diff --git a/plugins/webrtc/package-lock.json b/plugins/webrtc/package-lock.json index aa5a44e88..908c84430 100644 --- a/plugins/webrtc/package-lock.json +++ b/plugins/webrtc/package-lock.json @@ -1,12 +1,12 @@ { "name": "@scrypted/webrtc", - "version": "0.1.34", + "version": "0.1.35", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@scrypted/webrtc", - "version": "0.1.34", + "version": "0.1.35", "dependencies": { "@scrypted/common": "file:../../common", "@scrypted/sdk": "file:../../sdk", diff --git a/plugins/webrtc/package.json b/plugins/webrtc/package.json index e8d1e0c04..8abb90309 100644 --- a/plugins/webrtc/package.json +++ b/plugins/webrtc/package.json @@ -1,6 +1,6 @@ { "name": "@scrypted/webrtc", - "version": "0.1.34", + "version": "0.1.35", "scripts": { "scrypted-setup-project": "scrypted-setup-project", "prescrypted-setup-project": "scrypted-package-json", diff --git a/plugins/webrtc/src/main.ts b/plugins/webrtc/src/main.ts index 2f5e8414e..d6d71e52a 100644 --- a/plugins/webrtc/src/main.ts +++ b/plugins/webrtc/src/main.ts @@ -1,21 +1,22 @@ -import { defaultPeerConfig, MediaStreamTrack, PeerConfig, RTCPeerConnection } from './werift'; import { AutoenableMixinProvider } from '@scrypted/common/src/autoenable-mixin-provider'; import { Deferred } from '@scrypted/common/src/deferred'; import { listenZeroSingleClient } from '@scrypted/common/src/listen-cluster'; import { createBrowserSignalingSession } from "@scrypted/common/src/rtc-connect"; import { SettingsMixinDeviceBase, SettingsMixinDeviceOptions } from '@scrypted/common/src/settings-mixin'; -import sdk, { BufferConverter, BufferConvertorOptions, ConnectOptions, DeviceCreator, DeviceCreatorSettings, DeviceProvider, FFmpegInput, HttpRequest, Intercom, MediaObject, MixinProvider, RequestMediaStream, RequestMediaStreamOptions, ResponseMediaStreamOptions, RTCSessionControl, RTCSignalingChannel, RTCSignalingClient, RTCSignalingOptions, RTCSignalingSession, ScryptedDeviceBase, ScryptedDeviceType, ScryptedInterface, ScryptedMimeTypes, Setting, Settings, SettingValue, VideoCamera } from '@scrypted/sdk'; +import sdk, { BufferConverter, ConnectOptions, DeviceCreator, DeviceCreatorSettings, DeviceProvider, FFmpegInput, HttpRequest, Intercom, MediaObject, MediaObjectOptions, MixinProvider, RequestMediaStream, RequestMediaStreamOptions, ResponseMediaStreamOptions, RTCSessionControl, RTCSignalingChannel, RTCSignalingClient, RTCSignalingOptions, RTCSignalingSession, ScryptedDeviceBase, ScryptedDeviceType, ScryptedInterface, ScryptedMimeTypes, Setting, Settings, SettingValue, VideoCamera } from '@scrypted/sdk'; import { StorageSettings } from '@scrypted/sdk/storage-settings'; import crypto from 'crypto'; +import ip from 'ip'; import net from 'net'; import { DataChannelDebouncer } from './datachannel-debouncer'; -import { createRTCPeerConnectionSink, createTrackForwarder, parseOptions, RTC_BRIDGE_NATIVE_ID, WebRTCConnectionManagement } from "./ffmpeg-to-wrtc"; +import { createRTCPeerConnectionSink, createTrackForwarder, RTC_BRIDGE_NATIVE_ID, WebRTCConnectionManagement } from "./ffmpeg-to-wrtc"; import { stunServer, turnServer, weriftStunServer, weriftTurnServer } from './ice-servers'; import { waitClosed } from './peerconnection-util'; import { WebRTCCamera } from "./webrtc-camera"; +import { defaultPeerConfig, InterfaceAddresses, MediaStreamTrack, PeerConfig, RTCPeerConnection } from './werift'; +import { WeriftSignalingSession } from './werift-signaling-session'; import { createRTCPeerConnectionSource, getRTCMediaStreamOptions } from './wrtc-to-rtsp'; import { createZygote } from './zygote'; -import { WeriftSignalingSession } from './werift-signaling-session'; const { mediaManager, systemManager, deviceManager } = sdk; @@ -63,7 +64,7 @@ class WebRTCMixin extends SettingsMixinDeviceBase { + async convert(data: any, fromMimeType: string, toMimeType: string, options?: MediaObjectOptions): Promise { const plugin = this; const console = deviceManager.getMixinConsole(options?.sourceId, this.nativeId); @@ -267,7 +278,7 @@ export class WebRTCPlugin extends AutoenableMixinProvider implements DeviceCreat mo, plugin.storageSettings.values.maximumCompatibilityMode, plugin.getRTCConfiguration(), - plugin.getWeriftConfiguration(), + await plugin.getWeriftConfiguration(), ); } } @@ -284,7 +295,7 @@ export class WebRTCPlugin extends AutoenableMixinProvider implements DeviceCreat mo, plugin.storageSettings.values.maximumCompatibilityMode, plugin.getRTCConfiguration(), - plugin.getWeriftConfiguration(), + await plugin.getWeriftConfiguration(), ); } } @@ -408,7 +419,7 @@ export class WebRTCPlugin extends AutoenableMixinProvider implements DeviceCreat }; } - getWeriftConfiguration(): Partial { + async getWeriftConfiguration(): Promise> { let ret: Partial; if (this.storageSettings.values.weriftConfiguration) { try { @@ -423,9 +434,28 @@ export class WebRTCPlugin extends AutoenableMixinProvider implements DeviceCreat ? [weriftStunServer, weriftTurnServer] : [weriftStunServer]; + let iceInterfaceAddresses: InterfaceAddresses; + if (this.storageSettings.values.iceInterfaceAddresses !== 'All Addresses') { + try { + for (const address of await sdk.endpointManager.getLocalAddresses()) { + if (ip.isV4Format(address)) { + iceInterfaceAddresses ||= {}; + iceInterfaceAddresses.udp4 = address; + } + else if (ip.isV6Format(address)) { + iceInterfaceAddresses ||= {}; + iceInterfaceAddresses.udp6 = address; + } + } + } + catch (e) { + } + } + return { iceUseIpv6: false, iceServers, + iceInterfaceAddresses, ...ret, }; } @@ -498,7 +528,7 @@ export class WebRTCPlugin extends AutoenableMixinProvider implements DeviceCreat const connection = await createConnection(message, client.port, session, this.storageSettings.values.maximumCompatibilityMode, clientOptions, { configuration: this.getRTCConfiguration(), - weriftConfiguration: this.getWeriftConfiguration(), + weriftConfiguration: await this.getWeriftConfiguration(), }); cleanup.promise.finally(() => connection.close().catch(() => { })); connection.waitClosed().finally(() => cleanup.resolve('peer connection closed')); @@ -578,7 +608,7 @@ class WebRTCBridge extends ScryptedDeviceBase implements BufferConverter { this.toMimeType = ScryptedMimeTypes.RTCConnectionManagement; } - async convert(data: any, fromMimeType: string, toMimeType: string, options?: BufferConvertorOptions): Promise { + async convert(data: any, fromMimeType: string, toMimeType: string, options?: MediaObjectOptions): Promise { const session = data as RTCSignalingSession; const maximumCompatibilityMode = !!this.plugin.storageSettings.values.maximumCompatibilityMode; const clientOptions = await session.getOptions(); @@ -602,7 +632,7 @@ class WebRTCBridge extends ScryptedDeviceBase implements BufferConverter { clientOptions, { configuration: this.plugin.getRTCConfiguration(), - weriftConfiguration: this.plugin.getWeriftConfiguration(), + weriftConfiguration: await this.plugin.getWeriftConfiguration(), } ); cleanup.promise.finally(() => connection.close().catch(() => { })); diff --git a/server/src/plugin/runtime/python-worker.ts b/server/src/plugin/runtime/python-worker.ts index 8c53ab05e..8c01b30d0 100644 --- a/server/src/plugin/runtime/python-worker.ts +++ b/server/src/plugin/runtime/python-worker.ts @@ -56,6 +56,8 @@ export class PythonRuntimeWorker extends ChildProcessWorker { pythonPath ||= 'python3'; } + args.push(this.pluginId); + this.worker = child_process.spawn(pythonPath, args, { // stdin, stdout, stderr, peer in, peer out stdio: ['pipe', 'pipe', 'pipe', 'pipe', 'pipe'],