diff --git a/common/src/zygote.ts b/common/src/zygote.ts index b9f2dbb0a..824ddd9ef 100644 --- a/common/src/zygote.ts +++ b/common/src/zygote.ts @@ -52,7 +52,12 @@ export function createZygote(options?: ForkOptions): Zygote { } const gen = next(); - return () => gen.next().value as PluginFork; + return () => { + const ret = gen.next(); + if (ret.done || !ret.value) + throw new Error('Zygote exhausted'); + return ret.value; + }; } diff --git a/plugins/webrtc/package-lock.json b/plugins/webrtc/package-lock.json index ec08e0253..7954f6556 100644 --- a/plugins/webrtc/package-lock.json +++ b/plugins/webrtc/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/webrtc", - "version": "0.2.83", + "version": "0.2.85", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/webrtc", - "version": "0.2.83", + "version": "0.2.85", "dependencies": { "@scrypted/common": "file:../../common", "@scrypted/sdk": "file:../../sdk", diff --git a/plugins/webrtc/package.json b/plugins/webrtc/package.json index 262bcece6..beae1acae 100644 --- a/plugins/webrtc/package.json +++ b/plugins/webrtc/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/webrtc", - "version": "0.2.83", + "version": "0.2.85", "scripts": { "scrypted-setup-project": "scrypted-setup-project", "prescrypted-setup-project": "scrypted-package-json", diff --git a/plugins/webrtc/src/ffmpeg-to-wrtc.ts b/plugins/webrtc/src/ffmpeg-to-wrtc.ts index bb08c2839..68046dfaa 100644 --- a/plugins/webrtc/src/ffmpeg-to-wrtc.ts +++ b/plugins/webrtc/src/ffmpeg-to-wrtc.ts @@ -97,17 +97,18 @@ export async function createTrackForwarder(options: { if (!mo) return; - let mediaStreamFeedback: MediaStreamFeedback; + let hasMediaStreamFeedback = false; try { - mediaStreamFeedback = await sdk.mediaManager.convertMediaObject(mo, ScryptedMimeTypes.MediaStreamFeedback); + const mediaStreamFeedback = await sdk.connectRPCObject(await sdk.mediaManager.convertMediaObject(mo, ScryptedMimeTypes.MediaStreamFeedback)); + if (mediaStreamFeedback) { + videoTransceiver.sender.onRtcp.subscribe(rtcp => { + mediaStreamFeedback.onRtcp(rtcp.serialize()); + }); + hasMediaStreamFeedback = true; + } } catch (e) { } - if (mediaStreamFeedback) { - videoTransceiver.sender.onRtcp.subscribe(rtcp => { - mediaStreamFeedback.onRtcp(rtcp.serialize()); - }); - } const console = sdk.deviceManager.getMixinConsole(mo.sourceId); const ffmpegInput = await sdk.mediaManager.convertMediaObjectToJSON(mo, ScryptedMimeTypes.FFmpegInput); @@ -253,7 +254,7 @@ export async function createTrackForwarder(options: { } } - if (mediaStreamFeedback) + if (hasMediaStreamFeedback) needPacketization = false; let opusRepacketizer: OpusRepacketizer; @@ -580,9 +581,10 @@ export class WebRTCConnectionManagement implements RTCConnectionManagement { let requestMediaStream: RequestMediaStream; try { - requestMediaStream = await sdk.mediaManager.convertMediaObject(mediaObject, ScryptedMimeTypes.RequestMediaStream); + requestMediaStream = await sdk.connectRPCObject(await sdk.mediaManager.convertMediaObject(mediaObject, ScryptedMimeTypes.RequestMediaStream)); } catch (e) { + mediaObject = await sdk.connectRPCObject(mediaObject); requestMediaStream = async () => mediaObject; } diff --git a/plugins/webrtc/src/main.ts b/plugins/webrtc/src/main.ts index 41a27128c..92dcccec3 100644 --- a/plugins/webrtc/src/main.ts +++ b/plugins/webrtc/src/main.ts @@ -4,7 +4,7 @@ import { timeoutPromise } from '@scrypted/common/src/promise-utils'; import { legacyGetSignalingSessionOptions } from '@scrypted/common/src/rtc-signaling'; import { SettingsMixinDeviceBase, SettingsMixinDeviceOptions } from '@scrypted/common/src/settings-mixin'; import { createZygote } from '@scrypted/common/src/zygote'; -import sdk, { DeviceCreator, DeviceCreatorSettings, DeviceProvider, FFmpegInput, Intercom, MediaConverter, MediaObject, MediaObjectOptions, MixinProvider, PluginFork, RTCSessionControl, RTCSignalingChannel, RTCSignalingClient, RTCSignalingOptions, RTCSignalingSession, RequestMediaStream, RequestMediaStreamOptions, ResponseMediaStreamOptions, ScryptedDeviceType, ScryptedInterface, ScryptedMimeTypes, ScryptedNativeId, Setting, SettingValue, Settings, VideoCamera, WritableDeviceState } from '@scrypted/sdk'; +import sdk, { DeviceCreator, DeviceCreatorSettings, DeviceProvider, FFmpegInput, Intercom, MediaConverter, MediaObject, MediaObjectOptions, MixinProvider, RTCSessionControl, RTCSignalingChannel, RTCSignalingClient, RTCSignalingOptions, RTCSignalingSession, RequestMediaStream, RequestMediaStreamOptions, ResponseMediaStreamOptions, ScryptedDeviceType, ScryptedInterface, ScryptedMimeTypes, ScryptedNativeId, Setting, SettingValue, Settings, VideoCamera, WritableDeviceState } from '@scrypted/sdk'; import { StorageSettings } from '@scrypted/sdk/storage-settings'; import { RpcPeer } from '@scrypted/server/src/rpc'; import { createDataChannelSerializer } from '@scrypted/server/src/rpc-serializer'; @@ -27,9 +27,9 @@ defaultPeerConfig.headerExtensions = { audio: [], }; -function delayWorkerExit(f: PluginFork>) { +function delayWorkerExit(f: ReturnType) { setTimeout(() => { - f.result.then(r => r.then(rr => rr.exit())).catch(() => { }); + f.result.then(rr => rr.exit()).catch(() => { }); }, 1000); setTimeout(() => { f.worker.terminate(); @@ -272,7 +272,7 @@ export class WebRTCPlugin extends AutoenableMixinProvider implements DeviceCreat }, }); activeConnections = 0; - zygote = createZygote>(); + zygote = createZygote>>(); constructor() { super();