From 9d4d39e5acb72fa1ca1cb88bab9ad8c7af390ff6 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Wed, 10 Dec 2025 17:14:32 +0900 Subject: [PATCH 1/4] fix --- README.md | 10 +++++----- .../LiveKit Broadcast Extension/SocketConnection.swift | 2 +- example/web/e2ee.worker.dart.js | 4 ++-- lib/src/events.dart | 2 +- lib/src/exceptions.dart | 4 ++-- shared_cpp/pffft.h | 2 +- web/e2ee.data_packet_cryptor.dart | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index e95eeda03..9b03ef76d 100644 --- a/README.md +++ b/README.md @@ -221,7 +221,7 @@ room.localParticipant.setScreenShareEnabled(true); On Android, you will have to use a [media projection foreground service](https://developer.android.com/develop/background-work/services/fg-service-types#media-projection). -In our example, we use the `flutter_background` package to handle this. In the app's AndroidManifest.xml file, declare the service with the appropriate types and permissions as following: +In our example, we use the `flutter_background` package to handle this. In the app's AndroidManifest.xml file, declare the service with the appropriate types and permissions as follows: ```xml title="AndroidManifest.xml" @@ -248,7 +248,7 @@ other apps. See [setup guide](https://github.com/flutter-webrtc/flutter-webrtc/w #### Desktop(Windows/macOS) -On dekstop you can use `ScreenSelectDialog` to select the window or screen you want to share. +On desktop you can use `ScreenSelectDialog` to select the window or screen you want to share. ```dart try { @@ -282,10 +282,10 @@ By default, the native platform can support E2EE without any settings, but for f # for example app dart compile js web/e2ee.worker.dart -o example/web/e2ee.worker.dart.js -m # for your project -export YOU_PROJECT_DIR=your_project_dir +export YOUR_PROJECT_DIR=your_project_dir git clone https://github.com/livekit/client-sdk-flutter.git cd client-sdk-flutter && flutter pub get -dart compile js web/e2ee.worker.dart -o ${YOU_PROJECT_DIR}/web/e2ee.worker.dart.js -m +dart compile js web/e2ee.worker.dart -o ${YOUR_PROJECT_DIR}/web/e2ee.worker.dart.js -m ``` ### Advanced track manipulation @@ -460,7 +460,7 @@ class _VideoViewState extends State { ### Mute, unmute local tracks -On `LocalTrackPublication`s, you could control if the track is muted by setting its `muted` property. Changing the mute status will generate an `onTrackMuted` or `onTrack Unmuted` delegate call for the local participant. Other participant will receive the status change as well. +On `LocalTrackPublication`s, you could control if the track is muted by setting its `muted` property. Changing the mute status will generate an `onTrackMuted` or `onTrack Unmuted` delegate call for the local participant. Other participants will receive the status change as well. ```dart // mute track diff --git a/example/ios/LiveKit Broadcast Extension/SocketConnection.swift b/example/ios/LiveKit Broadcast Extension/SocketConnection.swift index a2a73a9b8..e33b3d4aa 100644 --- a/example/ios/LiveKit Broadcast Extension/SocketConnection.swift +++ b/example/ios/LiveKit Broadcast Extension/SocketConnection.swift @@ -100,7 +100,7 @@ extension SocketConnection: StreamDelegate { streamHasSpaceAvailable?() } case .errorOccurred: - os_log(.debug, log: broadcastLogger, "client stream error occured: \(String(describing: aStream.streamError))") + os_log(.debug, log: broadcastLogger, "client stream error occurred: \(String(describing: aStream.streamError))") close() notifyDidClose(error: aStream.streamError) diff --git a/example/web/e2ee.worker.dart.js b/example/web/e2ee.worker.dart.js index 434bc8b9b..51a3b6f3f 100644 --- a/example/web/e2ee.worker.dart.js +++ b/example/web/e2ee.worker.dart.js @@ -3537,7 +3537,7 @@ s=p}while(true)switch(s){case 0:a1={} a1.a=0 e=$.v() d=a5.a -e.i(B.l,"decodeFunction: data packet lenght "+d.length,null,null) +e.i(B.l,"decodeFunction: data packet length "+d.length,null,null) a1.b=a1.c=null m=0 p=4 @@ -3793,7 +3793,7 @@ s=p}while(true)switch(s){case 0:a6={} a7=n.b2(b0) a6.a=0 c=$.v() -c.i(B.l,"decodeFunction: frame lenght "+a7.d.length,null,null) +c.i(B.l,"decodeFunction: frame length "+a7.d.length,null,null) a6.b=a6.c=null a6.d=n.x if(!n.gaZ()||a7.d.length===0){n.z.b3() diff --git a/lib/src/events.dart b/lib/src/events.dart index 6c66bcc76..707347bd8 100644 --- a/lib/src/events.dart +++ b/lib/src/events.dart @@ -285,7 +285,7 @@ class TrackSubscribedEvent with RoomEvent, ParticipantEvent { 'track: ${track})'; } -/// An error has occured during track subscription. +/// An error has occurred during track subscription. /// Emitted by [Room] and [RemoteParticipant]. class TrackSubscriptionExceptionEvent with RoomEvent, ParticipantEvent { final RemoteParticipant? participant; diff --git a/lib/src/exceptions.dart b/lib/src/exceptions.dart index 02262f957..f14ba9640 100644 --- a/lib/src/exceptions.dart +++ b/lib/src/exceptions.dart @@ -27,7 +27,7 @@ enum ConnectionErrorReason { Timeout, } -/// An exception occured while attempting to connect. +/// An exception occurred while attempting to connect. /// Common reasons: /// - Invalid token (make sure your token is generated correctly) /// - Network condition is not good @@ -42,7 +42,7 @@ class ConnectException extends LiveKitException { }) : super._(msg); } -/// An exception occured while attempting to disconnect. +/// An exception occurred while attempting to disconnect. /// Common reasons: /// - Network condition is not good. /// - SFU deploy behind a NAT and not configured correctly. diff --git a/shared_cpp/pffft.h b/shared_cpp/pffft.h index e235f12e4..1c0901fe7 100644 --- a/shared_cpp/pffft.h +++ b/shared_cpp/pffft.h @@ -187,7 +187,7 @@ void pffft_zconvolve_accumulate(PFFFT_Setup* setup, void* pffft_aligned_malloc(size_t nb_bytes); void pffft_aligned_free(void*); -/* return 4 or 1 wether support SSE/Altivec instructions was enable when +/* return 4 or 1 whether support for SSE/Altivec instructions was enabled when * building pffft.c */ int pffft_simd_size(); diff --git a/web/e2ee.data_packet_cryptor.dart b/web/e2ee.data_packet_cryptor.dart index fc9796a35..60fb27c2f 100644 --- a/web/e2ee.data_packet_cryptor.dart +++ b/web/e2ee.data_packet_cryptor.dart @@ -126,7 +126,7 @@ class E2EEDataPacketCryptor { ) async { var ratchetCount = 0; - logger.fine('decodeFunction: data packet lenght ${encryptedPacket.data.length}'); + logger.fine('decodeFunction: data packet length ${encryptedPacket.data.length}'); ByteBuffer? decrypted; KeySet? initialKeySet; From 5c07741fbc0e2194df21165a0807ad2f16ffccb7 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:43:57 +0900 Subject: [PATCH 2/4] fix doc about muted --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9b03ef76d..8751b16d7 100644 --- a/README.md +++ b/README.md @@ -460,7 +460,7 @@ class _VideoViewState extends State { ### Mute, unmute local tracks -On `LocalTrackPublication`s, you could control if the track is muted by setting its `muted` property. Changing the mute status will generate an `onTrackMuted` or `onTrack Unmuted` delegate call for the local participant. Other participants will receive the status change as well. +On `LocalTrackPublication`s, you can control whether the track is muted by setting its `muted` property. Changing the mute status will emit a `TrackMutedEvent` or `TrackUnmutedEvent` for the local participant. Other participants will receive the status change as well. ```dart // mute track From 9d73fd9e0455345c9307431f2d204c40191972df Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:58:38 +0900 Subject: [PATCH 3/4] fix1 --- CHANGELOG.md | 2 +- example/web/e2ee.worker.dart.js | 14 +++++++------- lib/src/events.dart | 2 +- web/e2ee.data_packet_cryptor.dart | 8 ++++---- web/e2ee.frame_cryptor.dart | 14 +++++++------- 5 files changed, 20 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6098c0ac9..ba0b042eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -62,7 +62,7 @@ * fix: memory leak visualizer stop android (#831) * fix: ensure engine always has correct device id if switching camera fails (#820) * fix: Always emit RoomDisconnectedEvent when the reason is clientInitiated. (#821) -* fix: sif frame enqueing with e2ee (#822) +* fix: sif frame enqueuing with e2ee (#822) * fix: update camera `deviceId` when track is null (#814) * feat: Audio Visualizer for Windows/Linux. (#739) diff --git a/example/web/e2ee.worker.dart.js b/example/web/e2ee.worker.dart.js index 51a3b6f3f..f6cf10b34 100644 --- a/example/web/e2ee.worker.dart.js +++ b/example/web/e2ee.worker.dart.js @@ -3798,9 +3798,9 @@ a6.b=a6.c=null a6.d=n.x if(!n.gaZ()||a7.d.length===0){n.z.b3() if(n.e.d.r){s=1 -break}c.i(B.l,"enqueing empty frame",null,null) +break}c.i(B.l,"enqueuing empty frame",null,null) b1.enqueue(b0) -c.i(B.b,"enqueing silent frame",null,null) +c.i(B.b,"enqueuing silent frame",null,null) s=1 break}b=n.e.d.e if(b!=null){a=a7.d @@ -3821,13 +3821,13 @@ else a6=!1 if(a6){a6=B.e.aE(a7.d,a7.d.length-1) if(0>=a6.length){q=A.e(a6,0) s=1 -break}c.i(B.b,"ecodeFunction: skip uncrypted frame, type "+a6[0],null,null) +break}c.i(B.b,"decodeFunction: skip unencrypted frame, type "+a6[0],null,null) e=new A.b2($.cQ()) e.u(0,new Uint8Array(A.ar(B.e.B(a7.d,0,a7.d.length-a1)))) n.ap(b0,b1,e) -c.i(B.l,"ecodeFunction: enqueing silent frame",null,null) -b1.enqueue(b0)}else c.i(B.b,"ecodeFunction: SIF limit reached, dropping frame",null,null) -c.i(B.b,"ecodeFunction: enqueing silent frame",null,null) +c.i(B.l,"decodeFunction: enqueuing silent frame",null,null) +b1.enqueue(b0)}else c.i(B.b,"decodeFunction: SIF limit reached, dropping frame",null,null) +c.i(B.b,"decodeFunction: enqueuing silent frame",null,null) b1.enqueue(b0) s=1 break}else a.b3()}}p=4 @@ -4566,7 +4566,7 @@ s(A.bT,A.L)})() var v={G:typeof self!="undefined"?self:globalThis,typeUniverse:{eC:new Map(),tR:{},eT:{},tPV:{},sEA:[]},mangledGlobalNames:{a:"int",n:"double",aO:"num",a5:"String",V:"bool",y:"Null",r:"List",k:"Object",bs:"Map",q:"JSObject"},mangledNames:{},types:["~()","V(ak)","a_<~>()","~(@)","~(~())","y(@)","y()","~(k,a1)","k?(k?)","~(q,q)","V(aw)","y(q)","V(ah)","@(@)","@(@,a5)","@(a5)","y(~())","y(@,a1)","~(a,@)","y(k,a1)","~(k?,k?)","aX()","~(aB)","a_(q)"],interceptorsByTag:null,leafTags:null,arrayRti:Symbol("$ti")} A.id(v.typeUniverse,JSON.parse('{"a6":"al","ct":"al","bE":"al","jx":"an","cf":{"V":[],"o":[]},"bm":{"y":[],"o":[]},"bn":{"q":[]},"al":{"q":[]},"z":{"r":["1"],"l":["1"],"q":[],"f":["1"]},"ce":{"bC":[]},"d6":{"z":["1"],"r":["1"],"l":["1"],"q":[],"f":["1"]},"bf":{"a4":["1"]},"ch":{"n":[],"aO":[]},"bl":{"n":[],"a":[],"aO":[],"o":[]},"cg":{"n":[],"aO":[],"o":[]},"aT":{"a5":[],"fa":[],"o":[]},"b2":{"hm":[]},"bo":{"w":[]},"l":{"f":["1"]},"a7":{"l":["1"],"f":["1"]},"aA":{"a4":["1"]},"a8":{"f":["2"],"f.E":"2"},"bi":{"a8":["1","2"],"l":["2"],"f":["2"],"f.E":"2"},"bt":{"a4":["2"]},"a9":{"a7":["2"],"l":["2"],"f":["2"],"f.E":"2","a7.E":"2"},"aE":{"f":["1"],"f.E":"1"},"bH":{"a4":["1"]},"bA":{"ab":[],"w":[]},"ci":{"w":[]},"cB":{"w":[]},"bU":{"a1":[]},"aj":{"ax":[]},"c6":{"ax":[]},"c7":{"ax":[]},"cy":{"ax":[]},"cw":{"ax":[]},"aR":{"ax":[]},"cv":{"w":[]},"az":{"aC":["1","2"],"f3":["1","2"],"bs":["1","2"]},"bq":{"l":["1"],"f":["1"],"f.E":"1"},"bp":{"a4":["1"]},"aY":{"an":[],"q":[],"bg":[],"o":[]},"an":{"q":[],"bg":[],"o":[]},"bx":{"q":[]},"cL":{"bg":[]},"bu":{"ez":[],"q":[],"o":[]},"C":{"P":["1"],"q":[]},"bv":{"u":["n"],"C":["n"],"r":["n"],"P":["n"],"l":["n"],"q":[],"f":["n"],"L":["n"]},"bw":{"u":["a"],"C":["a"],"r":["a"],"P":["a"],"l":["a"],"q":[],"f":["a"],"L":["a"]},"ck":{"cX":[],"u":["n"],"C":["n"],"r":["n"],"P":["n"],"l":["n"],"q":[],"f":["n"],"L":["n"],"o":[],"u.E":"n"},"cl":{"cY":[],"u":["n"],"C":["n"],"r":["n"],"P":["n"],"l":["n"],"q":[],"f":["n"],"L":["n"],"o":[],"u.E":"n"},"cm":{"d2":[],"u":["a"],"C":["a"],"r":["a"],"P":["a"],"l":["a"],"q":[],"f":["a"],"L":["a"],"o":[],"u.E":"a"},"cn":{"d3":[],"u":["a"],"C":["a"],"r":["a"],"P":["a"],"l":["a"],"q":[],"f":["a"],"L":["a"],"o":[],"u.E":"a"},"co":{"d4":[],"u":["a"],"C":["a"],"r":["a"],"P":["a"],"l":["a"],"q":[],"f":["a"],"L":["a"],"o":[],"u.E":"a"},"cp":{"dl":[],"u":["a"],"C":["a"],"r":["a"],"P":["a"],"l":["a"],"q":[],"f":["a"],"L":["a"],"o":[],"u.E":"a"},"cq":{"dm":[],"u":["a"],"C":["a"],"r":["a"],"P":["a"],"l":["a"],"q":[],"f":["a"],"L":["a"],"o":[],"u.E":"a"},"by":{"dn":[],"u":["a"],"C":["a"],"r":["a"],"P":["a"],"l":["a"],"q":[],"f":["a"],"L":["a"],"o":[],"u.E":"a"},"bz":{"cz":[],"u":["a"],"C":["a"],"r":["a"],"P":["a"],"l":["a"],"q":[],"f":["a"],"L":["a"],"o":[],"u.E":"a"},"cF":{"w":[]},"bW":{"ab":[],"w":[]},"ad":{"b0":["1"],"ap":["1"]},"O":{"w":[]},"b1":{"bJ":["1"],"b5":["1"],"b_":["1"]},"ao":{"bK":["1"],"ad":["1"],"b0":["1"],"ap":["1"]},"aF":{"fh":["1"],"fv":["1"],"ap":["1"]},"bV":{"aF":["1"],"fh":["1"],"fv":["1"],"ap":["1"]},"bI":{"cE":["1"]},"x":{"a_":["1"]},"bJ":{"b5":["1"],"b_":["1"]},"bK":{"ad":["1"],"b0":["1"],"ap":["1"]},"b5":{"b_":["1"]},"bL":{"bM":["1"]},"b3":{"b0":["1"]},"c_":{"fm":[]},"cI":{"c_":[],"fm":[]},"bN":{"aC":["1","2"],"bs":["1","2"]},"b4":{"bN":["1","2"],"aC":["1","2"],"bs":["1","2"]},"bO":{"l":["1"],"f":["1"],"f.E":"1"},"bP":{"a4":["1"]},"aC":{"bs":["1","2"]},"c5":{"av":["r","a5"],"av.S":"r"},"n":{"aO":[]},"a":{"aO":[]},"r":{"l":["1"],"f":["1"]},"a5":{"fa":[]},"c3":{"w":[]},"ab":{"w":[]},"Z":{"w":[]},"aZ":{"w":[]},"cc":{"w":[]},"bF":{"w":[]},"cA":{"w":[]},"aD":{"w":[]},"c8":{"w":[]},"cr":{"w":[]},"bD":{"w":[]},"cK":{"a1":[]},"d4":{"r":["a"],"l":["a"],"f":["a"]},"cz":{"r":["a"],"l":["a"],"f":["a"]},"dn":{"r":["a"],"l":["a"],"f":["a"]},"d2":{"r":["a"],"l":["a"],"f":["a"]},"dl":{"r":["a"],"l":["a"],"f":["a"]},"d3":{"r":["a"],"l":["a"],"f":["a"]},"dm":{"r":["a"],"l":["a"],"f":["a"]},"cX":{"r":["n"],"l":["n"],"f":["n"]},"cY":{"r":["n"],"l":["n"],"f":["n"]}}')) A.ic(v.typeUniverse,JSON.parse('{"l":1,"C":1,"bM":1,"c9":2}')) -var u={o:"Cannot fire new event. Controller is already firing an event",c:"Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type",r:"[decodeFunction] decryption failed even after ratchting",u:"[ratchedKeyInternal] cannot ratchet anymore",h:"]: lastError != CryptorError.kOk, reset state to kNew",f:"decodeFunction: decryption success, buffer length ",D:"decodeFunction::decryptFrameInternal: decrypted: ",E:"decodeFunction::decryptFrameInternal: ratchetKey: decryption ok, newState: kKeyRatcheted"} +var u={o:"Cannot fire new event. Controller is already firing an event",c:"Error handler must accept one Object or one Object and a StackTrace as arguments, and return a value of the returned future's type",r:"[decodeFunction] decryption failed even after ratcheting",u:"[ratchetKeyInternal] cannot ratchet anymore",h:"]: lastError != CryptorError.kOk, reset state to kNew",f:"decodeFunction: decryption success, buffer length ",D:"decodeFunction::decryptFrameInternal: decrypted: ",E:"decodeFunction::decryptFrameInternal: ratchetKey: decryption ok, newState: kKeyRatcheted"} var t=(function rtii(){var s=A.ba return{h:s("@<~>"),b:s("ah"),n:s("O"),B:s("c5"),J:s("bg"),V:s("ez"),D:s("aw"),d:s("l<@>"),C:s("w"),G:s("cX"),q:s("cY"),j:s("ak"),Z:s("ax"),O:s("d2"),k:s("d3"),U:s("d4"),R:s("f<@>"),e:s("f"),s:s("z"),r:s("z<@>"),t:s("z"),c:s("z"),u:s("bm"),m:s("q"),g:s("a6"),w:s("P<@>"),x:s("aW"),cK:s("r<@>"),L:s("r"),bG:s("r"),cH:s("aB"),I:s("aX"),f:s("bs<@,@>"),a:s("aY"),P:s("y"),K:s("k"),bW:s("cs"),cY:s("jz"),l:s("a1"),N:s("a5"),a4:s("o"),b7:s("ab"),c0:s("dl"),bk:s("dm"),ca:s("dn"),p:s("cz"),cr:s("bE"),_:s("x<@>"),aQ:s("x"),A:s("b4"),W:s("bV"),y:s("V"),c1:s("V(k)"),i:s("n"),z:s("@"),bd:s("@()"),v:s("@(k)"),Q:s("@(k,a1)"),S:s("a"),a5:s("bj?"),bc:s("a_?"),b1:s("q?"),aF:s("aW?"),X:s("k?"),T:s("a5?"),E:s("cz?"),F:s("aG<@,@>?"),cG:s("V?"),dd:s("n?"),a3:s("a?"),ae:s("aO?"),Y:s("~()?"),o:s("aO"),H:s("~"),M:s("~()"),bo:s("~(k)"),aD:s("~(k,a1)")}})();(function constants(){var s=hunkHelpers.makeConstList B.M=J.cd.prototype diff --git a/lib/src/events.dart b/lib/src/events.dart index 707347bd8..7b0eda7e2 100644 --- a/lib/src/events.dart +++ b/lib/src/events.dart @@ -321,7 +321,7 @@ class TrackUnsubscribedEvent with RoomEvent, ParticipantEvent { 'track: ${track})'; } -/// A Participant has muted one of the track. +/// A Participant has muted one of the tracks. /// Emitted by [RemoteParticipant] and [LocalParticipant]. class TrackMutedEvent with RoomEvent, ParticipantEvent { final Participant participant; diff --git a/web/e2ee.data_packet_cryptor.dart b/web/e2ee.data_packet_cryptor.dart index 60fb27c2f..3de4f8810 100644 --- a/web/e2ee.data_packet_cryptor.dart +++ b/web/e2ee.data_packet_cryptor.dart @@ -177,9 +177,9 @@ class E2EEDataPacketCryptor { } } - Future ratchedKeyInternal() async { + Future ratchetKeyInternal() async { if (ratchetCount >= keyOptions.ratchetWindowSize || keyOptions.ratchetWindowSize <= 0) { - throw Exception('[ratchedKeyInternal] cannot ratchet anymore'); + throw Exception('[ratchetKeyInternal] cannot ratchet anymore'); } final newKeyBuffer = await keyHandler.ratchet(currentkeySet.material, keyOptions.ratchetSalt); @@ -196,11 +196,11 @@ class E2EEDataPacketCryptor { await decryptFrameInternal(); } catch (e) { logger.finer('decodeFunction: kInternalError catch $e'); - await ratchedKeyInternal(); + await ratchetKeyInternal(); } if (decrypted == null) { - throw Exception('[decodeFunction] decryption failed even after ratchting'); + throw Exception('[decodeFunction] decryption failed even after ratcheting'); } // we can now be sure that decryption was a success diff --git a/web/e2ee.frame_cryptor.dart b/web/e2ee.frame_cryptor.dart index a1169e554..0fad34a96 100644 --- a/web/e2ee.frame_cryptor.dart +++ b/web/e2ee.frame_cryptor.dart @@ -400,7 +400,7 @@ class FrameCryptor { srcFrame.buffer.isEmpty) { sifGuard.recordUserFrame(); if (keyOptions.discardFrameWhenCryptorNotReady) return; - logger.fine('enqueing empty dtx frame'); + logger.fine('enqueuing empty dtx frame'); controller.enqueue(frameObj); return; } @@ -419,9 +419,9 @@ class FrameCryptor { final finalBuffer = BytesBuilder(); finalBuffer .add(Uint8List.fromList(srcFrame.buffer.sublist(0, srcFrame.buffer.length - (magicBytes.length + 1)))); - logger.fine('decodeFunction: enqueing silent frame src: ${srcFrame.buffer}'); + logger.fine('decodeFunction: enqueuing silent frame src: ${srcFrame.buffer}'); enqueueFrame(frameObj, controller, finalBuffer); - logger.fine('decodeFunction: enqueing done'); + logger.fine('decodeFunction: enqueuing done'); return; } else { logger.warning('decodeFunction: SIF limit reached, dropping frame'); @@ -514,9 +514,9 @@ class FrameCryptor { } } - Future ratchedKeyInternal() async { + Future ratchetKeyInternal() async { if (ratchetCount >= keyOptions.ratchetWindowSize || keyOptions.ratchetWindowSize <= 0) { - throw Exception('[ratchedKeyInternal] cannot ratchet anymore'); + throw Exception('[ratchetKeyInternal] cannot ratchet anymore'); } final newKeyBuffer = await keyHandler.ratchet(currentkeySet.material, keyOptions.ratchetSalt); @@ -534,11 +534,11 @@ class FrameCryptor { } catch (e) { lastError = CryptorError.kInternalError; logger.finer('decodeFunction: kInternalError catch $e'); - await ratchedKeyInternal(); + await ratchetKeyInternal(); } if (decrypted == null) { - throw Exception('[decodeFunction] decryption failed even after ratchting'); + throw Exception('[decodeFunction] decryption failed even after ratcheting'); } // we can now be sure that decryption was a success From 73650a780c2a2efacff26186ae68f72715d73200 Mon Sep 17 00:00:00 2001 From: Hiroshi Horie <548776+hiroshihorie@users.noreply.github.com> Date: Fri, 12 Dec 2025 18:08:49 +0900 Subject: [PATCH 4/4] Create fix-typos --- .changes/fix-typos | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 .changes/fix-typos diff --git a/.changes/fix-typos b/.changes/fix-typos new file mode 100644 index 000000000..411c2054d --- /dev/null +++ b/.changes/fix-typos @@ -0,0 +1,2 @@ +patch type="docs" "Fix typos and inconsistencies in README and CHANGELOG" +patch type="fixed" "Correct spelling in E2EE log and error messages"