p2party 0.8.0 → 0.14.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/LICENSE.md +202 -661
  2. package/README.md +736 -404
  3. package/THIRD_PARTY_NOTICES.md +458 -0
  4. package/docs/assets/p2party-cat.svg +1 -0
  5. package/docs/getting-started.md +203 -0
  6. package/docs/protocol-v4-security.md +158 -0
  7. package/docs/references.md +157 -0
  8. package/docs/session-api.md +457 -0
  9. package/docs/wire-format.md +103 -0
  10. package/examples/standalone-e2ee.ts +194 -0
  11. package/lib/api/signalingServerApi.d.ts +6 -7
  12. package/lib/api/webrtc/baseQuery.d.ts +1 -2
  13. package/lib/api/webrtc/disconnectFromAllRoomsQuery.d.ts +1 -2
  14. package/lib/api/webrtc/disconnectFromChannelLabelQuery.d.ts +1 -2
  15. package/lib/api/webrtc/disconnectFromPeerChannelLabelQuery.d.ts +1 -2
  16. package/lib/api/webrtc/disconnectFromPeerQuery.d.ts +3 -3
  17. package/lib/api/webrtc/disconnectFromRoomQuery.d.ts +1 -2
  18. package/lib/api/webrtc/disconnectQuery.d.ts +1 -2
  19. package/lib/api/webrtc/iceGeneration.d.ts +17 -0
  20. package/lib/api/webrtc/iceRepair.d.ts +10 -0
  21. package/lib/api/webrtc/index.d.ts +13 -13
  22. package/lib/api/webrtc/interfaces.d.ts +67 -11
  23. package/lib/api/webrtc/negotiationLock.d.ts +12 -0
  24. package/lib/api/webrtc/openChannelQuery.d.ts +1 -2
  25. package/lib/api/webrtc/pendingIceCandidates.d.ts +14 -0
  26. package/lib/api/webrtc/roomPeer.d.ts +11 -0
  27. package/lib/api/webrtc/sendMessageQuery.d.ts +7 -4
  28. package/lib/api/webrtc/setCandidateQuery.d.ts +1 -2
  29. package/lib/api/webrtc/setDescriptionQuery.d.ts +1 -2
  30. package/lib/cryptography/coverCell.d.ts +65 -0
  31. package/lib/cryptography/cpace.d.ts +41 -0
  32. package/lib/cryptography/ed25519.d.ts +0 -1
  33. package/lib/cryptography/hashStream.d.ts +15 -0
  34. package/lib/cryptography/hkdf.d.ts +3 -0
  35. package/lib/cryptography/identityCrossSig.d.ts +7 -0
  36. package/lib/cryptography/interfaces.d.ts +28 -13
  37. package/lib/cryptography/memory.d.ts +2 -4
  38. package/lib/cryptography/merkle.d.ts +0 -1
  39. package/lib/cryptography/mlkem.d.ts +117 -0
  40. package/lib/cryptography/mnemonic.d.ts +0 -1
  41. package/lib/cryptography/pqHealing.d.ts +268 -0
  42. package/lib/cryptography/pqHealingFrame.d.ts +39 -0
  43. package/lib/cryptography/pqMessageKey.d.ts +30 -0
  44. package/lib/cryptography/random.d.ts +22 -0
  45. package/lib/cryptography/ratchet.d.ts +146 -0
  46. package/lib/cryptography/testModule.d.ts +7 -0
  47. package/lib/cryptography/utils.d.ts +0 -1
  48. package/lib/cryptography/wasmLoader.d.ts +6 -1
  49. package/lib/cryptography/x25519.d.ts +15 -0
  50. package/lib/cryptography/x3dh.d.ts +9 -0
  51. package/lib/db/api.d.ts +54 -22
  52. package/lib/db/db.worker.d.ts +0 -1
  53. package/lib/db/ratchetWrap.d.ts +36 -0
  54. package/lib/db/src/getDB.d.ts +17 -4
  55. package/lib/db/types.d.ts +274 -32
  56. package/lib/db.worker.js +1 -2
  57. package/lib/handlers/chunkFrame.d.ts +13 -0
  58. package/lib/handlers/connectionSignal.d.ts +26 -0
  59. package/lib/handlers/coverEdge.d.ts +42 -0
  60. package/lib/handlers/coverRuntime.d.ts +91 -0
  61. package/lib/handlers/coverScheduler.d.ts +184 -0
  62. package/lib/handlers/coverTransfer.d.ts +46 -0
  63. package/lib/handlers/frameType.d.ts +10 -0
  64. package/lib/handlers/handleChallenge.d.ts +0 -1
  65. package/lib/handlers/handleConnectToPeer.d.ts +0 -1
  66. package/lib/handlers/handleHandshake.d.ts +74 -0
  67. package/lib/handlers/handleMessageQueueing.d.ts +53 -4
  68. package/lib/handlers/handleOpenChannel.d.ts +4 -2
  69. package/lib/handlers/handleQueuedIceCandidates.d.ts +0 -1
  70. package/lib/handlers/handleReadReceipt.d.ts +17 -4
  71. package/lib/handlers/handleReceiveMessage.d.ts +21 -3
  72. package/lib/handlers/handleSendMessage.d.ts +110 -2
  73. package/lib/handlers/handleWebSocketMessage.d.ts +1 -3
  74. package/lib/handlers/handshakeCore.d.ts +95 -0
  75. package/lib/handlers/messageChunkCrypto.d.ts +70 -0
  76. package/lib/handlers/peerRosterDelta.d.ts +12 -0
  77. package/lib/handlers/pqHealingOrchestrator.d.ts +46 -0
  78. package/lib/handlers/pqHealingRuntime.d.ts +82 -0
  79. package/lib/handlers/ratchetGate.d.ts +18 -0
  80. package/lib/handlers/ratchetPersist.d.ts +53 -0
  81. package/lib/handlers/receiptFrame.d.ts +18 -0
  82. package/lib/handlers/receiveMessageKeyLifetime.d.ts +24 -0
  83. package/lib/handlers/reconcile.d.ts +16 -0
  84. package/lib/handlers/transferAbort.d.ts +42 -0
  85. package/lib/index.d.ts +203 -46
  86. package/lib/index.js +1 -2
  87. package/lib/index.min.js +1 -2
  88. package/lib/index.mjs +1 -2
  89. package/lib/libcrypto.provenance.json +45 -0
  90. package/lib/libcrypto.wasm +0 -0
  91. package/lib/middleware/keyPairListenerMiddleware.d.ts +0 -1
  92. package/lib/middleware/roomListenerMiddleware.d.ts +0 -1
  93. package/lib/reducers/commonSlice.d.ts +0 -1
  94. package/lib/reducers/keyPairSlice.d.ts +0 -1
  95. package/lib/reducers/roomSlice.d.ts +65 -3
  96. package/lib/reducers/signalingServerSlice.d.ts +25 -4
  97. package/lib/roomInvite.d.ts +18 -0
  98. package/lib/roomPinAttempts.d.ts +12 -0
  99. package/lib/roomPinVault.d.ts +26 -0
  100. package/lib/roomPolicy.d.ts +60 -0
  101. package/lib/session.d.ts +110 -0
  102. package/lib/session.js +1 -0
  103. package/lib/session.mjs +1 -0
  104. package/lib/store.d.ts +40 -41
  105. package/lib/utils/channelLabel.d.ts +0 -1
  106. package/lib/utils/chunkBounds.d.ts +9 -0
  107. package/lib/utils/constants.d.ts +50 -6
  108. package/lib/utils/debug.d.ts +25 -0
  109. package/lib/utils/drainAndClose.d.ts +5 -0
  110. package/lib/utils/identityRole.d.ts +19 -0
  111. package/lib/utils/interfaces.d.ts +31 -43
  112. package/lib/utils/leafHash.d.ts +13 -0
  113. package/lib/utils/messageTypes.d.ts +0 -1
  114. package/lib/utils/metadata.d.ts +6 -1
  115. package/lib/utils/mutex.d.ts +24 -0
  116. package/lib/utils/protocolVersion.d.ts +5 -0
  117. package/lib/utils/receiptToken.d.ts +7 -0
  118. package/lib/utils/sendQueueKey.d.ts +2 -0
  119. package/lib/utils/signalingAuth.d.ts +8 -0
  120. package/lib/utils/signalingBounds.d.ts +9 -0
  121. package/lib/utils/splitToChunks.d.ts +7 -4
  122. package/lib/utils/uint8array.d.ts +1 -2
  123. package/lib/utils/waitForOpen.d.ts +3 -0
  124. package/lib/utils/zeroFree.d.ts +10 -0
  125. package/package.json +109 -49
  126. package/lib/api/signalingServerApi.d.ts.map +0 -1
  127. package/lib/api/webrtc/baseQuery.d.ts.map +0 -1
  128. package/lib/api/webrtc/disconnectFromAllRoomsQuery.d.ts.map +0 -1
  129. package/lib/api/webrtc/disconnectFromChannelLabelQuery.d.ts.map +0 -1
  130. package/lib/api/webrtc/disconnectFromPeerChannelLabelQuery.d.ts.map +0 -1
  131. package/lib/api/webrtc/disconnectFromPeerQuery.d.ts.map +0 -1
  132. package/lib/api/webrtc/disconnectFromRoomQuery.d.ts.map +0 -1
  133. package/lib/api/webrtc/disconnectQuery.d.ts.map +0 -1
  134. package/lib/api/webrtc/index.d.ts.map +0 -1
  135. package/lib/api/webrtc/interfaces.d.ts.map +0 -1
  136. package/lib/api/webrtc/openChannelQuery.d.ts.map +0 -1
  137. package/lib/api/webrtc/sendMessageQuery.d.ts.map +0 -1
  138. package/lib/api/webrtc/setCandidateQuery.d.ts.map +0 -1
  139. package/lib/api/webrtc/setDescriptionQuery.d.ts.map +0 -1
  140. package/lib/cryptography/chacha20poly1305.d.ts +0 -116
  141. package/lib/cryptography/chacha20poly1305.d.ts.map +0 -1
  142. package/lib/cryptography/ed25519.d.ts.map +0 -1
  143. package/lib/cryptography/interfaces.d.ts.map +0 -1
  144. package/lib/cryptography/memory.d.ts.map +0 -1
  145. package/lib/cryptography/merkle.d.ts.map +0 -1
  146. package/lib/cryptography/mnemonic.d.ts.map +0 -1
  147. package/lib/cryptography/utils.d.ts.map +0 -1
  148. package/lib/cryptography/wasmLoader.d.ts.map +0 -1
  149. package/lib/db/api.d.ts.map +0 -1
  150. package/lib/db/db.worker.d.ts.map +0 -1
  151. package/lib/db/src/getDB.d.ts.map +0 -1
  152. package/lib/db/types.d.ts.map +0 -1
  153. package/lib/db.worker.js.map +0 -1
  154. package/lib/handlers/handleChallenge.d.ts.map +0 -1
  155. package/lib/handlers/handleConnectToPeer.d.ts.map +0 -1
  156. package/lib/handlers/handleMessageQueueing.d.ts.map +0 -1
  157. package/lib/handlers/handleOpenChannel.d.ts.map +0 -1
  158. package/lib/handlers/handleQueuedIceCandidates.d.ts.map +0 -1
  159. package/lib/handlers/handleReadReceipt.d.ts.map +0 -1
  160. package/lib/handlers/handleReceiveMessage.d.ts.map +0 -1
  161. package/lib/handlers/handleSendMessage.d.ts.map +0 -1
  162. package/lib/handlers/handleWebSocketMessage.d.ts.map +0 -1
  163. package/lib/index.d.ts.map +0 -1
  164. package/lib/index.js.map +0 -1
  165. package/lib/index.min.js.map +0 -1
  166. package/lib/index.mjs.map +0 -1
  167. package/lib/middleware/keyPairListenerMiddleware.d.ts.map +0 -1
  168. package/lib/middleware/roomListenerMiddleware.d.ts.map +0 -1
  169. package/lib/reducers/commonSlice.d.ts.map +0 -1
  170. package/lib/reducers/keyPairSlice.d.ts.map +0 -1
  171. package/lib/reducers/roomSlice.d.ts.map +0 -1
  172. package/lib/reducers/signalingServerSlice.d.ts.map +0 -1
  173. package/lib/store.d.ts.map +0 -1
  174. package/lib/utils/allocators.d.ts +0 -22
  175. package/lib/utils/allocators.d.ts.map +0 -1
  176. package/lib/utils/channelLabel.d.ts.map +0 -1
  177. package/lib/utils/constants.d.ts.map +0 -1
  178. package/lib/utils/interfaces.d.ts.map +0 -1
  179. package/lib/utils/messageTypes.d.ts.map +0 -1
  180. package/lib/utils/metadata.d.ts.map +0 -1
  181. package/lib/utils/splitToChunks.d.ts.map +0 -1
  182. package/lib/utils/uint8array.d.ts.map +0 -1
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Public standalone E2EE API — no WebRTC, signaling, Redux, IndexedDB, OPFS,
3
+ * `window`, or `localStorage`.
4
+ *
5
+ * Run from this repository:
6
+ * bun run examples/standalone-e2ee.ts
7
+ *
8
+ * Installed package:
9
+ * import { createSession, generateSessionIdentity, restoreSession }
10
+ * from "p2party/session";
11
+ *
12
+ * The packaged copy detects the missing repository source tree and exercises
13
+ * the installed public session entry point plus its release-matched WASM.
14
+ */
15
+ import { existsSync, readFileSync } from "node:fs";
16
+ import { createRequire } from "node:module";
17
+
18
+ import type { HandshakeTransport } from "../src/session";
19
+
20
+ const sourceSessionUrl = new URL("../src/session.ts", import.meta.url);
21
+ const installedSessionSpecifier: string = "p2party/session";
22
+ const { createSession, generateSessionIdentity, restoreSession } = existsSync(
23
+ sourceSessionUrl,
24
+ )
25
+ ? await import("../src/session")
26
+ : ((await import(
27
+ installedSessionSpecifier
28
+ )) as typeof import("../src/session"));
29
+
30
+ const sourceWasmUrl = new URL(
31
+ "../src/cryptography/libcrypto.wasm",
32
+ import.meta.url,
33
+ );
34
+ const require = createRequire(import.meta.url);
35
+ const wasmFile = readFileSync(
36
+ existsSync(sourceWasmUrl)
37
+ ? sourceWasmUrl
38
+ : require.resolve("p2party/libcrypto.wasm"),
39
+ );
40
+ const wasmBinary = wasmFile.buffer.slice(
41
+ wasmFile.byteOffset,
42
+ wasmFile.byteOffset + wasmFile.byteLength,
43
+ ) as ArrayBuffer;
44
+ const cryptoOptions = { wasmBinary };
45
+
46
+ // One one-way byte pipe. Two pipes form the full-duplex transport that carries
47
+ // the triple-confirmation authenticated handshake; a network app sends these bytes over
48
+ // its own socket/channel instead.
49
+ const makeLink = () => {
50
+ const queued: Uint8Array[] = [];
51
+ const waiters: Array<(bytes: Uint8Array) => void> = [];
52
+ return {
53
+ send(bytes: Uint8Array): void {
54
+ const owned = Uint8Array.from(bytes);
55
+ const waiter = waiters.shift();
56
+ if (waiter) waiter(owned);
57
+ else queued.push(owned);
58
+ },
59
+ recv(): Promise<Uint8Array> {
60
+ const bytes = queued.shift();
61
+ return bytes
62
+ ? Promise.resolve(bytes)
63
+ : new Promise((resolve) => waiters.push(resolve));
64
+ },
65
+ };
66
+ };
67
+
68
+ const main = async () => {
69
+ // Long-term identities. Persist these securely in a real application.
70
+ const [aliceIdentity, bobIdentity] = await Promise.all([
71
+ generateSessionIdentity(cryptoOptions),
72
+ generateSessionIdentity(cryptoOptions),
73
+ ]);
74
+
75
+ const aliceToBob = makeLink();
76
+ const bobToAlice = makeLink();
77
+ const channelId = crypto.getRandomValues(new Uint8Array(16));
78
+ const aliceFingerprint = crypto.getRandomValues(new Uint8Array(32));
79
+ const bobFingerprint = crypto.getRandomValues(new Uint8Array(32));
80
+
81
+ const transport = (
82
+ send: (bytes: Uint8Array) => void,
83
+ recv: () => Promise<Uint8Array>,
84
+ ): HandshakeTransport => ({ send, recv });
85
+
86
+ // Both peers run concurrently. `x25519SecretKey` is the identity DH secret;
87
+ // the Ed25519 key anchors/cross-signs it and is never passed as idSelfSec.
88
+ const [alice, bob] = await Promise.all([
89
+ createSession({
90
+ role: "initiator",
91
+ identity: aliceIdentity,
92
+ peerIdentityEd25519PublicKey: bobIdentity.ed25519PublicKey,
93
+ channel: {
94
+ channelId,
95
+ localFingerprint: aliceFingerprint,
96
+ remoteFingerprint: bobFingerprint,
97
+ },
98
+ transport: transport(aliceToBob.send, bobToAlice.recv),
99
+ mode: "nopin",
100
+ crypto: cryptoOptions,
101
+ }),
102
+ createSession({
103
+ role: "responder",
104
+ identity: bobIdentity,
105
+ peerIdentityEd25519PublicKey: aliceIdentity.ed25519PublicKey,
106
+ channel: {
107
+ channelId,
108
+ localFingerprint: bobFingerprint,
109
+ remoteFingerprint: aliceFingerprint,
110
+ },
111
+ transport: transport(bobToAlice.send, aliceToBob.recv),
112
+ mode: "nopin",
113
+ crypto: cryptoOptions,
114
+ }),
115
+ ]);
116
+ console.log("handshake complete — protocol", alice.protocolVersion);
117
+ if (!alice.canEncrypt || !bob.canEncrypt)
118
+ throw new Error("both sessions must be ready to encrypt after handshake");
119
+
120
+ // The envelope carries the Merkle root once alongside uniform chunk frames.
121
+ // Produce both message-0 envelopes before either side decrypts: the handshake
122
+ // primes both ratchet directions, so responder-first and simultaneous sends
123
+ // need no application-level initiator-first ordering.
124
+ const encoder = new TextEncoder();
125
+ const decoder = new TextDecoder();
126
+ const aliceMessage = encoder.encode("hello bob, from alice");
127
+ const bobMessage = encoder.encode("hi alice, bob here");
128
+ const [aliceEnvelope, bobEnvelope] = await Promise.all([
129
+ alice.encrypt(aliceMessage),
130
+ bob.encrypt(bobMessage),
131
+ ]);
132
+ const [receivedByBob, receivedByAlice] = await Promise.all([
133
+ bob.decrypt(aliceEnvelope),
134
+ alice.decrypt(bobEnvelope),
135
+ ]);
136
+ console.log("alice → bob:", decoder.decode(receivedByBob));
137
+ console.log("bob → alice:", decoder.decode(receivedByAlice));
138
+
139
+ // Snapshots are plaintext secrets: encrypt them at rest and protect against
140
+ // rollback. Restoration needs no Redux/DB and continues the same ratchet.
141
+ const aliceSnapshot = await alice.serialize();
142
+ const restoredAlice = await restoreSession(aliceSnapshot, cryptoOptions);
143
+ await alice.destroy();
144
+
145
+ const afterRestore = encoder.encode("still here after restore");
146
+ const restoredMessage = await restoredAlice.decrypt(
147
+ await bob.encrypt(afterRestore),
148
+ );
149
+ if (decoder.decode(restoredMessage) !== decoder.decode(afterRestore))
150
+ throw new Error("restore round-trip mismatch");
151
+
152
+ // Protocol-v4 sparse post-quantum healing over the store-free control API.
153
+ // The persist-before-send contract: whenever a call returns a frame, the
154
+ // caller must serialize() before delivering it so a crash cannot fork the
155
+ // OFFER/ADVANCE/ACK sequence. Drive one exchange to reach epoch 1.
156
+ for (let index = 0; index < 64; index += 1)
157
+ await bob.decrypt(await restoredAlice.encrypt(encoder.encode(`m${index}`)));
158
+ const offer = await restoredAlice.prepareHealing();
159
+ if (offer.frame) {
160
+ await restoredAlice.serialize();
161
+ const advance = await bob.acceptControlFrame(offer.frame);
162
+ if (!advance.frame) throw new Error("expected ADVANCE");
163
+ await bob.serialize();
164
+ const ack = await restoredAlice.acceptControlFrame(advance.frame);
165
+ if (!ack.frame) throw new Error("expected ACK");
166
+ await restoredAlice.serialize();
167
+ await bob.acceptControlFrame(ack.frame);
168
+ if (restoredAlice.pqEpoch !== 1n || bob.pqEpoch !== 1n)
169
+ throw new Error("sparse-PQ healing did not reach epoch 1");
170
+ const healed = encoder.encode("post-quantum healed");
171
+ const healedRoundTrip = await bob.decrypt(
172
+ await restoredAlice.encrypt(healed),
173
+ );
174
+ if (decoder.decode(healedRoundTrip) !== decoder.decode(healed))
175
+ throw new Error("post-heal round-trip mismatch");
176
+ console.log("sparse-PQ healing reached epoch:", String(bob.pqEpoch));
177
+ }
178
+
179
+ aliceIdentity.ed25519SecretKey.fill(0);
180
+ aliceIdentity.x25519SecretKey.fill(0);
181
+ bobIdentity.ed25519SecretKey.fill(0);
182
+ bobIdentity.x25519SecretKey.fill(0);
183
+ aliceSnapshot.fill(0);
184
+ await Promise.all([restoredAlice.destroy(), bob.destroy()]);
185
+
186
+ console.log(
187
+ "\nOK — public createSession E2EE + restore verified (no browser).",
188
+ );
189
+ };
190
+
191
+ main().catch((error) => {
192
+ console.error("FAILED:", error);
193
+ process.exit(1);
194
+ });
@@ -1,16 +1,15 @@
1
1
  import type { BaseQueryFn } from "@reduxjs/toolkit/query";
2
- import type { WebSocketMessageCandidateSend, WebSocketMessageDescriptionSend, WebSocketMessageChallengeResponse, WebSocketMessageRoomIdRequest, WebSocketMessagePeersRequest, WebSocketMessageConnectionResponse, WebSocketMessagePongResponse, WebSocketMessageMessageSendRequest, WebSocketPeerConnectionParams } from "../utils/interfaces";
2
+ import type { WebSocketMessageCandidateSend, WebSocketMessageDescriptionSend, WebSocketMessageChallengeResponse, WebSocketMessageRoomIdRequest, WebSocketMessagePeersRequest, WebSocketMessageConnectionResponse, WebSocketMessagePongResponse, WebSocketPeerConnectionParams } from "../utils/interfaces";
3
3
  export interface WebSocketParams {
4
4
  signalingServerUrl: string;
5
5
  }
6
6
  export interface WebSocketMessage {
7
- content: WebSocketMessagePongResponse | WebSocketMessageCandidateSend | WebSocketMessageDescriptionSend | WebSocketMessageChallengeResponse | WebSocketMessageRoomIdRequest | WebSocketMessagePeersRequest | WebSocketMessageConnectionResponse | WebSocketMessageMessageSendRequest;
7
+ content: WebSocketMessagePongResponse | WebSocketMessageCandidateSend | WebSocketMessageDescriptionSend | WebSocketMessageChallengeResponse | WebSocketMessageRoomIdRequest | WebSocketMessagePeersRequest | WebSocketMessageConnectionResponse;
8
8
  }
9
9
  declare const signalingServerApi: import("@reduxjs/toolkit/query").Api<BaseQueryFn<WebSocketParams, undefined>, {
10
- connectWebSocket: import("@reduxjs/toolkit/query").MutationDefinition<string, BaseQueryFn<WebSocketParams, undefined>, never, void, "signalingServerApi", undefined>;
11
- disconnectWebSocket: import("@reduxjs/toolkit/query").MutationDefinition<void, BaseQueryFn<WebSocketParams, undefined>, never, void, "signalingServerApi", undefined>;
12
- sendMessage: import("@reduxjs/toolkit/query").MutationDefinition<WebSocketMessage, BaseQueryFn<WebSocketParams, undefined>, never, void, "signalingServerApi", undefined>;
13
- connectWithPeer: import("@reduxjs/toolkit/query").MutationDefinition<WebSocketPeerConnectionParams, BaseQueryFn<WebSocketParams, undefined>, never, void, "signalingServerApi", undefined>;
10
+ connectWebSocket: import("@reduxjs/toolkit/query").MutationDefinition<string, BaseQueryFn<WebSocketParams, undefined>, never, undefined, "signalingServerApi", undefined>;
11
+ disconnectWebSocket: import("@reduxjs/toolkit/query").MutationDefinition<undefined, BaseQueryFn<WebSocketParams, undefined>, never, undefined, "signalingServerApi", undefined>;
12
+ sendMessage: import("@reduxjs/toolkit/query").MutationDefinition<WebSocketMessage, BaseQueryFn<WebSocketParams, undefined>, never, undefined, "signalingServerApi", undefined>;
13
+ connectWithPeer: import("@reduxjs/toolkit/query").MutationDefinition<WebSocketPeerConnectionParams, BaseQueryFn<WebSocketParams, undefined>, never, undefined, "signalingServerApi", undefined>;
14
14
  }, "signalingServerApi", never, typeof import("@reduxjs/toolkit/query").coreModuleName>;
15
15
  export default signalingServerApi;
16
- //# sourceMappingURL=signalingServerApi.d.ts.map
@@ -4,6 +4,5 @@ export interface RTCPeerConnectionParamsExtend extends RTCPeerConnectionParams {
4
4
  peerConnections: IRTCPeerConnection[];
5
5
  dataChannels: IRTCDataChannel[];
6
6
  }
7
- declare const webrtcBaseQuery: BaseQueryFn<RTCPeerConnectionParamsExtend, void, unknown>;
7
+ declare const webrtcBaseQuery: BaseQueryFn<RTCPeerConnectionParamsExtend, undefined>;
8
8
  export default webrtcBaseQuery;
9
- //# sourceMappingURL=baseQuery.d.ts.map
@@ -4,6 +4,5 @@ export interface RTCDisconnectFromAllRoomsParamsExtension extends RTCDisconnectF
4
4
  peerConnections: IRTCPeerConnection[];
5
5
  dataChannels: IRTCDataChannel[];
6
6
  }
7
- declare const webrtcDisconnectAllRoomsQuery: BaseQueryFn<RTCDisconnectFromAllRoomsParamsExtension, void, unknown>;
7
+ declare const webrtcDisconnectAllRoomsQuery: BaseQueryFn<RTCDisconnectFromAllRoomsParamsExtension, undefined>;
8
8
  export default webrtcDisconnectAllRoomsQuery;
9
- //# sourceMappingURL=disconnectFromAllRoomsQuery.d.ts.map
@@ -3,6 +3,5 @@ import type { IRTCDataChannel, RTCDisconnectFromChannelLabelParams } from "./int
3
3
  export interface RTCDisconnectFromChannelLabelParamsExtension extends RTCDisconnectFromChannelLabelParams {
4
4
  dataChannels: IRTCDataChannel[];
5
5
  }
6
- declare const webrtcDisconnectFromChannelLabelQuery: BaseQueryFn<RTCDisconnectFromChannelLabelParamsExtension, void, unknown>;
6
+ declare const webrtcDisconnectFromChannelLabelQuery: BaseQueryFn<RTCDisconnectFromChannelLabelParamsExtension, undefined>;
7
7
  export default webrtcDisconnectFromChannelLabelQuery;
8
- //# sourceMappingURL=disconnectFromChannelLabelQuery.d.ts.map
@@ -4,6 +4,5 @@ export interface RTCDisconnectFromPeerChannelLabelParamsExtension extends RTCDis
4
4
  peerConnections: IRTCPeerConnection[];
5
5
  dataChannels: IRTCDataChannel[];
6
6
  }
7
- declare const webrtcDisconnectFromPeerChannelLabelQuery: BaseQueryFn<RTCDisconnectFromPeerChannelLabelParamsExtension, void, unknown>;
7
+ declare const webrtcDisconnectFromPeerChannelLabelQuery: BaseQueryFn<RTCDisconnectFromPeerChannelLabelParamsExtension, undefined>;
8
8
  export default webrtcDisconnectFromPeerChannelLabelQuery;
9
- //# sourceMappingURL=disconnectFromPeerChannelLabelQuery.d.ts.map
@@ -1,9 +1,9 @@
1
1
  import type { BaseQueryFn } from "@reduxjs/toolkit/query";
2
- import type { IRTCDataChannel, IRTCPeerConnection, RTCDisconnectFromPeerParams } from "./interfaces";
2
+ import type { IRTCDataChannel, IRTCIceCandidate, IRTCPeerConnection, RTCDisconnectFromPeerParams } from "./interfaces";
3
3
  export interface RTCDisconnectFromPeerParamsExtension extends RTCDisconnectFromPeerParams {
4
4
  peerConnections: IRTCPeerConnection[];
5
5
  dataChannels: IRTCDataChannel[];
6
+ iceCandidates: IRTCIceCandidate[];
6
7
  }
7
- declare const webrtcDisconnectPeerQuery: BaseQueryFn<RTCDisconnectFromPeerParamsExtension, void, unknown>;
8
+ declare const webrtcDisconnectPeerQuery: BaseQueryFn<RTCDisconnectFromPeerParamsExtension, undefined>;
8
9
  export default webrtcDisconnectPeerQuery;
9
- //# sourceMappingURL=disconnectFromPeerQuery.d.ts.map
@@ -4,6 +4,5 @@ export interface RTCDisconnectFromRoomParamsExtension extends RTCDisconnectFromR
4
4
  peerConnections: IRTCPeerConnection[];
5
5
  dataChannels: IRTCDataChannel[];
6
6
  }
7
- declare const webrtcDisconnectRoomQuery: BaseQueryFn<RTCDisconnectFromRoomParamsExtension, void, unknown>;
7
+ declare const webrtcDisconnectRoomQuery: BaseQueryFn<RTCDisconnectFromRoomParamsExtension, undefined>;
8
8
  export default webrtcDisconnectRoomQuery;
9
- //# sourceMappingURL=disconnectFromRoomQuery.d.ts.map
@@ -4,6 +4,5 @@ export interface RTCDisconnectParamsExtension extends RTCDisconnectParams {
4
4
  peerConnections: IRTCPeerConnection[];
5
5
  dataChannels: IRTCDataChannel[];
6
6
  }
7
- declare const webrtcDisconnectQuery: BaseQueryFn<RTCDisconnectParamsExtension, void, unknown>;
7
+ declare const webrtcDisconnectQuery: BaseQueryFn<RTCDisconnectParamsExtension, undefined>;
8
8
  export default webrtcDisconnectQuery;
9
- //# sourceMappingURL=disconnectQuery.d.ts.map
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Return every ICE username fragment advertised by the active remote SDP.
3
+ * Multiple values are legitimate when media sections are not bundled.
4
+ */
5
+ export declare const remoteIceUsernameFragments: (description: RTCSessionDescription | RTCSessionDescriptionInit | null) => Set<string>;
6
+ /**
7
+ * Prefer the structured usernameFragment, but recover the optional `ufrag`
8
+ * candidate extension when signaling supplied only a candidate string.
9
+ */
10
+ export declare const candidateIceUsernameFragment: (candidate: RTCIceCandidateInit) => string | null;
11
+ /**
12
+ * Reject a candidate that explicitly names an ICE generation absent from the
13
+ * active remote description. Candidates without a ufrag remain acceptable:
14
+ * older signaling payloads omit it and the browser can still route them by
15
+ * sdpMid/sdpMLineIndex.
16
+ */
17
+ export declare const candidateMatchesRemoteIceGeneration: (candidate: RTCIceCandidateInit, remoteDescription: RTCSessionDescription | RTCSessionDescriptionInit | null) => boolean;
@@ -0,0 +1,10 @@
1
+ type IceRestartTarget = Pick<RTCPeerConnection, "connectionState" | "signalingState" | "restartIce">;
2
+ export type IceCandidateRepairResult = "restarted" | "disconnected";
3
+ /**
4
+ * Repair a candidate-add failure without ever calling restartIce() after
5
+ * teardown. Active PCs restart in place; closed PCs, or PCs whose restart
6
+ * throws because they closed concurrently, take the room-scoped disconnect
7
+ * path instead.
8
+ */
9
+ export declare const repairIceTransportAfterCandidateFailure: (target: IceRestartTarget, disconnect: () => void | Promise<void>) => Promise<IceCandidateRepairResult>;
10
+ export {};
@@ -1,16 +1,16 @@
1
1
  import type { RTCPeerConnectionParams, RTCSendMessageParams, RTCSetDescriptionParams, RTCSetCandidateParams, RTCOpenChannelParams, RTCDisconnectFromRoomParams, RTCDisconnectFromAllRoomsParams, RTCDisconnectFromPeerParams, RTCDisconnectFromChannelLabelParams, RTCDisconnectFromPeerChannelLabelParams, RTCDisconnectParams } from "./interfaces";
2
- declare const webrtcApi: import("@reduxjs/toolkit/query").Api<import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, {
3
- connectWithPeer: import("@reduxjs/toolkit/query").MutationDefinition<RTCPeerConnectionParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, never, void, "webrtcApi", void>;
4
- setDescription: import("@reduxjs/toolkit/query").MutationDefinition<RTCSetDescriptionParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, never, void, "webrtcApi", void>;
5
- setCandidate: import("@reduxjs/toolkit/query").MutationDefinition<RTCSetCandidateParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, never, void, "webrtcApi", void>;
6
- openChannel: import("@reduxjs/toolkit/query").MutationDefinition<RTCOpenChannelParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, never, void, "webrtcApi", void>;
7
- sendMessage: import("@reduxjs/toolkit/query").MutationDefinition<RTCSendMessageParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, never, void, "webrtcApi", void>;
8
- disconnect: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, never, void, "webrtcApi", void>;
9
- disconnectFromRoom: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectFromRoomParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, never, void, "webrtcApi", void>;
10
- disconnectFromAllRooms: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectFromAllRoomsParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, never, void, "webrtcApi", void>;
11
- disconnectFromPeer: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectFromPeerParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, never, void, "webrtcApi", void>;
12
- disconnectFromChannelLabel: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectFromChannelLabelParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, never, void, "webrtcApi", void>;
13
- disconnectFromPeerChannelLabel: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectFromPeerChannelLabelParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, void, unknown>, never, void, "webrtcApi", void>;
2
+ import type { SendMessageResult } from "../../handlers/handleSendMessage";
3
+ declare const webrtcApi: import("@reduxjs/toolkit/query").Api<import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, {
4
+ connectWithPeer: import("@reduxjs/toolkit/query").MutationDefinition<RTCPeerConnectionParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, never, undefined, "webrtcApi", undefined>;
5
+ setDescription: import("@reduxjs/toolkit/query").MutationDefinition<RTCSetDescriptionParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, never, undefined, "webrtcApi", undefined>;
6
+ setCandidate: import("@reduxjs/toolkit/query").MutationDefinition<RTCSetCandidateParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, never, undefined, "webrtcApi", undefined>;
7
+ openChannel: import("@reduxjs/toolkit/query").MutationDefinition<RTCOpenChannelParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, never, undefined, "webrtcApi", undefined>;
8
+ sendMessage: import("@reduxjs/toolkit/query").MutationDefinition<RTCSendMessageParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, never, SendMessageResult | undefined, "webrtcApi", undefined>;
9
+ disconnect: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, never, undefined, "webrtcApi", undefined>;
10
+ disconnectFromRoom: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectFromRoomParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, never, undefined, "webrtcApi", undefined>;
11
+ disconnectFromAllRooms: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectFromAllRoomsParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, never, undefined, "webrtcApi", undefined>;
12
+ disconnectFromPeer: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectFromPeerParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, never, undefined, "webrtcApi", undefined>;
13
+ disconnectFromChannelLabel: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectFromChannelLabelParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, never, undefined, "webrtcApi", undefined>;
14
+ disconnectFromPeerChannelLabel: import("@reduxjs/toolkit/query").MutationDefinition<RTCDisconnectFromPeerChannelLabelParams, import("@reduxjs/toolkit/query").BaseQueryFn<import("./baseQuery").RTCPeerConnectionParamsExtend, undefined>, never, undefined, "webrtcApi", undefined>;
14
15
  }, "webrtcApi", never, typeof import("@reduxjs/toolkit/query").coreModuleName>;
15
16
  export default webrtcApi;
16
- //# sourceMappingURL=index.d.ts.map
@@ -1,18 +1,66 @@
1
1
  import type { LibCrypto } from "../../cryptography/libcrypto";
2
- export interface IRTCPeerConnectionRoomId {
3
- roomId: string;
4
- receiveMessageModule: LibCrypto;
5
- }
2
+ import type { RatchetState } from "../../cryptography/ratchet";
3
+ import type { RatchetGateLease } from "../../handlers/ratchetGate";
4
+ import type { CoverRuntime } from "../../handlers/coverRuntime";
5
+ import type { SparsePqHealingState } from "../../handlers/pqHealingRuntime";
6
6
  export interface IRTCPeerConnection extends RTCPeerConnection {
7
+ /** The room this transport belongs to. A room/peer pair owns one PC. */
8
+ roomId: string;
7
9
  withPeerId: string;
8
10
  withPeerPublicKey: string;
9
11
  makingOffer: boolean;
10
- rooms: IRTCPeerConnectionRoomId[];
11
- iceCandidates: RTCIceCandidate[];
12
+ ignoreOffer: boolean;
13
+ receiveMessageModule: LibCrypto;
14
+ iceCandidates: RTCIceCandidateInit[];
15
+ /** Persistent control channel for this room/peer transport. */
16
+ mainChannel?: IRTCDataChannel;
17
+ /** Gate ownership captured when this concrete transport is created. */
18
+ ratchetGateLease: RatchetGateLease;
19
+ /** Resolves once the per-transport WASM dependency is ready. */
20
+ initialization?: Promise<void>;
21
+ ratchetState?: RatchetState;
22
+ ratchetEstablished?: Promise<void>;
23
+ messageKeyCache?: Map<string, Uint8Array>;
24
+ /** Maps a live transfer root to its `(dhPub,N)` receive-cache key for cancel cleanup. */
25
+ messageKeyByMerkleRoot?: Map<string, string>;
26
+ /** All configured non-main channels, including connecting channels. */
27
+ messageChannels?: Set<IRTCDataChannel>;
28
+ /**
29
+ * Protocol-v4 atomic edge checkpoint hook. The PQ runtime installs this
30
+ * store-free serializer before the initial ratchet row is committed.
31
+ */
32
+ serializeEdgeCryptoState?: () => Uint8Array;
33
+ /**
34
+ * Protocol-v4 live sparse-PQ runtime for this authenticated edge. Installed
35
+ * synchronously with `ratchetState` after the initial row (ratchet + PQ
36
+ * checkpoint) is durable; destroyed with it on teardown/replacement.
37
+ */
38
+ pqHealingState?: SparsePqHealingState;
39
+ /**
40
+ * Protocol-v4 scheduled-cover runtime, present ONLY on edges of rooms whose
41
+ * authenticated policy selects `coverMode: "scheduled"`. Its presence is the
42
+ * scheduled-mode signal for the send/receive/receipt/cancel paths.
43
+ */
44
+ coverRuntime?: CoverRuntime;
45
+ /**
46
+ * Protocol-v4 scheduled-cover lanes for this edge (both the outbound lanes
47
+ * this peer opens and the inbound lanes the peer opens). Kept SEPARATE from
48
+ * `messageChannels` so continuous cover lanes never block healing quiescence
49
+ * or exhaust the per-edge message-channel budget; cells route purely by type.
50
+ */
51
+ coverChannels?: Set<IRTCDataChannel>;
12
52
  }
13
53
  export interface IRTCDataChannel extends RTCDataChannel {
14
54
  withPeerId: string;
15
- roomIds: string[];
55
+ /** A data channel belongs to exactly one room. */
56
+ roomIds: [string];
57
+ /** Releases queue/channel accounting even when teardown nulls onclose. */
58
+ releaseProtocolResources?: () => void;
59
+ /**
60
+ * Abort an inbound message pipeline, retire its persisted receive key, and
61
+ * delete its storage artifacts after the active handler reaches quiescence.
62
+ */
63
+ cancelReceiveTransfer?: () => Promise<void>;
16
64
  }
17
65
  export interface IRTCMessage {
18
66
  id: string;
@@ -22,14 +70,14 @@ export interface IRTCMessage {
22
70
  channelLabel: string;
23
71
  timestamp: Date;
24
72
  }
25
- export interface IRTCIceCandidate extends RTCIceCandidate {
73
+ export interface IRTCIceCandidate extends RTCIceCandidateInit {
74
+ roomId: string;
26
75
  withPeerId: string;
27
76
  }
28
77
  export interface RTCPeerConnectionParams {
29
78
  peerId: string;
30
79
  peerPublicKey: string;
31
80
  roomId: string;
32
- initiator?: boolean;
33
81
  rtcConfig?: RTCConfiguration;
34
82
  }
35
83
  export interface RTCSetDescriptionParams {
@@ -41,7 +89,8 @@ export interface RTCSetDescriptionParams {
41
89
  }
42
90
  export interface RTCSetCandidateParams {
43
91
  peerId: string;
44
- candidate: RTCIceCandidate;
92
+ roomId: string;
93
+ candidate: RTCIceCandidateInit | RTCIceCandidate;
45
94
  }
46
95
  export interface RTCOpenChannelParams {
47
96
  roomId: string;
@@ -52,6 +101,8 @@ export interface RTCOpenChannelParams {
52
101
  }[];
53
102
  }
54
103
  export interface RTCSendMessageParams {
104
+ /** Random 32-byte lowercase-hex identity allocated by the public API. */
105
+ transferId: string;
55
106
  data: string | File;
56
107
  label: string;
57
108
  roomId: string;
@@ -93,19 +144,24 @@ export interface RTCDisconnectFromAllRoomsParams {
93
144
  }
94
145
  export interface RTCDisconnectFromPeerParams {
95
146
  peerId: string;
147
+ /** When present, tear down only this room/peer transport. */
148
+ roomId?: string;
96
149
  alsoDeleteData?: boolean;
97
150
  }
98
151
  export interface RTCDisconnectFromChannelLabelParams {
152
+ roomId: string;
99
153
  label: string;
100
154
  messageHash?: Uint8Array;
101
155
  alsoDeleteData?: boolean;
102
156
  alsoSendFinishedMessage?: boolean;
103
157
  }
104
158
  export interface RTCDisconnectFromPeerChannelLabelParams {
159
+ roomId: string;
105
160
  peerId: string;
106
161
  label: string;
107
162
  messageHash?: Uint8Array;
108
163
  alsoDeleteData?: boolean;
109
164
  alsoSendFinishedMessage?: boolean;
165
+ /** Internal exact-object selector; prevents a stale callback closing a replacement. */
166
+ channel?: IRTCDataChannel;
110
167
  }
111
- //# sourceMappingURL=interfaces.d.ts.map
@@ -0,0 +1,12 @@
1
+ import { AsyncMutex } from "../../utils/mutex";
2
+ export declare const getRoomPeerMutex: (roomId: string, peerId: string) => AsyncMutex;
3
+ /**
4
+ * Forget a terminal edge only after its current owner and queued signaling
5
+ * operations drain. Deleting a locked mutex would permit a second instance to
6
+ * enter the same critical section concurrently.
7
+ */
8
+ export declare const releaseRoomPeerMutex: (roomId: string, peerId: string) => void;
9
+ /** Narrow test visibility without exposing the mutable registry. */
10
+ export declare const hasRoomPeerMutex: (roomId: string, peerId: string) => boolean;
11
+ export declare const getRoomIdentityMutex: (roomId: string, peerPublicKey: string) => AsyncMutex;
12
+ export declare const releaseRoomIdentityMutex: (roomId: string, peerPublicKey: string) => void;
@@ -4,6 +4,5 @@ export interface RTCOpenChannelParamsExtention extends RTCOpenChannelParams {
4
4
  peerConnections: IRTCPeerConnection[];
5
5
  dataChannels: IRTCDataChannel[];
6
6
  }
7
- declare const webrtcOpenChannelQuery: BaseQueryFn<RTCOpenChannelParamsExtention, void, unknown>;
7
+ declare const webrtcOpenChannelQuery: BaseQueryFn<RTCOpenChannelParamsExtention, undefined>;
8
8
  export default webrtcOpenChannelQuery;
9
- //# sourceMappingURL=openChannelQuery.d.ts.map
@@ -0,0 +1,14 @@
1
+ import type { IRTCIceCandidate } from "./interfaces";
2
+ /** Bounds unauthenticated signaling state held before an SDP creates an edge. */
3
+ export declare const MAX_PENDING_ICE_PER_EDGE = 64;
4
+ export declare const MAX_PENDING_ICE_TOTAL = 1024;
5
+ export declare const normalizeIceCandidate: (candidate: RTCIceCandidateInit | RTCIceCandidate) => RTCIceCandidateInit;
6
+ export declare const enqueuePendingIceCandidate: (queue: IRTCIceCandidate[], roomId: string, peerId: string, candidate: RTCIceCandidateInit) => void;
7
+ export declare const enqueueConnectionIceCandidate: (queue: RTCIceCandidateInit[], candidate: RTCIceCandidateInit) => void;
8
+ export declare const takePendingIceCandidates: (queue: IRTCIceCandidate[], roomId: string, peerId: string) => RTCIceCandidateInit[];
9
+ export declare const discardPendingIceCandidates: (queue: IRTCIceCandidate[], roomId: string, peerId: string) => void;
10
+ /**
11
+ * Abandon one room/peer SDP attempt without disturbing the same peer's ICE
12
+ * candidates in another room.
13
+ */
14
+ export declare const discardIceCandidatesForAttempt: (connectionQueue: RTCIceCandidateInit[], pendingQueue: IRTCIceCandidate[], roomId: string, peerId: string) => void;
@@ -0,0 +1,11 @@
1
+ import type { IRTCPeerConnection } from "./interfaces";
2
+ export declare const isRoomPeerConnection: (connection: IRTCPeerConnection, roomId: string, peerId: string) => boolean;
3
+ export declare const findRoomPeerConnectionIndex: (connections: IRTCPeerConnection[], roomId: string, peerId: string) => number;
4
+ export declare const findRoomPeerConnection: (connections: IRTCPeerConnection[], roomId: string, peerId: string) => IRTCPeerConnection | undefined;
5
+ /**
6
+ * A peerId is a transient signaling handle; the Ed25519 public key is the
7
+ * stable cryptographic identity. Return transports in this room which claim
8
+ * the same stable identity under a different peerId so callers can replace
9
+ * them before a second live ratchet owner is created.
10
+ */
11
+ export declare const findRoomIdentityAliases: (connections: IRTCPeerConnection[], roomId: string, peerId: string, peerPublicKey: string) => IRTCPeerConnection[];
@@ -1,11 +1,14 @@
1
1
  import type { BaseQueryFn } from "@reduxjs/toolkit/query";
2
2
  import type { IRTCDataChannel, IRTCPeerConnection, RTCSendMessageParams } from "./interfaces";
3
+ import type { SendMessageResult } from "../../handlers/handleSendMessage";
3
4
  export interface RTCChannelMessageParamsExtension extends RTCSendMessageParams {
4
5
  peerConnections: IRTCPeerConnection[];
5
6
  dataChannels: IRTCDataChannel[];
6
- encryptionWasmMemory: WebAssembly.Memory;
7
- merkleWasmMemory: WebAssembly.Memory;
8
7
  }
9
- declare const webrtcMessageQuery: BaseQueryFn<RTCChannelMessageParamsExtension, void, unknown>;
8
+ /**
9
+ * Every logical send owns independent fixed WASM memories. Large-file hashing,
10
+ * per-message reconciliation, and reconnect waits therefore never hold a
11
+ * process-wide crypto mutex or block sends in another room.
12
+ */
13
+ declare const webrtcMessageQuery: BaseQueryFn<RTCChannelMessageParamsExtension, SendMessageResult | undefined>;
10
14
  export default webrtcMessageQuery;
11
- //# sourceMappingURL=sendMessageQuery.d.ts.map
@@ -4,6 +4,5 @@ export interface RTCSetCandidateParamsExtention extends RTCSetCandidateParams {
4
4
  peerConnections: IRTCPeerConnection[];
5
5
  iceCandidates: IRTCIceCandidate[];
6
6
  }
7
- declare const webrtcSetIceCandidateQuery: BaseQueryFn<RTCSetCandidateParamsExtention, void, unknown>;
7
+ declare const webrtcSetIceCandidateQuery: BaseQueryFn<RTCSetCandidateParamsExtention, undefined>;
8
8
  export default webrtcSetIceCandidateQuery;
9
- //# sourceMappingURL=setCandidateQuery.d.ts.map
@@ -5,6 +5,5 @@ export interface RTCSetDescriptionParamsExtension extends RTCSetDescriptionParam
5
5
  iceCandidates: IRTCIceCandidate[];
6
6
  dataChannels: IRTCDataChannel[];
7
7
  }
8
- declare const webrtcSetDescriptionQuery: BaseQueryFn<RTCSetDescriptionParamsExtension, void, unknown>;
8
+ declare const webrtcSetDescriptionQuery: BaseQueryFn<RTCSetDescriptionParamsExtension, undefined>;
9
9
  export default webrtcSetDescriptionQuery;
10
- //# sourceMappingURL=setDescriptionQuery.d.ts.map