@g9tm/syncdata 1.2.2 → 1.3.0

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 (56) hide show
  1. package/PARITY.md +26 -2
  2. package/dist/abstractions/errors.d.ts +4 -0
  3. package/dist/abstractions/errors.js +4 -0
  4. package/dist/abstractions/errors.js.map +1 -1
  5. package/dist/client/engine.js +93 -51
  6. package/dist/client/engine.js.map +1 -1
  7. package/dist/client/runs.d.ts +5 -0
  8. package/dist/client/runs.js +8 -7
  9. package/dist/client/runs.js.map +1 -1
  10. package/dist/client/storeTypes.d.ts +22 -1
  11. package/dist/client/storeTypes.js +27 -0
  12. package/dist/client/storeTypes.js.map +1 -1
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.js +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/node/index.d.ts +1 -0
  17. package/dist/node/index.js +1 -0
  18. package/dist/node/index.js.map +1 -1
  19. package/dist/node/snapshotFileSink.d.ts +3 -0
  20. package/dist/node/snapshotFileSink.js +79 -0
  21. package/dist/node/snapshotFileSink.js.map +1 -0
  22. package/dist/protocol/dtos.d.ts +76 -0
  23. package/dist/protocol/dtos.js +2 -0
  24. package/dist/protocol/dtos.js.map +1 -1
  25. package/dist/protocol/wire.d.ts +3 -1
  26. package/dist/protocol/wire.js +49 -0
  27. package/dist/protocol/wire.js.map +1 -1
  28. package/dist/sqlite/apply.d.ts +21 -1
  29. package/dist/sqlite/apply.js +218 -114
  30. package/dist/sqlite/apply.js.map +1 -1
  31. package/dist/sqlite/connection.d.ts +5 -0
  32. package/dist/sqlite/connection.js +17 -0
  33. package/dist/sqlite/connection.js.map +1 -1
  34. package/dist/sqlite/index.d.ts +2 -1
  35. package/dist/sqlite/index.js +1 -0
  36. package/dist/sqlite/index.js.map +1 -1
  37. package/dist/sqlite/options.d.ts +39 -1
  38. package/dist/sqlite/options.js +5 -1
  39. package/dist/sqlite/options.js.map +1 -1
  40. package/dist/sqlite/push.js +4 -1
  41. package/dist/sqlite/push.js.map +1 -1
  42. package/dist/sqlite/query.js +44 -15
  43. package/dist/sqlite/query.js.map +1 -1
  44. package/dist/sqlite/revocation.d.ts +1 -1
  45. package/dist/sqlite/revocation.js +4 -2
  46. package/dist/sqlite/revocation.js.map +1 -1
  47. package/dist/sqlite/snapshotFiles.d.ts +51 -0
  48. package/dist/sqlite/snapshotFiles.js +516 -0
  49. package/dist/sqlite/snapshotFiles.js.map +1 -0
  50. package/dist/sqlite/sql.d.ts +1 -1
  51. package/dist/sqlite/sql.js +4 -0
  52. package/dist/sqlite/sql.js.map +1 -1
  53. package/dist/sqlite/store.d.ts +20 -2
  54. package/dist/sqlite/store.js +147 -78
  55. package/dist/sqlite/store.js.map +1 -1
  56. package/package.json +1 -1
@@ -17,6 +17,8 @@ export declare const G9EPullPartKind: {
17
17
  readonly Snapshot: 0;
18
18
  readonly Delta: 1;
19
19
  readonly Backfill: 2;
20
+ /** A subscription's snapshot as a SQLite file (ADR-0072), streamed as file segments (`G9DtSyncChunk.file`). */
21
+ readonly SnapshotFile: 3;
20
22
  };
21
23
  export type G9EPullPartKind = (typeof G9EPullPartKind)[keyof typeof G9EPullPartKind];
22
24
  /** Outcome of a command executed by the server (`G9ECommandStatus`). */
@@ -67,6 +69,8 @@ export interface G9DtSyncChunk {
67
69
  isFinal: boolean;
68
70
  continuation?: G9DtPullContinuation | null;
69
71
  reconcileSummary?: G9DtReconcileSummary | null;
72
+ /** Set when the chunk carries a snapshot-file segment (ADR-0072): `payload` is then the segment, Brotli-compressed on its own. */
73
+ file?: G9DtFileSegment | null;
70
74
  }
71
75
  /** Server → client hint that tables changed. */
72
76
  export interface G9DtChangesAvailable {
@@ -223,13 +227,85 @@ export interface G9DtPullRequest {
223
227
  tables: G9DtTableColumns[];
224
228
  backfills: G9DtBackfillRequest[];
225
229
  frameVersion: number;
230
+ /** Set when the client accepts large first downloads as SQLite snapshot files (ADR-0072); absent = rows only. */
231
+ snapshotFiles?: G9DtSnapshotFileRequest | null;
226
232
  }
227
233
  export interface G9DtPlannedPart {
228
234
  subscriptionKey: string;
235
+ /** 0 for a snapshot-file part, whose tables are in `file`. */
229
236
  tableId: number;
230
237
  kind: G9EPullPartKind;
231
238
  rows: number;
232
239
  estimatedBytes: number;
240
+ /** The file a snapshot-file part delivers; null for every other kind. */
241
+ file?: G9DtPlannedFile | null;
242
+ }
243
+ /** The client's offer to receive snapshot files: its storage forms and the shape of every table it receives. */
244
+ export interface G9DtSnapshotFileRequest {
245
+ formatVersion: number;
246
+ storage: G9DtSnapshotFileStorage;
247
+ tables: G9DtSnapshotFileTable[];
248
+ minRows: number;
249
+ maxBytes: number;
250
+ maxFiles: number;
251
+ }
252
+ export interface G9DtSnapshotFileStorage {
253
+ dateTimeAsTicks: boolean;
254
+ dateTimeFormat: string;
255
+ decimalAsText: boolean;
256
+ }
257
+ /** One device table: local name, key and synced columns in LOCAL order, declared indexes. */
258
+ export interface G9DtSnapshotFileTable {
259
+ tableId: number;
260
+ localName: string;
261
+ keyColumn: string;
262
+ keyType: G9ESyncColumnType;
263
+ columns: G9DtColumnModel[];
264
+ indexes: G9DtSnapshotFileIndex[];
265
+ }
266
+ export interface G9DtSnapshotFileIndex {
267
+ name: string;
268
+ columns: string[];
269
+ unique: boolean;
270
+ }
271
+ export interface G9DtPlannedFile {
272
+ fileId: string;
273
+ /** When the server's state the file holds was taken (epoch ms UTC; .NET `DateTime SnapshotUtc`). */
274
+ snapshotUtcMs: number;
275
+ tables: G9DtPlannedFileTable[];
276
+ }
277
+ export interface G9DtPlannedFileTable {
278
+ tableId: number;
279
+ rows: number;
280
+ }
281
+ /** One segment of a snapshot file: `length` raw bytes at `offset`, compressed on its own. */
282
+ export interface G9DtFileSegment {
283
+ fileId: string;
284
+ index: number;
285
+ offset: number;
286
+ length: number;
287
+ /** SHA-256 of the raw segment, lower-case hex. */
288
+ sha256: string;
289
+ /** Set on the first segment a stream sends for the file (also after a resume). */
290
+ manifest?: G9DtSnapshotFileManifest | null;
291
+ }
292
+ export interface G9DtSnapshotFileManifest {
293
+ fileId: string;
294
+ formatVersion: number;
295
+ bytes: number;
296
+ segmentBytes: number;
297
+ segments: number;
298
+ sha256: string;
299
+ compression: string;
300
+ /** Epoch ms UTC (.NET `DateTime BuiltUtc`). */
301
+ builtUtcMs: number;
302
+ tables: G9DtSnapshotFileTableInfo[];
303
+ }
304
+ export interface G9DtSnapshotFileTableInfo {
305
+ tableId: number;
306
+ name: string;
307
+ versionTable: string;
308
+ rows: number;
233
309
  }
234
310
  export interface G9DtSubscriptionCursor {
235
311
  key: string;
@@ -14,6 +14,8 @@ export const G9EPullPartKind = {
14
14
  Snapshot: 0,
15
15
  Delta: 1,
16
16
  Backfill: 2,
17
+ /** A subscription's snapshot as a SQLite file (ADR-0072), streamed as file segments (`G9DtSyncChunk.file`). */
18
+ SnapshotFile: 3,
17
19
  };
18
20
  /** Outcome of a command executed by the server (`G9ECommandStatus`). */
19
21
  export const G9ECommandStatus = {
@@ -1 +1 @@
1
- {"version":3,"file":"dtos.js","sourceRoot":"","sources":["../../src/protocol/dtos.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,4FAA4F;AAC5F,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,EAAE,EAAE,CAAC;IACL,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,cAAc,EAAE,CAAC;IACjB,OAAO,EAAE,CAAC;IACV,iBAAiB,EAAE,CAAC;IACpB,SAAS,EAAE,CAAC;CACJ,CAAC;AAGX,uDAAuD;AACvD,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;CACH,CAAC;AAGX,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,EAAE,EAAE,CAAC;IACL,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,CAAC;CACL,CAAC;AAYX,qCAAqC;AACrC,MAAM,UAAU,oBAAoB,CAAC,KAAoB;;IACvD,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,MAAA,KAAK,CAAC,OAAO,mCAAI,IAAI,EAAE,CAAC,CAAC;AACxH,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,aAAa,CAAC,SAA0B;IACtD,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;AAC1H,CAAC","sourcesContent":["// Twins of G9SyncData.Protocol/Dtos/*.cs. Property names are the camelCase of the .NET names (the JSON wire names);\n// the MessagePack codec maps them to the PascalCase keys Nerdbank.MessagePack writes. .NET `long` values are numbers\n// except where they must stay exact: reconciliation digests and conflict masks are G9Long.\nimport type { G9EConflictPolicy, G9EMoveOutPolicy, G9ESyncColumnType, G9ESyncDirection } from '../abstractions/enums.js';\nimport { G9SyncException } from '../abstractions/errors.js';\nimport type { G9Long } from '../abstractions/long.js';\n\n/** What a subscription must do next, as decided by the server (`G9ESubscriptionAction`). */\nexport const G9ESubscriptionAction = {\n Ok: 0,\n Initial: 1,\n Reconcile: 2,\n ResyncRequired: 3,\n Unknown: 4,\n InvalidParameters: 5,\n Forbidden: 6,\n} as const;\nexport type G9ESubscriptionAction = (typeof G9ESubscriptionAction)[keyof typeof G9ESubscriptionAction];\n\n/** Kind of a planned pull part (`G9EPullPartKind`). */\nexport const G9EPullPartKind = {\n Snapshot: 0,\n Delta: 1,\n Backfill: 2,\n} as const;\nexport type G9EPullPartKind = (typeof G9EPullPartKind)[keyof typeof G9EPullPartKind];\n\n/** Outcome of a command executed by the server (`G9ECommandStatus`). */\nexport const G9ECommandStatus = {\n Ok: 0,\n Rejected: 1,\n Superseded: 2,\n} as const;\nexport type G9ECommandStatus = (typeof G9ECommandStatus)[keyof typeof G9ECommandStatus];\n\n// ---------------------------------------------------------------- common\n\nexport interface G9DtSyncError {\n code: string;\n message: string;\n retryable: boolean;\n details?: string | null;\n}\n\n/** `G9DtSyncError.ToException()`. */\nexport function syncErrorToException(error: G9DtSyncError): G9SyncException {\n return new G9SyncException(error.code, error.message, { retryable: error.retryable, details: error.details ?? null });\n}\n\n/** `G9DtSyncError.From(exception)`. */\nexport function syncErrorFrom(exception: G9SyncException): G9DtSyncError {\n return { code: exception.code, message: exception.message, retryable: exception.retryable, details: exception.details };\n}\n\nexport interface G9DtColumnModel {\n name: string;\n type: G9ESyncColumnType;\n nullable: boolean;\n}\n\n/** A subscription as the client holds it: name, canonical parameters and its sync state. */\nexport interface G9DtSubscriptionRef {\n name: string;\n parameters: { [name: string]: string };\n /** Opaque server cursor of the last completed pull. Null before the first pull. */\n cursor?: string | null;\n definitionHash?: string | null;\n authHash?: string | null;\n}\n\n/** Resume point after a chunk. Only chunks that carry one are safe restart points. */\nexport interface G9DtPullContinuation {\n partIndex: number;\n afterKey?: string | null;\n nextSequence: number;\n}\n\n/** One unit of a data stream; `payload` is a G9RowBatch frame. */\nexport interface G9DtSyncChunk {\n sequence: number;\n payload?: Uint8Array | null;\n rowCount: number;\n subscriptionKey?: string | null;\n isFinal: boolean;\n continuation?: G9DtPullContinuation | null;\n reconcileSummary?: G9DtReconcileSummary | null;\n}\n\n/** Server → client hint that tables changed. */\nexport interface G9DtChangesAvailable {\n tables: string[];\n}\n\n// ---------------------------------------------------------------- hello\n\nexport interface G9DtClientTableModel {\n name: string;\n keyColumn: string;\n keyType: G9ESyncColumnType;\n columns: G9DtColumnModel[];\n}\n\nexport interface G9DtHelloRequest {\n clientId: string;\n appVersion?: string | null;\n protocolVersion: number;\n tables: G9DtClientTableModel[];\n subscriptions: G9DtSubscriptionRef[];\n}\n\nexport interface G9DtColumnTypeMismatch {\n name: string;\n clientType: G9ESyncColumnType;\n serverType: G9ESyncColumnType;\n}\n\n/** The column set both sides agreed on for one table. */\nexport interface G9DtNegotiatedTable {\n tableId: number;\n name: string;\n keyColumn: string;\n keyType: G9ESyncColumnType;\n columns: G9DtColumnModel[];\n computedColumns: string[];\n readOnlyColumns: string[];\n missingColumns: string[];\n typeMismatchColumns: G9DtColumnTypeMismatch[];\n direction: G9ESyncDirection;\n conflictPolicy: G9EConflictPolicy;\n}\n\nexport interface G9DtParameterDefinition {\n name: string;\n type: G9ESyncColumnType;\n required: boolean;\n isList: boolean;\n}\n\nexport interface G9DtSubscriptionDependency {\n name: string;\n required: boolean;\n}\n\nexport interface G9DtSubscriptionDefinition {\n name: string;\n parameters: G9DtParameterDefinition[];\n dependsOn: G9DtSubscriptionDependency[];\n tables: string[];\n ephemeral: boolean;\n ttlSeconds: number;\n heavy: boolean;\n moveOutPolicy: G9EMoveOutPolicy;\n reconcileIntervalMinutes: number;\n definitionHash: string;\n}\n\nexport interface G9DtSubscriptionState {\n key: string;\n action: G9ESubscriptionAction;\n definitionHash?: string | null;\n authHash?: string | null;\n message?: string | null;\n}\n\nexport interface G9DtHelloResult {\n epoch: string;\n /** Server clock at the answer, epoch milliseconds UTC (.NET `DateTime ServerTimeUtc`). */\n serverTimeUtcMs: number;\n protocolVersion: number;\n tables: G9DtNegotiatedTable[];\n unknownTables: string[];\n definitions: G9DtSubscriptionDefinition[];\n subscriptions: G9DtSubscriptionState[];\n maxPushRows: number;\n maxPushBytes: number;\n error?: G9DtSyncError | null;\n}\n\n// ---------------------------------------------------------------- push / pull\n\nexport interface G9DtTableColumns {\n tableId: number;\n columns: string[];\n}\n\nexport interface G9DtRowRef {\n tableId: number;\n key: string;\n}\n\nexport interface G9DtCommand {\n commandId: string;\n sequence: number;\n name: string;\n version: number;\n payload: string;\n createdUtcMs: number;\n touched: G9DtRowRef[];\n}\n\nexport interface G9DtCommandResult {\n commandId: string;\n status: G9ECommandStatus;\n code?: string | null;\n message?: string | null;\n result?: string | null;\n}\n\nexport interface G9DtPushRequest {\n clientId: string;\n batchId: number;\n subscriptions: G9DtSubscriptionRef[];\n tables: G9DtTableColumns[];\n commands: G9DtCommand[];\n heldTables: G9DtTableColumns[];\n frameVersion: number;\n}\n\nexport interface G9DtAcceptedRows {\n tableId: number;\n keys: string[];\n versions: number[];\n deleted: boolean[];\n}\n\nexport interface G9DtRowRejection {\n tableId: number;\n key: string;\n code: string;\n message?: string | null;\n sqlState?: string | null;\n constraint?: string | null;\n column?: string | null;\n details?: string | null;\n}\n\nexport interface G9DtRowConflict {\n tableId: number;\n key: string;\n code: string;\n /** Bits (push column order) the server changed after the client's base version; -1 when unknown. */\n serverChangedMask: G9Long;\n partiallyApplied: boolean;\n}\n\nexport interface G9DtPushResult {\n batchId: number;\n alreadyApplied: boolean;\n accepted: G9DtAcceptedRows[];\n rejections: G9DtRowRejection[];\n conflicts: G9DtRowConflict[];\n canonicalFrames: Uint8Array[];\n commandResults: G9DtCommandResult[];\n error?: G9DtSyncError | null;\n}\n\nexport interface G9DtBackfillRequest {\n tableId: number;\n columns: string[];\n}\n\nexport interface G9DtPullRequest {\n clientId: string;\n subscriptions: G9DtSubscriptionRef[];\n tables: G9DtTableColumns[];\n backfills: G9DtBackfillRequest[];\n frameVersion: number;\n}\n\nexport interface G9DtPlannedPart {\n subscriptionKey: string;\n tableId: number;\n kind: G9EPullPartKind;\n rows: number;\n estimatedBytes: number;\n}\n\nexport interface G9DtSubscriptionCursor {\n key: string;\n cursor: string;\n definitionHash: string;\n authHash: string;\n}\n\nexport interface G9DtPullPlan {\n token: string;\n parts: G9DtPlannedPart[];\n totalRows: number;\n estimatedBytes: number;\n cursors: G9DtSubscriptionCursor[];\n skipped: G9DtSubscriptionState[];\n error?: G9DtSyncError | null;\n}\n\nexport interface G9DtTableDigest {\n tableId: number;\n computedColumns: string[];\n /** 256 bucket digests (XOR of row hashes). */\n digests: G9Long[];\n /** 256 bucket row counts. */\n counts: number[];\n}\n\nexport interface G9DtReconcileRequest {\n clientId: string;\n subscription: G9DtSubscriptionRef;\n tables: G9DtTableDigest[];\n frameVersion: number;\n}\n\nexport interface G9DtTableBuckets {\n tableId: number;\n buckets: number[];\n}\n\nexport interface G9DtReconcileSummary {\n cursor: string;\n definitionHash: string;\n authHash: string;\n mismatched: G9DtTableBuckets[];\n}\n\nexport interface G9DtFetchRowsRequest {\n clientId: string;\n subscription: G9DtSubscriptionRef;\n tableId: number;\n keys: string[];\n columns: string[];\n frameVersion: number;\n}\n"]}
1
+ {"version":3,"file":"dtos.js","sourceRoot":"","sources":["../../src/protocol/dtos.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,4FAA4F;AAC5F,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,EAAE,EAAE,CAAC;IACL,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,cAAc,EAAE,CAAC;IACjB,OAAO,EAAE,CAAC;IACV,iBAAiB,EAAE,CAAC;IACpB,SAAS,EAAE,CAAC;CACJ,CAAC;AAGX,uDAAuD;AACvD,MAAM,CAAC,MAAM,eAAe,GAAG;IAC7B,QAAQ,EAAE,CAAC;IACX,KAAK,EAAE,CAAC;IACR,QAAQ,EAAE,CAAC;IACX,+GAA+G;IAC/G,YAAY,EAAE,CAAC;CACP,CAAC;AAGX,wEAAwE;AACxE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,EAAE,EAAE,CAAC;IACL,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,CAAC;CACL,CAAC;AAYX,qCAAqC;AACrC,MAAM,UAAU,oBAAoB,CAAC,KAAoB;;IACvD,OAAO,IAAI,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,MAAA,KAAK,CAAC,OAAO,mCAAI,IAAI,EAAE,CAAC,CAAC;AACxH,CAAC;AAED,uCAAuC;AACvC,MAAM,UAAU,aAAa,CAAC,SAA0B;IACtD,OAAO,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC;AAC1H,CAAC","sourcesContent":["// Twins of G9SyncData.Protocol/Dtos/*.cs. Property names are the camelCase of the .NET names (the JSON wire names);\n// the MessagePack codec maps them to the PascalCase keys Nerdbank.MessagePack writes. .NET `long` values are numbers\n// except where they must stay exact: reconciliation digests and conflict masks are G9Long.\nimport type { G9EConflictPolicy, G9EMoveOutPolicy, G9ESyncColumnType, G9ESyncDirection } from '../abstractions/enums.js';\nimport { G9SyncException } from '../abstractions/errors.js';\nimport type { G9Long } from '../abstractions/long.js';\n\n/** What a subscription must do next, as decided by the server (`G9ESubscriptionAction`). */\nexport const G9ESubscriptionAction = {\n Ok: 0,\n Initial: 1,\n Reconcile: 2,\n ResyncRequired: 3,\n Unknown: 4,\n InvalidParameters: 5,\n Forbidden: 6,\n} as const;\nexport type G9ESubscriptionAction = (typeof G9ESubscriptionAction)[keyof typeof G9ESubscriptionAction];\n\n/** Kind of a planned pull part (`G9EPullPartKind`). */\nexport const G9EPullPartKind = {\n Snapshot: 0,\n Delta: 1,\n Backfill: 2,\n /** A subscription's snapshot as a SQLite file (ADR-0072), streamed as file segments (`G9DtSyncChunk.file`). */\n SnapshotFile: 3,\n} as const;\nexport type G9EPullPartKind = (typeof G9EPullPartKind)[keyof typeof G9EPullPartKind];\n\n/** Outcome of a command executed by the server (`G9ECommandStatus`). */\nexport const G9ECommandStatus = {\n Ok: 0,\n Rejected: 1,\n Superseded: 2,\n} as const;\nexport type G9ECommandStatus = (typeof G9ECommandStatus)[keyof typeof G9ECommandStatus];\n\n// ---------------------------------------------------------------- common\n\nexport interface G9DtSyncError {\n code: string;\n message: string;\n retryable: boolean;\n details?: string | null;\n}\n\n/** `G9DtSyncError.ToException()`. */\nexport function syncErrorToException(error: G9DtSyncError): G9SyncException {\n return new G9SyncException(error.code, error.message, { retryable: error.retryable, details: error.details ?? null });\n}\n\n/** `G9DtSyncError.From(exception)`. */\nexport function syncErrorFrom(exception: G9SyncException): G9DtSyncError {\n return { code: exception.code, message: exception.message, retryable: exception.retryable, details: exception.details };\n}\n\nexport interface G9DtColumnModel {\n name: string;\n type: G9ESyncColumnType;\n nullable: boolean;\n}\n\n/** A subscription as the client holds it: name, canonical parameters and its sync state. */\nexport interface G9DtSubscriptionRef {\n name: string;\n parameters: { [name: string]: string };\n /** Opaque server cursor of the last completed pull. Null before the first pull. */\n cursor?: string | null;\n definitionHash?: string | null;\n authHash?: string | null;\n}\n\n/** Resume point after a chunk. Only chunks that carry one are safe restart points. */\nexport interface G9DtPullContinuation {\n partIndex: number;\n afterKey?: string | null;\n nextSequence: number;\n}\n\n/** One unit of a data stream; `payload` is a G9RowBatch frame. */\nexport interface G9DtSyncChunk {\n sequence: number;\n payload?: Uint8Array | null;\n rowCount: number;\n subscriptionKey?: string | null;\n isFinal: boolean;\n continuation?: G9DtPullContinuation | null;\n reconcileSummary?: G9DtReconcileSummary | null;\n /** Set when the chunk carries a snapshot-file segment (ADR-0072): `payload` is then the segment, Brotli-compressed on its own. */\n file?: G9DtFileSegment | null;\n}\n\n/** Server → client hint that tables changed. */\nexport interface G9DtChangesAvailable {\n tables: string[];\n}\n\n// ---------------------------------------------------------------- hello\n\nexport interface G9DtClientTableModel {\n name: string;\n keyColumn: string;\n keyType: G9ESyncColumnType;\n columns: G9DtColumnModel[];\n}\n\nexport interface G9DtHelloRequest {\n clientId: string;\n appVersion?: string | null;\n protocolVersion: number;\n tables: G9DtClientTableModel[];\n subscriptions: G9DtSubscriptionRef[];\n}\n\nexport interface G9DtColumnTypeMismatch {\n name: string;\n clientType: G9ESyncColumnType;\n serverType: G9ESyncColumnType;\n}\n\n/** The column set both sides agreed on for one table. */\nexport interface G9DtNegotiatedTable {\n tableId: number;\n name: string;\n keyColumn: string;\n keyType: G9ESyncColumnType;\n columns: G9DtColumnModel[];\n computedColumns: string[];\n readOnlyColumns: string[];\n missingColumns: string[];\n typeMismatchColumns: G9DtColumnTypeMismatch[];\n direction: G9ESyncDirection;\n conflictPolicy: G9EConflictPolicy;\n}\n\nexport interface G9DtParameterDefinition {\n name: string;\n type: G9ESyncColumnType;\n required: boolean;\n isList: boolean;\n}\n\nexport interface G9DtSubscriptionDependency {\n name: string;\n required: boolean;\n}\n\nexport interface G9DtSubscriptionDefinition {\n name: string;\n parameters: G9DtParameterDefinition[];\n dependsOn: G9DtSubscriptionDependency[];\n tables: string[];\n ephemeral: boolean;\n ttlSeconds: number;\n heavy: boolean;\n moveOutPolicy: G9EMoveOutPolicy;\n reconcileIntervalMinutes: number;\n definitionHash: string;\n}\n\nexport interface G9DtSubscriptionState {\n key: string;\n action: G9ESubscriptionAction;\n definitionHash?: string | null;\n authHash?: string | null;\n message?: string | null;\n}\n\nexport interface G9DtHelloResult {\n epoch: string;\n /** Server clock at the answer, epoch milliseconds UTC (.NET `DateTime ServerTimeUtc`). */\n serverTimeUtcMs: number;\n protocolVersion: number;\n tables: G9DtNegotiatedTable[];\n unknownTables: string[];\n definitions: G9DtSubscriptionDefinition[];\n subscriptions: G9DtSubscriptionState[];\n maxPushRows: number;\n maxPushBytes: number;\n error?: G9DtSyncError | null;\n}\n\n// ---------------------------------------------------------------- push / pull\n\nexport interface G9DtTableColumns {\n tableId: number;\n columns: string[];\n}\n\nexport interface G9DtRowRef {\n tableId: number;\n key: string;\n}\n\nexport interface G9DtCommand {\n commandId: string;\n sequence: number;\n name: string;\n version: number;\n payload: string;\n createdUtcMs: number;\n touched: G9DtRowRef[];\n}\n\nexport interface G9DtCommandResult {\n commandId: string;\n status: G9ECommandStatus;\n code?: string | null;\n message?: string | null;\n result?: string | null;\n}\n\nexport interface G9DtPushRequest {\n clientId: string;\n batchId: number;\n subscriptions: G9DtSubscriptionRef[];\n tables: G9DtTableColumns[];\n commands: G9DtCommand[];\n heldTables: G9DtTableColumns[];\n frameVersion: number;\n}\n\nexport interface G9DtAcceptedRows {\n tableId: number;\n keys: string[];\n versions: number[];\n deleted: boolean[];\n}\n\nexport interface G9DtRowRejection {\n tableId: number;\n key: string;\n code: string;\n message?: string | null;\n sqlState?: string | null;\n constraint?: string | null;\n column?: string | null;\n details?: string | null;\n}\n\nexport interface G9DtRowConflict {\n tableId: number;\n key: string;\n code: string;\n /** Bits (push column order) the server changed after the client's base version; -1 when unknown. */\n serverChangedMask: G9Long;\n partiallyApplied: boolean;\n}\n\nexport interface G9DtPushResult {\n batchId: number;\n alreadyApplied: boolean;\n accepted: G9DtAcceptedRows[];\n rejections: G9DtRowRejection[];\n conflicts: G9DtRowConflict[];\n canonicalFrames: Uint8Array[];\n commandResults: G9DtCommandResult[];\n error?: G9DtSyncError | null;\n}\n\nexport interface G9DtBackfillRequest {\n tableId: number;\n columns: string[];\n}\n\nexport interface G9DtPullRequest {\n clientId: string;\n subscriptions: G9DtSubscriptionRef[];\n tables: G9DtTableColumns[];\n backfills: G9DtBackfillRequest[];\n frameVersion: number;\n /** Set when the client accepts large first downloads as SQLite snapshot files (ADR-0072); absent = rows only. */\n snapshotFiles?: G9DtSnapshotFileRequest | null;\n}\n\nexport interface G9DtPlannedPart {\n subscriptionKey: string;\n /** 0 for a snapshot-file part, whose tables are in `file`. */\n tableId: number;\n kind: G9EPullPartKind;\n rows: number;\n estimatedBytes: number;\n /** The file a snapshot-file part delivers; null for every other kind. */\n file?: G9DtPlannedFile | null;\n}\n\n// ---------------------------------------------------------------- snapshot files (ADR-0072)\n\n/** The client's offer to receive snapshot files: its storage forms and the shape of every table it receives. */\nexport interface G9DtSnapshotFileRequest {\n formatVersion: number;\n storage: G9DtSnapshotFileStorage;\n tables: G9DtSnapshotFileTable[];\n minRows: number;\n maxBytes: number;\n maxFiles: number;\n}\n\nexport interface G9DtSnapshotFileStorage {\n dateTimeAsTicks: boolean;\n dateTimeFormat: string;\n decimalAsText: boolean;\n}\n\n/** One device table: local name, key and synced columns in LOCAL order, declared indexes. */\nexport interface G9DtSnapshotFileTable {\n tableId: number;\n localName: string;\n keyColumn: string;\n keyType: G9ESyncColumnType;\n columns: G9DtColumnModel[];\n indexes: G9DtSnapshotFileIndex[];\n}\n\nexport interface G9DtSnapshotFileIndex {\n name: string;\n columns: string[];\n unique: boolean;\n}\n\nexport interface G9DtPlannedFile {\n fileId: string;\n /** When the server's state the file holds was taken (epoch ms UTC; .NET `DateTime SnapshotUtc`). */\n snapshotUtcMs: number;\n tables: G9DtPlannedFileTable[];\n}\n\nexport interface G9DtPlannedFileTable {\n tableId: number;\n rows: number;\n}\n\n/** One segment of a snapshot file: `length` raw bytes at `offset`, compressed on its own. */\nexport interface G9DtFileSegment {\n fileId: string;\n index: number;\n offset: number;\n length: number;\n /** SHA-256 of the raw segment, lower-case hex. */\n sha256: string;\n /** Set on the first segment a stream sends for the file (also after a resume). */\n manifest?: G9DtSnapshotFileManifest | null;\n}\n\nexport interface G9DtSnapshotFileManifest {\n fileId: string;\n formatVersion: number;\n bytes: number;\n segmentBytes: number;\n segments: number;\n sha256: string;\n compression: string;\n /** Epoch ms UTC (.NET `DateTime BuiltUtc`). */\n builtUtcMs: number;\n tables: G9DtSnapshotFileTableInfo[];\n}\n\nexport interface G9DtSnapshotFileTableInfo {\n tableId: number;\n name: string;\n versionTable: string;\n rows: number;\n}\n\nexport interface G9DtSubscriptionCursor {\n key: string;\n cursor: string;\n definitionHash: string;\n authHash: string;\n}\n\nexport interface G9DtPullPlan {\n token: string;\n parts: G9DtPlannedPart[];\n totalRows: number;\n estimatedBytes: number;\n cursors: G9DtSubscriptionCursor[];\n skipped: G9DtSubscriptionState[];\n error?: G9DtSyncError | null;\n}\n\nexport interface G9DtTableDigest {\n tableId: number;\n computedColumns: string[];\n /** 256 bucket digests (XOR of row hashes). */\n digests: G9Long[];\n /** 256 bucket row counts. */\n counts: number[];\n}\n\nexport interface G9DtReconcileRequest {\n clientId: string;\n subscription: G9DtSubscriptionRef;\n tables: G9DtTableDigest[];\n frameVersion: number;\n}\n\nexport interface G9DtTableBuckets {\n tableId: number;\n buckets: number[];\n}\n\nexport interface G9DtReconcileSummary {\n cursor: string;\n definitionHash: string;\n authHash: string;\n mismatched: G9DtTableBuckets[];\n}\n\nexport interface G9DtFetchRowsRequest {\n clientId: string;\n subscription: G9DtSubscriptionRef;\n tableId: number;\n keys: string[];\n columns: string[];\n frameVersion: number;\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { G9DtChangesAvailable, G9DtHelloResult, G9DtNegotiatedTable, G9DtPullContinuation, G9DtPullPlan, G9DtPushResult, G9DtReconcileSummary, G9DtSubscriptionDefinition, G9DtSubscriptionState, G9DtSyncChunk, G9DtSyncError } from './dtos.js';
1
+ import type { G9DtChangesAvailable, G9DtHelloResult, G9DtNegotiatedTable, G9DtPullContinuation, G9DtSnapshotFileManifest, G9DtPullPlan, G9DtPushResult, G9DtReconcileSummary, G9DtSubscriptionDefinition, G9DtSubscriptionState, G9DtSyncChunk, G9DtSyncError } from './dtos.js';
2
2
  /** Which SignalR hub protocol a value came from or goes to. */
3
3
  export type G9WireFormat = 'json' | 'messagepack';
4
4
  /** A GUID on its way into MessagePack (written as extension type 2, 16 big-endian bytes, like Nerdbank's Guid converter). */
@@ -25,6 +25,8 @@ export declare function readSubscriptionDefinition(value: unknown): G9DtSubscrip
25
25
  export declare function readSubscriptionState(value: unknown): G9DtSubscriptionState;
26
26
  export declare function readHelloResult(value: unknown): G9DtHelloResult;
27
27
  export declare function readPushResult(value: unknown): G9DtPushResult;
28
+ /** A snapshot-file manifest (wire or persisted). */
29
+ export declare function readFileManifest(value: unknown): G9DtSnapshotFileManifest | null;
28
30
  export declare function readPullPlan(value: unknown): G9DtPullPlan;
29
31
  export declare function readContinuation(value: unknown): G9DtPullContinuation | null;
30
32
  export declare function readReconcileSummary(value: unknown): G9DtReconcileSummary | null;
@@ -266,6 +266,22 @@ export function readPushResult(value) {
266
266
  error: readSyncError(v.error),
267
267
  };
268
268
  }
269
+ /** A wire DateTime (`snapshotUtc`) or the persisted epoch milliseconds (`snapshotUtcMs`) of the same field. */
270
+ function msOf(v, name) {
271
+ return v[name + 'Ms'] !== undefined ? num(v[name + 'Ms']) : dateTimeMs(v[name]);
272
+ }
273
+ function readPlannedFile(value) {
274
+ if (!isPlainObject(value))
275
+ return null;
276
+ return {
277
+ fileId: str(value.fileId),
278
+ snapshotUtcMs: msOf(value, 'snapshotUtc'),
279
+ tables: arr(value.tables).map((t) => {
280
+ const d = obj(t);
281
+ return { tableId: num(d.tableId), rows: num(d.rows) };
282
+ }),
283
+ };
284
+ }
269
285
  function readPlannedPart(value) {
270
286
  const v = obj(value);
271
287
  return {
@@ -274,6 +290,38 @@ function readPlannedPart(value) {
274
290
  kind: num(v.kind),
275
291
  rows: num(v.rows),
276
292
  estimatedBytes: num(v.estimatedBytes),
293
+ file: readPlannedFile(v.file),
294
+ };
295
+ }
296
+ /** A snapshot-file manifest (wire or persisted). */
297
+ export function readFileManifest(value) {
298
+ if (!isPlainObject(value))
299
+ return null;
300
+ return {
301
+ fileId: str(value.fileId),
302
+ formatVersion: num(value.formatVersion),
303
+ bytes: num(value.bytes),
304
+ segmentBytes: num(value.segmentBytes),
305
+ segments: num(value.segments),
306
+ sha256: str(value.sha256),
307
+ compression: str(value.compression, 'br'),
308
+ builtUtcMs: msOf(value, 'builtUtc'),
309
+ tables: arr(value.tables).map((t) => {
310
+ const d = obj(t);
311
+ return { tableId: num(d.tableId), name: str(d.name), versionTable: str(d.versionTable), rows: num(d.rows) };
312
+ }),
313
+ };
314
+ }
315
+ function readFileSegment(value) {
316
+ if (!isPlainObject(value))
317
+ return null;
318
+ return {
319
+ fileId: str(value.fileId),
320
+ index: num(value.index),
321
+ offset: num(value.offset),
322
+ length: num(value.length),
323
+ sha256: str(value.sha256),
324
+ manifest: readFileManifest(value.manifest),
277
325
  };
278
326
  }
279
327
  function readCursor(value) {
@@ -321,6 +369,7 @@ export function readSyncChunk(value) {
321
369
  isFinal: bool(v.isFinal),
322
370
  continuation: readContinuation(v.continuation),
323
371
  reconcileSummary: readReconcileSummary(v.reconcileSummary),
372
+ file: readFileSegment(v.file),
324
373
  };
325
374
  }
326
375
  export function readChangesAvailable(value) {
@@ -1 +1 @@
1
- {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/protocol/wire.ts"],"names":[],"mappings":"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","sourcesContent":["// The wire forms of the DTOs. Both SignalR protocols are decoded to plain objects first — JSON with camelCase names\n// (System.Text.Json, G9SyncJsonContext), MessagePack with the PascalCase names Nerdbank.MessagePack writes, GUIDs as\n// extension type 2 (16 big-endian bytes) and DateTime as the timestamp extension — then normalised here into the DTO\n// interfaces, with every missing field defaulted the way .NET's initialisers default it.\nimport { G9Long, longToNumber } from '../abstractions/long.js';\nimport { tryNormalizeGuid } from '../abstractions/guid.js';\nimport { base64ToBytes } from '../internal/base64.js';\nimport type {\n G9DtAcceptedRows,\n G9DtChangesAvailable,\n G9DtColumnModel,\n G9DtColumnTypeMismatch,\n G9DtCommandResult,\n G9DtHelloResult,\n G9DtNegotiatedTable,\n G9DtPlannedPart,\n G9DtPullContinuation,\n G9DtPullPlan,\n G9DtPushResult,\n G9DtReconcileSummary,\n G9DtRowConflict,\n G9DtRowRejection,\n G9DtSubscriptionCursor,\n G9DtSubscriptionDefinition,\n G9DtSubscriptionState,\n G9DtSyncChunk,\n G9DtSyncError,\n G9DtTableBuckets,\n} from './dtos.js';\n\n/** Which SignalR hub protocol a value came from or goes to. */\nexport type G9WireFormat = 'json' | 'messagepack';\n\n/** A GUID on its way into MessagePack (written as extension type 2, 16 big-endian bytes, like Nerdbank's Guid converter). */\nexport class G9WireGuid {\n readonly value: string;\n\n constructor(value: string) {\n this.value = value;\n }\n}\n\n/** Nerdbank.MessagePack's extension type for System.Guid. */\nexport const GUID_EXTENSION_TYPE = 2;\n\ntype Plain = { [key: string]: unknown };\n\nfunction isPlainObject(value: unknown): value is Plain {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Uint8Array) && !(value instanceof G9Long) && !(value instanceof Date) && !(value instanceof G9WireGuid);\n}\n\nfunction lowerFirst(name: string): string {\n return name.length === 0 ? name : name.charAt(0).toLowerCase() + name.slice(1);\n}\n\nfunction upperFirst(name: string): string {\n return name.length === 0 ? name : name.charAt(0).toUpperCase() + name.slice(1);\n}\n\n/** The camelCase twin of a decoded MessagePack value (a `Parameters` dictionary keeps its own keys). */\nexport function fromMessagePackNames(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(fromMessagePackNames);\n if (!isPlainObject(value)) return value;\n const out: Plain = {};\n for (const key of Object.keys(value)) {\n const item = value[key];\n out[lowerFirst(key)] = key === 'Parameters' && isPlainObject(item) ? copyDictionary(item) : fromMessagePackNames(item);\n }\n return out;\n}\n\n/**\n * The MessagePack form of an outgoing DTO: PascalCase names (a `parameters` dictionary keeps its keys), GUID fields as\n * {@link G9WireGuid}. G9Long values stay as they are (the protocol writes them as int64).\n */\nexport function toMessagePackNames(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(toMessagePackNames);\n if (!isPlainObject(value)) return value;\n const out: Plain = {};\n for (const key of Object.keys(value)) {\n const item = value[key];\n if (item === undefined) continue;\n let mapped: unknown;\n if (key === 'parameters' && isPlainObject(item)) mapped = copyDictionary(item);\n else if (GUID_FIELDS[key] === true && typeof item === 'string') mapped = new G9WireGuid(item);\n else mapped = toMessagePackNames(item);\n out[upperFirst(key)] = mapped;\n }\n return out;\n}\n\n/** DTO fields typed System.Guid on the .NET side. */\nconst GUID_FIELDS: { [key: string]: true } = { clientId: true, commandId: true, epoch: true };\n\nfunction copyDictionary(value: Plain): { [key: string]: string } {\n const out: { [key: string]: string } = {};\n for (const key of Object.keys(value)) out[key] = String(value[key]);\n return out;\n}\n\n// ---------------------------------------------------------------- field readers\n\nfunction obj(value: unknown): Plain {\n return isPlainObject(value) ? value : {};\n}\n\nfunction str(value: unknown, fallback = ''): string {\n return typeof value === 'string' ? value : fallback;\n}\n\nfunction optStr(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\nfunction num(value: unknown): number {\n return value === null || value === undefined ? 0 : longToNumber(value);\n}\n\nfunction bool(value: unknown): boolean {\n return value === true;\n}\n\nfunction long(value: unknown): G9Long {\n if (value instanceof G9Long) return value;\n if (typeof value === 'number') return G9Long.fromNumber(value);\n if (typeof value === 'string' && value !== '') return G9Long.parse(value);\n return G9Long.ZERO;\n}\n\nfunction arr(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction strings(value: unknown): string[] {\n return arr(value).map((v) => str(v));\n}\n\nfunction guid(value: unknown): string {\n if (value instanceof G9WireGuid) return value.value;\n if (typeof value === 'string') return tryNormalizeGuid(value) ?? value;\n return '00000000-0000-0000-0000-000000000000';\n}\n\n/** A byte[] field: base64 text (JSON) or bytes (MessagePack). */\nexport function bytesField(value: unknown): Uint8Array | null {\n if (value instanceof Uint8Array) return value;\n if (typeof value === 'string') return base64ToBytes(value);\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n return null;\n}\n\n/** Epoch milliseconds of a wire DateTime: ISO text (JSON) or a Date (MessagePack timestamp). */\nexport function dateTimeMs(value: unknown): number {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number') return value;\n if (typeof value !== 'string') return 0;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d+))?)?(Z|[+-]\\d{2}:?\\d{2})?$/.exec(value.trim());\n if (!m) return 0;\n const fraction = m[7] ? (m[7] + '00').slice(0, 3) : '0';\n let ms = Date.UTC(+(m[1] as string), +(m[2] as string) - 1, +(m[3] as string), +(m[4] as string), +(m[5] as string), m[6] ? +m[6] : 0, +fraction);\n // Date.UTC maps years 0..99 to 1900..1999.\n if (+(m[1] as string) < 100) {\n const date = new Date(ms);\n date.setUTCFullYear(+(m[1] as string));\n ms = date.getTime();\n }\n const zone = m[8];\n if (zone && zone !== 'Z') {\n const sign = zone.charAt(0) === '-' ? -1 : 1;\n const digits = zone.slice(1).replace(':', '');\n ms -= sign * (+digits.slice(0, 2) * 60 + +digits.slice(2, 4)) * 60000;\n }\n return ms;\n}\n\n// ---------------------------------------------------------------- DTO readers (camelCase input)\n\nexport function readSyncError(value: unknown): G9DtSyncError | null {\n if (!isPlainObject(value)) return null;\n return { code: str(value.code, 'G9S-SRV-ERROR'), message: str(value.message), retryable: bool(value.retryable), details: optStr(value.details) };\n}\n\nfunction readColumn(value: unknown): G9DtColumnModel {\n const v = obj(value);\n return { name: str(v.name), type: num(v.type) as G9DtColumnModel['type'], nullable: bool(v.nullable) };\n}\n\nfunction readMismatch(value: unknown): G9DtColumnTypeMismatch {\n const v = obj(value);\n return { name: str(v.name), clientType: num(v.clientType) as G9DtColumnTypeMismatch['clientType'], serverType: num(v.serverType) as G9DtColumnTypeMismatch['serverType'] };\n}\n\nexport function readNegotiatedTable(value: unknown): G9DtNegotiatedTable {\n const v = obj(value);\n return {\n tableId: num(v.tableId),\n name: str(v.name),\n keyColumn: str(v.keyColumn),\n keyType: num(v.keyType) as G9DtNegotiatedTable['keyType'],\n columns: arr(v.columns).map(readColumn),\n computedColumns: strings(v.computedColumns),\n readOnlyColumns: strings(v.readOnlyColumns),\n missingColumns: strings(v.missingColumns),\n typeMismatchColumns: arr(v.typeMismatchColumns).map(readMismatch),\n direction: num(v.direction) as G9DtNegotiatedTable['direction'],\n conflictPolicy: num(v.conflictPolicy) as G9DtNegotiatedTable['conflictPolicy'],\n };\n}\n\nexport function readSubscriptionDefinition(value: unknown): G9DtSubscriptionDefinition {\n const v = obj(value);\n return {\n name: str(v.name),\n parameters: arr(v.parameters).map((p) => {\n const d = obj(p);\n return { name: str(d.name), type: num(d.type) as G9DtColumnModel['type'], required: bool(d.required), isList: bool(d.isList) };\n }),\n dependsOn: arr(v.dependsOn).map((p) => {\n const d = obj(p);\n return { name: str(d.name), required: d.required === undefined ? true : bool(d.required) };\n }),\n tables: strings(v.tables),\n ephemeral: bool(v.ephemeral),\n ttlSeconds: num(v.ttlSeconds),\n heavy: bool(v.heavy),\n moveOutPolicy: num(v.moveOutPolicy) as G9DtSubscriptionDefinition['moveOutPolicy'],\n reconcileIntervalMinutes: num(v.reconcileIntervalMinutes),\n definitionHash: str(v.definitionHash),\n };\n}\n\nexport function readSubscriptionState(value: unknown): G9DtSubscriptionState {\n const v = obj(value);\n return {\n key: str(v.key),\n action: num(v.action) as G9DtSubscriptionState['action'],\n definitionHash: optStr(v.definitionHash),\n authHash: optStr(v.authHash),\n message: optStr(v.message),\n };\n}\n\nexport function readHelloResult(value: unknown): G9DtHelloResult {\n const v = obj(value);\n return {\n epoch: guid(v.epoch),\n serverTimeUtcMs: dateTimeMs(v.serverTimeUtc),\n protocolVersion: v.protocolVersion === undefined ? 1 : num(v.protocolVersion),\n tables: arr(v.tables).map(readNegotiatedTable),\n unknownTables: strings(v.unknownTables),\n definitions: arr(v.definitions).map(readSubscriptionDefinition),\n subscriptions: arr(v.subscriptions).map(readSubscriptionState),\n maxPushRows: num(v.maxPushRows),\n maxPushBytes: num(v.maxPushBytes),\n error: readSyncError(v.error),\n };\n}\n\nfunction readAccepted(value: unknown): G9DtAcceptedRows {\n const v = obj(value);\n return { tableId: num(v.tableId), keys: strings(v.keys), versions: arr(v.versions).map(num), deleted: arr(v.deleted).map(bool) };\n}\n\nfunction readRejection(value: unknown): G9DtRowRejection {\n const v = obj(value);\n return {\n tableId: num(v.tableId),\n key: str(v.key),\n code: str(v.code, 'G9S-REJ-CONSTRAINT'),\n message: optStr(v.message),\n sqlState: optStr(v.sqlState),\n constraint: optStr(v.constraint),\n column: optStr(v.column),\n details: optStr(v.details),\n };\n}\n\nfunction readConflict(value: unknown): G9DtRowConflict {\n const v = obj(value);\n return {\n tableId: num(v.tableId),\n key: str(v.key),\n code: str(v.code, 'G9S-CON-SERVER-WINS'),\n serverChangedMask: long(v.serverChangedMask),\n partiallyApplied: bool(v.partiallyApplied),\n };\n}\n\nfunction readCommandResult(value: unknown): G9DtCommandResult {\n const v = obj(value);\n return { commandId: guid(v.commandId), status: num(v.status) as G9DtCommandResult['status'], code: optStr(v.code), message: optStr(v.message), result: optStr(v.result) };\n}\n\nexport function readPushResult(value: unknown): G9DtPushResult {\n const v = obj(value);\n return {\n batchId: num(v.batchId),\n alreadyApplied: bool(v.alreadyApplied),\n accepted: arr(v.accepted).map(readAccepted),\n rejections: arr(v.rejections).map(readRejection),\n conflicts: arr(v.conflicts).map(readConflict),\n canonicalFrames: arr(v.canonicalFrames)\n .map(bytesField)\n .filter((b): b is Uint8Array => b !== null),\n commandResults: arr(v.commandResults).map(readCommandResult),\n error: readSyncError(v.error),\n };\n}\n\nfunction readPlannedPart(value: unknown): G9DtPlannedPart {\n const v = obj(value);\n return {\n subscriptionKey: str(v.subscriptionKey),\n tableId: num(v.tableId),\n kind: num(v.kind) as G9DtPlannedPart['kind'],\n rows: num(v.rows),\n estimatedBytes: num(v.estimatedBytes),\n };\n}\n\nfunction readCursor(value: unknown): G9DtSubscriptionCursor {\n const v = obj(value);\n return { key: str(v.key), cursor: str(v.cursor), definitionHash: str(v.definitionHash), authHash: str(v.authHash) };\n}\n\nexport function readPullPlan(value: unknown): G9DtPullPlan {\n const v = obj(value);\n return {\n token: str(v.token),\n parts: arr(v.parts).map(readPlannedPart),\n totalRows: num(v.totalRows),\n estimatedBytes: num(v.estimatedBytes),\n cursors: arr(v.cursors).map(readCursor),\n skipped: arr(v.skipped).map(readSubscriptionState),\n error: readSyncError(v.error),\n };\n}\n\nexport function readContinuation(value: unknown): G9DtPullContinuation | null {\n if (!isPlainObject(value)) return null;\n return { partIndex: num(value.partIndex), afterKey: optStr(value.afterKey), nextSequence: num(value.nextSequence) };\n}\n\nfunction readBuckets(value: unknown): G9DtTableBuckets {\n const v = obj(value);\n return { tableId: num(v.tableId), buckets: arr(v.buckets).map(num) };\n}\n\nexport function readReconcileSummary(value: unknown): G9DtReconcileSummary | null {\n if (!isPlainObject(value)) return null;\n return {\n cursor: str(value.cursor),\n definitionHash: str(value.definitionHash),\n authHash: str(value.authHash),\n mismatched: arr(value.mismatched).map(readBuckets),\n };\n}\n\nexport function readSyncChunk(value: unknown): G9DtSyncChunk {\n const v = obj(value);\n return {\n sequence: num(v.sequence),\n payload: bytesField(v.payload),\n rowCount: num(v.rowCount),\n subscriptionKey: optStr(v.subscriptionKey),\n isFinal: bool(v.isFinal),\n continuation: readContinuation(v.continuation),\n reconcileSummary: readReconcileSummary(v.reconcileSummary),\n };\n}\n\nexport function readChangesAvailable(value: unknown): G9DtChangesAvailable {\n return { tables: strings(obj(value).tables) };\n}\n"]}
1
+ {"version":3,"file":"wire.js","sourceRoot":"","sources":["../../src/protocol/wire.ts"],"names":[],"mappings":"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","sourcesContent":["// The wire forms of the DTOs. Both SignalR protocols are decoded to plain objects first — JSON with camelCase names\n// (System.Text.Json, G9SyncJsonContext), MessagePack with the PascalCase names Nerdbank.MessagePack writes, GUIDs as\n// extension type 2 (16 big-endian bytes) and DateTime as the timestamp extension — then normalised here into the DTO\n// interfaces, with every missing field defaulted the way .NET's initialisers default it.\nimport { G9Long, longToNumber } from '../abstractions/long.js';\nimport { tryNormalizeGuid } from '../abstractions/guid.js';\nimport { base64ToBytes } from '../internal/base64.js';\nimport type {\n G9DtAcceptedRows,\n G9DtChangesAvailable,\n G9DtColumnModel,\n G9DtColumnTypeMismatch,\n G9DtCommandResult,\n G9DtHelloResult,\n G9DtNegotiatedTable,\n G9DtFileSegment,\n G9DtPlannedFile,\n G9DtPlannedPart,\n G9DtPullContinuation,\n G9DtSnapshotFileManifest,\n G9DtPullPlan,\n G9DtPushResult,\n G9DtReconcileSummary,\n G9DtRowConflict,\n G9DtRowRejection,\n G9DtSubscriptionCursor,\n G9DtSubscriptionDefinition,\n G9DtSubscriptionState,\n G9DtSyncChunk,\n G9DtSyncError,\n G9DtTableBuckets,\n} from './dtos.js';\n\n/** Which SignalR hub protocol a value came from or goes to. */\nexport type G9WireFormat = 'json' | 'messagepack';\n\n/** A GUID on its way into MessagePack (written as extension type 2, 16 big-endian bytes, like Nerdbank's Guid converter). */\nexport class G9WireGuid {\n readonly value: string;\n\n constructor(value: string) {\n this.value = value;\n }\n}\n\n/** Nerdbank.MessagePack's extension type for System.Guid. */\nexport const GUID_EXTENSION_TYPE = 2;\n\ntype Plain = { [key: string]: unknown };\n\nfunction isPlainObject(value: unknown): value is Plain {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Uint8Array) && !(value instanceof G9Long) && !(value instanceof Date) && !(value instanceof G9WireGuid);\n}\n\nfunction lowerFirst(name: string): string {\n return name.length === 0 ? name : name.charAt(0).toLowerCase() + name.slice(1);\n}\n\nfunction upperFirst(name: string): string {\n return name.length === 0 ? name : name.charAt(0).toUpperCase() + name.slice(1);\n}\n\n/** The camelCase twin of a decoded MessagePack value (a `Parameters` dictionary keeps its own keys). */\nexport function fromMessagePackNames(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(fromMessagePackNames);\n if (!isPlainObject(value)) return value;\n const out: Plain = {};\n for (const key of Object.keys(value)) {\n const item = value[key];\n out[lowerFirst(key)] = key === 'Parameters' && isPlainObject(item) ? copyDictionary(item) : fromMessagePackNames(item);\n }\n return out;\n}\n\n/**\n * The MessagePack form of an outgoing DTO: PascalCase names (a `parameters` dictionary keeps its keys), GUID fields as\n * {@link G9WireGuid}. G9Long values stay as they are (the protocol writes them as int64).\n */\nexport function toMessagePackNames(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(toMessagePackNames);\n if (!isPlainObject(value)) return value;\n const out: Plain = {};\n for (const key of Object.keys(value)) {\n const item = value[key];\n if (item === undefined) continue;\n let mapped: unknown;\n if (key === 'parameters' && isPlainObject(item)) mapped = copyDictionary(item);\n else if (GUID_FIELDS[key] === true && typeof item === 'string') mapped = new G9WireGuid(item);\n else mapped = toMessagePackNames(item);\n out[upperFirst(key)] = mapped;\n }\n return out;\n}\n\n/** DTO fields typed System.Guid on the .NET side. */\nconst GUID_FIELDS: { [key: string]: true } = { clientId: true, commandId: true, epoch: true };\n\nfunction copyDictionary(value: Plain): { [key: string]: string } {\n const out: { [key: string]: string } = {};\n for (const key of Object.keys(value)) out[key] = String(value[key]);\n return out;\n}\n\n// ---------------------------------------------------------------- field readers\n\nfunction obj(value: unknown): Plain {\n return isPlainObject(value) ? value : {};\n}\n\nfunction str(value: unknown, fallback = ''): string {\n return typeof value === 'string' ? value : fallback;\n}\n\nfunction optStr(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n\nfunction num(value: unknown): number {\n return value === null || value === undefined ? 0 : longToNumber(value);\n}\n\nfunction bool(value: unknown): boolean {\n return value === true;\n}\n\nfunction long(value: unknown): G9Long {\n if (value instanceof G9Long) return value;\n if (typeof value === 'number') return G9Long.fromNumber(value);\n if (typeof value === 'string' && value !== '') return G9Long.parse(value);\n return G9Long.ZERO;\n}\n\nfunction arr(value: unknown): unknown[] {\n return Array.isArray(value) ? value : [];\n}\n\nfunction strings(value: unknown): string[] {\n return arr(value).map((v) => str(v));\n}\n\nfunction guid(value: unknown): string {\n if (value instanceof G9WireGuid) return value.value;\n if (typeof value === 'string') return tryNormalizeGuid(value) ?? value;\n return '00000000-0000-0000-0000-000000000000';\n}\n\n/** A byte[] field: base64 text (JSON) or bytes (MessagePack). */\nexport function bytesField(value: unknown): Uint8Array | null {\n if (value instanceof Uint8Array) return value;\n if (typeof value === 'string') return base64ToBytes(value);\n if (value instanceof ArrayBuffer) return new Uint8Array(value);\n return null;\n}\n\n/** Epoch milliseconds of a wire DateTime: ISO text (JSON) or a Date (MessagePack timestamp). */\nexport function dateTimeMs(value: unknown): number {\n if (value instanceof Date) return value.getTime();\n if (typeof value === 'number') return value;\n if (typeof value !== 'string') return 0;\n const m = /^(\\d{4})-(\\d{2})-(\\d{2})[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d+))?)?(Z|[+-]\\d{2}:?\\d{2})?$/.exec(value.trim());\n if (!m) return 0;\n const fraction = m[7] ? (m[7] + '00').slice(0, 3) : '0';\n let ms = Date.UTC(+(m[1] as string), +(m[2] as string) - 1, +(m[3] as string), +(m[4] as string), +(m[5] as string), m[6] ? +m[6] : 0, +fraction);\n // Date.UTC maps years 0..99 to 1900..1999.\n if (+(m[1] as string) < 100) {\n const date = new Date(ms);\n date.setUTCFullYear(+(m[1] as string));\n ms = date.getTime();\n }\n const zone = m[8];\n if (zone && zone !== 'Z') {\n const sign = zone.charAt(0) === '-' ? -1 : 1;\n const digits = zone.slice(1).replace(':', '');\n ms -= sign * (+digits.slice(0, 2) * 60 + +digits.slice(2, 4)) * 60000;\n }\n return ms;\n}\n\n// ---------------------------------------------------------------- DTO readers (camelCase input)\n\nexport function readSyncError(value: unknown): G9DtSyncError | null {\n if (!isPlainObject(value)) return null;\n return { code: str(value.code, 'G9S-SRV-ERROR'), message: str(value.message), retryable: bool(value.retryable), details: optStr(value.details) };\n}\n\nfunction readColumn(value: unknown): G9DtColumnModel {\n const v = obj(value);\n return { name: str(v.name), type: num(v.type) as G9DtColumnModel['type'], nullable: bool(v.nullable) };\n}\n\nfunction readMismatch(value: unknown): G9DtColumnTypeMismatch {\n const v = obj(value);\n return { name: str(v.name), clientType: num(v.clientType) as G9DtColumnTypeMismatch['clientType'], serverType: num(v.serverType) as G9DtColumnTypeMismatch['serverType'] };\n}\n\nexport function readNegotiatedTable(value: unknown): G9DtNegotiatedTable {\n const v = obj(value);\n return {\n tableId: num(v.tableId),\n name: str(v.name),\n keyColumn: str(v.keyColumn),\n keyType: num(v.keyType) as G9DtNegotiatedTable['keyType'],\n columns: arr(v.columns).map(readColumn),\n computedColumns: strings(v.computedColumns),\n readOnlyColumns: strings(v.readOnlyColumns),\n missingColumns: strings(v.missingColumns),\n typeMismatchColumns: arr(v.typeMismatchColumns).map(readMismatch),\n direction: num(v.direction) as G9DtNegotiatedTable['direction'],\n conflictPolicy: num(v.conflictPolicy) as G9DtNegotiatedTable['conflictPolicy'],\n };\n}\n\nexport function readSubscriptionDefinition(value: unknown): G9DtSubscriptionDefinition {\n const v = obj(value);\n return {\n name: str(v.name),\n parameters: arr(v.parameters).map((p) => {\n const d = obj(p);\n return { name: str(d.name), type: num(d.type) as G9DtColumnModel['type'], required: bool(d.required), isList: bool(d.isList) };\n }),\n dependsOn: arr(v.dependsOn).map((p) => {\n const d = obj(p);\n return { name: str(d.name), required: d.required === undefined ? true : bool(d.required) };\n }),\n tables: strings(v.tables),\n ephemeral: bool(v.ephemeral),\n ttlSeconds: num(v.ttlSeconds),\n heavy: bool(v.heavy),\n moveOutPolicy: num(v.moveOutPolicy) as G9DtSubscriptionDefinition['moveOutPolicy'],\n reconcileIntervalMinutes: num(v.reconcileIntervalMinutes),\n definitionHash: str(v.definitionHash),\n };\n}\n\nexport function readSubscriptionState(value: unknown): G9DtSubscriptionState {\n const v = obj(value);\n return {\n key: str(v.key),\n action: num(v.action) as G9DtSubscriptionState['action'],\n definitionHash: optStr(v.definitionHash),\n authHash: optStr(v.authHash),\n message: optStr(v.message),\n };\n}\n\nexport function readHelloResult(value: unknown): G9DtHelloResult {\n const v = obj(value);\n return {\n epoch: guid(v.epoch),\n serverTimeUtcMs: dateTimeMs(v.serverTimeUtc),\n protocolVersion: v.protocolVersion === undefined ? 1 : num(v.protocolVersion),\n tables: arr(v.tables).map(readNegotiatedTable),\n unknownTables: strings(v.unknownTables),\n definitions: arr(v.definitions).map(readSubscriptionDefinition),\n subscriptions: arr(v.subscriptions).map(readSubscriptionState),\n maxPushRows: num(v.maxPushRows),\n maxPushBytes: num(v.maxPushBytes),\n error: readSyncError(v.error),\n };\n}\n\nfunction readAccepted(value: unknown): G9DtAcceptedRows {\n const v = obj(value);\n return { tableId: num(v.tableId), keys: strings(v.keys), versions: arr(v.versions).map(num), deleted: arr(v.deleted).map(bool) };\n}\n\nfunction readRejection(value: unknown): G9DtRowRejection {\n const v = obj(value);\n return {\n tableId: num(v.tableId),\n key: str(v.key),\n code: str(v.code, 'G9S-REJ-CONSTRAINT'),\n message: optStr(v.message),\n sqlState: optStr(v.sqlState),\n constraint: optStr(v.constraint),\n column: optStr(v.column),\n details: optStr(v.details),\n };\n}\n\nfunction readConflict(value: unknown): G9DtRowConflict {\n const v = obj(value);\n return {\n tableId: num(v.tableId),\n key: str(v.key),\n code: str(v.code, 'G9S-CON-SERVER-WINS'),\n serverChangedMask: long(v.serverChangedMask),\n partiallyApplied: bool(v.partiallyApplied),\n };\n}\n\nfunction readCommandResult(value: unknown): G9DtCommandResult {\n const v = obj(value);\n return { commandId: guid(v.commandId), status: num(v.status) as G9DtCommandResult['status'], code: optStr(v.code), message: optStr(v.message), result: optStr(v.result) };\n}\n\nexport function readPushResult(value: unknown): G9DtPushResult {\n const v = obj(value);\n return {\n batchId: num(v.batchId),\n alreadyApplied: bool(v.alreadyApplied),\n accepted: arr(v.accepted).map(readAccepted),\n rejections: arr(v.rejections).map(readRejection),\n conflicts: arr(v.conflicts).map(readConflict),\n canonicalFrames: arr(v.canonicalFrames)\n .map(bytesField)\n .filter((b): b is Uint8Array => b !== null),\n commandResults: arr(v.commandResults).map(readCommandResult),\n error: readSyncError(v.error),\n };\n}\n\n/** A wire DateTime (`snapshotUtc`) or the persisted epoch milliseconds (`snapshotUtcMs`) of the same field. */\nfunction msOf(v: Plain, name: string): number {\n return v[name + 'Ms'] !== undefined ? num(v[name + 'Ms']) : dateTimeMs(v[name]);\n}\n\nfunction readPlannedFile(value: unknown): G9DtPlannedFile | null {\n if (!isPlainObject(value)) return null;\n return {\n fileId: str(value.fileId),\n snapshotUtcMs: msOf(value, 'snapshotUtc'),\n tables: arr(value.tables).map((t) => {\n const d = obj(t);\n return { tableId: num(d.tableId), rows: num(d.rows) };\n }),\n };\n}\n\nfunction readPlannedPart(value: unknown): G9DtPlannedPart {\n const v = obj(value);\n return {\n subscriptionKey: str(v.subscriptionKey),\n tableId: num(v.tableId),\n kind: num(v.kind) as G9DtPlannedPart['kind'],\n rows: num(v.rows),\n estimatedBytes: num(v.estimatedBytes),\n file: readPlannedFile(v.file),\n };\n}\n\n/** A snapshot-file manifest (wire or persisted). */\nexport function readFileManifest(value: unknown): G9DtSnapshotFileManifest | null {\n if (!isPlainObject(value)) return null;\n return {\n fileId: str(value.fileId),\n formatVersion: num(value.formatVersion),\n bytes: num(value.bytes),\n segmentBytes: num(value.segmentBytes),\n segments: num(value.segments),\n sha256: str(value.sha256),\n compression: str(value.compression, 'br'),\n builtUtcMs: msOf(value, 'builtUtc'),\n tables: arr(value.tables).map((t) => {\n const d = obj(t);\n return { tableId: num(d.tableId), name: str(d.name), versionTable: str(d.versionTable), rows: num(d.rows) };\n }),\n };\n}\n\nfunction readFileSegment(value: unknown): G9DtFileSegment | null {\n if (!isPlainObject(value)) return null;\n return {\n fileId: str(value.fileId),\n index: num(value.index),\n offset: num(value.offset),\n length: num(value.length),\n sha256: str(value.sha256),\n manifest: readFileManifest(value.manifest),\n };\n}\n\nfunction readCursor(value: unknown): G9DtSubscriptionCursor {\n const v = obj(value);\n return { key: str(v.key), cursor: str(v.cursor), definitionHash: str(v.definitionHash), authHash: str(v.authHash) };\n}\n\nexport function readPullPlan(value: unknown): G9DtPullPlan {\n const v = obj(value);\n return {\n token: str(v.token),\n parts: arr(v.parts).map(readPlannedPart),\n totalRows: num(v.totalRows),\n estimatedBytes: num(v.estimatedBytes),\n cursors: arr(v.cursors).map(readCursor),\n skipped: arr(v.skipped).map(readSubscriptionState),\n error: readSyncError(v.error),\n };\n}\n\nexport function readContinuation(value: unknown): G9DtPullContinuation | null {\n if (!isPlainObject(value)) return null;\n return { partIndex: num(value.partIndex), afterKey: optStr(value.afterKey), nextSequence: num(value.nextSequence) };\n}\n\nfunction readBuckets(value: unknown): G9DtTableBuckets {\n const v = obj(value);\n return { tableId: num(v.tableId), buckets: arr(v.buckets).map(num) };\n}\n\nexport function readReconcileSummary(value: unknown): G9DtReconcileSummary | null {\n if (!isPlainObject(value)) return null;\n return {\n cursor: str(value.cursor),\n definitionHash: str(value.definitionHash),\n authHash: str(value.authHash),\n mismatched: arr(value.mismatched).map(readBuckets),\n };\n}\n\nexport function readSyncChunk(value: unknown): G9DtSyncChunk {\n const v = obj(value);\n return {\n sequence: num(v.sequence),\n payload: bytesField(v.payload),\n rowCount: num(v.rowCount),\n subscriptionKey: optStr(v.subscriptionKey),\n isFinal: bool(v.isFinal),\n continuation: readContinuation(v.continuation),\n reconcileSummary: readReconcileSummary(v.reconcileSummary),\n file: readFileSegment(v.file),\n };\n}\n\nexport function readChangesAvailable(value: unknown): G9DtChangesAvailable {\n return { tables: strings(obj(value).tables) };\n}\n"]}
@@ -28,6 +28,8 @@ export declare class ApplyContext {
28
28
  }[];
29
29
  rows: number;
30
30
  hasRevoked: boolean;
31
+ /** The database holds a trigger the library did not create: bulk disposals would not be exact (row by row then). */
32
+ hasForeignTriggers: boolean;
31
33
  private readonly _dirtyTables;
32
34
  private readonly _tableTime;
33
35
  private readonly _progress;
@@ -38,6 +40,9 @@ export declare class ApplyContext {
38
40
  isDirty(tid: number, key: string): boolean;
39
41
  hasDirty(tid: number): boolean;
40
42
  wantsChangedKey(table: string): boolean;
43
+ get maxChangedKeys(): number;
44
+ /** Counts rows applied in bulk (a snapshot file's table) and reports progress once for them. */
45
+ advance(rows: number): void;
41
46
  addChanged(table: string, key: string): void;
42
47
  tick(): void;
43
48
  /** Queues a script; flushes when the batch is full. */
@@ -71,7 +76,10 @@ export declare function endApply(context: ApplyContext): Promise<void>;
71
76
  export declare function isLibraryTrigger(store: StoreInternals, name: string): boolean;
72
77
  /** The triggers the library did not create. */
73
78
  export declare function foreignTriggerNames(store: StoreInternals, connection: G9SqliteConnection): Promise<string[]>;
74
- /** Rows changed after a sequence, table by table (`g9_rows_feed (tid, local_seq)` serves each read). */
79
+ /**
80
+ * Rows changed after a sequence, table by table (`g9_rows_feed (tid, local_seq)` serves each part) — as ONE statement:
81
+ * a query per table cost a bridge call per table on every apply (LES-0055).
82
+ */
75
83
  export declare function readRowsChangedAfter(store: StoreInternals, connection: G9SqliteConnection, sequence: number, add: (tid: number, key: string) => void): Promise<void>;
76
84
  /** Rows each table receives from snapshot parts of a plan, by server table id. */
77
85
  export declare function snapshotRowsByTable(plan: G9DtPullPlan): Map<number, number>;
@@ -81,6 +89,18 @@ export declare function downloadDurability(store: StoreInternals, connection: G9
81
89
  export declare function applyFrame(store: StoreInternals, context: ApplyContext, frame: Uint8Array, subscriptionKey: string | null): Promise<void>;
82
90
  /** `MoveOut`: drops the membership; with a Delete policy a row nobody holds goes through the revocation policy. */
83
91
  export declare function moveOut(store: StoreInternals, context: ApplyContext, table: LocalTable, key: string, subscriptionKey: string, slot: number, ephemeral: boolean, policy: G9EMoveOutPolicy): Promise<void>;
92
+ /**
93
+ * A run of move-outs of one table (a MoveOut section of a frame, or a reconciliation's move-out keys), with the database
94
+ * state the row-by-row {@link moveOut} leaves. Row by row a released row costs ~8 driver calls (flush, read metadata,
95
+ * commands, the app row, the writes, the clock): ~34 ms per row on the Android emulator, minutes for a large office
96
+ * change. Here every membership update is queued and flushed once, then the released rows are disposed in bulk by
97
+ * disposeReleasedRows — read in three queries, decided in the same order, written in batches with each row's explicit
98
+ * local_seq (the clock's value the row-by-row path gives it), the clock moved once by the number of rows. Exact for the
99
+ * same reasons as an unsubscribe (ADR-0071 addendum) plus one: the keys of a run are distinct, so no row's membership
100
+ * update can change another row's decision. Ephemeral subscriptions, a Keep policy, duplicate keys or a foreign trigger
101
+ * take the row-by-row path.
102
+ */
103
+ export declare function moveOutMany(store: StoreInternals, context: ApplyContext, table: LocalTable, keys: readonly string[], subscriptionKey: string, slot: number, ephemeral: boolean, policy: G9EMoveOutPolicy): Promise<void>;
84
104
  /** `AddMembership`. */
85
105
  export declare function addMembership(context: ApplyContext, table: LocalTable, key: string, slot: number, ephemeralKey: string | null): Promise<void>;
86
106
  /** `ApplyStagedPullAsync`: atomic, or in committed slices (ADR-0053); cursors move only with the last slice. */