@g9tm/syncdata 1.3.1 → 1.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/signalr/transport.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.SignalR/G9CSignalRSyncTransport.cs: the sync transport over the G9SignalRSuperNetCore client\n// (its jittered reconnect policy and connection states), every failure surfacing as a G9SyncException with the server's\n// stable code. Lynx hosts build the client with the native WebSocket of @g9tm/signalr-supernetcore-lynx\n// (`createLynxSyncTransport` in @g9tm/syncdata-lynx does).\nimport { G9Client, type G9ClientOptions } from '@g9tm/signalr-supernetcore-client';\nimport { HubConnectionState, Subject, type IHubProtocol, type IStreamResult, type ISubscription } from '@microsoft/signalr';\nimport { G9SyncErrorCodes, G9SyncException, isSyncException } from '../abstractions/errors.js';\nimport { createAbortController, onAbort } from '../internal/abort.js';\nimport type { G9SyncTransport } from '../client/transport.js';\nimport type {\n G9DtChangesAvailable,\n G9DtFetchRowsRequest,\n G9DtHelloRequest,\n G9DtHelloResult,\n G9DtPullContinuation,\n G9DtPullPlan,\n G9DtPullRequest,\n G9DtPushRequest,\n G9DtPushResult,\n G9DtReconcileRequest,\n G9DtSyncChunk,\n} from '../protocol/dtos.js';\nimport { G9SyncHubErrors, G9SyncProtocol } from '../protocol/protocol.js';\nimport {\n fromMessagePackNames,\n readChangesAvailable,\n readHelloResult,\n readPullPlan,\n readPushResult,\n readSyncChunk,\n toMessagePackNames,\n type G9WireFormat,\n} from '../protocol/wire.js';\nimport { createSyncMessagePackProtocol, G9SyncJsonHubProtocol } from './protocols.js';\n\n/** The SignalR hub protocol a client speaks (`G9ESyncHubProtocol`). The server accepts both. */\nexport const G9ESyncHubProtocol = {\n /** Text frames; payloads base64-encoded (+33%). Readable in traces. */\n Json: 0,\n /** Binary frames: payloads as raw bytes. The default. */\n MessagePack: 1,\n} as const;\nexport type G9ESyncHubProtocol = (typeof G9ESyncHubProtocol)[keyof typeof G9ESyncHubProtocol];\n\n/** Options of {@link G9SignalRSyncTransport} (`G9CSignalRSyncTransportOptions`). Durations are milliseconds. */\nexport interface G9SignalRSyncTransportOptions {\n /** Absolute hub URL, e.g. `https://sync.example.com/g9sync`. */\n url: string;\n /** Hub protocol; MessagePack by default. */\n protocol?: G9ESyncHubProtocol;\n /** Supplies the bearer token for every (re)connect. */\n accessTokenFactory?: () => string | Promise<string>;\n /** SignalR stateful reconnect (ADR-0069); off by default, the server must allow it too. */\n statefulReconnect?: boolean;\n /** How long one connect may take before it counts as a network failure. */\n connectTimeoutMs?: number;\n serverTimeoutMs?: number;\n keepAliveIntervalMs?: number;\n /**\n * Everything else the G9 client takes (transport, headers, WebSocket constructor, skipNegotiation, reconnect policy, log\n * level…) — the twin of ConfigureHttpConnection/ConfigureBuilder. `url`, `protocol` and the timeouts above win.\n */\n client?: Partial<G9ClientOptions>;\n /** Builds the client (tests, hosts with their own wiring); `new G9Client(options)` by default. */\n createClient?: (options: G9ClientOptions) => G9Client;\n}\n\n/** The SignalR implementation of {@link G9SyncTransport}. */\nexport class G9SignalRSyncTransport implements G9SyncTransport {\n readonly client: G9Client;\n readonly format: G9WireFormat;\n private readonly _options: G9SignalRSyncTransportOptions;\n private readonly _handlers: ((changes: G9DtChangesAvailable) => void)[] = [];\n private _connecting: Promise<void> | null = null;\n\n constructor(options: G9SignalRSyncTransportOptions) {\n if (!options || typeof options.url !== 'string' || options.url.trim() === '') throw new TypeError('A hub URL is required.');\n this._options = options;\n const json = options.protocol === G9ESyncHubProtocol.Json;\n this.format = json ? 'json' : 'messagepack';\n const protocol: IHubProtocol = json ? new G9SyncJsonHubProtocol() : createSyncMessagePackProtocol();\n const clientOptions: G9ClientOptions = {\n ...(options.client ?? {}),\n url: options.url,\n protocol,\n statefulReconnect: options.statefulReconnect ?? false,\n serverTimeoutMs: options.serverTimeoutMs ?? 30000,\n keepAliveIntervalMs: options.keepAliveIntervalMs ?? 10000,\n };\n if (options.accessTokenFactory) clientOptions.accessTokenFactory = options.accessTokenFactory;\n this.client = options.createClient ? options.createClient(clientOptions) : new G9Client(clientOptions);\n this.client.on(G9SyncProtocol.Listeners.OnChangesAvailable, (payload: unknown) => this._onChanges(payload));\n }\n\n get isConnected(): boolean {\n return this.client.connection.state === HubConnectionState.Connected;\n }\n\n onChangesAvailable(handler: (changes: G9DtChangesAvailable) => void): () => void {\n this._handlers.push(handler);\n return () => {\n const index = this._handlers.indexOf(handler);\n if (index >= 0) this._handlers.splice(index, 1);\n };\n }\n\n /** Connects (joins a connect in progress); a connect that takes longer than connectTimeoutMs is a network failure. */\n connect(signal?: AbortSignal): Promise<void> {\n if (this.isConnected) return Promise.resolve();\n if (!this._connecting) {\n const connecting = this._connectCore().finally(() => {\n if (this._connecting === connecting) this._connecting = null;\n });\n this._connecting = connecting;\n }\n const connecting = this._connecting;\n if (!signal) return connecting;\n return new Promise<void>((resolve, reject) => {\n const unsubscribe = onAbort(signal, () => reject(new G9SyncException(G9SyncErrorCodes.Canceled, 'The connect was canceled.')));\n connecting.then(\n () => {\n unsubscribe();\n resolve();\n },\n (error) => {\n unsubscribe();\n reject(error);\n },\n );\n });\n }\n\n private async _connectCore(): Promise<void> {\n const timeout = createAbortController();\n const timer = setTimeout(() => timeout.abort(), this._options.connectTimeoutMs ?? 20000);\n try {\n await this.client.start(timeout.signal);\n } catch (error) {\n const mapped = mapError(error, false) ?? new G9SyncException(G9SyncErrorCodes.NetworkFailure, messageOf(error), { retryable: true, cause: error });\n throw mapped.code === G9SyncErrorCodes.Canceled\n ? new G9SyncException(G9SyncErrorCodes.NetworkFailure, `The sync connection to ${this._options.url} did not open in time.`, { retryable: true, cause: error })\n : mapped;\n } finally {\n clearTimeout(timer);\n }\n if (!this.isConnected) {\n throw new G9SyncException(G9SyncErrorCodes.NetworkFailure, `The sync connection is ${String(this.client.connection.state)}.`, { retryable: true });\n }\n }\n\n hello(request: G9DtHelloRequest, signal?: AbortSignal): Promise<G9DtHelloResult> {\n return this._invoke(G9SyncProtocol.Methods.Hello, [this._wire(request)], readHelloResult, signal);\n }\n\n push(request: G9DtPushRequest, chunks: AsyncIterable<G9DtSyncChunk>, signal?: AbortSignal): Promise<G9DtPushResult> {\n const subject = new Subject<unknown>();\n const result = this._invoke(G9SyncProtocol.Methods.Push, [this._wire(request), subject], readPushResult, signal);\n void (async () => {\n try {\n for await (const chunk of chunks) subject.next(this._wire(chunk));\n subject.complete();\n } catch (error) {\n subject.error(error);\n }\n })();\n return result;\n }\n\n planPull(request: G9DtPullRequest, signal?: AbortSignal): Promise<G9DtPullPlan> {\n return this._invoke(G9SyncProtocol.Methods.PlanPull, [this._wire(request)], readPullPlan, signal);\n }\n\n pull(token: string, continuation: G9DtPullContinuation | null, signal?: AbortSignal): AsyncIterable<G9DtSyncChunk> {\n return this._stream(G9SyncProtocol.Methods.Pull, [token, continuation === null ? null : this._wire(continuation)], signal);\n }\n\n reconcile(request: G9DtReconcileRequest, signal?: AbortSignal): AsyncIterable<G9DtSyncChunk> {\n return this._stream(G9SyncProtocol.Methods.Reconcile, [this._wire(request)], signal);\n }\n\n fetchRows(request: G9DtFetchRowsRequest, signal?: AbortSignal): AsyncIterable<G9DtSyncChunk> {\n return this._stream(G9SyncProtocol.Methods.FetchRows, [this._wire(request)], signal);\n }\n\n async dispose(): Promise<void> {\n this._handlers.length = 0;\n await this.client.stop();\n }\n\n // ================================================================ plumbing\n\n private _wire(value: unknown): unknown {\n return this.format === 'messagepack' ? toMessagePackNames(value) : value;\n }\n\n private _read(value: unknown): unknown {\n return this.format === 'messagepack' ? fromMessagePackNames(value) : value;\n }\n\n private async _invoke<T>(method: string, args: unknown[], read: (value: unknown) => T, signal?: AbortSignal): Promise<T> {\n if (signal && signal.aborted) throw new G9SyncException(G9SyncErrorCodes.Canceled, 'The call was canceled.');\n let unsubscribe: () => void = () => undefined;\n try {\n const call = this.client.connection.invoke(method, ...args);\n const raw = signal\n ? await new Promise<unknown>((resolve, reject) => {\n unsubscribe = onAbort(signal, () => reject(new G9SyncException(G9SyncErrorCodes.Canceled, 'The call was canceled.')));\n call.then(resolve, reject);\n })\n : await call;\n return read(this._read(raw));\n } catch (error) {\n throw mapError(error, signal ? signal.aborted : false) ?? error;\n } finally {\n unsubscribe();\n }\n }\n\n private _stream(method: string, args: unknown[], signal?: AbortSignal): AsyncIterable<G9DtSyncChunk> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n return {\n [Symbol.asyncIterator](): AsyncIterator<G9DtSyncChunk> {\n const queue: G9DtSyncChunk[] = [];\n let done = false;\n let failure: unknown = null;\n let wake: (() => void) | null = null;\n let subscription: ISubscription<unknown> | null = null;\n const notify = (): void => {\n const w = wake;\n wake = null;\n if (w) w();\n };\n let unsubscribeAbort: () => void = () => undefined;\n const start = (): void => {\n if (subscription || done) return;\n let stream: IStreamResult<unknown>;\n try {\n stream = self.client.connection.stream(method, ...args);\n } catch (error) {\n failure = error;\n done = true;\n return;\n }\n subscription = stream.subscribe({\n next: (item) => {\n queue.push(readSyncChunk(self._read(item)));\n notify();\n },\n error: (error) => {\n failure = error;\n done = true;\n notify();\n },\n complete: () => {\n done = true;\n notify();\n },\n });\n unsubscribeAbort = onAbort(signal, () => {\n failure = new G9SyncException(G9SyncErrorCodes.Canceled, 'The stream was canceled.');\n done = true;\n subscription?.dispose();\n notify();\n });\n };\n const finish = (): void => {\n unsubscribeAbort();\n if (subscription && !done) subscription.dispose();\n done = true;\n };\n return {\n async next(): Promise<IteratorResult<G9DtSyncChunk>> {\n start();\n for (;;) {\n const item = queue.shift();\n if (item) return { value: item, done: false };\n if (done) {\n unsubscribeAbort();\n if (failure !== null) throw mapError(failure, signal ? signal.aborted : false) ?? failure;\n return { value: undefined as unknown as G9DtSyncChunk, done: true };\n }\n await new Promise<void>((resolve) => {\n wake = resolve;\n });\n }\n },\n async return(): Promise<IteratorResult<G9DtSyncChunk>> {\n finish();\n return { value: undefined as unknown as G9DtSyncChunk, done: true };\n },\n };\n },\n };\n }\n\n private _onChanges(payload: unknown): void {\n const changes = readChangesAvailable(this._read(payload));\n for (const handler of this._handlers.slice()) {\n try {\n handler(changes);\n } catch {\n // A ChangesAvailable handler threw (logged by the .NET transport); it must not break the connection.\n }\n }\n }\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * The sync exception for a transport failure (`Map`): the server's `[G9S|code|retryable]` marker wins; any other hub\n * error is a retryable server error; 401/403 is Unauthorized; the rest is a retryable network failure. Null leaves the\n * error as it is (an already mapped one).\n */\nexport function mapError(error: unknown, canceled: boolean): G9SyncException | null {\n if (isSyncException(error)) return null;\n if (canceled) return new G9SyncException(G9SyncErrorCodes.Canceled, 'The call was canceled.', { cause: error });\n const message = messageOf(error);\n const marked = G9SyncHubErrors.tryParse(message);\n if (marked) return marked;\n const status = (error as { statusCode?: unknown }).statusCode;\n if (status === 401 || status === 403) return new G9SyncException(G9SyncErrorCodes.Unauthorized, 'The sync server refused the credentials.', { cause: error });\n if (error instanceof Error && error.name === 'AbortError') return new G9SyncException(G9SyncErrorCodes.Canceled, message, { cause: error });\n // A completion error from the hub: SignalR words it \"An unexpected error occurred invoking '…' on the server.\"\n if (/on the server|HubException/i.test(message)) return new G9SyncException(G9SyncErrorCodes.ServerError, message, { retryable: true, cause: error });\n return new G9SyncException(G9SyncErrorCodes.NetworkFailure, message, { retryable: true, cause: error });\n}\n"]}
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/signalr/transport.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.SignalR/G9CSignalRSyncTransport.cs: the sync transport over the G9SignalRSuperNetCore client\n// (its jittered reconnect policy and connection states), every failure surfacing as a G9SyncException with the server's\n// stable code. Lynx hosts build the client with the native WebSocket of @g9tm/signalr-supernetcore-lynx\n// (`createLynxSyncTransport` in @g9tm/syncdata-lynx does).\nimport { G9Client, type G9ClientOptions } from '@g9tm/signalr-supernetcore-client';\nimport { HubConnectionState, Subject, type IHubProtocol, type IStreamResult, type ISubscription } from '@microsoft/signalr';\nimport { G9SyncErrorCodes, G9SyncException, isSyncException } from '../abstractions/errors.js';\nimport { createAbortController, onAbort } from '../internal/abort.js';\nimport type { G9SyncTransport } from '../client/transport.js';\nimport type {\n G9DtChangesAvailable,\n G9DtFetchRowsRequest,\n G9DtHelloRequest,\n G9DtHelloResult,\n G9DtPullContinuation,\n G9DtPullPlan,\n G9DtPullRequest,\n G9DtPushRequest,\n G9DtPushResult,\n G9DtReconcileRequest,\n G9DtSyncChunk,\n} from '../protocol/dtos.js';\nimport { G9SyncHubErrors, G9SyncProtocol } from '../protocol/protocol.js';\nimport {\n fromMessagePackNames,\n readChangesAvailable,\n readHelloResult,\n readPullPlan,\n readPushResult,\n readSyncChunk,\n toMessagePackNames,\n type G9WireFormat,\n} from '../protocol/wire.js';\nimport { createSyncMessagePackProtocol, G9SyncJsonHubProtocol } from './protocols.js';\n\n/** The SignalR hub protocol a client speaks (`G9ESyncHubProtocol`). The server accepts both. */\nexport const G9ESyncHubProtocol = {\n /** Text frames; payloads base64-encoded (+33%). Readable in traces. */\n Json: 0,\n /** Binary frames: payloads as raw bytes. The default. */\n MessagePack: 1,\n} as const;\nexport type G9ESyncHubProtocol = (typeof G9ESyncHubProtocol)[keyof typeof G9ESyncHubProtocol];\n\n/** Options of {@link G9SignalRSyncTransport} (`G9CSignalRSyncTransportOptions`). Durations are milliseconds. */\nexport interface G9SignalRSyncTransportOptions {\n /** Absolute hub URL, e.g. `https://sync.example.com/g9sync`. */\n url: string;\n /** Hub protocol; MessagePack by default. */\n protocol?: G9ESyncHubProtocol;\n /** Supplies the bearer token for every (re)connect. */\n accessTokenFactory?: () => string | Promise<string>;\n /** SignalR stateful reconnect (ADR-0069); off by default, the server must allow it too. */\n statefulReconnect?: boolean;\n /** How long one connect may take before it counts as a network failure. */\n connectTimeoutMs?: number;\n serverTimeoutMs?: number;\n keepAliveIntervalMs?: number;\n /**\n * How long a single-answer call (Hello, PlanPull) waits for its answer before it is a retryable G9S-NET-FAILURE (ADR-0074).\n * Default 60000; 0 = no limit. A live connection does not guarantee an answer: pings keep it up while the call's message\n * was lost on the way.\n */\n callTimeoutMs?: number;\n /** How long a push may take from its first chunk to its result; a safety net, not a pace. Default 600000; 0 = no limit. */\n pushTimeoutMs?: number;\n /**\n * How long a server stream (Pull, Reconcile, FetchRows) may go without a chunk before it is a retryable G9S-NET-FAILURE; the\n * engine resumes from its last continuation. Default 120000 (a snapshot file may still be building); 0 = no limit (ADR-0074).\n */\n streamIdleTimeoutMs?: number;\n /**\n * Everything else the G9 client takes (transport, headers, WebSocket constructor, skipNegotiation, reconnect policy, log\n * level…) — the twin of ConfigureHttpConnection/ConfigureBuilder. `url`, `protocol` and the timeouts above win.\n */\n client?: Partial<G9ClientOptions>;\n /** Builds the client (tests, hosts with their own wiring); `new G9Client(options)` by default. */\n createClient?: (options: G9ClientOptions) => G9Client;\n}\n\n/** The SignalR implementation of {@link G9SyncTransport}. */\nexport class G9SignalRSyncTransport implements G9SyncTransport {\n readonly client: G9Client;\n readonly format: G9WireFormat;\n private readonly _options: G9SignalRSyncTransportOptions;\n private readonly _handlers: ((changes: G9DtChangesAvailable) => void)[] = [];\n private _connecting: Promise<void> | null = null;\n\n constructor(options: G9SignalRSyncTransportOptions) {\n if (!options || typeof options.url !== 'string' || options.url.trim() === '') throw new TypeError('A hub URL is required.');\n this._options = options;\n const json = options.protocol === G9ESyncHubProtocol.Json;\n this.format = json ? 'json' : 'messagepack';\n const protocol: IHubProtocol = json ? new G9SyncJsonHubProtocol() : createSyncMessagePackProtocol();\n const clientOptions: G9ClientOptions = {\n ...(options.client ?? {}),\n url: options.url,\n protocol,\n statefulReconnect: options.statefulReconnect ?? false,\n serverTimeoutMs: options.serverTimeoutMs ?? 30000,\n keepAliveIntervalMs: options.keepAliveIntervalMs ?? 10000,\n };\n if (options.accessTokenFactory) clientOptions.accessTokenFactory = options.accessTokenFactory;\n this.client = options.createClient ? options.createClient(clientOptions) : new G9Client(clientOptions);\n this.client.on(G9SyncProtocol.Listeners.OnChangesAvailable, (payload: unknown) => this._onChanges(payload));\n }\n\n get isConnected(): boolean {\n return this.client.connection.state === HubConnectionState.Connected;\n }\n\n onChangesAvailable(handler: (changes: G9DtChangesAvailable) => void): () => void {\n this._handlers.push(handler);\n return () => {\n const index = this._handlers.indexOf(handler);\n if (index >= 0) this._handlers.splice(index, 1);\n };\n }\n\n /** Connects (joins a connect in progress); a connect that takes longer than connectTimeoutMs is a network failure. */\n connect(signal?: AbortSignal): Promise<void> {\n if (this.isConnected) return Promise.resolve();\n if (!this._connecting) {\n const connecting = this._connectCore().finally(() => {\n if (this._connecting === connecting) this._connecting = null;\n });\n this._connecting = connecting;\n }\n const connecting = this._connecting;\n if (!signal) return connecting;\n return new Promise<void>((resolve, reject) => {\n const unsubscribe = onAbort(signal, () => reject(new G9SyncException(G9SyncErrorCodes.Canceled, 'The connect was canceled.')));\n connecting.then(\n () => {\n unsubscribe();\n resolve();\n },\n (error) => {\n unsubscribe();\n reject(error);\n },\n );\n });\n }\n\n private async _connectCore(): Promise<void> {\n const timeout = createAbortController();\n const timer = setTimeout(() => timeout.abort(), this._options.connectTimeoutMs ?? 20000);\n try {\n await this.client.start(timeout.signal);\n } catch (error) {\n const mapped = mapError(error, false) ?? new G9SyncException(G9SyncErrorCodes.NetworkFailure, messageOf(error), { retryable: true, cause: error });\n throw mapped.code === G9SyncErrorCodes.Canceled\n ? new G9SyncException(G9SyncErrorCodes.NetworkFailure, `The sync connection to ${this._options.url} did not open in time.`, { retryable: true, cause: error })\n : mapped;\n } finally {\n clearTimeout(timer);\n }\n if (!this.isConnected) {\n throw new G9SyncException(G9SyncErrorCodes.NetworkFailure, `The sync connection is ${String(this.client.connection.state)}.`, { retryable: true });\n }\n }\n\n hello(request: G9DtHelloRequest, signal?: AbortSignal): Promise<G9DtHelloResult> {\n return this._invoke(G9SyncProtocol.Methods.Hello, [this._wire(request)], readHelloResult, this._callTimeoutMs(), signal);\n }\n\n push(request: G9DtPushRequest, chunks: AsyncIterable<G9DtSyncChunk>, signal?: AbortSignal): Promise<G9DtPushResult> {\n const subject = new Subject<unknown>();\n const result = this._invoke(G9SyncProtocol.Methods.Push, [this._wire(request), subject], readPushResult, this._options.pushTimeoutMs ?? 600000, signal);\n void (async () => {\n try {\n for await (const chunk of chunks) subject.next(this._wire(chunk));\n subject.complete();\n } catch (error) {\n subject.error(error);\n }\n })();\n return result;\n }\n\n planPull(request: G9DtPullRequest, signal?: AbortSignal): Promise<G9DtPullPlan> {\n return this._invoke(G9SyncProtocol.Methods.PlanPull, [this._wire(request)], readPullPlan, this._callTimeoutMs(), signal);\n }\n\n pull(token: string, continuation: G9DtPullContinuation | null, signal?: AbortSignal): AsyncIterable<G9DtSyncChunk> {\n return this._stream(G9SyncProtocol.Methods.Pull, [token, continuation === null ? null : this._wire(continuation)], signal);\n }\n\n reconcile(request: G9DtReconcileRequest, signal?: AbortSignal): AsyncIterable<G9DtSyncChunk> {\n return this._stream(G9SyncProtocol.Methods.Reconcile, [this._wire(request)], signal);\n }\n\n fetchRows(request: G9DtFetchRowsRequest, signal?: AbortSignal): AsyncIterable<G9DtSyncChunk> {\n return this._stream(G9SyncProtocol.Methods.FetchRows, [this._wire(request)], signal);\n }\n\n async dispose(): Promise<void> {\n this._handlers.length = 0;\n await this.client.stop();\n }\n\n // ================================================================ plumbing\n\n private _wire(value: unknown): unknown {\n return this.format === 'messagepack' ? toMessagePackNames(value) : value;\n }\n\n private _read(value: unknown): unknown {\n return this.format === 'messagepack' ? fromMessagePackNames(value) : value;\n }\n\n private _callTimeoutMs(): number {\n return this._options.callTimeoutMs ?? 60000;\n }\n\n private async _invoke<T>(method: string, args: unknown[], read: (value: unknown) => T, timeoutMs: number, signal?: AbortSignal): Promise<T> {\n if (signal && signal.aborted) throw new G9SyncException(G9SyncErrorCodes.Canceled, 'The call was canceled.');\n let unsubscribe: () => void = () => undefined;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let timedOut = false;\n try {\n const call = this.client.connection.invoke(method, ...args);\n const raw =\n signal || timeoutMs > 0\n ? await new Promise<unknown>((resolve, reject) => {\n if (signal) unsubscribe = onAbort(signal, () => reject(new G9SyncException(G9SyncErrorCodes.Canceled, 'The call was canceled.')));\n if (timeoutMs > 0) {\n timer = setTimeout(() => {\n timedOut = true;\n reject(\n new G9SyncException(G9SyncErrorCodes.NetworkFailure, `The sync server did not answer ${method} within ${Math.round(timeoutMs / 1000)} s.`, {\n retryable: true,\n }),\n );\n }, timeoutMs);\n }\n call.then(resolve, reject);\n })\n : await call;\n return read(this._read(raw));\n } catch (error) {\n // ADR-0074: the answer did not come in time. The connection is not trusted any more (the server runs one invocation per\n // connection at a time, and whatever lost this answer may lose the next): drop it, so the retry runs on a fresh one.\n if (timedOut) await this._dropConnection();\n throw mapError(error, signal ? signal.aborted : false) ?? error;\n } finally {\n if (timer !== null) clearTimeout(timer);\n unsubscribe();\n }\n }\n\n /** Ends the connection after a call or stream ran out of time (ADR-0074); the next call connects afresh. Never throws. */\n private async _dropConnection(): Promise<void> {\n try {\n await this.client.connection.stop();\n } catch {\n // Stopping a connection that is already gone may throw; the next call connects afresh either way.\n }\n }\n\n private _stream(method: string, args: unknown[], signal?: AbortSignal): AsyncIterable<G9DtSyncChunk> {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const self = this;\n return {\n [Symbol.asyncIterator](): AsyncIterator<G9DtSyncChunk> {\n const queue: G9DtSyncChunk[] = [];\n let done = false;\n let failure: unknown = null;\n let wake: (() => void) | null = null;\n let subscription: ISubscription<unknown> | null = null;\n const notify = (): void => {\n const w = wake;\n wake = null;\n if (w) w();\n };\n let unsubscribeAbort: () => void = () => undefined;\n // ADR-0074: the idle limit runs only while the iterator waits for the next chunk, never while the caller processes one.\n const idleMs = self._options.streamIdleTimeoutMs ?? 120000;\n let idleTimer: ReturnType<typeof setTimeout> | null = null;\n let idleExpired = false;\n const stopIdle = (): void => {\n if (idleTimer !== null) clearTimeout(idleTimer);\n idleTimer = null;\n };\n const armIdle = (): void => {\n stopIdle();\n if (idleMs <= 0 || done) return;\n idleTimer = setTimeout(() => {\n idleTimer = null;\n if (done) return;\n idleExpired = true;\n failure = new G9SyncException(G9SyncErrorCodes.NetworkFailure, `The sync server sent nothing on ${method} for ${Math.round(idleMs / 1000)} s.`, {\n retryable: true,\n });\n done = true;\n subscription?.dispose();\n notify();\n }, idleMs);\n };\n const start = (): void => {\n if (subscription || done) return;\n let stream: IStreamResult<unknown>;\n try {\n stream = self.client.connection.stream(method, ...args);\n } catch (error) {\n failure = error;\n done = true;\n return;\n }\n subscription = stream.subscribe({\n next: (item) => {\n queue.push(readSyncChunk(self._read(item)));\n notify();\n },\n error: (error) => {\n failure = error;\n done = true;\n notify();\n },\n complete: () => {\n done = true;\n notify();\n },\n });\n unsubscribeAbort = onAbort(signal, () => {\n failure = new G9SyncException(G9SyncErrorCodes.Canceled, 'The stream was canceled.');\n done = true;\n subscription?.dispose();\n notify();\n });\n };\n const finish = (): void => {\n stopIdle();\n unsubscribeAbort();\n if (subscription && !done) subscription.dispose();\n done = true;\n };\n return {\n async next(): Promise<IteratorResult<G9DtSyncChunk>> {\n start();\n for (;;) {\n const item = queue.shift();\n if (item) {\n stopIdle();\n return { value: item, done: false };\n }\n if (done) {\n stopIdle();\n unsubscribeAbort();\n if (idleExpired) await self._dropConnection();\n if (failure !== null) throw mapError(failure, signal ? signal.aborted : false) ?? failure;\n return { value: undefined as unknown as G9DtSyncChunk, done: true };\n }\n if (idleTimer === null) armIdle();\n await new Promise<void>((resolve) => {\n wake = resolve;\n });\n }\n },\n async return(): Promise<IteratorResult<G9DtSyncChunk>> {\n finish();\n return { value: undefined as unknown as G9DtSyncChunk, done: true };\n },\n };\n },\n };\n }\n\n private _onChanges(payload: unknown): void {\n const changes = readChangesAvailable(this._read(payload));\n for (const handler of this._handlers.slice()) {\n try {\n handler(changes);\n } catch {\n // A ChangesAvailable handler threw (logged by the .NET transport); it must not break the connection.\n }\n }\n }\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/**\n * The sync exception for a transport failure (`Map`): the server's `[G9S|code|retryable]` marker wins; any other hub\n * error is a retryable server error; 401/403 is Unauthorized; the rest is a retryable network failure. Null leaves the\n * error as it is (an already mapped one).\n */\nexport function mapError(error: unknown, canceled: boolean): G9SyncException | null {\n if (isSyncException(error)) return null;\n if (canceled) return new G9SyncException(G9SyncErrorCodes.Canceled, 'The call was canceled.', { cause: error });\n const message = messageOf(error);\n const marked = G9SyncHubErrors.tryParse(message);\n if (marked) return marked;\n const status = (error as { statusCode?: unknown }).statusCode;\n if (status === 401 || status === 403) return new G9SyncException(G9SyncErrorCodes.Unauthorized, 'The sync server refused the credentials.', { cause: error });\n if (error instanceof Error && error.name === 'AbortError') return new G9SyncException(G9SyncErrorCodes.Canceled, message, { cause: error });\n // A completion error from the hub: SignalR words it \"An unexpected error occurred invoking '…' on the server.\"\n if (/on the server|HubException/i.test(message)) return new G9SyncException(G9SyncErrorCodes.ServerError, message, { retryable: true, cause: error });\n return new G9SyncException(G9SyncErrorCodes.NetworkFailure, message, { retryable: true, cause: error });\n}\n"]}
@@ -1,4 +1,4 @@
1
- import type { G9ChangeFeedEntry, G9LocalRowEntry, G9PendingSummary, G9ResumePoint, G9StagedPull, G9SyncRejection, G9SyncRunReport } from '../client/storeTypes.js';
1
+ import type { G9ChangeFeedEntry, G9ChangeFeedKeyFilter, G9LocalRowEntry, G9PendingSummary, G9ResumePoint, G9StagedPull, G9SyncRejection, G9SyncRunReport } from '../client/storeTypes.js';
2
2
  import type { G9DtNegotiatedTable, G9DtSyncChunk, G9DtTableDigest } from '../protocol/dtos.js';
3
3
  import { type G9SqliteConnection } from './connection.js';
4
4
  import type { G9SqlValue } from './driver.js';
@@ -16,6 +16,8 @@ export declare function computeDigest(store: StoreInternals, subscriptionKey: st
16
16
  export declare function readLocalEntries(store: StoreInternals, subscriptionKey: string, table: G9DtNegotiatedTable, buckets: ReadonlySet<number>, serverKeys: ReadonlySet<string>): Promise<G9LocalRowEntry[]>;
17
17
  export declare function getPendingSummary(store: StoreInternals): Promise<G9PendingSummary>;
18
18
  export declare function readChangeFeed(store: StoreInternals, localTable: string, afterSequence: number, limit: number): Promise<G9ChangeFeedEntry[]>;
19
+ /** `ReadChangeFeedAsync(..., G9CChangeFeedKeyFilter, ...)`: the same read, narrowed in SQL to the selected keys plus every deletion. */
20
+ export declare function readChangeFeedFiltered(store: StoreInternals, localTable: string, afterSequence: number, limit: number, keyFilter: G9ChangeFeedKeyFilter): Promise<G9ChangeFeedEntry[]>;
19
21
  export declare function getChangeSequence(store: StoreInternals): Promise<number>;
20
22
  export declare function getRejections(store: StoreInternals): Promise<G9SyncRejection[]>;
21
23
  export declare function retryRejected(store: StoreInternals, localTable: string | null, key: string | null): Promise<number>;
@@ -4,6 +4,7 @@ import { G9SyncDigest } from '../abstractions/digest.js';
4
4
  import { G9SyncKey } from '../abstractions/key.js';
5
5
  import { G9Long, parseJson } from '../abstractions/long.js';
6
6
  import { guidToN, tryNormalizeGuid } from '../abstractions/guid.js';
7
+ import { validateChangeFeedKeyFilter } from '../client/storeTypes.js';
7
8
  import { readContinuation, readPullPlan } from '../protocol/wire.js';
8
9
  import { asLong, asNumber, asOptionalString, asString, statementsOf } from './connection.js';
9
10
  import { findByServerName, getLocal, persistedJson, readSubscriptions } from './internals.js';
@@ -306,6 +307,21 @@ export async function readChangeFeed(store, localTable, afterSequence, limit) {
306
307
  });
307
308
  return rows.map((r) => ({ sequence: asNumber(r[0]), key: asString(r[1]), deleted: asNumber(r[2]) !== 0, localPending: asNumber(r[3]) !== 0 }));
308
309
  }
310
+ /** `ReadChangeFeedAsync(..., G9CChangeFeedKeyFilter, ...)`: the same read, narrowed in SQL to the selected keys plus every deletion. */
311
+ export async function readChangeFeedFiltered(store, localTable, afterSequence, limit, keyFilter) {
312
+ var _a;
313
+ validateChangeFeedKeyFilter(keyFilter);
314
+ store.ensureInitialized();
315
+ const table = getLocal(store, localTable);
316
+ const parameters = { $g9t: table.tid, $g9a: afterSequence, $g9l: Math.max(1, limit) };
317
+ for (const [name, value] of Object.entries((_a = keyFilter.parameters) !== null && _a !== void 0 ? _a : {}))
318
+ parameters[name] = value;
319
+ const rows = await store
320
+ .reader()
321
+ .query('SELECT local_seq, pk, (deleted = 1 OR dirty = 2), dirty <> 0 FROM g9_rows ' +
322
+ `WHERE tid = $g9t AND local_seq > $g9a AND (deleted = 1 OR dirty = 2 OR pk IN (${keyFilter.keySql.trim()})) ORDER BY local_seq LIMIT $g9l`, parameters);
323
+ return rows.map((r) => ({ sequence: asNumber(r[0]), key: asString(r[1]), deleted: asNumber(r[2]) !== 0, localPending: asNumber(r[3]) !== 0 }));
324
+ }
309
325
  export async function getChangeSequence(store) {
310
326
  store.ensureInitialized();
311
327
  return asNumber(await store.reader().scalar('SELECT seq FROM g9_clock WHERE id = 1'));
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/sqlite/query.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.Query.cs: staging, reconciliation reads, pending counts, change\n// feed, rejections, run reports and statistics.\nimport { G9SyncDigest } from '../abstractions/digest.js';\nimport { G9SyncKey } from '../abstractions/key.js';\nimport { G9Long, parseJson } from '../abstractions/long.js';\nimport { guidToN, tryNormalizeGuid } from '../abstractions/guid.js';\nimport type {\n G9ChangeFeedEntry,\n G9LocalRowEntry,\n G9PendingSummary,\n G9PendingTable,\n G9ResumePoint,\n G9StagedPull,\n G9SyncRejection,\n G9SyncRunReport,\n} from '../client/storeTypes.js';\nimport type { G9DtNegotiatedTable, G9DtSyncChunk, G9DtTableDigest } from '../protocol/dtos.js';\nimport { readContinuation, readPullPlan } from '../protocol/wire.js';\nimport { asLong, asNumber, asOptionalString, asString, statementsOf, type G9SqliteConnection } from './connection.js';\nimport type { G9SqlValue } from './driver.js';\nimport { findByServerName, getLocal, persistedJson, readSubscriptions, type LocalTable, type StoreInternals } from './internals.js';\nimport { allColumnsMask, bit, keyExpression, literal, NOW_MS, quote } from './sql.js';\nimport { deleteFiles, forgetPendingSegments, persistedPlan, stageFileSegment, takeStagedFiles } from './snapshotFiles.js';\nimport { formatTicks, ticksOf, ticksToUnixMs } from './values.js';\n\n// ================================================================ staging\n\nexport async function readStagedRun(connection: G9SqliteConnection, runId: string): Promise<G9StagedPull | null> {\n const rows = await connection.query('SELECT plan_json, backfills_json, created_utc, generation, stage_seq, from_cursors_json FROM g9_stage_runs WHERE run_id = $r', {\n $r: runId,\n });\n const r = rows[0];\n if (!r) return null;\n const backfills = r[1] === null ? [] : (parseJson(asString(r[1])) as { tableId?: number; columns?: string[] }[]);\n const fromCursors = r[5] === null ? {} : (JSON.parse(asString(r[5])) as { [key: string]: string | null });\n return {\n runId,\n plan: readPullPlan(parseJson(asString(r[0]))),\n backfills: (Array.isArray(backfills) ? backfills : []).map((b) => ({ tableId: Number(b.tableId ?? 0), columns: Array.isArray(b.columns) ? b.columns.map(String) : [] })),\n createdUtcMs: asNumber(r[2]),\n generation: asOptionalString(r[3]),\n stageSequence: asNumber(r[4]),\n plannedFromCursors: fromCursors ?? {},\n };\n}\n\nexport async function getStagedPull(store: StoreInternals, generation: string | null): Promise<G9StagedPull | null> {\n const connection = store.reader();\n const runId =\n generation === null\n ? await connection.scalar('SELECT run_id FROM g9_stage_runs ORDER BY created_utc DESC LIMIT 1')\n : await connection.scalar('SELECT run_id FROM g9_stage_runs WHERE generation = $g ORDER BY created_utc DESC LIMIT 1', { $g: generation });\n return runId === null ? null : readStagedRun(connection, asString(runId));\n}\n\nexport async function pruneStagedPulls(store: StoreInternals, olderThanUtcMs: number, maxBytes: number, keepGeneration: string | null): Promise<number> {\n let files: string[] = [];\n const pruned = await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n const doomed = (await connection.query('SELECT run_id FROM g9_stage_runs WHERE created_utc < $c', { $c: olderThanUtcMs })).map((r) => asString(r[0]));\n // The byte cap is for the stages nobody is about to resume: newest first, past the cap they go (ADR-0060).\n let kept = 0;\n for (const r of await connection.query(\n 'SELECT r.run_id, (SELECT coalesce(sum(length(payload)), 0) FROM g9_stage s WHERE s.run_id = r.run_id) ' +\n '+ (SELECT coalesce(sum(bytes_received), 0) FROM g9_stage_files f WHERE f.run_id = r.run_id) FROM g9_stage_runs r ' +\n 'WHERE r.created_utc >= $c AND (r.generation IS NULL OR r.generation <> $g) ORDER BY r.created_utc DESC',\n { $c: olderThanUtcMs, $g: keepGeneration ?? '' },\n )) {\n kept += asNumber(r[1]);\n if (kept > Math.max(0, maxBytes)) doomed.push(asString(r[0]));\n }\n for (const runId of doomed) {\n files = files.concat(await takeStagedFiles(connection, '$r', { $r: runId }));\n await connection.exec('DELETE FROM g9_stage WHERE run_id = $r; DELETE FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\n }\n return doomed.length;\n }),\n );\n await deleteFiles(store, files);\n return pruned;\n}\n\nexport async function discardAllStagedPulls(store: StoreInternals): Promise<number> {\n let files: string[] = [];\n const count = await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n const count = asNumber(await connection.scalar('SELECT count(*) FROM g9_stage_runs'));\n files = await takeStagedFiles(connection, 'SELECT run_id FROM g9_stage_files');\n await connection.exec('DELETE FROM g9_stage; DELETE FROM g9_stage_runs;');\n return count;\n }),\n );\n await deleteFiles(store, files);\n return count;\n}\n\nexport async function beginStagedPull(store: StoreInternals, pull: G9StagedPull): Promise<void> {\n let replaced: string[] = [];\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n // Only the stage this one replaces goes: the same generation (ADR-0060).\n replaced = await takeStagedFiles(connection, 'SELECT run_id FROM g9_stage_runs WHERE generation IS $g', { $g: pull.generation });\n await connection.exec(\n 'DELETE FROM g9_stage WHERE run_id IN (SELECT run_id FROM g9_stage_runs WHERE generation IS $g); DELETE FROM g9_stage_runs WHERE generation IS $g',\n { $g: pull.generation },\n );\n // Read inside the transaction that inserts the run: rows written after it are newer than the stage (ADR-0046).\n const stageSequence = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n const fromCursors: { [key: string]: string | null } = {};\n for (const key of Object.keys(pull.plannedFromCursors)) fromCursors[key] = pull.plannedFromCursors[key] ?? null;\n await connection.exec(\n 'INSERT INTO g9_stage_runs (run_id, plan_json, backfills_json, created_utc, complete, generation, stage_seq, from_cursors_json) VALUES ($r, $p, $b, $c, 0, $g, $s, $f)',\n {\n $r: pull.runId,\n $p: persistedPlan(pull.plan),\n $b: persistedJson(pull.backfills),\n $c: pull.createdUtcMs,\n $g: pull.generation,\n $s: stageSequence,\n // Dictionary<string, string?>: a null value stays (DefaultIgnoreCondition only drops null PROPERTIES).\n $f: JSON.stringify(fromCursors),\n },\n );\n }),\n );\n await deleteFiles(store, replaced);\n}\n\nexport async function stageChunk(store: StoreInternals, runId: string, chunk: G9DtSyncChunk, durability: (connection: G9SqliteConnection) => Promise<(() => Promise<void>) | null>): Promise<void> {\n await store.writeLock.run(async () => {\n const connection = store.writer();\n if (chunk.file) {\n // A snapshot-file segment goes to its place in the staged file, not into g9_stage (ADR-0072).\n await stageFileSegment(store, runId, chunk);\n return;\n }\n const restore = await durability(connection);\n try {\n // One transaction, one bridge call (a chunk used to cost ~7: PRAGMA reads, begin, insert, commit — LES-0056).\n await connection.runAtomic([\n ...statementsOf('INSERT OR REPLACE INTO g9_stage (run_id, seq, subscription_key, row_count, continuation_json, payload) VALUES ($r, $s, $k, $n, $c, $p)', {\n $r: runId,\n $s: chunk.sequence,\n $k: chunk.subscriptionKey ?? null,\n $n: chunk.rowCount,\n $c: chunk.continuation ? persistedJson(chunk.continuation) : null,\n $p: chunk.payload ?? null,\n }),\n ...(chunk.isFinal ? statementsOf('UPDATE g9_stage_runs SET complete = 1 WHERE run_id = $r', { $r: runId }) : []),\n ]);\n } finally {\n if (restore) await restore();\n }\n });\n}\n\nexport async function getResumePoint(store: StoreInternals, runId: string): Promise<G9ResumePoint> {\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n const flag = await connection.scalar('SELECT complete FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\n const complete = typeof flag === 'number' && flag !== 0;\n // A resumed stream starts at the last durable checkpoint of a snapshot file.\n forgetPendingSegments(store, runId);\n let continuation = null;\n let lastSequence = -1;\n if (!complete) {\n const rows = await connection.query('SELECT seq, continuation_json FROM g9_stage WHERE run_id = $r AND continuation_json IS NOT NULL ORDER BY seq DESC LIMIT 1', { $r: runId });\n const r = rows[0];\n if (r) {\n lastSequence = asNumber(r[0]);\n continuation = readContinuation(parseJson(asString(r[1])));\n }\n await connection.exec('DELETE FROM g9_stage WHERE run_id = $r AND seq > $s', { $r: runId, $s: lastSequence });\n }\n const totals = (\n await connection.query(\n 'SELECT coalesce(sum(row_count), 0), coalesce(sum(length(payload)), 0) + (SELECT coalesce(sum(bytes_received), 0) FROM g9_stage_files WHERE run_id = $r) ' +\n 'FROM g9_stage WHERE run_id = $r',\n { $r: runId },\n )\n )[0];\n return { continuation, stagedRows: totals ? asNumber(totals[0]) : 0, stagedBytes: totals ? asNumber(totals[1]) : 0, complete };\n }),\n );\n}\n\nexport async function discardStagedPull(store: StoreInternals, runId: string): Promise<void> {\n let files: string[] = [];\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n files = await takeStagedFiles(connection, '$r', { $r: runId });\n await connection.exec('DELETE FROM g9_stage WHERE run_id = $r; DELETE FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\n }),\n );\n forgetPendingSegments(store, runId);\n await deleteFiles(store, files);\n}\n\n// ================================================================ reconciliation reads\n\nfunction computedColumns(local: LocalTable, table: G9DtNegotiatedTable): string[] {\n return table.computedColumns.filter((c) => local.model.indexOf(c) >= 0);\n}\n\nasync function memberRows(connection: G9SqliteConnection, local: LocalTable, subscriptionKey: string): Promise<(readonly G9SqlValue[])[] | null> {\n const records = await readSubscriptions(connection, subscriptionKey);\n const record = records[0];\n if (!record) return null;\n return record.ephemeral\n ? connection.query(\n 'SELECT r.pk, r.server_ver, r.dirty FROM g9_rows r WHERE r.tid = $t AND r.deleted = 0 AND r.dirty <> 2 ' +\n 'AND EXISTS (SELECT 1 FROM g9_ephemeral_rows e WHERE e.sub_key = $k AND e.tid = r.tid AND e.pk = r.pk)',\n { $t: local.tid, $k: subscriptionKey },\n )\n : connection.query('SELECT r.pk, r.server_ver, r.dirty FROM g9_rows r WHERE r.tid = $t AND r.deleted = 0 AND r.dirty <> 2 AND (r.subs & $b) <> 0', {\n $t: local.tid,\n $b: bit(record.slot),\n });\n}\n\nexport async function computeDigest(store: StoreInternals, subscriptionKey: string, table: G9DtNegotiatedTable): Promise<G9DtTableDigest> {\n store.ensureInitialized();\n const local = findByServerName(store, table.name);\n if (!local) throw new RangeError(`'${table.name}' is not a synced table.`);\n const computed = computedColumns(local, table);\n const digests: G9Long[] = [];\n const counts: number[] = [];\n for (let i = 0; i < 256; i++) {\n digests.push(G9Long.ZERO);\n counts.push(0);\n }\n const connection = store.reader();\n if (computed.length === 0) {\n for (const r of (await memberRows(connection, local, subscriptionKey)) ?? []) {\n const key = asString(r[0]);\n const bucket = G9SyncDigest.getBucket(key);\n counts[bucket] = (counts[bucket] as number) + 1;\n digests[bucket] = (digests[bucket] as G9Long).xor(G9SyncDigest.getRowHash(key, asLong(r[1])));\n }\n } else {\n for (const entry of await readMemberEntries(connection, local, subscriptionKey, computed)) {\n counts[entry.bucket] = (counts[entry.bucket] as number) + 1;\n digests[entry.bucket] = (digests[entry.bucket] as G9Long).xor(entry.hash);\n }\n }\n return { tableId: table.tableId, computedColumns: computed, digests, counts };\n}\n\nexport async function readLocalEntries(\n store: StoreInternals,\n subscriptionKey: string,\n table: G9DtNegotiatedTable,\n buckets: ReadonlySet<number>,\n serverKeys: ReadonlySet<string>,\n): Promise<G9LocalRowEntry[]> {\n store.ensureInitialized();\n const local = findByServerName(store, table.name);\n if (!local) throw new RangeError(`'${table.name}' is not a synced table.`);\n const computed = computedColumns(local, table);\n const entries = new Map<string, G9LocalRowEntry>();\n const connection = store.reader();\n if (computed.length === 0) {\n for (const r of (await memberRows(connection, local, subscriptionKey)) ?? []) {\n const key = asString(r[0]);\n const bucket = G9SyncDigest.getBucket(key);\n if (!buckets.has(bucket)) continue;\n const version = asLong(r[1]);\n entries.set(key, { key, bucket, version: version.toNumber(), hash: G9SyncDigest.getRowHash(key, version), member: true, dirty: asNumber(r[2]) !== 0 });\n }\n } else {\n for (const entry of await readMemberEntries(connection, local, subscriptionKey, computed)) {\n if (buckets.has(entry.bucket)) entries.set(entry.key, entry);\n }\n }\n const missing: string[] = [];\n serverKeys.forEach((key) => {\n if (!entries.has(key)) missing.push(key);\n });\n for (let i = 0; i < missing.length; i += 5000) {\n const json = JSON.stringify(missing.slice(i, i + 5000));\n for (const entry of await readEntries(connection, local, computed, 'r.deleted = 0 AND r.pk IN (SELECT value FROM json_each($keys))', false, { $keys: json })) {\n entries.set(entry.key, entry);\n }\n }\n return Array.from(entries.values());\n}\n\nasync function readMemberEntries(connection: G9SqliteConnection, local: LocalTable, subscriptionKey: string, computed: string[]): Promise<G9LocalRowEntry[]> {\n const record = (await readSubscriptions(connection, subscriptionKey))[0];\n if (!record) return [];\n return record.ephemeral\n ? readEntries(\n connection,\n local,\n computed,\n 'r.deleted = 0 AND r.dirty <> 2 AND EXISTS (SELECT 1 FROM g9_ephemeral_rows e WHERE e.sub_key = $sub AND e.tid = r.tid AND e.pk = r.pk)',\n true,\n { $sub: subscriptionKey },\n )\n : readEntries(connection, local, computed, 'r.deleted = 0 AND r.dirty <> 2 AND (r.subs & $bit) <> 0', true, { $bit: bit(record.slot) });\n}\n\nasync function readEntries(\n connection: G9SqliteConnection,\n local: LocalTable,\n computed: string[],\n where: string,\n member: boolean,\n params: { [name: string]: G9SqlValue | G9Long },\n): Promise<G9LocalRowEntry[]> {\n const computedTypes = computed.map((name) => (local.model.columns[local.model.indexOf(name)] as { type: number }).type);\n // typeof() next to each computed value: JavaScript cannot tell an INTEGER 5 from a REAL 5.0, and their canonical texts\n // can differ (1E+15 vs 1000000000000000).\n const select =\n 'SELECT r.pk, r.server_ver, r.dirty' +\n computed.map((c) => ', b.' + quote(c) + ', typeof(b.' + quote(c) + ')').join('') +\n ' FROM g9_rows r' +\n (computed.length === 0 ? '' : ` LEFT JOIN ${local.quoted} b ON b.${local.keyQuoted} = r.pk`) +\n ' WHERE r.tid = $tid AND ' +\n where;\n const rows = await connection.query(select, { $tid: local.tid, ...params });\n return rows.map((r) => {\n const key = asString(r[0]);\n const version = asLong(r[1]);\n const values: (string | null)[] = [];\n for (let i = 0; i < computed.length; i++) {\n const value = r[3 + i * 2] as G9SqlValue;\n const storage = asString(r[4 + i * 2]);\n values.push(value === null ? null : G9SyncDigest.canonicalText(computedTypes[i] as number, value, storage === 'real' ? 'real' : storage === 'integer' ? 'integer' : undefined));\n }\n return { key, bucket: G9SyncDigest.getBucket(key), version: version.toNumber(), hash: G9SyncDigest.getRowHash(key, version, values), member, dirty: asNumber(r[2]) !== 0 };\n });\n}\n\n// ================================================================ queries\n\nexport async function getPendingSummary(store: StoreInternals): Promise<G9PendingSummary> {\n const connection = store.reader();\n const tables: G9PendingTable[] = (\n await connection.query(\n 'SELECT t.local_name, ' +\n 'sum(CASE WHEN r.dirty = 1 AND r.rejected = 0 THEN 1 ELSE 0 END), ' +\n 'sum(CASE WHEN r.dirty = 2 AND r.rejected = 0 THEN 1 ELSE 0 END), ' +\n 'sum(CASE WHEN r.rejected = 1 THEN 1 ELSE 0 END) ' +\n 'FROM g9_rows r JOIN g9_tables t ON t.tid = r.tid WHERE r.dirty <> 0 GROUP BY t.local_name ORDER BY t.local_name',\n )\n ).map((r) => ({ localTable: asString(r[0]), upserts: asNumber(r[1]), deletes: asNumber(r[2]), rejected: asNumber(r[3]) }));\n const pendingCommands = asNumber(await connection.scalar('SELECT count(*) FROM g9_commands WHERE state = 0'));\n let totalRows = 0;\n let rejectedRows = 0;\n for (const t of tables) {\n totalRows += t.upserts + t.deletes;\n rejectedRows += t.rejected;\n }\n return { tables, totalRows, rejectedRows, pendingCommands };\n}\n\nexport async function readChangeFeed(store: StoreInternals, localTable: string, afterSequence: number, limit: number): Promise<G9ChangeFeedEntry[]> {\n store.ensureInitialized();\n const table = getLocal(store, localTable);\n const rows = await store\n .reader()\n .query('SELECT local_seq, pk, (deleted = 1 OR dirty = 2), dirty <> 0 FROM g9_rows WHERE tid = $t AND local_seq > $a ORDER BY local_seq LIMIT $l', {\n $t: table.tid,\n $a: afterSequence,\n $l: Math.max(1, limit),\n });\n return rows.map((r) => ({ sequence: asNumber(r[0]), key: asString(r[1]), deleted: asNumber(r[2]) !== 0, localPending: asNumber(r[3]) !== 0 }));\n}\n\nexport async function getChangeSequence(store: StoreInternals): Promise<number> {\n store.ensureInitialized();\n return asNumber(await store.reader().scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n}\n\nexport async function getRejections(store: StoreInternals): Promise<G9SyncRejection[]> {\n const rows = await store\n .reader()\n .query(\n 'SELECT t.local_name, j.pk, j.code, j.message, j.sql_state, j.constraint_name, j.column_name, j.details, j.at_utc ' +\n 'FROM g9_rejections j JOIN g9_tables t ON t.tid = j.tid JOIN g9_rows r ON r.tid = j.tid AND r.pk = j.pk WHERE r.rejected = 1 ORDER BY j.at_utc',\n );\n return rows.map((r) => ({\n localTable: asString(r[0]),\n key: asString(r[1]),\n code: asString(r[2]),\n message: asOptionalString(r[3]),\n sqlState: asOptionalString(r[4]),\n constraint: asOptionalString(r[5]),\n column: asOptionalString(r[6]),\n details: asOptionalString(r[7]),\n atUtcMs: asNumber(r[8]),\n }));\n}\n\nexport async function retryRejected(store: StoreInternals, localTable: string | null, key: string | null): Promise<number> {\n store.ensureInitialized();\n let where = 'rejected = 1';\n const params: { [name: string]: G9SqlValue } = {};\n if (localTable !== null) {\n where += ' AND tid = $t';\n params.$t = getLocal(store, localTable).tid;\n }\n if (key !== null) {\n where += ' AND pk = $pk';\n params.$pk = key;\n }\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n await connection.exec('DELETE FROM g9_rejections WHERE (tid, pk) IN (SELECT tid, pk FROM g9_rows WHERE ' + where + ')', params);\n return connection.exec('UPDATE g9_rows SET rejected = 0 WHERE ' + where, params);\n }),\n );\n}\n\nexport async function markDirty(store: StoreInternals, localTable: string, keys: readonly string[]): Promise<number> {\n store.ensureInitialized();\n const table = getLocal(store, localTable);\n const normalized = keys.map((k) => G9SyncKey.tryNormalize(table.model.keyType, k) ?? k);\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n let marked = 0;\n for (let i = 0; i < normalized.length; i += 5000) {\n const json = JSON.stringify(normalized.slice(i, i + 5000));\n marked += await markPending(store.writer(), table, 'SELECT value AS pk FROM json_each($keys)', { $keys: json }, 'dirty = 1, dirty_mask = ' + literal(allColumnsMask(table.model.columns.length)));\n }\n return marked;\n }),\n );\n}\n\n/** Marks the rows `keysSql` selects as pending, giving EACH its own local sequence (LES-0039). */\nexport async function markPending(connection: G9SqliteConnection, table: LocalTable, keysSql: string, params: { [name: string]: G9SqlValue }, set: string): Promise<number> {\n await connection.exec('CREATE TEMP TABLE IF NOT EXISTS g9_mark (pk TEXT NOT NULL PRIMARY KEY, n INTEGER NOT NULL); DELETE FROM temp.g9_mark;');\n const count = await connection.exec(`INSERT INTO temp.g9_mark (pk, n) SELECT pk, row_number() OVER (ORDER BY pk) FROM (SELECT DISTINCT pk FROM (${keysSql}) WHERE pk IS NOT NULL)`, params);\n if (count === 0) return 0;\n const first = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n await connection.exec('INSERT OR IGNORE INTO g9_rows (tid, pk) SELECT $t, pk FROM temp.g9_mark', { $t: table.tid });\n const marked = await connection.exec(\n `UPDATE g9_rows SET ${set}, local_seq = $first + m.n, hlc_ms = ${NOW_MS}, rejected = 0, deleted = 0 FROM temp.g9_mark AS m WHERE g9_rows.tid = $t AND g9_rows.pk = m.pk`,\n { $first: first, $t: table.tid },\n );\n await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1; DELETE FROM temp.g9_mark;', { $n: count });\n return marked;\n}\n\nexport async function adoptExistingRows(store: StoreInternals): Promise<number> {\n store.ensureInitialized();\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n let adopted = 0;\n for (const table of store.byLocal.values()) {\n adopted += await store.writer().exec(`INSERT OR IGNORE INTO g9_rows (tid, pk) SELECT $t, ${keyExpression(table.model, 'b')} FROM ${table.quoted} AS b`, { $t: table.tid });\n }\n return adopted;\n }),\n );\n}\n\n// ================================================================ reports and statistics\n\n/** The run report as .NET's G9SyncClientJsonContext writes it (camelCase, nulls omitted, DateTime/Guid in .NET text). */\nfunction reportToJson(report: G9SyncRunReport): string {\n const startedTicks = ticksOf(1970, 1, 1, 0, 0, 0, 0).add(G9Long.fromNumber(Math.floor(report.startedUtcMs)).multiplySmall(10000));\n return persistedJson({\n runId: report.runId,\n startedUtc: formatTicks(startedTicks) + 'Z',\n durationMs: report.durationMs,\n outcome: report.outcome,\n priority: report.priority,\n errorCode: report.errorCode,\n errorMessage: report.errorMessage,\n pushed: report.pushed,\n rejected: report.rejected,\n conflicts: report.conflicts,\n downloaded: report.downloaded,\n applied: report.applied,\n downloadedBytes: report.downloadedBytes,\n subscriptions: report.subscriptions,\n phaseMs: report.phaseMs,\n triggersSkipped: report.triggersSkipped,\n foreignTriggers: report.foreignTriggers,\n applyTransactions: report.applyTransactions,\n indexesDeferred: report.indexesDeferred,\n indexRebuildMs: report.indexRebuildMs,\n liveIndexReasons: report.liveIndexReasons,\n unchangedRows: report.unchangedRows,\n });\n}\n\nfunction reportFromJson(json: string): G9SyncRunReport | null {\n const v = parseJson(json) as { [key: string]: unknown } | null;\n if (!v || typeof v !== 'object') return null;\n const num = (x: unknown) => (typeof x === 'number' ? x : x instanceof G9Long ? x.toNumber() : 0);\n const started = typeof v.startedUtc === 'string' ? Date.parse(v.startedUtc.replace(/(\\.\\d{3})\\d+/, '$1')) : NaN;\n return {\n runId: typeof v.runId === 'string' ? v.runId : '',\n startedUtcMs: isNaN(started) ? 0 : started,\n durationMs: num(v.durationMs),\n outcome: typeof v.outcome === 'string' ? v.outcome : '',\n priority: typeof v.priority === 'string' ? v.priority : '',\n errorCode: typeof v.errorCode === 'string' ? v.errorCode : null,\n errorMessage: typeof v.errorMessage === 'string' ? v.errorMessage : null,\n pushed: num(v.pushed),\n rejected: num(v.rejected),\n conflicts: num(v.conflicts),\n downloaded: num(v.downloaded),\n applied: num(v.applied),\n downloadedBytes: num(v.downloadedBytes),\n subscriptions: Array.isArray(v.subscriptions) ? v.subscriptions.map(String) : [],\n phaseMs: (v.phaseMs as { [phase: string]: number }) ?? {},\n triggersSkipped: typeof v.triggersSkipped === 'boolean' ? v.triggersSkipped : null,\n foreignTriggers: Array.isArray(v.foreignTriggers) ? v.foreignTriggers.map(String) : [],\n applyTransactions: num(v.applyTransactions),\n indexesDeferred: num(v.indexesDeferred),\n indexRebuildMs: num(v.indexRebuildMs),\n liveIndexReasons: (v.liveIndexReasons as { [table: string]: string }) ?? {},\n unchangedRows: num(v.unchangedRows),\n };\n}\n\nexport async function saveRunReport(store: StoreInternals, report: G9SyncRunReport, keep: number): Promise<void> {\n const runId = tryNormalizeGuid(report.runId) ? guidToN(report.runId) : report.runId;\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n await connection.exec('INSERT OR REPLACE INTO g9_runs (run_id, started_utc, report_json) VALUES ($r, $s, $j)', { $r: runId, $s: report.startedUtcMs, $j: reportToJson(report) });\n await connection.exec('DELETE FROM g9_runs WHERE run_id NOT IN (SELECT run_id FROM g9_runs ORDER BY started_utc DESC LIMIT $k)', { $k: Math.max(1, keep) });\n }),\n );\n}\n\nexport async function getRecentRunReports(store: StoreInternals, count: number): Promise<G9SyncRunReport[]> {\n const rows = await store.reader().query('SELECT report_json FROM g9_runs ORDER BY started_utc DESC LIMIT $c', { $c: Math.max(1, count) });\n const reports: G9SyncRunReport[] = [];\n for (const r of rows) {\n const report = reportFromJson(asString(r[0]));\n if (report) reports.push(report);\n }\n return reports;\n}\n\nexport async function getPhaseStatistics(store: StoreInternals): Promise<{ [key: string]: number }> {\n const statistics: { [key: string]: number } = {};\n for (const r of await store.reader().query('SELECT key, value FROM g9_stats')) statistics[asString(r[0])] = asNumber(r[1]);\n return statistics;\n}\n\nexport async function recordPhaseStatistics(store: StoreInternals, samples: { [key: string]: number }): Promise<void> {\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n for (const key of Object.keys(samples)) {\n const value = samples[key] as number;\n if (!isFinite(value) || value < 0) continue;\n await store\n .writer()\n .exec(\n 'INSERT INTO g9_stats (key, value, samples) VALUES ($k, $v, 1) ON CONFLICT(key) DO UPDATE SET value = value * 0.7 + excluded.value * 0.3, samples = samples + 1',\n { $k: key, $v: value },\n );\n }\n }),\n );\n}\n\nexport async function purgeDeletedFeed(store: StoreInternals, keep: number): Promise<number> {\n return store.writeLock.run(async () => {\n const connection = store.writer();\n const threshold = await connection.scalar('SELECT local_seq FROM g9_rows WHERE deleted = 1 ORDER BY local_seq DESC LIMIT 1 OFFSET $k', { $k: Math.max(0, keep) });\n if (threshold === null) return 0;\n return connection.transaction('immediate', async () => {\n // The floor moves in the same transaction as the purge (ADR-0059).\n const purgedUpTo = await connection.scalar('SELECT max(local_seq) FROM g9_rows WHERE deleted = 1 AND dirty = 0 AND local_seq < $x', { $x: threshold });\n if (purgedUpTo === null) return 0;\n const purged = await connection.exec('DELETE FROM g9_rows WHERE deleted = 1 AND dirty = 0 AND local_seq < $x', { $x: threshold });\n await connection.exec(\n \"INSERT INTO g9_meta (key, value) VALUES ('feed_floor_seq', $f) ON CONFLICT(key) DO UPDATE SET value = excluded.value WHERE CAST(value AS INTEGER) < CAST(excluded.value AS INTEGER)\",\n { $f: asLong(purgedUpTo).toString() },\n );\n return purged;\n });\n });\n}\n\nexport async function getChangeFeedFloor(store: StoreInternals): Promise<number> {\n store.ensureInitialized();\n const text = await store.reader().scalar(\"SELECT value FROM g9_meta WHERE key = 'feed_floor_seq'\");\n if (typeof text !== 'string' || !/^[+-]?\\d+$/.test(text.trim())) return 0;\n return Number(text.trim());\n}\n\nexport { ticksToUnixMs };\n"]}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/sqlite/query.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.Query.cs: staging, reconciliation reads, pending counts, change\n// feed, rejections, run reports and statistics.\nimport { G9SyncDigest } from '../abstractions/digest.js';\nimport { G9SyncKey } from '../abstractions/key.js';\nimport { G9Long, parseJson } from '../abstractions/long.js';\nimport { guidToN, tryNormalizeGuid } from '../abstractions/guid.js';\nimport type {\n G9ChangeFeedEntry,\n G9ChangeFeedKeyFilter,\n G9LocalRowEntry,\n G9PendingSummary,\n G9PendingTable,\n G9ResumePoint,\n G9StagedPull,\n G9SyncRejection,\n G9SyncRunReport,\n} from '../client/storeTypes.js';\nimport { validateChangeFeedKeyFilter } from '../client/storeTypes.js';\nimport type { G9DtNegotiatedTable, G9DtSyncChunk, G9DtTableDigest } from '../protocol/dtos.js';\nimport { readContinuation, readPullPlan } from '../protocol/wire.js';\nimport { asLong, asNumber, asOptionalString, asString, statementsOf, type G9SqliteConnection } from './connection.js';\nimport type { G9SqlValue } from './driver.js';\nimport { findByServerName, getLocal, persistedJson, readSubscriptions, type LocalTable, type StoreInternals } from './internals.js';\nimport { allColumnsMask, bit, keyExpression, literal, NOW_MS, quote } from './sql.js';\nimport { deleteFiles, forgetPendingSegments, persistedPlan, stageFileSegment, takeStagedFiles } from './snapshotFiles.js';\nimport { formatTicks, ticksOf, ticksToUnixMs } from './values.js';\n\n// ================================================================ staging\n\nexport async function readStagedRun(connection: G9SqliteConnection, runId: string): Promise<G9StagedPull | null> {\n const rows = await connection.query('SELECT plan_json, backfills_json, created_utc, generation, stage_seq, from_cursors_json FROM g9_stage_runs WHERE run_id = $r', {\n $r: runId,\n });\n const r = rows[0];\n if (!r) return null;\n const backfills = r[1] === null ? [] : (parseJson(asString(r[1])) as { tableId?: number; columns?: string[] }[]);\n const fromCursors = r[5] === null ? {} : (JSON.parse(asString(r[5])) as { [key: string]: string | null });\n return {\n runId,\n plan: readPullPlan(parseJson(asString(r[0]))),\n backfills: (Array.isArray(backfills) ? backfills : []).map((b) => ({ tableId: Number(b.tableId ?? 0), columns: Array.isArray(b.columns) ? b.columns.map(String) : [] })),\n createdUtcMs: asNumber(r[2]),\n generation: asOptionalString(r[3]),\n stageSequence: asNumber(r[4]),\n plannedFromCursors: fromCursors ?? {},\n };\n}\n\nexport async function getStagedPull(store: StoreInternals, generation: string | null): Promise<G9StagedPull | null> {\n const connection = store.reader();\n const runId =\n generation === null\n ? await connection.scalar('SELECT run_id FROM g9_stage_runs ORDER BY created_utc DESC LIMIT 1')\n : await connection.scalar('SELECT run_id FROM g9_stage_runs WHERE generation = $g ORDER BY created_utc DESC LIMIT 1', { $g: generation });\n return runId === null ? null : readStagedRun(connection, asString(runId));\n}\n\nexport async function pruneStagedPulls(store: StoreInternals, olderThanUtcMs: number, maxBytes: number, keepGeneration: string | null): Promise<number> {\n let files: string[] = [];\n const pruned = await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n const doomed = (await connection.query('SELECT run_id FROM g9_stage_runs WHERE created_utc < $c', { $c: olderThanUtcMs })).map((r) => asString(r[0]));\n // The byte cap is for the stages nobody is about to resume: newest first, past the cap they go (ADR-0060).\n let kept = 0;\n for (const r of await connection.query(\n 'SELECT r.run_id, (SELECT coalesce(sum(length(payload)), 0) FROM g9_stage s WHERE s.run_id = r.run_id) ' +\n '+ (SELECT coalesce(sum(bytes_received), 0) FROM g9_stage_files f WHERE f.run_id = r.run_id) FROM g9_stage_runs r ' +\n 'WHERE r.created_utc >= $c AND (r.generation IS NULL OR r.generation <> $g) ORDER BY r.created_utc DESC',\n { $c: olderThanUtcMs, $g: keepGeneration ?? '' },\n )) {\n kept += asNumber(r[1]);\n if (kept > Math.max(0, maxBytes)) doomed.push(asString(r[0]));\n }\n for (const runId of doomed) {\n files = files.concat(await takeStagedFiles(connection, '$r', { $r: runId }));\n await connection.exec('DELETE FROM g9_stage WHERE run_id = $r; DELETE FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\n }\n return doomed.length;\n }),\n );\n await deleteFiles(store, files);\n return pruned;\n}\n\nexport async function discardAllStagedPulls(store: StoreInternals): Promise<number> {\n let files: string[] = [];\n const count = await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n const count = asNumber(await connection.scalar('SELECT count(*) FROM g9_stage_runs'));\n files = await takeStagedFiles(connection, 'SELECT run_id FROM g9_stage_files');\n await connection.exec('DELETE FROM g9_stage; DELETE FROM g9_stage_runs;');\n return count;\n }),\n );\n await deleteFiles(store, files);\n return count;\n}\n\nexport async function beginStagedPull(store: StoreInternals, pull: G9StagedPull): Promise<void> {\n let replaced: string[] = [];\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n // Only the stage this one replaces goes: the same generation (ADR-0060).\n replaced = await takeStagedFiles(connection, 'SELECT run_id FROM g9_stage_runs WHERE generation IS $g', { $g: pull.generation });\n await connection.exec(\n 'DELETE FROM g9_stage WHERE run_id IN (SELECT run_id FROM g9_stage_runs WHERE generation IS $g); DELETE FROM g9_stage_runs WHERE generation IS $g',\n { $g: pull.generation },\n );\n // Read inside the transaction that inserts the run: rows written after it are newer than the stage (ADR-0046).\n const stageSequence = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n const fromCursors: { [key: string]: string | null } = {};\n for (const key of Object.keys(pull.plannedFromCursors)) fromCursors[key] = pull.plannedFromCursors[key] ?? null;\n await connection.exec(\n 'INSERT INTO g9_stage_runs (run_id, plan_json, backfills_json, created_utc, complete, generation, stage_seq, from_cursors_json) VALUES ($r, $p, $b, $c, 0, $g, $s, $f)',\n {\n $r: pull.runId,\n $p: persistedPlan(pull.plan),\n $b: persistedJson(pull.backfills),\n $c: pull.createdUtcMs,\n $g: pull.generation,\n $s: stageSequence,\n // Dictionary<string, string?>: a null value stays (DefaultIgnoreCondition only drops null PROPERTIES).\n $f: JSON.stringify(fromCursors),\n },\n );\n }),\n );\n await deleteFiles(store, replaced);\n}\n\nexport async function stageChunk(store: StoreInternals, runId: string, chunk: G9DtSyncChunk, durability: (connection: G9SqliteConnection) => Promise<(() => Promise<void>) | null>): Promise<void> {\n await store.writeLock.run(async () => {\n const connection = store.writer();\n if (chunk.file) {\n // A snapshot-file segment goes to its place in the staged file, not into g9_stage (ADR-0072).\n await stageFileSegment(store, runId, chunk);\n return;\n }\n const restore = await durability(connection);\n try {\n // One transaction, one bridge call (a chunk used to cost ~7: PRAGMA reads, begin, insert, commit — LES-0056).\n await connection.runAtomic([\n ...statementsOf('INSERT OR REPLACE INTO g9_stage (run_id, seq, subscription_key, row_count, continuation_json, payload) VALUES ($r, $s, $k, $n, $c, $p)', {\n $r: runId,\n $s: chunk.sequence,\n $k: chunk.subscriptionKey ?? null,\n $n: chunk.rowCount,\n $c: chunk.continuation ? persistedJson(chunk.continuation) : null,\n $p: chunk.payload ?? null,\n }),\n ...(chunk.isFinal ? statementsOf('UPDATE g9_stage_runs SET complete = 1 WHERE run_id = $r', { $r: runId }) : []),\n ]);\n } finally {\n if (restore) await restore();\n }\n });\n}\n\nexport async function getResumePoint(store: StoreInternals, runId: string): Promise<G9ResumePoint> {\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n const flag = await connection.scalar('SELECT complete FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\n const complete = typeof flag === 'number' && flag !== 0;\n // A resumed stream starts at the last durable checkpoint of a snapshot file.\n forgetPendingSegments(store, runId);\n let continuation = null;\n let lastSequence = -1;\n if (!complete) {\n const rows = await connection.query('SELECT seq, continuation_json FROM g9_stage WHERE run_id = $r AND continuation_json IS NOT NULL ORDER BY seq DESC LIMIT 1', { $r: runId });\n const r = rows[0];\n if (r) {\n lastSequence = asNumber(r[0]);\n continuation = readContinuation(parseJson(asString(r[1])));\n }\n await connection.exec('DELETE FROM g9_stage WHERE run_id = $r AND seq > $s', { $r: runId, $s: lastSequence });\n }\n const totals = (\n await connection.query(\n 'SELECT coalesce(sum(row_count), 0), coalesce(sum(length(payload)), 0) + (SELECT coalesce(sum(bytes_received), 0) FROM g9_stage_files WHERE run_id = $r) ' +\n 'FROM g9_stage WHERE run_id = $r',\n { $r: runId },\n )\n )[0];\n return { continuation, stagedRows: totals ? asNumber(totals[0]) : 0, stagedBytes: totals ? asNumber(totals[1]) : 0, complete };\n }),\n );\n}\n\nexport async function discardStagedPull(store: StoreInternals, runId: string): Promise<void> {\n let files: string[] = [];\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n files = await takeStagedFiles(connection, '$r', { $r: runId });\n await connection.exec('DELETE FROM g9_stage WHERE run_id = $r; DELETE FROM g9_stage_runs WHERE run_id = $r', { $r: runId });\n }),\n );\n forgetPendingSegments(store, runId);\n await deleteFiles(store, files);\n}\n\n// ================================================================ reconciliation reads\n\nfunction computedColumns(local: LocalTable, table: G9DtNegotiatedTable): string[] {\n return table.computedColumns.filter((c) => local.model.indexOf(c) >= 0);\n}\n\nasync function memberRows(connection: G9SqliteConnection, local: LocalTable, subscriptionKey: string): Promise<(readonly G9SqlValue[])[] | null> {\n const records = await readSubscriptions(connection, subscriptionKey);\n const record = records[0];\n if (!record) return null;\n return record.ephemeral\n ? connection.query(\n 'SELECT r.pk, r.server_ver, r.dirty FROM g9_rows r WHERE r.tid = $t AND r.deleted = 0 AND r.dirty <> 2 ' +\n 'AND EXISTS (SELECT 1 FROM g9_ephemeral_rows e WHERE e.sub_key = $k AND e.tid = r.tid AND e.pk = r.pk)',\n { $t: local.tid, $k: subscriptionKey },\n )\n : connection.query('SELECT r.pk, r.server_ver, r.dirty FROM g9_rows r WHERE r.tid = $t AND r.deleted = 0 AND r.dirty <> 2 AND (r.subs & $b) <> 0', {\n $t: local.tid,\n $b: bit(record.slot),\n });\n}\n\nexport async function computeDigest(store: StoreInternals, subscriptionKey: string, table: G9DtNegotiatedTable): Promise<G9DtTableDigest> {\n store.ensureInitialized();\n const local = findByServerName(store, table.name);\n if (!local) throw new RangeError(`'${table.name}' is not a synced table.`);\n const computed = computedColumns(local, table);\n const digests: G9Long[] = [];\n const counts: number[] = [];\n for (let i = 0; i < 256; i++) {\n digests.push(G9Long.ZERO);\n counts.push(0);\n }\n const connection = store.reader();\n if (computed.length === 0) {\n for (const r of (await memberRows(connection, local, subscriptionKey)) ?? []) {\n const key = asString(r[0]);\n const bucket = G9SyncDigest.getBucket(key);\n counts[bucket] = (counts[bucket] as number) + 1;\n digests[bucket] = (digests[bucket] as G9Long).xor(G9SyncDigest.getRowHash(key, asLong(r[1])));\n }\n } else {\n for (const entry of await readMemberEntries(connection, local, subscriptionKey, computed)) {\n counts[entry.bucket] = (counts[entry.bucket] as number) + 1;\n digests[entry.bucket] = (digests[entry.bucket] as G9Long).xor(entry.hash);\n }\n }\n return { tableId: table.tableId, computedColumns: computed, digests, counts };\n}\n\nexport async function readLocalEntries(\n store: StoreInternals,\n subscriptionKey: string,\n table: G9DtNegotiatedTable,\n buckets: ReadonlySet<number>,\n serverKeys: ReadonlySet<string>,\n): Promise<G9LocalRowEntry[]> {\n store.ensureInitialized();\n const local = findByServerName(store, table.name);\n if (!local) throw new RangeError(`'${table.name}' is not a synced table.`);\n const computed = computedColumns(local, table);\n const entries = new Map<string, G9LocalRowEntry>();\n const connection = store.reader();\n if (computed.length === 0) {\n for (const r of (await memberRows(connection, local, subscriptionKey)) ?? []) {\n const key = asString(r[0]);\n const bucket = G9SyncDigest.getBucket(key);\n if (!buckets.has(bucket)) continue;\n const version = asLong(r[1]);\n entries.set(key, { key, bucket, version: version.toNumber(), hash: G9SyncDigest.getRowHash(key, version), member: true, dirty: asNumber(r[2]) !== 0 });\n }\n } else {\n for (const entry of await readMemberEntries(connection, local, subscriptionKey, computed)) {\n if (buckets.has(entry.bucket)) entries.set(entry.key, entry);\n }\n }\n const missing: string[] = [];\n serverKeys.forEach((key) => {\n if (!entries.has(key)) missing.push(key);\n });\n for (let i = 0; i < missing.length; i += 5000) {\n const json = JSON.stringify(missing.slice(i, i + 5000));\n for (const entry of await readEntries(connection, local, computed, 'r.deleted = 0 AND r.pk IN (SELECT value FROM json_each($keys))', false, { $keys: json })) {\n entries.set(entry.key, entry);\n }\n }\n return Array.from(entries.values());\n}\n\nasync function readMemberEntries(connection: G9SqliteConnection, local: LocalTable, subscriptionKey: string, computed: string[]): Promise<G9LocalRowEntry[]> {\n const record = (await readSubscriptions(connection, subscriptionKey))[0];\n if (!record) return [];\n return record.ephemeral\n ? readEntries(\n connection,\n local,\n computed,\n 'r.deleted = 0 AND r.dirty <> 2 AND EXISTS (SELECT 1 FROM g9_ephemeral_rows e WHERE e.sub_key = $sub AND e.tid = r.tid AND e.pk = r.pk)',\n true,\n { $sub: subscriptionKey },\n )\n : readEntries(connection, local, computed, 'r.deleted = 0 AND r.dirty <> 2 AND (r.subs & $bit) <> 0', true, { $bit: bit(record.slot) });\n}\n\nasync function readEntries(\n connection: G9SqliteConnection,\n local: LocalTable,\n computed: string[],\n where: string,\n member: boolean,\n params: { [name: string]: G9SqlValue | G9Long },\n): Promise<G9LocalRowEntry[]> {\n const computedTypes = computed.map((name) => (local.model.columns[local.model.indexOf(name)] as { type: number }).type);\n // typeof() next to each computed value: JavaScript cannot tell an INTEGER 5 from a REAL 5.0, and their canonical texts\n // can differ (1E+15 vs 1000000000000000).\n const select =\n 'SELECT r.pk, r.server_ver, r.dirty' +\n computed.map((c) => ', b.' + quote(c) + ', typeof(b.' + quote(c) + ')').join('') +\n ' FROM g9_rows r' +\n (computed.length === 0 ? '' : ` LEFT JOIN ${local.quoted} b ON b.${local.keyQuoted} = r.pk`) +\n ' WHERE r.tid = $tid AND ' +\n where;\n const rows = await connection.query(select, { $tid: local.tid, ...params });\n return rows.map((r) => {\n const key = asString(r[0]);\n const version = asLong(r[1]);\n const values: (string | null)[] = [];\n for (let i = 0; i < computed.length; i++) {\n const value = r[3 + i * 2] as G9SqlValue;\n const storage = asString(r[4 + i * 2]);\n values.push(value === null ? null : G9SyncDigest.canonicalText(computedTypes[i] as number, value, storage === 'real' ? 'real' : storage === 'integer' ? 'integer' : undefined));\n }\n return { key, bucket: G9SyncDigest.getBucket(key), version: version.toNumber(), hash: G9SyncDigest.getRowHash(key, version, values), member, dirty: asNumber(r[2]) !== 0 };\n });\n}\n\n// ================================================================ queries\n\nexport async function getPendingSummary(store: StoreInternals): Promise<G9PendingSummary> {\n const connection = store.reader();\n const tables: G9PendingTable[] = (\n await connection.query(\n 'SELECT t.local_name, ' +\n 'sum(CASE WHEN r.dirty = 1 AND r.rejected = 0 THEN 1 ELSE 0 END), ' +\n 'sum(CASE WHEN r.dirty = 2 AND r.rejected = 0 THEN 1 ELSE 0 END), ' +\n 'sum(CASE WHEN r.rejected = 1 THEN 1 ELSE 0 END) ' +\n 'FROM g9_rows r JOIN g9_tables t ON t.tid = r.tid WHERE r.dirty <> 0 GROUP BY t.local_name ORDER BY t.local_name',\n )\n ).map((r) => ({ localTable: asString(r[0]), upserts: asNumber(r[1]), deletes: asNumber(r[2]), rejected: asNumber(r[3]) }));\n const pendingCommands = asNumber(await connection.scalar('SELECT count(*) FROM g9_commands WHERE state = 0'));\n let totalRows = 0;\n let rejectedRows = 0;\n for (const t of tables) {\n totalRows += t.upserts + t.deletes;\n rejectedRows += t.rejected;\n }\n return { tables, totalRows, rejectedRows, pendingCommands };\n}\n\nexport async function readChangeFeed(store: StoreInternals, localTable: string, afterSequence: number, limit: number): Promise<G9ChangeFeedEntry[]> {\n store.ensureInitialized();\n const table = getLocal(store, localTable);\n const rows = await store\n .reader()\n .query('SELECT local_seq, pk, (deleted = 1 OR dirty = 2), dirty <> 0 FROM g9_rows WHERE tid = $t AND local_seq > $a ORDER BY local_seq LIMIT $l', {\n $t: table.tid,\n $a: afterSequence,\n $l: Math.max(1, limit),\n });\n return rows.map((r) => ({ sequence: asNumber(r[0]), key: asString(r[1]), deleted: asNumber(r[2]) !== 0, localPending: asNumber(r[3]) !== 0 }));\n}\n\n/** `ReadChangeFeedAsync(..., G9CChangeFeedKeyFilter, ...)`: the same read, narrowed in SQL to the selected keys plus every deletion. */\nexport async function readChangeFeedFiltered(\n store: StoreInternals,\n localTable: string,\n afterSequence: number,\n limit: number,\n keyFilter: G9ChangeFeedKeyFilter,\n): Promise<G9ChangeFeedEntry[]> {\n validateChangeFeedKeyFilter(keyFilter);\n store.ensureInitialized();\n const table = getLocal(store, localTable);\n const parameters: { [name: string]: G9SqlValue } = { $g9t: table.tid, $g9a: afterSequence, $g9l: Math.max(1, limit) };\n for (const [name, value] of Object.entries(keyFilter.parameters ?? {})) parameters[name] = value;\n const rows = await store\n .reader()\n .query(\n 'SELECT local_seq, pk, (deleted = 1 OR dirty = 2), dirty <> 0 FROM g9_rows ' +\n `WHERE tid = $g9t AND local_seq > $g9a AND (deleted = 1 OR dirty = 2 OR pk IN (${keyFilter.keySql.trim()})) ORDER BY local_seq LIMIT $g9l`,\n parameters,\n );\n return rows.map((r) => ({ sequence: asNumber(r[0]), key: asString(r[1]), deleted: asNumber(r[2]) !== 0, localPending: asNumber(r[3]) !== 0 }));\n}\n\nexport async function getChangeSequence(store: StoreInternals): Promise<number> {\n store.ensureInitialized();\n return asNumber(await store.reader().scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n}\n\nexport async function getRejections(store: StoreInternals): Promise<G9SyncRejection[]> {\n const rows = await store\n .reader()\n .query(\n 'SELECT t.local_name, j.pk, j.code, j.message, j.sql_state, j.constraint_name, j.column_name, j.details, j.at_utc ' +\n 'FROM g9_rejections j JOIN g9_tables t ON t.tid = j.tid JOIN g9_rows r ON r.tid = j.tid AND r.pk = j.pk WHERE r.rejected = 1 ORDER BY j.at_utc',\n );\n return rows.map((r) => ({\n localTable: asString(r[0]),\n key: asString(r[1]),\n code: asString(r[2]),\n message: asOptionalString(r[3]),\n sqlState: asOptionalString(r[4]),\n constraint: asOptionalString(r[5]),\n column: asOptionalString(r[6]),\n details: asOptionalString(r[7]),\n atUtcMs: asNumber(r[8]),\n }));\n}\n\nexport async function retryRejected(store: StoreInternals, localTable: string | null, key: string | null): Promise<number> {\n store.ensureInitialized();\n let where = 'rejected = 1';\n const params: { [name: string]: G9SqlValue } = {};\n if (localTable !== null) {\n where += ' AND tid = $t';\n params.$t = getLocal(store, localTable).tid;\n }\n if (key !== null) {\n where += ' AND pk = $pk';\n params.$pk = key;\n }\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n await connection.exec('DELETE FROM g9_rejections WHERE (tid, pk) IN (SELECT tid, pk FROM g9_rows WHERE ' + where + ')', params);\n return connection.exec('UPDATE g9_rows SET rejected = 0 WHERE ' + where, params);\n }),\n );\n}\n\nexport async function markDirty(store: StoreInternals, localTable: string, keys: readonly string[]): Promise<number> {\n store.ensureInitialized();\n const table = getLocal(store, localTable);\n const normalized = keys.map((k) => G9SyncKey.tryNormalize(table.model.keyType, k) ?? k);\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n let marked = 0;\n for (let i = 0; i < normalized.length; i += 5000) {\n const json = JSON.stringify(normalized.slice(i, i + 5000));\n marked += await markPending(store.writer(), table, 'SELECT value AS pk FROM json_each($keys)', { $keys: json }, 'dirty = 1, dirty_mask = ' + literal(allColumnsMask(table.model.columns.length)));\n }\n return marked;\n }),\n );\n}\n\n/** Marks the rows `keysSql` selects as pending, giving EACH its own local sequence (LES-0039). */\nexport async function markPending(connection: G9SqliteConnection, table: LocalTable, keysSql: string, params: { [name: string]: G9SqlValue }, set: string): Promise<number> {\n await connection.exec('CREATE TEMP TABLE IF NOT EXISTS g9_mark (pk TEXT NOT NULL PRIMARY KEY, n INTEGER NOT NULL); DELETE FROM temp.g9_mark;');\n const count = await connection.exec(`INSERT INTO temp.g9_mark (pk, n) SELECT pk, row_number() OVER (ORDER BY pk) FROM (SELECT DISTINCT pk FROM (${keysSql}) WHERE pk IS NOT NULL)`, params);\n if (count === 0) return 0;\n const first = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n await connection.exec('INSERT OR IGNORE INTO g9_rows (tid, pk) SELECT $t, pk FROM temp.g9_mark', { $t: table.tid });\n const marked = await connection.exec(\n `UPDATE g9_rows SET ${set}, local_seq = $first + m.n, hlc_ms = ${NOW_MS}, rejected = 0, deleted = 0 FROM temp.g9_mark AS m WHERE g9_rows.tid = $t AND g9_rows.pk = m.pk`,\n { $first: first, $t: table.tid },\n );\n await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1; DELETE FROM temp.g9_mark;', { $n: count });\n return marked;\n}\n\nexport async function adoptExistingRows(store: StoreInternals): Promise<number> {\n store.ensureInitialized();\n return store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n let adopted = 0;\n for (const table of store.byLocal.values()) {\n adopted += await store.writer().exec(`INSERT OR IGNORE INTO g9_rows (tid, pk) SELECT $t, ${keyExpression(table.model, 'b')} FROM ${table.quoted} AS b`, { $t: table.tid });\n }\n return adopted;\n }),\n );\n}\n\n// ================================================================ reports and statistics\n\n/** The run report as .NET's G9SyncClientJsonContext writes it (camelCase, nulls omitted, DateTime/Guid in .NET text). */\nfunction reportToJson(report: G9SyncRunReport): string {\n const startedTicks = ticksOf(1970, 1, 1, 0, 0, 0, 0).add(G9Long.fromNumber(Math.floor(report.startedUtcMs)).multiplySmall(10000));\n return persistedJson({\n runId: report.runId,\n startedUtc: formatTicks(startedTicks) + 'Z',\n durationMs: report.durationMs,\n outcome: report.outcome,\n priority: report.priority,\n errorCode: report.errorCode,\n errorMessage: report.errorMessage,\n pushed: report.pushed,\n rejected: report.rejected,\n conflicts: report.conflicts,\n downloaded: report.downloaded,\n applied: report.applied,\n downloadedBytes: report.downloadedBytes,\n subscriptions: report.subscriptions,\n phaseMs: report.phaseMs,\n triggersSkipped: report.triggersSkipped,\n foreignTriggers: report.foreignTriggers,\n applyTransactions: report.applyTransactions,\n indexesDeferred: report.indexesDeferred,\n indexRebuildMs: report.indexRebuildMs,\n liveIndexReasons: report.liveIndexReasons,\n unchangedRows: report.unchangedRows,\n });\n}\n\nfunction reportFromJson(json: string): G9SyncRunReport | null {\n const v = parseJson(json) as { [key: string]: unknown } | null;\n if (!v || typeof v !== 'object') return null;\n const num = (x: unknown) => (typeof x === 'number' ? x : x instanceof G9Long ? x.toNumber() : 0);\n const started = typeof v.startedUtc === 'string' ? Date.parse(v.startedUtc.replace(/(\\.\\d{3})\\d+/, '$1')) : NaN;\n return {\n runId: typeof v.runId === 'string' ? v.runId : '',\n startedUtcMs: isNaN(started) ? 0 : started,\n durationMs: num(v.durationMs),\n outcome: typeof v.outcome === 'string' ? v.outcome : '',\n priority: typeof v.priority === 'string' ? v.priority : '',\n errorCode: typeof v.errorCode === 'string' ? v.errorCode : null,\n errorMessage: typeof v.errorMessage === 'string' ? v.errorMessage : null,\n pushed: num(v.pushed),\n rejected: num(v.rejected),\n conflicts: num(v.conflicts),\n downloaded: num(v.downloaded),\n applied: num(v.applied),\n downloadedBytes: num(v.downloadedBytes),\n subscriptions: Array.isArray(v.subscriptions) ? v.subscriptions.map(String) : [],\n phaseMs: (v.phaseMs as { [phase: string]: number }) ?? {},\n triggersSkipped: typeof v.triggersSkipped === 'boolean' ? v.triggersSkipped : null,\n foreignTriggers: Array.isArray(v.foreignTriggers) ? v.foreignTriggers.map(String) : [],\n applyTransactions: num(v.applyTransactions),\n indexesDeferred: num(v.indexesDeferred),\n indexRebuildMs: num(v.indexRebuildMs),\n liveIndexReasons: (v.liveIndexReasons as { [table: string]: string }) ?? {},\n unchangedRows: num(v.unchangedRows),\n };\n}\n\nexport async function saveRunReport(store: StoreInternals, report: G9SyncRunReport, keep: number): Promise<void> {\n const runId = tryNormalizeGuid(report.runId) ? guidToN(report.runId) : report.runId;\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n const connection = store.writer();\n await connection.exec('INSERT OR REPLACE INTO g9_runs (run_id, started_utc, report_json) VALUES ($r, $s, $j)', { $r: runId, $s: report.startedUtcMs, $j: reportToJson(report) });\n await connection.exec('DELETE FROM g9_runs WHERE run_id NOT IN (SELECT run_id FROM g9_runs ORDER BY started_utc DESC LIMIT $k)', { $k: Math.max(1, keep) });\n }),\n );\n}\n\nexport async function getRecentRunReports(store: StoreInternals, count: number): Promise<G9SyncRunReport[]> {\n const rows = await store.reader().query('SELECT report_json FROM g9_runs ORDER BY started_utc DESC LIMIT $c', { $c: Math.max(1, count) });\n const reports: G9SyncRunReport[] = [];\n for (const r of rows) {\n const report = reportFromJson(asString(r[0]));\n if (report) reports.push(report);\n }\n return reports;\n}\n\nexport async function getPhaseStatistics(store: StoreInternals): Promise<{ [key: string]: number }> {\n const statistics: { [key: string]: number } = {};\n for (const r of await store.reader().query('SELECT key, value FROM g9_stats')) statistics[asString(r[0])] = asNumber(r[1]);\n return statistics;\n}\n\nexport async function recordPhaseStatistics(store: StoreInternals, samples: { [key: string]: number }): Promise<void> {\n await store.writeLock.run(() =>\n store.writer().transaction('immediate', async () => {\n for (const key of Object.keys(samples)) {\n const value = samples[key] as number;\n if (!isFinite(value) || value < 0) continue;\n await store\n .writer()\n .exec(\n 'INSERT INTO g9_stats (key, value, samples) VALUES ($k, $v, 1) ON CONFLICT(key) DO UPDATE SET value = value * 0.7 + excluded.value * 0.3, samples = samples + 1',\n { $k: key, $v: value },\n );\n }\n }),\n );\n}\n\nexport async function purgeDeletedFeed(store: StoreInternals, keep: number): Promise<number> {\n return store.writeLock.run(async () => {\n const connection = store.writer();\n const threshold = await connection.scalar('SELECT local_seq FROM g9_rows WHERE deleted = 1 ORDER BY local_seq DESC LIMIT 1 OFFSET $k', { $k: Math.max(0, keep) });\n if (threshold === null) return 0;\n return connection.transaction('immediate', async () => {\n // The floor moves in the same transaction as the purge (ADR-0059).\n const purgedUpTo = await connection.scalar('SELECT max(local_seq) FROM g9_rows WHERE deleted = 1 AND dirty = 0 AND local_seq < $x', { $x: threshold });\n if (purgedUpTo === null) return 0;\n const purged = await connection.exec('DELETE FROM g9_rows WHERE deleted = 1 AND dirty = 0 AND local_seq < $x', { $x: threshold });\n await connection.exec(\n \"INSERT INTO g9_meta (key, value) VALUES ('feed_floor_seq', $f) ON CONFLICT(key) DO UPDATE SET value = excluded.value WHERE CAST(value AS INTEGER) < CAST(excluded.value AS INTEGER)\",\n { $f: asLong(purgedUpTo).toString() },\n );\n return purged;\n });\n });\n}\n\nexport async function getChangeFeedFloor(store: StoreInternals): Promise<number> {\n store.ensureInitialized();\n const text = await store.reader().scalar(\"SELECT value FROM g9_meta WHERE key = 'feed_floor_seq'\");\n if (typeof text !== 'string' || !/^[+-]?\\d+$/.test(text.trim())) return 0;\n return Number(text.trim());\n}\n\nexport { ticksToUnixMs };\n"]}
@@ -5,7 +5,7 @@
5
5
  // few thousand statements: the whole reason this exists for the TypeScript client.
6
6
  import { G9SyncErrorCodes, G9SyncException } from '../abstractions/errors.js';
7
7
  import { parseJson } from '../abstractions/long.js';
8
- import { FILE_MODE_COLUMNS, FILE_MODE_COPY, FILE_MODE_MERGE } from '../client/storeTypes.js';
8
+ import { FILE_MODE_APPEND, FILE_MODE_COLUMNS, FILE_MODE_COPY, FILE_MODE_MERGE } from '../client/storeTypes.js';
9
9
  import { G9EPullPartKind } from '../protocol/dtos.js';
10
10
  import { readFileManifest } from '../protocol/wire.js';
11
11
  import { G9ESyncDirection } from '../abstractions/enums.js';
@@ -419,12 +419,17 @@ export async function applySnapshotFile(store, context, schema, file) {
419
419
  mode = identical ? FILE_MODE_COPY : FILE_MODE_COLUMNS;
420
420
  const list = shared.map(quote).join(', ');
421
421
  rows = await connection.exec(identical ? `INSERT INTO main.${table.quoted} SELECT * FROM ${source}` : `INSERT INTO main.${table.quoted} (${list}) SELECT ${list} FROM ${source}`);
422
- const clock = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));
423
- const numbered = await connection.exec('INSERT INTO g9_rows (tid, pk, server_ver, local_seq, subs, dirty, dirty_mask, rejected, deleted) ' +
424
- `SELECT $t, v.pk, v.ver, $base + row_number() OVER (ORDER BY v.r), $bit, 0, 0, 0, 0 FROM ${pairs} AS v WHERE true ` +
425
- 'ON CONFLICT(tid, pk) DO UPDATE SET server_ver = excluded.server_ver, local_seq = excluded.local_seq, subs = subs | excluded.subs, ' +
426
- 'dirty = 0, dirty_mask = 0, rejected = 0, deleted = 0', { $t: table.tid, $base: clock, $bit: bitValue });
427
- await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: numbered });
422
+ await numberNewRows(context, table, pairs, bitValue);
423
+ if (context.wantsChangedKey(table.model.localName))
424
+ await addChangedKeys(context, table, `SELECT ${sourceKey} FROM ${source} AS s ORDER BY s.rowid`);
425
+ }
426
+ else if (!isProtected && !(await overlapsStoredRows(context, table, source))) {
427
+ // A table holding only OTHER rows (a second site's first load): every row is new, so the merge's per-row diff proves nothing.
428
+ // The .NET twin measured 12.4 s as a merge against ~1 s as a plain insert for 232,005 rows (AgriPad, 2026-10-16).
429
+ mode = FILE_MODE_APPEND;
430
+ const list = shared.map(quote).join(', ');
431
+ rows = await connection.exec(`INSERT INTO main.${table.quoted} (${list}) SELECT ${list} FROM ${source} AS s ORDER BY s.${quote(table.model.keyColumn)}`);
432
+ await numberNewRows(context, table, pairs, bitValue);
428
433
  if (context.wantsChangedKey(table.model.localName))
429
434
  await addChangedKeys(context, table, `SELECT ${sourceKey} FROM ${source} AS s ORDER BY s.rowid`);
430
435
  }
@@ -447,6 +452,21 @@ export async function applySnapshotFile(store, context, schema, file) {
447
452
  diagnostics.snapshotFiles++;
448
453
  diagnostics.fileCopyMs += Date.now() - started;
449
454
  }
455
+ /** `NumberNewRows`: every row of the file is new to the table - membership, server version and the next number on the clock. */
456
+ async function numberNewRows(context, table, pairs, bitValue) {
457
+ const connection = context.connection;
458
+ const clock = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));
459
+ const numbered = await connection.exec('INSERT INTO g9_rows (tid, pk, server_ver, local_seq, subs, dirty, dirty_mask, rejected, deleted) ' +
460
+ `SELECT $t, v.pk, v.ver, $base + row_number() OVER (ORDER BY v.r), $bit, 0, 0, 0, 0 FROM ${pairs} AS v WHERE true ` +
461
+ 'ON CONFLICT(tid, pk) DO UPDATE SET server_ver = excluded.server_ver, local_seq = excluded.local_seq, subs = subs | excluded.subs, ' +
462
+ 'dirty = 0, dirty_mask = 0, rejected = 0, deleted = 0', { $t: table.tid, $base: clock, $bit: bitValue });
463
+ await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: numbered });
464
+ }
465
+ /** `OverlapsStoredRows`: whether any row of the file is already in the table - what separates an append from a merge. */
466
+ async function overlapsStoredRows(context, table, source) {
467
+ const key = quote(table.model.keyColumn);
468
+ return (await context.connection.scalar(`SELECT 1 FROM ${source} AS s WHERE EXISTS (SELECT 1 FROM main.${table.quoted} AS m WHERE m.${key} = s.${key}) LIMIT 1`)) !== null;
469
+ }
450
470
  /** `MergeSnapshotTable`: changed rows only; protected rows gain membership; unchanged rows keep their feed position. */
451
471
  async function mergeSnapshotTable(context, table, source, pairs, columns, bitValue, isProtected) {
452
472
  const connection = context.connection;