@g9tm/syncdata 1.2.1

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 (149) hide show
  1. package/LICENSE.md +21 -0
  2. package/PARITY.md +71 -0
  3. package/README.md +71 -0
  4. package/THIRD-PARTY-NOTICES.md +31 -0
  5. package/dist/abstractions/digest.d.ts +27 -0
  6. package/dist/abstractions/digest.js +78 -0
  7. package/dist/abstractions/digest.js.map +1 -0
  8. package/dist/abstractions/enums.d.ts +42 -0
  9. package/dist/abstractions/enums.js +60 -0
  10. package/dist/abstractions/enums.js.map +1 -0
  11. package/dist/abstractions/errors.d.ts +72 -0
  12. package/dist/abstractions/errors.js +90 -0
  13. package/dist/abstractions/errors.js.map +1 -0
  14. package/dist/abstractions/guid.d.ts +24 -0
  15. package/dist/abstractions/guid.js +93 -0
  16. package/dist/abstractions/guid.js.map +1 -0
  17. package/dist/abstractions/key.d.ts +16 -0
  18. package/dist/abstractions/key.js +47 -0
  19. package/dist/abstractions/key.js.map +1 -0
  20. package/dist/abstractions/long.d.ts +103 -0
  21. package/dist/abstractions/long.js +351 -0
  22. package/dist/abstractions/long.js.map +1 -0
  23. package/dist/abstractions/parameters.d.ts +49 -0
  24. package/dist/abstractions/parameters.js +153 -0
  25. package/dist/abstractions/parameters.js.map +1 -0
  26. package/dist/brotli-js/decode.d.ts +8 -0
  27. package/dist/brotli-js/decode.js +2004 -0
  28. package/dist/brotli-js/decode.js.map +1 -0
  29. package/dist/brotli-js/index.d.ts +5 -0
  30. package/dist/brotli-js/index.js +19 -0
  31. package/dist/brotli-js/index.js.map +1 -0
  32. package/dist/client/engine.d.ts +110 -0
  33. package/dist/client/engine.js +1158 -0
  34. package/dist/client/engine.js.map +1 -0
  35. package/dist/client/model.d.ts +61 -0
  36. package/dist/client/model.js +154 -0
  37. package/dist/client/model.js.map +1 -0
  38. package/dist/client/progress.d.ts +101 -0
  39. package/dist/client/progress.js +251 -0
  40. package/dist/client/progress.js.map +1 -0
  41. package/dist/client/runs.d.ts +219 -0
  42. package/dist/client/runs.js +239 -0
  43. package/dist/client/runs.js.map +1 -0
  44. package/dist/client/storeTypes.d.ts +428 -0
  45. package/dist/client/storeTypes.js +256 -0
  46. package/dist/client/storeTypes.js.map +1 -0
  47. package/dist/client/transport.d.ts +19 -0
  48. package/dist/client/transport.js +2 -0
  49. package/dist/client/transport.js.map +1 -0
  50. package/dist/index.d.ts +27 -0
  51. package/dist/index.js +35 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/internal/abort.d.ts +21 -0
  54. package/dist/internal/abort.js +125 -0
  55. package/dist/internal/abort.js.map +1 -0
  56. package/dist/internal/base64.d.ts +8 -0
  57. package/dist/internal/base64.js +85 -0
  58. package/dist/internal/base64.js.map +1 -0
  59. package/dist/internal/dotnetFormat.d.ts +32 -0
  60. package/dist/internal/dotnetFormat.js +207 -0
  61. package/dist/internal/dotnetFormat.js.map +1 -0
  62. package/dist/internal/md5.d.ts +2 -0
  63. package/dist/internal/md5.js +97 -0
  64. package/dist/internal/md5.js.map +1 -0
  65. package/dist/internal/sha256.d.ts +20 -0
  66. package/dist/internal/sha256.js +153 -0
  67. package/dist/internal/sha256.js.map +1 -0
  68. package/dist/internal/utf8.d.ts +8 -0
  69. package/dist/internal/utf8.js +143 -0
  70. package/dist/internal/utf8.js.map +1 -0
  71. package/dist/node/index.d.ts +9 -0
  72. package/dist/node/index.js +35 -0
  73. package/dist/node/index.js.map +1 -0
  74. package/dist/node/sqliteDriver.d.ts +11 -0
  75. package/dist/node/sqliteDriver.js +252 -0
  76. package/dist/node/sqliteDriver.js.map +1 -0
  77. package/dist/protocol/dtos.d.ts +280 -0
  78. package/dist/protocol/dtos.js +33 -0
  79. package/dist/protocol/dtos.js.map +1 -0
  80. package/dist/protocol/protocol.d.ts +36 -0
  81. package/dist/protocol/protocol.js +63 -0
  82. package/dist/protocol/protocol.js.map +1 -0
  83. package/dist/protocol/rowBatch/columnLayout.d.ts +4 -0
  84. package/dist/protocol/rowBatch/columnLayout.js +309 -0
  85. package/dist/protocol/rowBatch/columnLayout.js.map +1 -0
  86. package/dist/protocol/rowBatch/format.d.ts +74 -0
  87. package/dist/protocol/rowBatch/format.js +163 -0
  88. package/dist/protocol/rowBatch/format.js.map +1 -0
  89. package/dist/protocol/rowBatch/reader.d.ts +119 -0
  90. package/dist/protocol/rowBatch/reader.js +459 -0
  91. package/dist/protocol/rowBatch/reader.js.map +1 -0
  92. package/dist/protocol/rowBatch/writer.d.ts +101 -0
  93. package/dist/protocol/rowBatch/writer.js +412 -0
  94. package/dist/protocol/rowBatch/writer.js.map +1 -0
  95. package/dist/protocol/wire.d.ts +32 -0
  96. package/dist/protocol/wire.js +329 -0
  97. package/dist/protocol/wire.js.map +1 -0
  98. package/dist/signalr/index.d.ts +2 -0
  99. package/dist/signalr/index.js +5 -0
  100. package/dist/signalr/index.js.map +1 -0
  101. package/dist/signalr/protocols.d.ts +17 -0
  102. package/dist/signalr/protocols.js +109 -0
  103. package/dist/signalr/protocols.js.map +1 -0
  104. package/dist/signalr/transport.d.ts +67 -0
  105. package/dist/signalr/transport.js +286 -0
  106. package/dist/signalr/transport.js.map +1 -0
  107. package/dist/sqlite/apply.d.ts +91 -0
  108. package/dist/sqlite/apply.js +657 -0
  109. package/dist/sqlite/apply.js.map +1 -0
  110. package/dist/sqlite/commands.d.ts +24 -0
  111. package/dist/sqlite/commands.js +167 -0
  112. package/dist/sqlite/commands.js.map +1 -0
  113. package/dist/sqlite/connection.d.ts +81 -0
  114. package/dist/sqlite/connection.js +322 -0
  115. package/dist/sqlite/connection.js.map +1 -0
  116. package/dist/sqlite/driver.d.ts +63 -0
  117. package/dist/sqlite/driver.js +9 -0
  118. package/dist/sqlite/driver.js.map +1 -0
  119. package/dist/sqlite/index.d.ts +6 -0
  120. package/dist/sqlite/index.js +7 -0
  121. package/dist/sqlite/index.js.map +1 -0
  122. package/dist/sqlite/internals.d.ts +63 -0
  123. package/dist/sqlite/internals.js +194 -0
  124. package/dist/sqlite/internals.js.map +1 -0
  125. package/dist/sqlite/options.d.ts +78 -0
  126. package/dist/sqlite/options.js +78 -0
  127. package/dist/sqlite/options.js.map +1 -0
  128. package/dist/sqlite/push.d.ts +9 -0
  129. package/dist/sqlite/push.js +272 -0
  130. package/dist/sqlite/push.js.map +1 -0
  131. package/dist/sqlite/query.d.ts +38 -0
  132. package/dist/sqlite/query.js +476 -0
  133. package/dist/sqlite/query.js.map +1 -0
  134. package/dist/sqlite/revocation.d.ts +28 -0
  135. package/dist/sqlite/revocation.js +337 -0
  136. package/dist/sqlite/revocation.js.map +1 -0
  137. package/dist/sqlite/sql.d.ts +60 -0
  138. package/dist/sqlite/sql.js +324 -0
  139. package/dist/sqlite/sql.js.map +1 -0
  140. package/dist/sqlite/store.d.ts +116 -0
  141. package/dist/sqlite/store.js +664 -0
  142. package/dist/sqlite/store.js.map +1 -0
  143. package/dist/sqlite/values.d.ts +29 -0
  144. package/dist/sqlite/values.js +288 -0
  145. package/dist/sqlite/values.js.map +1 -0
  146. package/dist/testing/index.d.ts +61 -0
  147. package/dist/testing/index.js +175 -0
  148. package/dist/testing/index.js.map +1 -0
  149. package/package.json +104 -0
@@ -0,0 +1,5 @@
1
+ import type { G9FrameDecompressor } from '../protocol/rowBatch/reader.js';
2
+ /** Decodes a raw Brotli stream. */
3
+ export declare function brotliDecompressJs(compressed: Uint8Array): Uint8Array;
4
+ /** A frame decompressor over the JavaScript decoder. */
5
+ export declare function jsBrotliDecompressor(): G9FrameDecompressor;
@@ -0,0 +1,19 @@
1
+ import { brotliDecode } from './decode.js';
2
+ /** Decodes a raw Brotli stream. */
3
+ export function brotliDecompressJs(compressed) {
4
+ const input = new Int8Array(compressed.buffer, compressed.byteOffset, compressed.length);
5
+ const output = brotliDecode(input);
6
+ return new Uint8Array(output.buffer, output.byteOffset, output.length);
7
+ }
8
+ /** A frame decompressor over the JavaScript decoder. */
9
+ export function jsBrotliDecompressor() {
10
+ return {
11
+ decompress(compressed, expectedLength) {
12
+ const out = brotliDecompressJs(compressed);
13
+ if (out.length !== expectedLength)
14
+ throw new Error(`Brotli body decoded to ${out.length} bytes, ${expectedLength} expected.`);
15
+ return out;
16
+ },
17
+ };
18
+ }
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/brotli-js/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,mCAAmC;AACnC,MAAM,UAAU,kBAAkB,CAAC,UAAsB;IACvD,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACzF,MAAM,MAAM,GAAG,YAAY,CAAC,KAAK,CAAc,CAAC;IAChD,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;AACzE,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,UAAU,CAAC,UAAsB,EAAE,cAAsB;YACvD,MAAM,GAAG,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;YAC3C,IAAI,GAAG,CAAC,MAAM,KAAK,cAAc;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,WAAW,cAAc,YAAY,CAAC,CAAC;YAC9H,OAAO,GAAG,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC","sourcesContent":["// @g9tm/syncdata/brotli-js — a pure-JavaScript Brotli decoder for frames, for runtimes with no native one (Lynx web,\n// a Lynx host without @g9tm/syncdata-lynx's native module, tests). It is Google's own decoder (about 190 KB of source,\n// most of it the static dictionary), so import it only where it is needed: the native decoders are far faster.\nimport type { G9FrameDecompressor } from '../protocol/rowBatch/reader.js';\nimport { brotliDecode } from './decode.js';\n\n/** Decodes a raw Brotli stream. */\nexport function brotliDecompressJs(compressed: Uint8Array): Uint8Array {\n const input = new Int8Array(compressed.buffer, compressed.byteOffset, compressed.length);\n const output = brotliDecode(input) as Int8Array;\n return new Uint8Array(output.buffer, output.byteOffset, output.length);\n}\n\n/** A frame decompressor over the JavaScript decoder. */\nexport function jsBrotliDecompressor(): G9FrameDecompressor {\n return {\n decompress(compressed: Uint8Array, expectedLength: number): Uint8Array {\n const out = brotliDecompressJs(compressed);\n if (out.length !== expectedLength) throw new Error(`Brotli body decoded to ${out.length} bytes, ${expectedLength} expected.`);\n return out;\n },\n };\n}\n"]}
@@ -0,0 +1,110 @@
1
+ import { G9SyncParameters } from '../abstractions/parameters.js';
2
+ import { type G9DtHelloResult, type G9DtNegotiatedTable, type G9DtSubscriptionState } from '../protocol/dtos.js';
3
+ import type { G9SyncClientModel } from './model.js';
4
+ import { G9SyncRun, type G9RowsAppliedEvent, type G9SubscriptionOptions, type G9SyncEngineOptions, type G9SyncHealth, type G9SyncRequest, type G9SyncRunResult } from './runs.js';
5
+ import { type G9ChangeFeedEntry, type G9LocalCommand, type G9LocalCommandWriter, type G9ELocalCommandState, type G9PendingSummary, type G9QuarantinedRow, type G9RetainedRow, type G9SyncClientStore, type G9SyncRejection, type G9SyncSubscriptionRecord } from './storeTypes.js';
6
+ import type { G9SyncTransport } from './transport.js';
7
+ /**
8
+ * The client sync engine (`G9CSyncEngine`): one per local database. Owns a prioritised run queue, so status queries
9
+ * never wait for a running sync and background runs yield to user runs.
10
+ */
11
+ export declare class G9SyncEngine {
12
+ readonly model: G9SyncClientModel;
13
+ private readonly _store;
14
+ private readonly _transport;
15
+ private readonly _options;
16
+ private readonly _lifetime;
17
+ private readonly _queue;
18
+ private readonly _pokedTables;
19
+ private readonly _rowsAppliedListeners;
20
+ private readonly _runCompletedListeners;
21
+ private readonly _unsubscribePokes;
22
+ private _initialized;
23
+ private _initializing;
24
+ private _clientId;
25
+ private _order;
26
+ private _current;
27
+ private _suppressions;
28
+ private _autoTimer;
29
+ private _pokeTimer;
30
+ private _wake;
31
+ private _worker;
32
+ private _disposed;
33
+ /** The model problems last logged, so the warning is said once per distinct set (ADR-0061). */
34
+ private _reportedModelProblems;
35
+ constructor(store: G9SyncClientStore, transport: G9SyncTransport, model: G9SyncClientModel, options?: G9SyncEngineOptions);
36
+ get clientId(): string;
37
+ get isRunning(): boolean;
38
+ get queuedRuns(): number;
39
+ get isBackgroundSuppressed(): boolean;
40
+ /** Raised after rows were written locally (download, reconciliation or canonical push results). Returns the unsubscribe function. */
41
+ onRowsApplied(listener: (event: G9RowsAppliedEvent) => void): () => void;
42
+ onRunCompleted(listener: (result: G9SyncRunResult) => void): () => void;
43
+ /** Provisions local tables and capture, and starts the run worker. Idempotent. */
44
+ initialize(signal?: AbortSignal): Promise<void>;
45
+ /** Adds (or returns) a subscription. Its rows arrive on the next run that includes it. */
46
+ subscribe(name: string, parameters?: G9SyncParameters | null, options?: G9SubscriptionOptions | null, signal?: AbortSignal): Promise<G9SyncSubscriptionRecord>;
47
+ /** Removes a subscription; rows no other subscription holds follow the server's move-out policy. */
48
+ unsubscribe(name: string, parameters?: G9SyncParameters | null, signal?: AbortSignal): Promise<void>;
49
+ getSubscriptions(signal?: AbortSignal): Promise<G9SyncSubscriptionRecord[]>;
50
+ /** Queues a run. Identical plain requests already waiting are coalesced into one run. */
51
+ run(request?: G9SyncRequest | null): G9SyncRun;
52
+ /** Queues a run and awaits its result. */
53
+ sync(request?: G9SyncRequest | null): Promise<G9SyncRunResult>;
54
+ /** While the returned scope is alive, background runs are skipped. Call the returned function to end it. */
55
+ suppressBackground(): () => void;
56
+ /** Queues a background push+pull of every non-heavy subscription on a fixed interval. */
57
+ startAutomaticSync(intervalMs: number): void;
58
+ stopAutomaticSync(): void;
59
+ /**
60
+ * Records a command (ADR-0025): the server executes the handler registered for `name` on the next push, once, in
61
+ * device order. `applyLocally` writes its local effects immediately, in the same transaction.
62
+ */
63
+ executeCommand(name: string, payloadJson: string, applyLocally?: ((writer: G9LocalCommandWriter, signal?: AbortSignal) => Promise<void>) | null, version?: number, signal?: AbortSignal): Promise<G9LocalCommand>;
64
+ /** Frees space taken by an UPLOAD-ONLY table: removes uploaded rows without uploading a delete. */
65
+ forgetUploadedRows(localTable: string, keys?: readonly string[] | null, signal?: AbortSignal): Promise<number>;
66
+ getCommands(state?: G9ELocalCommandState | null, limit?: number, signal?: AbortSignal): Promise<G9LocalCommand[]>;
67
+ getPendingSummary(signal?: AbortSignal): Promise<G9PendingSummary>;
68
+ getRejections(signal?: AbortSignal): Promise<G9SyncRejection[]>;
69
+ getQuarantined(signal?: AbortSignal): Promise<G9QuarantinedRow[]>;
70
+ restoreQuarantined(localTable: string, key: string, signal?: AbortSignal): Promise<number>;
71
+ /** Throws away every staged pull, so the next run plans afresh. Returns whether there was one. */
72
+ discardStagedPull(signal?: AbortSignal): Promise<boolean>;
73
+ discardQuarantined(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number>;
74
+ getRetained(signal?: AbortSignal): Promise<G9RetainedRow[]>;
75
+ retryRejected(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number>;
76
+ readChangeFeed(localTable: string, afterSequence: number, limit?: number, signal?: AbortSignal): Promise<G9ChangeFeedEntry[]>;
77
+ /** The highest sequence readChangeFeed can return today (a watermark above it belongs to a store that no longer exists). */
78
+ getChangeSequence(signal?: AbortSignal): Promise<number>;
79
+ /** The highest sequence ever purged from the change feed; 0 when nothing was (ADR-0059). */
80
+ getChangeFeedFloor(signal?: AbortSignal): Promise<number>;
81
+ adoptExistingRows(signal?: AbortSignal): Promise<number>;
82
+ markDirty(localTable: string, keys: readonly string[], signal?: AbortSignal): Promise<number>;
83
+ getHealth(signal?: AbortSignal): Promise<G9SyncHealth>;
84
+ dispose(): Promise<void>;
85
+ private _signal;
86
+ private _dequeue;
87
+ private _workerLoop;
88
+ private _tryQueueBackground;
89
+ private _onChangesAvailable;
90
+ private _flushPokes;
91
+ private _raiseRowsApplied;
92
+ private _log;
93
+ private _executeRun;
94
+ private _planPhases;
95
+ private _selectSubscriptions;
96
+ private _pushAll;
97
+ private _download;
98
+ private _withRetry;
99
+ private _backoff;
100
+ private _ensureConnected;
101
+ private _persistRun;
102
+ private _reconcileSubscription;
103
+ }
104
+ /**
105
+ * Everything a staged pull's rows depend on (ADR-0046): the server's epoch, the exact set of subscriptions with their
106
+ * definition and authorisation hashes, and the negotiated columns. The cursor is deliberately NOT part of it (ADR-0060).
107
+ */
108
+ export declare function stageGeneration(hello: G9DtHelloResult, plannable: readonly G9SyncSubscriptionRecord[], states: {
109
+ [key: string]: G9DtSubscriptionState;
110
+ }, negotiated: readonly G9DtNegotiatedTable[]): string;