openvibers/openrestream Commits
Plan T4 — the unported-transport stub is gone; status files match the…
Changes
@@@ -8,11 +8,11 @@"port": 4500,"rtmpPort": 1936,"domain": "openre.stream",-- "contracts": "openvibe-contracts v0.76.0 (openvibe-sdk v0.21.3, openvibe-shared v1.28.0)",++ "contracts": "openvibe-contracts v0.76.0 (openvibe-sdk v0.21.3, openvibe-shared v2.3.1)","protocols": {"rtmp": "ingest ported (openre-rtmp-ingest)","restream": "RTMP source to RTMP/RTMPS/SRT destinations ported (openre-restream-worker)",-- "webrtc": "not ported (workers/webrtc.js: one worker will own WHIP ingest, the SFU and viewer signaling; worker interface only)",++ "webrtc": "worker ported (workers/webrtc.js + workers/webrtc/{sfu,sdp,signaling}.js, run by openre-webrtc@): WHIP (RFC 9725) ingest by key on the mediasoup SFU, browser broadcasters over /b/<key> and viewers over /w/<playback id>, loopback RTP egress for restream/recording/thumbnails, recording through Media's RTP ingest; generations/leases/drain; refuses to start in production without MEDIASOUP_ANNOUNCED_IP","jsmpeg": "worker ported (workers/jsmpeg.js): MPEG-TS POST admission by key, WS viewers, loopback data tap, restream (re-encode), generations/drain; no recording (parity)"},"capabilities": [ddeleted file mode 100644@@@ -1,46 +0,0 @@--'use strict';--/**-- * The worker interface for the transports OpenRe does not carry yet. Today only WebRTC: the port-- * (WHIP ingest + mediasoup SFU + viewer signaling) is T4's next job (decision 1, one worker owns-- * all of it). It registers a generation with the coordinator, takes part in the drain protocol and-- * heartbeats like a real transport worker, and carries nothing: activeCount() is always 0, and no-- * 'webrtc' session is ever admitted (a definition may list the protocol, but its HTTP error is-- * 'protocol_not_allowed' — no worker accepts it, so encoders keep using Live).-- *-- * This is the seam the port lands in: it replaces `admit nothing` with its session code and reports-- * sessions through store.sessions exactly like rtmp-ingest.js / jsmpeg.js.-- */--const path = require('path');--const { createWorkerRuntime } = require('./runtime');----const PORT_STATUS = Object.freeze({-- webrtc: 'WebRTC (WHIP ingest + mediasoup SFU + viewer signaling; Live: server/streaming/whip-handler.js + webrtc-sfu.js + broadcast-server.js) — not ported',--});----function createUnportedTransport({ rt, kind, log = console, exit = (code) => process.exit(code) }) {-- if (!PORT_STATUS[kind]) throw new Error(`no unported transport "${kind}"`);-- const runtime = createWorkerRuntime({ rt, kind, log, exit, hooks: { activeCount: () => 0 } });-- return {-- runtime,-- async start() {-- await runtime.register({ ported: false, note: PORT_STATUS[kind] });-- await runtime.ready();-- log.log(`[${kind}] registered generation ${runtime.me.generation}: ${PORT_STATUS[kind]}`);-- return runtime.me;-- },-- drain: async (reason) => await runtime.drainNow(reason),-- };--}----async function main(kind) {-- require('dotenv').config({ path: process.env.OPENRE_ENV_FILE || path.join(process.cwd(), '.env') });-- const { load, exitIfDrill } = require('../server/config');-- const { openRuntime } = require('../server/store');-- const config = load();-- exitIfDrill(config, `openre-${kind}`);-- const w = createUnportedTransport({ rt: await openRuntime({ config }), kind });-- await w.start();-- for (const sig of ['SIGTERM', 'SIGINT']) process.on(sig, () => w.drain(sig).catch((err) => console.error(`[${kind}] drain failed on ${sig}: ${err && (err.stack || err.message) || err}`)));--}----module.exports = { createUnportedTransport, PORT_STATUS, main };
@@ -8,11 +8,11 @@
@@ -8,11 +8,11 @@
"port": 4500,
"port": 4500,
"rtmpPort": 1936,
"rtmpPort": 1936,
"domain": "openre.stream",
"domain": "openre.stream",
- "contracts": "openvibe-contracts v0.76.0 (openvibe-sdk v0.21.3, openvibe-shared v1.28.0)",
+ "contracts": "openvibe-contracts v0.76.0 (openvibe-sdk v0.21.3, openvibe-shared v2.3.1)",
"protocols": {
"protocols": {
"rtmp": "ingest ported (openre-rtmp-ingest)",
"rtmp": "ingest ported (openre-rtmp-ingest)",
"restream": "RTMP source to RTMP/RTMPS/SRT destinations ported (openre-restream-worker)",
"restream": "RTMP source to RTMP/RTMPS/SRT destinations ported (openre-restream-worker)",
- "webrtc": "not ported (workers/webrtc.js: one worker will own WHIP ingest, the SFU and viewer signaling; worker interface only)",
+ "webrtc": "worker ported (workers/webrtc.js + workers/webrtc/{sfu,sdp,signaling}.js, run by openre-webrtc@): WHIP (RFC 9725) ingest by key on the mediasoup SFU, browser broadcasters over /b/<key> and viewers over /w/<playback id>, loopback RTP egress for restream/recording/thumbnails, recording through Media's RTP ingest; generations/leases/drain; refuses to start in production without MEDIASOUP_ANNOUNCED_IP",
"jsmpeg": "worker ported (workers/jsmpeg.js): MPEG-TS POST admission by key, WS viewers, loopback data tap, restream (re-encode), generations/drain; no recording (parity)"
"jsmpeg": "worker ported (workers/jsmpeg.js): MPEG-TS POST admission by key, WS viewers, loopback data tap, restream (re-encode), generations/drain; no recording (parity)"
},
},
"capabilities": [
"capabilities": [
deleted file mode 100644
deleted file mode 100644
@@ -1,46 +0,0 @@
@@ -1,46 +0,0 @@
-'use strict';
-/**
- * The worker interface for the transports OpenRe does not carry yet. Today only WebRTC: the port
- * (WHIP ingest + mediasoup SFU + viewer signaling) is T4's next job (decision 1, one worker owns
- * all of it). It registers a generation with the coordinator, takes part in the drain protocol and
- * heartbeats like a real transport worker, and carries nothing: activeCount() is always 0, and no
- * 'webrtc' session is ever admitted (a definition may list the protocol, but its HTTP error is
- * 'protocol_not_allowed' — no worker accepts it, so encoders keep using Live).
- *
- * This is the seam the port lands in: it replaces `admit nothing` with its session code and reports
- * sessions through store.sessions exactly like rtmp-ingest.js / jsmpeg.js.
- */
-const path = require('path');
-const { createWorkerRuntime } = require('./runtime');
-
-const PORT_STATUS = Object.freeze({
- webrtc: 'WebRTC (WHIP ingest + mediasoup SFU + viewer signaling; Live: server/streaming/whip-handler.js + webrtc-sfu.js + broadcast-server.js) — not ported',
-});
-
-function createUnportedTransport({ rt, kind, log = console, exit = (code) => process.exit(code) }) {
- if (!PORT_STATUS[kind]) throw new Error(`no unported transport "${kind}"`);
- const runtime = createWorkerRuntime({ rt, kind, log, exit, hooks: { activeCount: () => 0 } });
- return {
- runtime,
- async start() {
- await runtime.register({ ported: false, note: PORT_STATUS[kind] });
- await runtime.ready();
- log.log(`[${kind}] registered generation ${runtime.me.generation}: ${PORT_STATUS[kind]}`);
- return runtime.me;
- },
- drain: async (reason) => await runtime.drainNow(reason),
- };
-}
-
-async function main(kind) {
- require('dotenv').config({ path: process.env.OPENRE_ENV_FILE || path.join(process.cwd(), '.env') });
- const { load, exitIfDrill } = require('../server/config');
- const { openRuntime } = require('../server/store');
- const config = load();
- exitIfDrill(config, `openre-${kind}`);
- const w = createUnportedTransport({ rt: await openRuntime({ config }), kind });
- await w.start();
- for (const sig of ['SIGTERM', 'SIGINT']) process.on(sig, () => w.drain(sig).catch((err) => console.error(`[${kind}] drain failed on ${sig}: ${err && (err.stack || err.message) || err}`)));
-}
-
-module.exports = { createUnportedTransport, PORT_STATUS, main };