diff --git a/CHANGELOG.md b/CHANGELOG.md index 4961ea7..dfe286e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ # Changelog -------------------------------------------- +[1.5.4] - 2025-04-29 + +* Media recording changes. + +[1.5.3+hotfix.3] - 2025-07-24 + +* fixed E2EE issue for Chrome. + [1.5.3+hotfix.2] - 2025-04-25 * fix bug for dc.onMessage. diff --git a/lib/src/frame_cryptor_impl.dart b/lib/src/frame_cryptor_impl.dart index e8365f7..6020d9d 100644 --- a/lib/src/frame_cryptor_impl.dart +++ b/lib/src/frame_cryptor_impl.dart @@ -20,70 +20,6 @@ class WorkerResponse { dynamic data; } -extension RtcRtpReceiverExt on web.RTCRtpReceiver { - static Map readableStreams_ = {}; - static Map writableStreams_ = {}; - - web.ReadableStream? get readable { - if (readableStreams_.containsKey(hashCode)) { - return readableStreams_[hashCode]!; - } - return null; - } - - web.WritableStream? get writable { - if (writableStreams_.containsKey(hashCode)) { - return writableStreams_[hashCode]!; - } - return null; - } - - set readableStream(web.ReadableStream stream) { - readableStreams_[hashCode] = stream; - } - - set writableStream(web.WritableStream stream) { - writableStreams_[hashCode] = stream; - } - - void closeStreams() { - readableStreams_.remove(hashCode); - writableStreams_.remove(hashCode); - } -} - -extension RtcRtpSenderExt on web.RTCRtpSender { - static Map readableStreams_ = {}; - static Map writableStreams_ = {}; - - web.ReadableStream? get readable { - if (readableStreams_.containsKey(hashCode)) { - return readableStreams_[hashCode]!; - } - return null; - } - - web.WritableStream? get writable { - if (writableStreams_.containsKey(hashCode)) { - return writableStreams_[hashCode]!; - } - return null; - } - - set readableStream(web.ReadableStream stream) { - readableStreams_[hashCode] = stream; - } - - set writableStream(web.WritableStream stream) { - writableStreams_[hashCode] = stream; - } - - void closeStreams() { - readableStreams_.remove(hashCode); - writableStreams_.remove(hashCode); - } -} - class FrameCryptorImpl extends FrameCryptor { FrameCryptorImpl( this._factory, this.worker, this._participantId, this._trackId, @@ -452,7 +388,7 @@ class FrameCryptorFactoryImpl implements FrameCryptorFactory { required KeyProvider keyProvider}) { var jsReceiver = (receiver as RTCRtpReceiverWeb).jsRtpReceiver; - var trackId = jsReceiver.hashCode.toString(); + var trackId = jsReceiver.track.id; var kind = jsReceiver.track.kind; if (web.window.hasProperty('RTCRtpScriptTransform'.toJS).toDart) { @@ -469,33 +405,35 @@ class FrameCryptorFactoryImpl implements FrameCryptorFactory { jsReceiver.transform = web.RTCRtpScriptTransform(worker, options.jsify()); } else { - var writable = jsReceiver.writable; - var readable = jsReceiver.readable; - var exist = true; - if (writable == null || readable == null) { - final streams = - jsReceiver.callMethod('createEncodedStreams'.toJS); - readable = streams.getProperty('readable'.toJS) as web.ReadableStream; - jsReceiver.readableStream = readable; - writable = streams.getProperty('writable'.toJS) as web.WritableStream; - jsReceiver.writableStream = writable; - exist = false; - } + var exist = false; + final streams = + jsReceiver.callMethod('createEncodedStreams'.toJS); + final readable = + streams.getProperty('readable'.toJS) as web.ReadableStream; + final writable = + streams.getProperty('writable'.toJS) as web.WritableStream; + var msgId = randomString(12); - worker.postMessage( - { - 'msgType': 'decode', - 'msgId': msgId, - 'keyProviderId': (keyProvider as KeyProviderImpl).id, - 'kind': kind, - 'exist': exist, - 'participantId': participantId, - 'trackId': trackId, - 'readableStream': readable, - 'writableStream': writable - }.jsify(), - [readable, writable].jsify() as JSObject, - ); + try { + worker.postMessage( + { + 'msgType': 'decode', + 'msgId': msgId, + 'keyProviderId': (keyProvider as KeyProviderImpl).id, + 'kind': kind, + 'exist': exist, + 'participantId': participantId, + 'trackId': trackId, + 'options': keyProvider.options.toJson(), + 'readableStream': readable, + 'writableStream': writable + }.jsify(), + [readable, writable] as JSObject, + ); + } catch (e) { + print('Error posting message: $e'); + rethrow; + } } FrameCryptor cryptor = FrameCryptorImpl( this, worker, participantId, trackId, @@ -529,39 +467,42 @@ class FrameCryptorFactoryImpl implements FrameCryptorFactory { print('object: ${options['keyProviderId']}'); jsSender.transform = web.RTCRtpScriptTransform(worker, options.jsify()); } else { - var writable = jsSender.writable; - var readable = jsSender.readable; - var exist = true; - if (writable == null || readable == null) { - final streams = - jsSender.callMethod('createEncodedStreams'.toJS); - readable = streams.getProperty('readable'.toJS) as web.ReadableStream; - jsSender.readableStream = readable; - writable = streams.getProperty('writable'.toJS) as web.WritableStream; - - exist = false; - } + var exist = false; + final streams = + jsSender.callMethod('createEncodedStreams'.toJS); + final readable = + streams.getProperty('readable'.toJS) as web.ReadableStream; + final writable = + streams.getProperty('writable'.toJS) as web.WritableStream; + var msgId = randomString(12); - worker.postMessage( - { - 'msgType': 'encode', - 'msgId': msgId, - 'keyProviderId': (keyProvider as KeyProviderImpl).id, - 'kind': kind, - 'exist': exist, - 'participantId': participantId, - 'trackId': trackId, - 'options': keyProvider.options.toJson(), - 'readableStream': readable, - 'writableStream': writable - }.jsify(), - [readable, writable].jsify() as JSObject, - ); + + try { + worker.postMessage( + { + 'msgType': 'encode', + 'msgId': msgId, + 'keyProviderId': (keyProvider as KeyProviderImpl).id, + 'kind': kind, + 'exist': exist, + 'participantId': participantId, + 'trackId': trackId, + 'options': keyProvider.options.toJson(), + 'readableStream': readable, + 'writableStream': writable + }.jsify(), + [readable, writable] as JSObject, + ); + } catch (e) { + print('Error posting message: $e'); + rethrow; + } } FrameCryptor cryptor = FrameCryptorImpl( this, worker, participantId, trackId, jsSender: jsSender, keyProvider: keyProvider); _frameCryptors[trackId] = cryptor; + return Future.value(cryptor); } diff --git a/lib/src/media_recorder.dart b/lib/src/media_recorder.dart index 7ed9dd3..5a2a4e6 100644 --- a/lib/src/media_recorder.dart +++ b/lib/src/media_recorder.dart @@ -7,8 +7,11 @@ class MediaRecorder extends _interface.MediaRecorder { final _interface.MediaRecorder _delegate; @override - Future start(String path, - {MediaStreamTrack? videoTrack, RecorderAudioChannel? audioChannel}) => + Future start( + String path, { + MediaStreamTrack? videoTrack, + RecorderAudioChannel? audioChannel, + }) => _delegate.start(path, videoTrack: videoTrack, audioChannel: audioChannel); @override diff --git a/lib/src/media_recorder_impl.dart b/lib/src/media_recorder_impl.dart index c03a9bc..38bc50e 100644 --- a/lib/src/media_recorder_impl.dart +++ b/lib/src/media_recorder_impl.dart @@ -15,9 +15,7 @@ class MediaRecorderWeb extends MediaRecorder { Future start( String path, { MediaStreamTrack? videoTrack, - MediaStreamTrack? audioTrack, RecorderAudioChannel? audioChannel, - int? rotation, }) { throw 'Use startWeb on Flutter Web!'; } diff --git a/pubspec.yaml b/pubspec.yaml index 49b8637..5507ef7 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: dart_webrtc description: Use the dart/js library to re-wrap the webrtc js interface of the browser, to adapted common browsers. -version: 1.5.3+hotfix.2 +version: 1.5.3+hotfix.3 homepage: https://github.com/flutter-webrtc/dart-webrtc environment: @@ -13,7 +13,7 @@ dependencies: meta: ^1.8.0 synchronized: ^3.0.0+3 web: ^1.0.0 - webrtc_interface: ^1.2.2+hotfix.1 + webrtc_interface: ^1.2.2+hotfix.2 dev_dependencies: build_runner: ^2.3.3 @@ -22,4 +22,4 @@ dev_dependencies: import_sorter: ^4.6.0 pedantic: ^1.9.0 protoo_client: ^0.3.0 - test: ^1.15.4 \ No newline at end of file + test: ^1.15.4