cojson 0.20.7 → 0.20.9

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 (209) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +26 -0
  3. package/dist/SyncStateManager.d.ts.map +1 -1
  4. package/dist/SyncStateManager.js +0 -2
  5. package/dist/SyncStateManager.js.map +1 -1
  6. package/dist/base64url.d.ts +15 -0
  7. package/dist/base64url.d.ts.map +1 -1
  8. package/dist/base64url.js +101 -5
  9. package/dist/base64url.js.map +1 -1
  10. package/dist/base64url.test.js +76 -1
  11. package/dist/base64url.test.js.map +1 -1
  12. package/dist/coValue.d.ts +2 -1
  13. package/dist/coValue.d.ts.map +1 -1
  14. package/dist/coValue.js.map +1 -1
  15. package/dist/coValueCore/coValueCore.d.ts +9 -11
  16. package/dist/coValueCore/coValueCore.d.ts.map +1 -1
  17. package/dist/coValueCore/coValueCore.js +92 -65
  18. package/dist/coValueCore/coValueCore.js.map +1 -1
  19. package/dist/coValueCore/verifiedState.d.ts +38 -7
  20. package/dist/coValueCore/verifiedState.d.ts.map +1 -1
  21. package/dist/coValueCore/verifiedState.js +226 -30
  22. package/dist/coValueCore/verifiedState.js.map +1 -1
  23. package/dist/coValues/binaryCoStream.d.ts +63 -0
  24. package/dist/coValues/binaryCoStream.d.ts.map +1 -0
  25. package/dist/coValues/binaryCoStream.js +125 -0
  26. package/dist/coValues/binaryCoStream.js.map +1 -0
  27. package/dist/coValues/coList.d.ts +3 -1
  28. package/dist/coValues/coList.d.ts.map +1 -1
  29. package/dist/coValues/coList.js +15 -6
  30. package/dist/coValues/coList.js.map +1 -1
  31. package/dist/coValues/coMap.d.ts +1 -1
  32. package/dist/coValues/coMap.d.ts.map +1 -1
  33. package/dist/coValues/coMap.js +2 -2
  34. package/dist/coValues/coMap.js.map +1 -1
  35. package/dist/coValues/coStream.d.ts +0 -38
  36. package/dist/coValues/coStream.d.ts.map +1 -1
  37. package/dist/coValues/coStream.js +0 -86
  38. package/dist/coValues/coStream.js.map +1 -1
  39. package/dist/coValues/group.d.ts +44 -6
  40. package/dist/coValues/group.d.ts.map +1 -1
  41. package/dist/coValues/group.js +198 -17
  42. package/dist/coValues/group.js.map +1 -1
  43. package/dist/coreToCoValue.d.ts +2 -1
  44. package/dist/coreToCoValue.d.ts.map +1 -1
  45. package/dist/coreToCoValue.js +2 -1
  46. package/dist/coreToCoValue.js.map +1 -1
  47. package/dist/crypto/NapiCrypto.d.ts +18 -24
  48. package/dist/crypto/NapiCrypto.d.ts.map +1 -1
  49. package/dist/crypto/NapiCrypto.js +98 -60
  50. package/dist/crypto/NapiCrypto.js.map +1 -1
  51. package/dist/crypto/RNCrypto.d.ts +16 -3
  52. package/dist/crypto/RNCrypto.d.ts.map +1 -1
  53. package/dist/crypto/RNCrypto.js +117 -54
  54. package/dist/crypto/RNCrypto.js.map +1 -1
  55. package/dist/crypto/WasmCrypto.d.ts +18 -24
  56. package/dist/crypto/WasmCrypto.d.ts.map +1 -1
  57. package/dist/crypto/WasmCrypto.js +100 -61
  58. package/dist/crypto/WasmCrypto.js.map +1 -1
  59. package/dist/crypto/crypto.d.ts +55 -19
  60. package/dist/crypto/crypto.d.ts.map +1 -1
  61. package/dist/crypto/crypto.js +14 -3
  62. package/dist/crypto/crypto.js.map +1 -1
  63. package/dist/exports.d.ts +7 -3
  64. package/dist/exports.d.ts.map +1 -1
  65. package/dist/exports.js +4 -2
  66. package/dist/exports.js.map +1 -1
  67. package/dist/localNode.d.ts +3 -1
  68. package/dist/localNode.d.ts.map +1 -1
  69. package/dist/localNode.js +10 -3
  70. package/dist/localNode.js.map +1 -1
  71. package/dist/media.d.ts +1 -1
  72. package/dist/media.d.ts.map +1 -1
  73. package/dist/permissions.d.ts +2 -1
  74. package/dist/permissions.d.ts.map +1 -1
  75. package/dist/permissions.js +19 -3
  76. package/dist/permissions.js.map +1 -1
  77. package/dist/storage/sqliteAsync/client.d.ts +24 -12
  78. package/dist/storage/sqliteAsync/client.d.ts.map +1 -1
  79. package/dist/storage/sqliteAsync/client.js +70 -58
  80. package/dist/storage/sqliteAsync/client.js.map +1 -1
  81. package/dist/storage/sqliteAsync/types.d.ts +1 -1
  82. package/dist/storage/sqliteAsync/types.d.ts.map +1 -1
  83. package/dist/storage/types.d.ts +1 -0
  84. package/dist/storage/types.d.ts.map +1 -1
  85. package/dist/sync.d.ts.map +1 -1
  86. package/dist/sync.js +7 -1
  87. package/dist/sync.js.map +1 -1
  88. package/dist/tests/CojsonMessageChannel.test.js +2 -2
  89. package/dist/tests/SQLiteClientAsync.test.d.ts +2 -0
  90. package/dist/tests/SQLiteClientAsync.test.d.ts.map +1 -0
  91. package/dist/tests/SQLiteClientAsync.test.js +64 -0
  92. package/dist/tests/SQLiteClientAsync.test.js.map +1 -0
  93. package/dist/tests/StorageApiAsync.test.js +2 -8
  94. package/dist/tests/StorageApiAsync.test.js.map +1 -1
  95. package/dist/tests/SyncStateManager.test.js +2 -2
  96. package/dist/tests/WasmCrypto.test.js +1 -15
  97. package/dist/tests/WasmCrypto.test.js.map +1 -1
  98. package/dist/tests/coList.test.js +24 -5
  99. package/dist/tests/coList.test.js.map +1 -1
  100. package/dist/tests/coStream.test.js +4 -3
  101. package/dist/tests/coStream.test.js.map +1 -1
  102. package/dist/tests/coValueCore.initTransaction.test.d.ts +2 -0
  103. package/dist/tests/coValueCore.initTransaction.test.d.ts.map +1 -0
  104. package/dist/tests/coValueCore.initTransaction.test.js +438 -0
  105. package/dist/tests/coValueCore.initTransaction.test.js.map +1 -0
  106. package/dist/tests/coValueCore.test.js +11 -19
  107. package/dist/tests/coValueCore.test.js.map +1 -1
  108. package/dist/tests/crypto.test.js +83 -0
  109. package/dist/tests/crypto.test.js.map +1 -1
  110. package/dist/tests/deleteCoValue.test.js +5 -5
  111. package/dist/tests/deleteCoValue.test.js.map +1 -1
  112. package/dist/tests/group.inheritance.test.js +11 -0
  113. package/dist/tests/group.inheritance.test.js.map +1 -1
  114. package/dist/tests/group.test.js +24 -1
  115. package/dist/tests/group.test.js.map +1 -1
  116. package/dist/tests/groupSealer.test.d.ts +2 -0
  117. package/dist/tests/groupSealer.test.d.ts.map +1 -0
  118. package/dist/tests/groupSealer.test.js +913 -0
  119. package/dist/tests/groupSealer.test.js.map +1 -0
  120. package/dist/tests/setup.js +5 -0
  121. package/dist/tests/setup.js.map +1 -1
  122. package/dist/tests/sync.auth.test.js +10 -10
  123. package/dist/tests/sync.concurrentLoad.test.js +12 -12
  124. package/dist/tests/sync.deleted.test.js +8 -8
  125. package/dist/tests/sync.garbageCollection.test.js +10 -10
  126. package/dist/tests/sync.invite.test.js +12 -12
  127. package/dist/tests/sync.known.test.js +2 -2
  128. package/dist/tests/sync.load.test.js +107 -107
  129. package/dist/tests/sync.mesh.test.js +164 -46
  130. package/dist/tests/sync.mesh.test.js.map +1 -1
  131. package/dist/tests/sync.multipleServers.test.js +43 -43
  132. package/dist/tests/sync.peerReconciliation.test.js +29 -29
  133. package/dist/tests/sync.sharding.test.js +3 -3
  134. package/dist/tests/sync.storage.test.js +104 -104
  135. package/dist/tests/sync.storage.test.js.map +1 -1
  136. package/dist/tests/sync.storageAsync.test.js +56 -56
  137. package/dist/tests/sync.upload.test.js +22 -22
  138. package/dist/tests/testStorage.d.ts +2 -0
  139. package/dist/tests/testStorage.d.ts.map +1 -1
  140. package/dist/tests/testStorage.js +30 -6
  141. package/dist/tests/testStorage.js.map +1 -1
  142. package/dist/typeUtils/isCoValue.js +1 -1
  143. package/dist/typeUtils/isCoValue.js.map +1 -1
  144. package/package.json +4 -4
  145. package/src/SyncStateManager.ts +0 -2
  146. package/src/base64url.test.ts +89 -1
  147. package/src/base64url.ts +134 -6
  148. package/src/coValue.ts +2 -1
  149. package/src/coValueCore/coValueCore.ts +126 -84
  150. package/src/coValueCore/verifiedState.ts +335 -53
  151. package/src/coValues/binaryCoStream.ts +217 -0
  152. package/src/coValues/coList.ts +21 -8
  153. package/src/coValues/coMap.ts +3 -0
  154. package/src/coValues/coStream.ts +0 -170
  155. package/src/coValues/group.ts +270 -21
  156. package/src/coreToCoValue.ts +2 -1
  157. package/src/crypto/NapiCrypto.ts +198 -95
  158. package/src/crypto/RNCrypto.ts +229 -102
  159. package/src/crypto/WasmCrypto.ts +201 -95
  160. package/src/crypto/crypto.ts +118 -45
  161. package/src/exports.ts +11 -5
  162. package/src/localNode.ts +17 -1
  163. package/src/media.ts +1 -1
  164. package/src/permissions.ts +30 -7
  165. package/src/storage/sqliteAsync/client.ts +136 -115
  166. package/src/storage/sqliteAsync/types.ts +3 -1
  167. package/src/storage/types.ts +4 -0
  168. package/src/sync.ts +10 -1
  169. package/src/tests/CojsonMessageChannel.test.ts +2 -2
  170. package/src/tests/SQLiteClientAsync.test.ts +75 -0
  171. package/src/tests/StorageApiAsync.test.ts +4 -9
  172. package/src/tests/SyncStateManager.test.ts +2 -2
  173. package/src/tests/WasmCrypto.test.ts +1 -25
  174. package/src/tests/coList.test.ts +39 -5
  175. package/src/tests/coStream.test.ts +4 -5
  176. package/src/tests/coValueCore.initTransaction.test.ts +836 -0
  177. package/src/tests/coValueCore.test.ts +11 -22
  178. package/src/tests/crypto.test.ts +107 -0
  179. package/src/tests/deleteCoValue.test.ts +5 -5
  180. package/src/tests/group.inheritance.test.ts +16 -0
  181. package/src/tests/group.test.ts +29 -1
  182. package/src/tests/groupSealer.test.ts +1473 -0
  183. package/src/tests/setup.ts +6 -0
  184. package/src/tests/sync.auth.test.ts +10 -10
  185. package/src/tests/sync.concurrentLoad.test.ts +12 -12
  186. package/src/tests/sync.deleted.test.ts +8 -8
  187. package/src/tests/sync.garbageCollection.test.ts +10 -10
  188. package/src/tests/sync.invite.test.ts +12 -12
  189. package/src/tests/sync.known.test.ts +2 -2
  190. package/src/tests/sync.load.test.ts +107 -107
  191. package/src/tests/sync.mesh.test.ts +189 -46
  192. package/src/tests/sync.multipleServers.test.ts +43 -43
  193. package/src/tests/sync.peerReconciliation.test.ts +29 -29
  194. package/src/tests/sync.sharding.test.ts +3 -3
  195. package/src/tests/sync.storage.test.ts +104 -104
  196. package/src/tests/sync.storageAsync.test.ts +56 -56
  197. package/src/tests/sync.upload.test.ts +22 -22
  198. package/src/tests/testStorage.ts +39 -9
  199. package/src/typeUtils/isCoValue.ts +1 -1
  200. package/dist/coValueCore/SessionMap.d.ts +0 -55
  201. package/dist/coValueCore/SessionMap.d.ts.map +0 -1
  202. package/dist/coValueCore/SessionMap.js +0 -206
  203. package/dist/coValueCore/SessionMap.js.map +0 -1
  204. package/dist/tests/coreWasm.test.d.ts +0 -2
  205. package/dist/tests/coreWasm.test.d.ts.map +0 -1
  206. package/dist/tests/coreWasm.test.js +0 -203
  207. package/dist/tests/coreWasm.test.js.map +0 -1
  208. package/src/coValueCore/SessionMap.ts +0 -394
  209. package/src/tests/coreWasm.test.ts +0 -452
@@ -1,7 +1,6 @@
1
1
  import {
2
2
  JsonValue,
3
3
  RawCoID,
4
- SessionID,
5
4
  Stringified,
6
5
  base64URLtoBytes,
7
6
  bytesToBase64url,
@@ -9,23 +8,16 @@ import {
9
8
  import { CojsonInternalTypes } from "../exports.js";
10
9
  import { TransactionID } from "../ids.js";
11
10
  import { stableStringify } from "../jsonStringify.js";
12
- import { JsonObject } from "../jsonValue.js";
13
11
  import { logger } from "../logger.js";
14
- import { ControlledAccountOrAgent } from "../coValues/account.js";
15
- import {
16
- PrivateTransaction,
17
- Transaction,
18
- TrustingTransaction,
19
- } from "../coValueCore/verifiedState.js";
12
+ import { Transaction } from "../coValueCore/verifiedState.js";
20
13
  import {
21
14
  CryptoProvider,
22
- KeyID,
23
- KeySecret,
24
15
  Sealed,
16
+ SealedForGroup,
25
17
  SealerID,
26
18
  SealerSecret,
27
- SessionLogImpl,
28
- Signature,
19
+ SessionMapImpl,
20
+ ShortHash,
29
21
  SignerID,
30
22
  SignerSecret,
31
23
  textDecoder,
@@ -41,13 +33,19 @@ import {
41
33
  newX25519PrivateKey,
42
34
  getSealerId,
43
35
  getSignerId,
36
+ shortHash,
44
37
  sign,
45
38
  seal,
39
+ sealForGroup,
46
40
  unseal,
41
+ unsealForGroup,
47
42
  Blake3Hasher,
48
- SessionLog,
43
+ bytesToBase64url as nativeBytesToBase64url,
44
+ base64urlToBytes as nativeBase64urlToBytes,
45
+ bytesToBase64 as nativeBytesToBase64,
46
+ SessionMap as RNSessionMap,
49
47
  } from "cojson-core-rn";
50
- import { WasmCrypto } from "./WasmCrypto.js";
48
+ import { setNativeBase64Implementation } from "../base64url.js";
51
49
 
52
50
  type Blake3State = Blake3Hasher;
53
51
 
@@ -94,6 +92,11 @@ export class RNCrypto extends CryptoProvider<Blake3State> {
94
92
  blake3HashOnceWithContext(toArrayBuffer(data), toArrayBuffer(context)),
95
93
  );
96
94
  }
95
+
96
+ shortHash(value: JsonValue): ShortHash {
97
+ return shortHash(stableStringify(value)) as ShortHash;
98
+ }
99
+
97
100
  seal<T extends JsonValue>({
98
101
  message,
99
102
  from,
@@ -137,15 +140,75 @@ export class RNCrypto extends CryptoProvider<Blake3State> {
137
140
  return undefined;
138
141
  }
139
142
  }
140
- createSessionLog(
143
+
144
+ sealForGroup<T extends JsonValue>({
145
+ message,
146
+ to,
147
+ nOnceMaterial,
148
+ }: {
149
+ message: T;
150
+ to: SealerID;
151
+ nOnceMaterial: { in: RawCoID; tx: TransactionID };
152
+ }): SealedForGroup<T> {
153
+ const messageBuffer = toArrayBuffer(
154
+ textEncoder.encode(stableStringify(message)),
155
+ );
156
+ const nOnceBuffer = toArrayBuffer(
157
+ textEncoder.encode(stableStringify(nOnceMaterial)),
158
+ );
159
+
160
+ return `sealedForGroup_U${bytesToBase64url(
161
+ new Uint8Array(sealForGroup(messageBuffer, to, nOnceBuffer)),
162
+ )}` as SealedForGroup<T>;
163
+ }
164
+
165
+ unsealForGroup<T extends JsonValue>(
166
+ sealed: SealedForGroup<T>,
167
+ groupSealerSecret: SealerSecret,
168
+ nOnceMaterial: { in: RawCoID; tx: TransactionID },
169
+ ): T | undefined {
170
+ try {
171
+ const sealedBytes = base64URLtoBytes(
172
+ sealed.substring("sealedForGroup_U".length),
173
+ );
174
+ const nonceBuffer = toArrayBuffer(
175
+ textEncoder.encode(stableStringify(nOnceMaterial)),
176
+ );
177
+
178
+ const plaintext = textDecoder.decode(
179
+ unsealForGroup(
180
+ toArrayBuffer(sealedBytes),
181
+ groupSealerSecret,
182
+ nonceBuffer,
183
+ ),
184
+ );
185
+ return JSON.parse(plaintext) as T;
186
+ } catch (e) {
187
+ logger.error("Failed to decrypt/parse sealed for group message", {
188
+ err: e,
189
+ });
190
+ return undefined;
191
+ }
192
+ }
193
+
194
+ createSessionMap(
141
195
  coID: RawCoID,
142
- sessionID: SessionID,
143
- signerID?: SignerID,
144
- ): SessionLogImpl {
145
- return new SessionLogAdapter(new SessionLog(coID, sessionID, signerID));
196
+ headerJson: string,
197
+ maxTxSize?: number,
198
+ skipVerify?: boolean,
199
+ ): SessionMapImpl {
200
+ return new SessionMapAdapter(
201
+ new RNSessionMap(coID, headerJson, maxTxSize, skipVerify),
202
+ );
146
203
  }
147
204
 
148
205
  static async create(): Promise<RNCrypto> {
206
+ // Register native base64 implementation for React Native
207
+ setNativeBase64Implementation({
208
+ bytesToBase64url: nativeBytesToBase64url,
209
+ base64urlToBytes: nativeBase64urlToBytes,
210
+ bytesToBase64: nativeBytesToBase64,
211
+ });
149
212
  return new RNCrypto();
150
213
  }
151
214
 
@@ -214,112 +277,176 @@ export class RNCrypto extends CryptoProvider<Blake3State> {
214
277
  }
215
278
  }
216
279
 
217
- class SessionLogAdapter implements SessionLogImpl {
218
- constructor(private readonly sessionLog: SessionLog) {}
280
+ /**
281
+ * Adapter wrapping RNSessionMap to implement SessionMapImpl interface
282
+ */
283
+ class SessionMapAdapter implements SessionMapImpl {
284
+ constructor(private readonly sessionMap: RNSessionMap) {}
285
+
286
+ // === Header ===
287
+ getHeader(): string {
288
+ return this.sessionMap.getHeader();
289
+ }
219
290
 
220
- tryAdd(
221
- transactions: Transaction[],
222
- newSignature: Signature,
291
+ // === Transaction Operations ===
292
+ addTransactions(
293
+ sessionId: string,
294
+ signerId: string | undefined,
295
+ transactionsJson: string,
296
+ signature: string,
223
297
  skipVerify: boolean,
224
298
  ): void {
225
- // Use direct calls instead of JSON.stringify for better performance
226
- for (const tx of transactions) {
227
- if (tx.privacy === "private") {
228
- this.sessionLog.addExistingPrivateTransaction(
229
- tx.encryptedChanges,
230
- tx.keyUsed,
231
- tx.madeAt,
232
- tx.meta,
233
- );
234
- } else {
235
- this.sessionLog.addExistingTrustingTransaction(
236
- tx.changes,
237
- tx.madeAt,
238
- tx.meta,
239
- );
240
- }
241
- }
242
- this.sessionLog.commitTransactions(newSignature, skipVerify);
299
+ this.sessionMap.addTransactions(
300
+ sessionId,
301
+ signerId,
302
+ transactionsJson,
303
+ signature,
304
+ skipVerify,
305
+ );
243
306
  }
244
307
 
245
- addNewPrivateTransaction(
246
- signerAgent: ControlledAccountOrAgent,
247
- changes: JsonValue[],
248
- keyID: KeyID,
249
- keySecret: KeySecret,
308
+ makeNewPrivateTransaction(
309
+ sessionId: string,
310
+ signerSecret: string,
311
+ changesJson: string,
312
+ keyId: string,
313
+ keySecret: string,
314
+ metaJson: string | undefined,
250
315
  madeAt: number,
251
- meta: JsonObject | undefined,
252
- ) {
253
- const output = this.sessionLog.addNewPrivateTransaction(
254
- // We can avoid stableStringify because it will be encrypted.
255
- JSON.stringify(changes),
256
- signerAgent.currentSignerSecret(),
316
+ ): string {
317
+ return this.sessionMap.makeNewPrivateTransaction(
318
+ sessionId,
319
+ signerSecret,
320
+ changesJson,
321
+ keyId,
257
322
  keySecret,
258
- keyID,
323
+ metaJson,
259
324
  madeAt,
260
- // We can avoid stableStringify because it will be encrypted.
261
- meta ? JSON.stringify(meta) : undefined,
262
325
  );
263
- const parsedOutput = JSON.parse(output);
264
- const transaction: PrivateTransaction = {
265
- privacy: "private",
266
- madeAt,
267
- encryptedChanges: parsedOutput.encrypted_changes,
268
- keyUsed: keyID,
269
- meta: parsedOutput.meta,
270
- };
271
- return { signature: parsedOutput.signature as Signature, transaction };
272
326
  }
273
327
 
274
- addNewTrustingTransaction(
275
- signerAgent: ControlledAccountOrAgent,
276
- changes: JsonValue[],
328
+ makeNewTrustingTransaction(
329
+ sessionId: string,
330
+ signerSecret: string,
331
+ changesJson: string,
332
+ metaJson: string | undefined,
277
333
  madeAt: number,
278
- meta: JsonObject | undefined,
279
- ) {
280
- // We can avoid stableStringify because the changes will be in a string format already.
281
- const stringifiedChanges = JSON.stringify(changes);
282
- // We can avoid stableStringify because the meta will be in a string format already.
283
- const stringifiedMeta = meta ? JSON.stringify(meta) : undefined;
284
- const output = this.sessionLog.addNewTrustingTransaction(
285
- stringifiedChanges,
286
- signerAgent.currentSignerSecret(),
334
+ ): string {
335
+ return this.sessionMap.makeNewTrustingTransaction(
336
+ sessionId,
337
+ signerSecret,
338
+ changesJson,
339
+ metaJson,
287
340
  madeAt,
288
- stringifiedMeta,
289
341
  );
290
- const transaction: TrustingTransaction = {
291
- privacy: "trusting",
292
- madeAt,
293
- changes: stringifiedChanges as Stringified<JsonValue[]>,
294
- meta: stringifiedMeta as Stringified<JsonObject> | undefined,
342
+ }
343
+
344
+ // === Session Queries ===
345
+ getSessionIds(): string[] {
346
+ return this.sessionMap.getSessionIds();
347
+ }
348
+
349
+ getTransactionCount(sessionId: string): number {
350
+ return this.sessionMap.getTransactionCount(sessionId);
351
+ }
352
+
353
+ getTransaction(sessionId: string, txIndex: number): Transaction | undefined {
354
+ const result = this.sessionMap.getTransaction(sessionId, txIndex);
355
+ if (!result) return undefined;
356
+ return JSON.parse(result) as Transaction;
357
+ }
358
+
359
+ getSessionTransactions(
360
+ sessionId: string,
361
+ fromIndex: number,
362
+ ): Transaction[] | undefined {
363
+ const result = this.sessionMap.getSessionTransactions(sessionId, fromIndex);
364
+ if (!result) return undefined;
365
+ return result.map((tx) => JSON.parse(tx) as Transaction);
366
+ }
367
+
368
+ getLastSignature(sessionId: string): string | undefined {
369
+ return this.sessionMap.getLastSignature(sessionId) ?? undefined;
370
+ }
371
+
372
+ getSignatureAfter(sessionId: string, txIndex: number): string | undefined {
373
+ return this.sessionMap.getSignatureAfter(sessionId, txIndex) ?? undefined;
374
+ }
375
+
376
+ getLastSignatureCheckpoint(sessionId: string): number | undefined {
377
+ return this.sessionMap.getLastSignatureCheckpoint(sessionId) ?? undefined;
378
+ }
379
+
380
+ // === Known State ===
381
+ getKnownState(): {
382
+ id: string;
383
+ header: boolean;
384
+ sessions: Record<string, number>;
385
+ } {
386
+ // Uniffi returns a Record with Map<string, number> for sessions
387
+ // Convert Map to Record for consistency
388
+ // Type assertion needed until Uniffi types are regenerated
389
+ const ks = this.sessionMap.getKnownState() as unknown as {
390
+ id: string;
391
+ header: boolean;
392
+ sessions: Map<string, number>;
393
+ };
394
+ return {
395
+ id: ks.id,
396
+ header: ks.header,
397
+ sessions: Object.fromEntries(ks.sessions),
295
398
  };
296
- return { signature: output as Signature, transaction };
297
399
  }
298
400
 
299
- decryptNextTransactionChangesJson(
300
- txIndex: number,
301
- keySecret: KeySecret,
302
- ): string {
303
- return this.sessionLog.decryptNextTransactionChangesJson(
304
- txIndex,
305
- keySecret,
306
- );
401
+ getKnownStateWithStreaming():
402
+ | { id: string; header: boolean; sessions: Record<string, number> }
403
+ | undefined {
404
+ // Uniffi returns a Record with Map<string, number> for sessions
405
+ // Type assertion needed until Uniffi types are regenerated
406
+ const ks = this.sessionMap.getKnownStateWithStreaming() as unknown as
407
+ | { id: string; header: boolean; sessions: Map<string, number> }
408
+ | undefined;
409
+ if (!ks || ks === undefined) return undefined;
410
+ return {
411
+ id: ks.id,
412
+ header: ks.header,
413
+ sessions: Object.fromEntries(ks.sessions),
414
+ };
307
415
  }
308
416
 
309
- decryptNextTransactionMetaJson(
310
- txIndex: number,
311
- keySecret: KeySecret,
312
- ): string | undefined {
313
- return this.sessionLog.decryptNextTransactionMetaJson(txIndex, keySecret);
417
+ setStreamingKnownState(streamingJson: string): void {
418
+ this.sessionMap.setStreamingKnownState(streamingJson);
314
419
  }
315
420
 
316
- free(): void {
317
- this.sessionLog.uniffiDestroy();
421
+ // === Deletion ===
422
+ markAsDeleted(): void {
423
+ this.sessionMap.markAsDeleted();
318
424
  }
319
425
 
320
- clone(): SessionLogImpl {
321
- return new SessionLogAdapter(
322
- this.sessionLog.cloneSessionLog() as SessionLog,
426
+ isDeleted(): boolean {
427
+ return this.sessionMap.isDeleted();
428
+ }
429
+
430
+ // === Decryption ===
431
+ decryptTransaction(
432
+ sessionId: string,
433
+ txIndex: number,
434
+ keySecret: string,
435
+ ): string | undefined {
436
+ return (
437
+ this.sessionMap.decryptTransaction(sessionId, txIndex, keySecret) ??
438
+ undefined
439
+ );
440
+ }
441
+
442
+ decryptTransactionMeta(
443
+ sessionId: string,
444
+ txIndex: number,
445
+ keySecret: string,
446
+ ): string | undefined {
447
+ return (
448
+ this.sessionMap.decryptTransactionMeta(sessionId, txIndex, keySecret) ??
449
+ undefined
323
450
  );
324
451
  }
325
452
  }