feat(backend): add SIMPLE_STREAMING WebRTC control-path streaming
This commit is contained in:
@@ -25,10 +25,29 @@ const parsePositiveNumber = (value: string | undefined): number | null => {
|
||||
return parsed;
|
||||
};
|
||||
|
||||
export const parseFeatureFlag = (value: string | undefined, defaultValue: boolean): boolean => {
|
||||
if (value === undefined) {
|
||||
return defaultValue;
|
||||
}
|
||||
|
||||
const normalized = value.trim().toLowerCase();
|
||||
if (['1', 'true', 'yes', 'on'].includes(normalized)) {
|
||||
return true;
|
||||
}
|
||||
if (['0', 'false', 'no', 'off'].includes(normalized)) {
|
||||
return false;
|
||||
}
|
||||
return defaultValue;
|
||||
};
|
||||
|
||||
export const mediaMode: MediaMode = parseMediaMode(process.env.MEDIA_MODE);
|
||||
export const simpleStreamingEnabled = parseFeatureFlag(process.env.SIMPLE_STREAMING, false);
|
||||
export const streamRecordingEnabled = parseFeatureFlag(process.env.STREAM_RECORDINGS_ENABLED, false);
|
||||
|
||||
export const mediaConfig = {
|
||||
mode: mediaMode,
|
||||
simpleStreamingEnabled,
|
||||
streamRecordingEnabled,
|
||||
turn: {
|
||||
urls: parseCsv(process.env.TURN_URLS),
|
||||
username: process.env.TURN_USERNAME ?? '',
|
||||
@@ -40,4 +59,3 @@ export const mediaConfig = {
|
||||
maxSubscribersPerRoom: parsePositiveNumber(process.env.MEDIA_MAX_SUBSCRIBERS_PER_ROOM),
|
||||
},
|
||||
};
|
||||
|
||||
|
||||
@@ -37,6 +37,8 @@ export class MockMediaProvider implements MediaProvider {
|
||||
name = 'mock';
|
||||
|
||||
async createSession(input: MediaSessionCreateInput): Promise<MediaSessionCreateResult> {
|
||||
// SIMPLE_STREAMING bypasses provider-backed transport at runtime. This metadata
|
||||
// path is kept only for legacy endpoints and backwards compatibility.
|
||||
const mediaSessionId = `mock_${input.streamSessionId}`;
|
||||
const baseUrl = getBaseUrl();
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { simpleStreamingEnabled } from './config';
|
||||
import { MockMediaProvider } from './providers/mock';
|
||||
import type { MediaProvider } from './types';
|
||||
import type { MediaProvider, MediaSessionCreateInput, MediaSessionCreateResult } from './types';
|
||||
|
||||
const providerName = (process.env.MEDIA_PROVIDER ?? 'mock').toLowerCase();
|
||||
|
||||
@@ -13,3 +14,14 @@ const createProvider = (): MediaProvider => {
|
||||
};
|
||||
|
||||
export const mediaProvider = createProvider();
|
||||
export const mediaProviderRuntimeEnabled = !simpleStreamingEnabled;
|
||||
|
||||
export const createLiveMediaSession = async (
|
||||
input: MediaSessionCreateInput,
|
||||
): Promise<MediaSessionCreateResult | null> => {
|
||||
if (!mediaProviderRuntimeEnabled) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return mediaProvider.createSession(input);
|
||||
};
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
import { mediaMode } from '../config';
|
||||
import { mediaMode, simpleStreamingEnabled } from '../config';
|
||||
import { NoopSfuService } from './noop';
|
||||
import type { SfuService } from './types';
|
||||
|
||||
const createSfuService = (): SfuService | null => {
|
||||
if (simpleStreamingEnabled) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (mediaMode !== 'single_server_sfu') {
|
||||
return null;
|
||||
}
|
||||
@@ -11,4 +15,3 @@ const createSfuService = (): SfuService | null => {
|
||||
};
|
||||
|
||||
export const sfuService = createSfuService();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user