@g9tm/syncdata 1.5.19 → 1.5.21

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":"revocation.js","sourceRoot":"","sources":["../../src/sqlite/revocation.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.Revocation.cs: revocation dispositions (ADR-0026). Every path that\r\n// releases a row — a move-out in a pull or a reconciliation, an unsubscribe, an expired ephemeral subscription — ends in\r\n// disposeReleasedRow, which asks the revocation policy what to do with a row NO subscription holds any more.\r\n//\r\n// The local sequence such a row gets is the clock's next value, (SELECT seq FROM g9_clock) + 1; the CALLER moves the\r\n// clock afterwards (unconditionally, like the .NET store's `++sequence`).\r\nimport { G9ESyncColumnType } from '../abstractions/enums.js';\r\nimport { G9Long } from '../abstractions/long.js';\r\nimport {\r\n G9ApplyReport,\r\n G9ERevocationDisposition,\r\n G9ERevocationReason,\r\n G9ESubscriptionState,\r\n type G9QuarantinedRow,\r\n type G9RetainedRow,\r\n type G9RevokedRow,\r\n type G9RevokedRowEditor,\r\n} from '../client/storeTypes.js';\r\nimport { asLong, asNumber, asOptionalString, asString, G9StatementBatch, statementsOf, type G9Params, type G9SqliteConnection } from './connection.js';\r\nimport type { G9SqlValue } from './driver.js';\r\nimport { byTid, deserializeValues, getLocal, keyValue, nowMs, readLocalValues, serializeValues, type LocalTable, type StoreInternals } from './internals.js';\r\nimport { quote } from './sql.js';\r\n\r\nexport const REVOKED_REJECTION_CODE = 'G9S-REJ-REVOKED';\r\nconst NEXT_SEQ = '(SELECT seq FROM g9_clock WHERE id = 1) + 1';\r\n\r\nclass RowEditor implements G9RevokedRowEditor {\r\n readonly changed = new Map<string, string>();\r\n private readonly _values: { [column: string]: G9SqlValue };\r\n\r\n constructor(values: { [column: string]: G9SqlValue }) {\r\n this._values = values;\r\n }\r\n\r\n set(column: string, value: unknown): void {\r\n if (typeof column !== 'string' || column.trim() === '') throw new TypeError('A column is required.');\r\n const actual = Object.keys(this._values).find((c) => c.toLowerCase() === column.toLowerCase());\r\n if (actual === undefined) throw new RangeError(`'${column}' is not a column of the row.`);\r\n this._values[actual] = value as G9SqlValue;\r\n this.changed.set(actual.toLowerCase(), actual);\r\n }\r\n}\r\n\r\n/** What disposing a released row reads about it before anything is written. */\r\ninterface ReleasedRowState {\r\n /** Another subscription still holds the row. */\r\n held: boolean;\r\n dirty: number;\r\n dirtyMask: G9SqlValue;\r\n rejected: number;\r\n /** A pending command touches the row (only looked at when the row has no pending change). */\r\n pendingCommand: boolean;\r\n /** The app row; empty when it is gone. */\r\n values: { [column: string]: G9SqlValue };\r\n}\r\n\r\n/** A row with no metadata row: what the per-row path assumes when its first read finds nothing. */\r\nfunction emptyState(): ReleasedRowState {\r\n return { held: false, dirty: 0, dirtyMask: 0, rejected: 0, pendingCommand: false, values: {} };\r\n}\r\n\r\ninterface Statement {\r\n script: string;\r\n params: G9Params;\r\n}\r\n\r\n/**\r\n * The revocation decision for one released row, as the statements that carry it out, in the order the .NET store runs\r\n * them. `seq` is the SQL of the local sequence the row gets when it moves: NEXT_SEQ, or `$seq` with its value in `seqParams`.\r\n */\r\nfunction planDisposal(\r\n store: StoreInternals,\r\n table: LocalTable,\r\n key: string,\r\n state: ReleasedRowState,\r\n reason: G9ERevocationReason,\r\n subscriptionKey: string | null,\r\n report: G9ApplyReport | null,\r\n seq: string,\r\n seqParams: G9Params,\r\n): { removed: boolean; statements: Statement[] } {\r\n if (state.held) return { removed: false, statements: [] };\r\n // A row touched by a pending command is settled by that command's result, never disposed underneath it.\r\n if (state.dirty === 0 && state.pendingCommand) return { removed: false, statements: [] };\r\n\r\n const values = state.values;\r\n if (Object.keys(values).length === 0) {\r\n const script = 'UPDATE g9_rows SET deleted = 1, dirty = 0, dirty_mask = 0, rejected = 0, local_seq = ' + seq + ' WHERE tid = $t AND pk = $pk';\r\n return { removed: false, statements: [{ script, params: { ...seqParams, $t: table.tid, $pk: key } }] };\r\n }\r\n\r\n const editor = new RowEditor(values);\r\n const row: G9RevokedRow = {\r\n localTable: table.model.localName,\r\n key,\r\n reason,\r\n subscriptionKey,\r\n hasPendingChanges: state.dirty !== 0,\r\n isRejected: state.rejected !== 0,\r\n values,\r\n };\r\n const { rule, disposition } = store.options.revocation.decide(row, editor);\r\n const now = nowMs();\r\n const statements: Statement[] = [];\r\n\r\n switch (disposition) {\r\n case G9ERevocationDisposition.MarkRevoked:\r\n case G9ERevocationDisposition.Retain: {\r\n if (editor.changed.size > 0) {\r\n const columns = Array.from(editor.changed.values());\r\n const params: G9Params = { $k: keyValue(table, key) };\r\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\r\n statements.push({ script: `UPDATE ${table.quoted} SET ${columns.map((c, i) => quote(c) + ' = $v' + i).join(', ')} WHERE ${table.keyQuoted} = $k`, params });\r\n }\r\n statements.push({\r\n script: 'INSERT OR REPLACE INTO g9_revoked (tid, pk, disposition, reason, rule, at_utc) VALUES ($t, $pk, $d, $r, $rule, $now)',\r\n params: { $t: table.tid, $pk: key, $d: disposition, $r: reason, $rule: rule ? rule.name : null, $now: now },\r\n });\r\n if (state.dirty !== 0) {\r\n // Its pending change can no longer be accepted: park it as rejected instead of uploading it on every push.\r\n statements.push({\r\n script:\r\n 'UPDATE g9_rows SET rejected = 1 WHERE tid = $t AND pk = $pk; ' +\r\n 'INSERT OR REPLACE INTO g9_rejections (tid, pk, code, message, at_utc) VALUES ($t, $pk, $code, $message, $now)',\r\n params: { $t: table.tid, $pk: key, $code: REVOKED_REJECTION_CODE, $message: 'The row is no longer visible to this device; its pending change was not uploaded.', $now: now },\r\n });\r\n }\r\n if (report) report.revokedRetained++;\r\n return { removed: false, statements };\r\n }\r\n case G9ERevocationDisposition.Quarantine:\r\n statements.push({\r\n script: 'INSERT OR REPLACE INTO g9_quarantine (tid, pk, reason, rule, row_json, had_pending, dirty_mask, at_utc) VALUES ($t, $pk, $r, $rule, $json, $p, $m, $now)',\r\n params: { $t: table.tid, $pk: key, $r: reason, $rule: rule ? rule.name : null, $json: serializeValues(values), $p: state.dirty !== 0 ? 1 : 0, $m: state.dirtyMask, $now: now },\r\n });\r\n statements.push(...removeLocalRowStatements(table, key, seq, seqParams));\r\n if (report) report.revokedQuarantined++;\r\n return { removed: true, statements };\r\n default:\r\n statements.push(...removeLocalRowStatements(table, key, seq, seqParams));\r\n if (report) report.revokedDeleted++;\r\n return { removed: true, statements };\r\n }\r\n}\r\n\r\n/**\r\n * Applies the revocation policy to a released row (`DisposeReleasedRow`). Rows still held by another subscription are\r\n * untouched. Returns true when the row left the app's table (deleted or quarantined). Reads the row first, so it sees\r\n * whatever the caller ran before it; a release of many rows goes through disposeReleasedRows.\r\n */\r\nexport async function disposeReleasedRow(\r\n store: StoreInternals,\r\n connection: G9SqliteConnection,\r\n table: LocalTable,\r\n key: string,\r\n reason: G9ERevocationReason,\r\n subscriptionKey: string | null,\r\n report: G9ApplyReport | null,\r\n): Promise<boolean> {\r\n const state = emptyState();\r\n const first = (await connection.query('SELECT subs, dirty, dirty_mask, rejected FROM g9_rows WHERE tid = $t AND pk = $pk AND deleted = 0', { $t: table.tid, $pk: key }))[0];\r\n if (first) {\r\n state.held = !asLong(first[0]).isZero();\r\n state.dirty = asNumber(first[1]);\r\n state.dirtyMask = first[2] as G9SqlValue;\r\n state.rejected = asNumber(first[3]);\r\n }\r\n if (state.held) return false;\r\n if (state.dirty === 0) {\r\n const commands = await connection.scalar(\r\n 'SELECT count(*) FROM g9_command_rows r JOIN g9_commands c ON c.command_id = r.command_id WHERE c.state = 0 AND r.tid = $t AND r.pk = $pk',\r\n { $t: table.tid, $pk: key },\r\n );\r\n state.pendingCommand = asNumber(commands) > 0;\r\n if (state.pendingCommand) return false;\r\n }\r\n state.values = await readLocalValues(connection, table, key);\r\n const plan = planDisposal(store, table, key, state, reason, subscriptionKey, report, NEXT_SEQ, {});\r\n for (const statement of plan.statements) await connection.exec(statement.script, statement.params);\r\n return plan.removed;\r\n}\r\n\r\n/**\r\n * `DisposeReleasedRow` for every row `releasedSql` selects (`SELECT tid, pk …`, in the order the .NET store walks them),\r\n * then the clock moves once per row of a known table — the database state the row-by-row path leaves, in a handful of\r\n * driver calls instead of ~6 per row (on Lynx every call crosses the bridge: 25,000 rows took 850 s row by row,\r\n * LES-0051). Everything is read before anything is written, which is exact because disposing a row writes nothing\r\n * another released row's decision reads: the store's connections run with foreign keys OFF, and the CALLER must take the\r\n * row-by-row path when the database holds a foreign trigger. Returns how many rows left the app's tables.\r\n */\r\nexport async function disposeReleasedRows(\r\n store: StoreInternals,\r\n connection: G9SqliteConnection,\r\n releasedSql: string,\r\n releasedParams: G9Params,\r\n reason: G9ERevocationReason,\r\n subscriptionKey: string | null,\r\n report: G9ApplyReport | null,\r\n onRemoved?: (tid: number, key: string) => void,\r\n): Promise<number> {\r\n const released = (await connection.query(releasedSql, releasedParams)).map((r) => ({ tid: asNumber(r[0]), key: asString(r[1]) }));\r\n if (released.length === 0) return 0;\r\n const id = (tid: number, key: string): string => tid + '\\u001f' + key;\r\n // The default policy (no rules) decides a clean row without its values: it is deleted. Such rows - most of a released\r\n // site - are written by a few set statements per table instead of four per row (P2-03: 38,632 rows took 15.2 s, of\r\n // which ~9.5 s the per-row writes and 2.7 s reading values nobody looked at). A duplicate key keeps the walk.\r\n if (store.options.revocation.rules.length === 0 && new Set(released.map((r) => id(r.tid, r.key))).size === released.length) {\r\n return disposeReleasedRowsBySet(store, connection, released, releasedSql, releasedParams, reason, subscriptionKey, report, onRemoved);\r\n }\r\n\r\n const states = new Map<string, ReleasedRowState>();\r\n const stateRows = await connection.query(\r\n 'SELECT r.tid, r.pk, r.subs, r.dirty, r.dirty_mask, r.rejected, ' +\r\n 'EXISTS (SELECT 1 FROM g9_command_rows cr JOIN g9_commands c ON c.command_id = cr.command_id WHERE c.state = 0 AND cr.tid = r.tid AND cr.pk = r.pk) ' +\r\n `FROM (${releasedSql}) g JOIN g9_rows r ON r.tid = g.tid AND r.pk = g.pk WHERE r.deleted = 0`,\r\n releasedParams,\r\n );\r\n for (const r of stateRows) {\r\n states.set(id(asNumber(r[0]), asString(r[1])), {\r\n held: !asLong(r[2]).isZero(),\r\n dirty: asNumber(r[3]),\r\n dirtyMask: r[4] as G9SqlValue,\r\n rejected: asNumber(r[5]),\r\n pendingCommand: asNumber(r[6]) !== 0,\r\n values: {},\r\n });\r\n }\r\n\r\n // The app rows, one query per table: `SELECT *` of exactly the rows the per-row path reads by key.\r\n for (const tid of new Set(released.map((r) => r.tid))) {\r\n const table = byTid(store, tid);\r\n if (!table) continue;\r\n const integerKey = table.model.keyType === G9ESyncColumnType.Int32 || table.model.keyType === G9ESyncColumnType.Int64;\r\n const sql = `SELECT g.pk, t.* FROM (${releasedSql}) g JOIN ${table.quoted} t ON t.${table.keyQuoted} = ${integerKey ? 'CAST(g.pk AS INTEGER)' : 'g.pk'} WHERE g.tid = ${tid}`;\r\n const result = (await connection.runStatements(statementsOf(sql, releasedParams)))[0];\r\n if (!result) continue;\r\n const columns = result.columns.slice(1);\r\n for (const row of result.rows) {\r\n const rowId = id(tid, asString(row[0] as G9SqlValue));\r\n const state = states.get(rowId) ?? emptyState();\r\n states.set(rowId, state);\r\n columns.forEach((name, i) => (state.values[name] = row[i + 1] as G9SqlValue));\r\n }\r\n }\r\n\r\n const batch = new G9StatementBatch(connection, store.options.statementsPerBatch);\r\n const base = asLong(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\r\n let advanced = 0;\r\n let removed = 0;\r\n for (const row of released) {\r\n const table = byTid(store, row.tid);\r\n // The .NET store advances its sequence for every released row of a known table, whether or not it moved.\r\n if (!table) continue;\r\n const state = states.get(id(row.tid, row.key)) ?? emptyState();\r\n const plan = planDisposal(store, table, row.key, state, reason, subscriptionKey, report, '$seq', { $seq: base.add(G9Long.fromNumber(++advanced)) });\r\n if (plan.removed) {\r\n removed++;\r\n onRemoved?.(row.tid, row.key);\r\n }\r\n for (const statement of plan.statements) if (batch.add(statement.script, statement.params)) await batch.flush();\r\n }\r\n await batch.flush();\r\n if (advanced > 0) await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: advanced });\r\n return removed;\r\n}\r\n\r\n/**\r\n * disposeReleasedRows under the default policy: the database state of the walk, with the clean rows written as sets.\r\n * `temp.g9_dispose` holds every released row of a known table with its place in the walk (`ord`, so its tombstone gets\r\n * `base + ord` - the value the walk gives it) and its kind: 1 clean with its app row gone (a tombstone only), 2 clean\r\n * with an app row (removed), 0 any other (held, pending change or command: decided from its values, as before).\r\n */\r\nasync function disposeReleasedRowsBySet(\r\n store: StoreInternals,\r\n connection: G9SqliteConnection,\r\n released: readonly { tid: number; key: string }[],\r\n releasedSql: string,\r\n releasedParams: G9Params,\r\n reason: G9ERevocationReason,\r\n subscriptionKey: string | null,\r\n report: G9ApplyReport | null,\r\n onRemoved?: (tid: number, key: string) => void,\r\n): Promise<number> {\r\n const id = (tid: number, key: string): string => tid + '\\u001f' + key;\r\n const states = new Map<string, ReleasedRowState>();\r\n const stateRows = await connection.query(\r\n 'SELECT r.tid, r.pk, r.subs, r.dirty, r.dirty_mask, r.rejected, ' +\r\n 'EXISTS (SELECT 1 FROM g9_command_rows cr JOIN g9_commands c ON c.command_id = cr.command_id WHERE c.state = 0 AND cr.tid = r.tid AND cr.pk = r.pk) ' +\r\n `FROM (${releasedSql}) g JOIN g9_rows r ON r.tid = g.tid AND r.pk = g.pk WHERE r.deleted = 0`,\r\n releasedParams,\r\n );\r\n for (const r of stateRows) {\r\n states.set(id(asNumber(r[0]), asString(r[1])), {\r\n held: !asLong(r[2]).isZero(),\r\n dirty: asNumber(r[3]),\r\n dirtyMask: r[4] as G9SqlValue,\r\n rejected: asNumber(r[5]),\r\n pendingCommand: asNumber(r[6]) !== 0,\r\n values: {},\r\n });\r\n }\r\n\r\n // The walk's order and each row's kind; the clock moves once per released row of a known table.\r\n const walk: { table: LocalTable; tid: number; key: string; ord: number; clean: boolean }[] = [];\r\n let advanced = 0;\r\n for (const row of released) {\r\n const table = byTid(store, row.tid);\r\n if (!table) continue;\r\n const state = states.get(id(row.tid, row.key)) ?? emptyState();\r\n walk.push({ table, tid: row.tid, key: row.key, ord: ++advanced, clean: !state.held && state.dirty === 0 && !state.pendingCommand });\r\n }\r\n if (walk.length === 0) return 0;\r\n\r\n await connection.exec(\r\n 'DROP TABLE IF EXISTS temp.g9_dispose; ' +\r\n 'CREATE TEMP TABLE g9_dispose (tid INTEGER NOT NULL, pk TEXT NOT NULL, ord INTEGER NOT NULL, kind INTEGER NOT NULL, PRIMARY KEY (tid, pk)) WITHOUT ROWID',\r\n );\r\n const CHUNK = 20_000;\r\n for (let i = 0; i < walk.length; i += CHUNK) {\r\n const part = walk.slice(i, i + CHUNK).map((w) => [w.tid, w.key, w.ord, w.clean ? 1 : 0]);\r\n await connection.exec(\r\n \"INSERT INTO temp.g9_dispose (tid, pk, ord, kind) SELECT json_extract(j.value, '$[0]'), json_extract(j.value, '$[1]'), json_extract(j.value, '$[2]'), json_extract(j.value, '$[3]') FROM json_each($rows) AS j\",\r\n { $rows: JSON.stringify(part) },\r\n );\r\n }\r\n\r\n const base = asLong(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\r\n const removedKeys = new Set<string>();\r\n const tables = new Map<number, LocalTable>();\r\n for (const w of walk) tables.set(w.tid, w.table);\r\n for (const [tid, table] of tables) {\r\n const integerKey = table.model.keyType === G9ESyncColumnType.Int32 || table.model.keyType === G9ESyncColumnType.Int64;\r\n const keyOf = integerKey ? 'CAST(d.pk AS INTEGER)' : 'd.pk';\r\n // A clean row whose app row is there is removed (kind 2); one whose app row is gone gets its tombstone only (kind 1).\r\n await connection.exec(\r\n `UPDATE temp.g9_dispose SET kind = 2 WHERE tid = ${tid} AND kind = 1 AND EXISTS (SELECT 1 FROM ${table.quoted} t WHERE t.${table.keyQuoted} = ${keyOf.replace('d.pk', 'g9_dispose.pk')})`,\r\n );\r\n for (const r of await connection.query(`SELECT pk FROM temp.g9_dispose WHERE tid = ${tid} AND kind = 2`)) removedKeys.add(id(tid, asString(r[0])));\r\n await connection.exec(`DELETE FROM ${table.quoted} WHERE ${table.keyQuoted} IN (SELECT ${keyOf} FROM temp.g9_dispose AS d WHERE d.tid = ${tid} AND d.kind = 2)`);\r\n\r\n // Every other released row of the table: decided from its values, as the walk decides it.\r\n const sql = `SELECT d.pk, t.* FROM temp.g9_dispose AS d JOIN ${table.quoted} t ON t.${table.keyQuoted} = ${keyOf} WHERE d.tid = ${tid} AND d.kind = 0`;\r\n const result = (await connection.runStatements(statementsOf(sql, {})))[0];\r\n const values = new Map<string, { [column: string]: G9SqlValue }>();\r\n if (result) {\r\n const columns = result.columns.slice(1);\r\n for (const row of result.rows) {\r\n const v: { [column: string]: G9SqlValue } = {};\r\n columns.forEach((name, i) => (v[name] = row[i + 1] as G9SqlValue));\r\n values.set(asString(row[0] as G9SqlValue), v);\r\n }\r\n }\r\n const batch = new G9StatementBatch(connection, store.options.statementsPerBatch);\r\n for (const w of walk) {\r\n if (w.tid !== tid || w.clean) continue;\r\n const state = states.get(id(w.tid, w.key)) ?? emptyState();\r\n state.values = values.get(w.key) ?? {};\r\n const plan = planDisposal(store, table, w.key, state, reason, subscriptionKey, report, '$seq', { $seq: base.add(G9Long.fromNumber(w.ord)) });\r\n if (plan.removed) removedKeys.add(id(w.tid, w.key));\r\n for (const statement of plan.statements) if (batch.add(statement.script, statement.params)) await batch.flush();\r\n }\r\n await batch.flush();\r\n }\r\n\r\n // The clean rows' metadata, as removeLocalRowStatements and the tombstone-only branch of planDisposal write it.\r\n await connection.exec(\r\n 'UPDATE g9_rows SET deleted = 1, dirty = 0, dirty_mask = 0, rejected = 0, ' +\r\n 'local_seq = $base + (SELECT d.ord FROM temp.g9_dispose AS d WHERE d.tid = g9_rows.tid AND d.pk = g9_rows.pk) ' +\r\n 'WHERE (tid, pk) IN (SELECT tid, pk FROM temp.g9_dispose WHERE kind IN (1, 2)); ' +\r\n 'DELETE FROM g9_rejections WHERE (tid, pk) IN (SELECT tid, pk FROM temp.g9_dispose WHERE kind = 2); ' +\r\n 'DELETE FROM g9_revoked WHERE (tid, pk) IN (SELECT tid, pk FROM temp.g9_dispose WHERE kind = 2); ' +\r\n 'DROP TABLE temp.g9_dispose',\r\n { $base: base },\r\n );\r\n await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: advanced });\r\n\r\n let removed = 0;\r\n for (const w of walk) {\r\n if (!removedKeys.has(id(w.tid, w.key))) continue;\r\n removed++;\r\n if (w.clean && report) report.revokedDeleted++;\r\n onRemoved?.(w.tid, w.key);\r\n }\r\n return removed;\r\n}\r\n\r\nfunction removeLocalRowStatements(table: LocalTable, key: string, seq: string, seqParams: G9Params): Statement[] {\r\n return [\r\n { script: `DELETE FROM ${table.quoted} WHERE ${table.keyQuoted} = $k`, params: { $k: keyValue(table, key) } },\r\n {\r\n script:\r\n 'UPDATE g9_rows SET deleted = 1, dirty = 0, dirty_mask = 0, rejected = 0, local_seq = ' +\r\n seq +\r\n ' WHERE tid = $t AND pk = $pk; ' +\r\n 'DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk; DELETE FROM g9_revoked WHERE tid = $t AND pk = $pk',\r\n params: { ...seqParams, $t: table.tid, $pk: key },\r\n },\r\n ];\r\n}\r\n\r\n/**\r\n * `RevertRejectedAsync` (LES-0070): gives up the local change of rejected rows and takes the server's copy. A row the server never had\r\n * (`server_ver = 0` and held by no subscription) is removed locally. Any other drops its pending change and gets `server_ver = -1`: the\r\n * digest hashes key + server_ver, not the values, and a server reports version 0 for every row unchanged since its tracking began, so\r\n * \"forget the version\" (0) would leave the hash equal and the local values in place for good. -1 is a version no server issues: the\r\n * reconcile fetches the row and the apply writes the server's values and real version. The subscriptions holding the row become\r\n * NeedsReconcile, so their next sync of any kind does it (offline now is fine). A library write: capture is silent, nothing uploads.\r\n */\r\nexport async function revertRejected(store: StoreInternals, localTable: string | null, key: string | null): Promise<number> {\r\n store.ensureInitialized();\r\n let where = 'rejected = 1';\r\n const params: G9Params = {};\r\n if (localTable !== null) {\r\n where += ' AND tid = $t';\r\n params.$t = getLocal(store, localTable).tid;\r\n }\r\n if (key !== null) {\r\n where += ' AND pk = $pk';\r\n params.$pk = key;\r\n }\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const rows = await connection.query('SELECT tid, pk, (server_ver = 0 AND subs = 0) FROM g9_rows WHERE ' + where, params);\r\n if (rows.length === 0) return 0;\r\n await connection.exec('UPDATE g9_ctx SET applying = 1 WHERE id = 1');\r\n for (const r of rows) {\r\n const tid = asNumber(r[0]);\r\n const pk = asString(r[1]);\r\n const table = byTid(store, tid);\r\n if (!table) continue;\r\n if (asNumber(r[2]) === 1) {\r\n for (const statement of removeLocalRowStatements(table, pk, NEXT_SEQ, {})) await connection.exec(statement.script, statement.params);\r\n await connection.exec('UPDATE g9_clock SET seq = seq + 1 WHERE id = 1');\r\n continue;\r\n }\r\n await connection.exec(\r\n 'DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk; ' +\r\n 'UPDATE g9_subscriptions SET state = $needs WHERE (((SELECT subs FROM g9_rows WHERE tid = $t AND pk = $pk) >> slot) & 1) = 1; ' +\r\n 'UPDATE g9_rows SET dirty = 0, dirty_mask = 0, rejected = 0, server_ver = -1 WHERE tid = $t AND pk = $pk',\r\n { $t: tid, $pk: pk, $needs: G9ESubscriptionState.NeedsReconcile },\r\n );\r\n }\r\n await connection.exec('UPDATE g9_ctx SET applying = 0 WHERE id = 1');\r\n return rows.length;\r\n }),\r\n );\r\n}\r\n\r\n/** `RemoveLocalRow`: the row leaves the app's table; its metadata becomes a tombstone at the clock's next value. */\r\nexport async function removeLocalRow(connection: G9SqliteConnection, table: LocalTable, key: string): Promise<void> {\r\n for (const statement of removeLocalRowStatements(table, key, NEXT_SEQ, {})) await connection.exec(statement.script, statement.params);\r\n}\r\n\r\n// ================================================================ holding area and retained rows\r\n\r\nexport async function getQuarantined(store: StoreInternals): Promise<G9QuarantinedRow[]> {\r\n store.ensureInitialized();\r\n const rows = await store\r\n .reader()\r\n .query('SELECT t.local_name, q.pk, q.reason, q.rule, q.had_pending, q.row_json, q.at_utc FROM g9_quarantine q JOIN g9_tables t ON t.tid = q.tid ORDER BY q.at_utc');\r\n return rows.map((r) => ({\r\n localTable: asString(r[0]),\r\n key: asString(r[1]),\r\n reason: asNumber(r[2]) as G9ERevocationReason,\r\n rule: asOptionalString(r[3]),\r\n hadPendingChanges: asNumber(r[4]) !== 0,\r\n values: deserializeValues(asString(r[5])),\r\n atUtcMs: asNumber(r[6]),\r\n }));\r\n}\r\n\r\n/** Puts a quarantined row back as a pending local change (capture is ON: the restored values upload on the next push). */\r\nexport async function restoreQuarantined(store: StoreInternals, localTable: string, key: string): Promise<number> {\r\n store.ensureInitialized();\r\n const table = getLocal(store, localTable);\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const rows = await connection.query('SELECT row_json, dirty_mask, had_pending FROM g9_quarantine WHERE tid = $t AND pk = $pk', { $t: table.tid, $pk: key });\r\n const first = rows[0];\r\n if (!first) return 0;\r\n const values = deserializeValues(asString(first[0]));\r\n const mask = asNumber(first[2]) !== 0 ? asLong(first[1]) : null;\r\n const exists = Object.keys(await readLocalValues(connection, table, key)).length > 0;\r\n const lookup = (name: string): string | undefined => Object.keys(values).find((c) => c.toLowerCase() === name.toLowerCase());\r\n if (exists) {\r\n // Only the columns the user had changed are written back, so newer server values of the others survive.\r\n const columns: string[] = [];\r\n table.model.columns.forEach((c, i) => {\r\n const actual = lookup(c.name);\r\n if (actual !== undefined && (mask === null || mask.isZero() || mask.testBit(i))) columns.push(actual);\r\n });\r\n if (columns.length > 0) {\r\n const params: { [name: string]: G9SqlValue } = { $k: keyValue(table, key) };\r\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\r\n await connection.exec(`UPDATE ${table.quoted} SET ${columns.map((c, i) => quote(c) + ' = $v' + i).join(', ')} WHERE ${table.keyQuoted} = $k`, params);\r\n }\r\n } else {\r\n const columns = Object.keys(values);\r\n const params: { [name: string]: G9SqlValue } = {};\r\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\r\n await connection.exec(`INSERT INTO ${table.quoted} (${columns.map(quote).join(', ')}) VALUES (${columns.map((_, i) => '$v' + i).join(', ')})`, params);\r\n }\r\n await connection.exec('DELETE FROM g9_quarantine WHERE tid = $t AND pk = $pk', { $t: table.tid, $pk: key });\r\n return 1;\r\n }),\r\n );\r\n}\r\n\r\nexport async function discardQuarantined(store: StoreInternals, localTable: string | null, key: string | null): Promise<number> {\r\n store.ensureInitialized();\r\n const tid = localTable === null ? null : getLocal(store, localTable).tid;\r\n return store.writeLock.run(() =>\r\n store.writer().exec('DELETE FROM g9_quarantine WHERE ($t IS NULL OR tid = $t) AND ($pk IS NULL OR pk = $pk)', { $t: tid, $pk: key }),\r\n );\r\n}\r\n\r\nexport async function getRetained(store: StoreInternals): Promise<G9RetainedRow[]> {\r\n store.ensureInitialized();\r\n const rows = await store.reader().query('SELECT t.local_name, r.pk, r.disposition, r.reason, r.rule, r.at_utc FROM g9_revoked r JOIN g9_tables t ON t.tid = r.tid ORDER BY r.at_utc');\r\n return rows.map((r) => ({\r\n localTable: asString(r[0]),\r\n key: asString(r[1]),\r\n disposition: asNumber(r[2]) as G9ERevocationDisposition,\r\n reason: asNumber(r[3]) as G9ERevocationReason,\r\n rule: asOptionalString(r[4]),\r\n atUtcMs: asNumber(r[5]),\r\n }));\r\n}\r\n\r\n/** Re-checks rows retained by a RetainWhile rule; deletes those no longer retained (`ReevaluateRetainedAsync`). */\r\nexport async function reevaluateRetained(store: StoreInternals): Promise<number> {\r\n store.ensureInitialized();\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const retained = (await connection.query('SELECT tid, pk, reason, rule, disposition FROM g9_revoked')).map((r) => ({\r\n tid: asNumber(r[0]),\r\n key: asString(r[1]),\r\n reason: asNumber(r[2]),\r\n rule: asOptionalString(r[3]),\r\n disposition: asNumber(r[4]),\r\n }));\r\n if (retained.length === 0) return 0;\r\n await connection.exec('UPDATE g9_ctx SET applying = 1 WHERE id = 1');\r\n let deleted = 0;\r\n for (const entry of retained) {\r\n const table = byTid(store, entry.tid);\r\n if (!table) continue;\r\n const subs = asLong(\r\n await connection.scalar('SELECT coalesce(max(subs), 0) FROM g9_rows WHERE tid = $t AND pk = $pk AND deleted = 0', { $t: entry.tid, $pk: entry.key }),\r\n );\r\n if (!subs.isZero()) {\r\n // Visible again: no longer revoked, and a pending change parked by the revocation may upload again.\r\n await connection.exec(\r\n 'DELETE FROM g9_revoked WHERE tid = $t AND pk = $pk; DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk AND code = $code; ' +\r\n 'UPDATE g9_rows SET rejected = 0 WHERE tid = $t AND pk = $pk AND NOT EXISTS (SELECT 1 FROM g9_rejections WHERE tid = $t AND pk = $pk)',\r\n { $t: entry.tid, $pk: entry.key, $code: REVOKED_REJECTION_CODE },\r\n );\r\n continue;\r\n }\r\n if (entry.disposition !== G9ERevocationDisposition.Retain) continue;\r\n const values = await readLocalValues(connection, table, entry.key);\r\n const rule = entry.rule === null ? null : store.options.revocation.find(entry.rule);\r\n const row: G9RevokedRow = {\r\n localTable: table.model.localName,\r\n key: entry.key,\r\n reason: entry.reason as G9ERevocationReason,\r\n subscriptionKey: null,\r\n hasPendingChanges: false,\r\n isRejected: false,\r\n values,\r\n };\r\n if (rule && rule.retainWhile && Object.keys(values).length > 0 && rule.retainWhile(row)) continue;\r\n await removeLocalRow(connection, table, entry.key);\r\n await connection.exec('UPDATE g9_clock SET seq = seq + 1 WHERE id = 1');\r\n deleted++;\r\n }\r\n await connection.exec('UPDATE g9_ctx SET applying = 0 WHERE id = 1');\r\n return deleted;\r\n }),\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"revocation.js","sourceRoot":"","sources":["../../src/sqlite/revocation.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.Revocation.cs: revocation dispositions (ADR-0026). Every path that\r\n// releases a row — a move-out in a pull or a reconciliation, an unsubscribe, an expired ephemeral subscription — ends in\r\n// disposeReleasedRow, which asks the revocation policy what to do with a row NO subscription holds any more.\r\n//\r\n// The local sequence such a row gets is the clock's next value, (SELECT seq FROM g9_clock) + 1; the CALLER moves the\r\n// clock afterwards (unconditionally, like the .NET store's `++sequence`).\r\nimport { G9ESyncColumnType } from '../abstractions/enums.js';\r\nimport { G9Long } from '../abstractions/long.js';\r\nimport { G9SyncKey } from '../abstractions/key.js';\r\nimport {\r\n G9ApplyReport,\r\n G9ERevocationDisposition,\r\n G9ERevocationReason,\r\n G9ESubscriptionState,\r\n type G9QuarantinedRow,\r\n type G9RetainedRow,\r\n type G9RevokedRow,\r\n type G9RevokedRowEditor,\r\n} from '../client/storeTypes.js';\r\nimport { asLong, asNumber, asOptionalString, asString, G9StatementBatch, statementsOf, type G9Params, type G9SqliteConnection } from './connection.js';\r\nimport type { G9SqlValue } from './driver.js';\r\nimport { byTid, deserializeValues, getLocal, keyValue, nowMs, readLocalValues, serializeValues, type LocalTable, type StoreInternals } from './internals.js';\r\nimport { quote } from './sql.js';\r\n\r\nexport const REVOKED_REJECTION_CODE = 'G9S-REJ-REVOKED';\r\nconst NEXT_SEQ = '(SELECT seq FROM g9_clock WHERE id = 1) + 1';\r\n\r\nclass RowEditor implements G9RevokedRowEditor {\r\n readonly changed = new Map<string, string>();\r\n private readonly _values: { [column: string]: G9SqlValue };\r\n\r\n constructor(values: { [column: string]: G9SqlValue }) {\r\n this._values = values;\r\n }\r\n\r\n set(column: string, value: unknown): void {\r\n if (typeof column !== 'string' || column.trim() === '') throw new TypeError('A column is required.');\r\n const actual = Object.keys(this._values).find((c) => c.toLowerCase() === column.toLowerCase());\r\n if (actual === undefined) throw new RangeError(`'${column}' is not a column of the row.`);\r\n this._values[actual] = value as G9SqlValue;\r\n this.changed.set(actual.toLowerCase(), actual);\r\n }\r\n}\r\n\r\n/** What disposing a released row reads about it before anything is written. */\r\ninterface ReleasedRowState {\r\n /** Another subscription still holds the row. */\r\n held: boolean;\r\n dirty: number;\r\n dirtyMask: G9SqlValue;\r\n rejected: number;\r\n /** A pending command touches the row (only looked at when the row has no pending change). */\r\n pendingCommand: boolean;\r\n /** The app row; empty when it is gone. */\r\n values: { [column: string]: G9SqlValue };\r\n}\r\n\r\n/** A row with no metadata row: what the per-row path assumes when its first read finds nothing. */\r\nfunction emptyState(): ReleasedRowState {\r\n return { held: false, dirty: 0, dirtyMask: 0, rejected: 0, pendingCommand: false, values: {} };\r\n}\r\n\r\ninterface Statement {\r\n script: string;\r\n params: G9Params;\r\n}\r\n\r\n/**\r\n * The revocation decision for one released row, as the statements that carry it out, in the order the .NET store runs\r\n * them. `seq` is the SQL of the local sequence the row gets when it moves: NEXT_SEQ, or `$seq` with its value in `seqParams`.\r\n */\r\nfunction planDisposal(\r\n store: StoreInternals,\r\n table: LocalTable,\r\n key: string,\r\n state: ReleasedRowState,\r\n reason: G9ERevocationReason,\r\n subscriptionKey: string | null,\r\n report: G9ApplyReport | null,\r\n seq: string,\r\n seqParams: G9Params,\r\n): { removed: boolean; statements: Statement[] } {\r\n if (state.held) return { removed: false, statements: [] };\r\n // A row touched by a pending command is settled by that command's result, never disposed underneath it.\r\n if (state.dirty === 0 && state.pendingCommand) return { removed: false, statements: [] };\r\n\r\n const values = state.values;\r\n if (Object.keys(values).length === 0) {\r\n const script = 'UPDATE g9_rows SET deleted = 1, dirty = 0, dirty_mask = 0, rejected = 0, local_seq = ' + seq + ' WHERE tid = $t AND pk = $pk';\r\n return { removed: false, statements: [{ script, params: { ...seqParams, $t: table.tid, $pk: key } }] };\r\n }\r\n\r\n const editor = new RowEditor(values);\r\n const row: G9RevokedRow = {\r\n localTable: table.model.localName,\r\n key,\r\n reason,\r\n subscriptionKey,\r\n hasPendingChanges: state.dirty !== 0,\r\n isRejected: state.rejected !== 0,\r\n values,\r\n };\r\n const { rule, disposition } = store.options.revocation.decide(row, editor);\r\n const now = nowMs();\r\n const statements: Statement[] = [];\r\n\r\n switch (disposition) {\r\n case G9ERevocationDisposition.MarkRevoked:\r\n case G9ERevocationDisposition.Retain: {\r\n if (editor.changed.size > 0) {\r\n const columns = Array.from(editor.changed.values());\r\n const params: G9Params = { $k: keyValue(table, key) };\r\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\r\n statements.push({ script: `UPDATE ${table.quoted} SET ${columns.map((c, i) => quote(c) + ' = $v' + i).join(', ')} WHERE ${table.keyQuoted} = $k`, params });\r\n }\r\n statements.push({\r\n script: 'INSERT OR REPLACE INTO g9_revoked (tid, pk, disposition, reason, rule, at_utc) VALUES ($t, $pk, $d, $r, $rule, $now)',\r\n params: { $t: table.tid, $pk: key, $d: disposition, $r: reason, $rule: rule ? rule.name : null, $now: now },\r\n });\r\n if (state.dirty !== 0) {\r\n // Its pending change can no longer be accepted: park it as rejected instead of uploading it on every push.\r\n statements.push({\r\n script:\r\n 'UPDATE g9_rows SET rejected = 1 WHERE tid = $t AND pk = $pk; ' +\r\n 'INSERT OR REPLACE INTO g9_rejections (tid, pk, code, message, at_utc) VALUES ($t, $pk, $code, $message, $now)',\r\n params: { $t: table.tid, $pk: key, $code: REVOKED_REJECTION_CODE, $message: 'The row is no longer visible to this device; its pending change was not uploaded.', $now: now },\r\n });\r\n }\r\n if (report) report.revokedRetained++;\r\n return { removed: false, statements };\r\n }\r\n case G9ERevocationDisposition.Quarantine:\r\n statements.push({\r\n script: 'INSERT OR REPLACE INTO g9_quarantine (tid, pk, reason, rule, row_json, had_pending, dirty_mask, at_utc) VALUES ($t, $pk, $r, $rule, $json, $p, $m, $now)',\r\n params: { $t: table.tid, $pk: key, $r: reason, $rule: rule ? rule.name : null, $json: serializeValues(values), $p: state.dirty !== 0 ? 1 : 0, $m: state.dirtyMask, $now: now },\r\n });\r\n statements.push(...removeLocalRowStatements(table, key, seq, seqParams));\r\n if (report) report.revokedQuarantined++;\r\n return { removed: true, statements };\r\n default:\r\n statements.push(...removeLocalRowStatements(table, key, seq, seqParams));\r\n if (report) report.revokedDeleted++;\r\n return { removed: true, statements };\r\n }\r\n}\r\n\r\n/**\r\n * Applies the revocation policy to a released row (`DisposeReleasedRow`). Rows still held by another subscription are\r\n * untouched. Returns true when the row left the app's table (deleted or quarantined). Reads the row first, so it sees\r\n * whatever the caller ran before it; a release of many rows goes through disposeReleasedRows.\r\n */\r\nexport async function disposeReleasedRow(\r\n store: StoreInternals,\r\n connection: G9SqliteConnection,\r\n table: LocalTable,\r\n key: string,\r\n reason: G9ERevocationReason,\r\n subscriptionKey: string | null,\r\n report: G9ApplyReport | null,\r\n): Promise<boolean> {\r\n const state = emptyState();\r\n const first = (await connection.query('SELECT subs, dirty, dirty_mask, rejected FROM g9_rows WHERE tid = $t AND pk = $pk AND deleted = 0', { $t: table.tid, $pk: key }))[0];\r\n if (first) {\r\n state.held = !asLong(first[0]).isZero();\r\n state.dirty = asNumber(first[1]);\r\n state.dirtyMask = first[2] as G9SqlValue;\r\n state.rejected = asNumber(first[3]);\r\n }\r\n if (state.held) return false;\r\n if (state.dirty === 0) {\r\n const commands = await connection.scalar(\r\n 'SELECT count(*) FROM g9_command_rows r JOIN g9_commands c ON c.command_id = r.command_id WHERE c.state = 0 AND r.tid = $t AND r.pk = $pk',\r\n { $t: table.tid, $pk: key },\r\n );\r\n state.pendingCommand = asNumber(commands) > 0;\r\n if (state.pendingCommand) return false;\r\n }\r\n state.values = await readLocalValues(connection, table, key);\r\n const plan = planDisposal(store, table, key, state, reason, subscriptionKey, report, NEXT_SEQ, {});\r\n for (const statement of plan.statements) await connection.exec(statement.script, statement.params);\r\n return plan.removed;\r\n}\r\n\r\n/**\r\n * `DisposeReleasedRow` for every row `releasedSql` selects (`SELECT tid, pk …`, in the order the .NET store walks them),\r\n * then the clock moves once per row of a known table — the database state the row-by-row path leaves, in a handful of\r\n * driver calls instead of ~6 per row (on Lynx every call crosses the bridge: 25,000 rows took 850 s row by row,\r\n * LES-0051). Everything is read before anything is written, which is exact because disposing a row writes nothing\r\n * another released row's decision reads: the store's connections run with foreign keys OFF, and the CALLER must take the\r\n * row-by-row path when the database holds a foreign trigger. Returns how many rows left the app's tables.\r\n */\r\nexport async function disposeReleasedRows(\r\n store: StoreInternals,\r\n connection: G9SqliteConnection,\r\n releasedSql: string,\r\n releasedParams: G9Params,\r\n reason: G9ERevocationReason,\r\n subscriptionKey: string | null,\r\n report: G9ApplyReport | null,\r\n onRemoved?: (tid: number, key: string) => void,\r\n): Promise<number> {\r\n const released = (await connection.query(releasedSql, releasedParams)).map((r) => ({ tid: asNumber(r[0]), key: asString(r[1]) }));\r\n if (released.length === 0) return 0;\r\n const id = (tid: number, key: string): string => tid + '\\u001f' + key;\r\n // The default policy (no rules) decides a clean row without its values: it is deleted. Such rows - most of a released\r\n // site - are written by a few set statements per table instead of four per row (P2-03: 38,632 rows took 15.2 s, of\r\n // which ~9.5 s the per-row writes and 2.7 s reading values nobody looked at). A duplicate key keeps the walk.\r\n if (store.options.revocation.rules.length === 0 && new Set(released.map((r) => id(r.tid, r.key))).size === released.length) {\r\n return disposeReleasedRowsBySet(store, connection, released, releasedSql, releasedParams, reason, subscriptionKey, report, onRemoved);\r\n }\r\n\r\n const states = new Map<string, ReleasedRowState>();\r\n const stateRows = await connection.query(\r\n 'SELECT r.tid, r.pk, r.subs, r.dirty, r.dirty_mask, r.rejected, ' +\r\n 'EXISTS (SELECT 1 FROM g9_command_rows cr JOIN g9_commands c ON c.command_id = cr.command_id WHERE c.state = 0 AND cr.tid = r.tid AND cr.pk = r.pk) ' +\r\n `FROM (${releasedSql}) g JOIN g9_rows r ON r.tid = g.tid AND r.pk = g.pk WHERE r.deleted = 0`,\r\n releasedParams,\r\n );\r\n for (const r of stateRows) {\r\n states.set(id(asNumber(r[0]), asString(r[1])), {\r\n held: !asLong(r[2]).isZero(),\r\n dirty: asNumber(r[3]),\r\n dirtyMask: r[4] as G9SqlValue,\r\n rejected: asNumber(r[5]),\r\n pendingCommand: asNumber(r[6]) !== 0,\r\n values: {},\r\n });\r\n }\r\n\r\n // The app rows, one query per table: `SELECT *` of exactly the rows the per-row path reads by key.\r\n for (const tid of new Set(released.map((r) => r.tid))) {\r\n const table = byTid(store, tid);\r\n if (!table) continue;\r\n const integerKey = table.model.keyType === G9ESyncColumnType.Int32 || table.model.keyType === G9ESyncColumnType.Int64;\r\n const sql = `SELECT g.pk, t.* FROM (${releasedSql}) g JOIN ${table.quoted} t ON t.${table.keyQuoted} = ${integerKey ? 'CAST(g.pk AS INTEGER)' : 'g.pk'} WHERE g.tid = ${tid}`;\r\n const result = (await connection.runStatements(statementsOf(sql, releasedParams)))[0];\r\n if (!result) continue;\r\n const columns = result.columns.slice(1);\r\n for (const row of result.rows) {\r\n const rowId = id(tid, asString(row[0] as G9SqlValue));\r\n const state = states.get(rowId) ?? emptyState();\r\n states.set(rowId, state);\r\n columns.forEach((name, i) => (state.values[name] = row[i + 1] as G9SqlValue));\r\n }\r\n }\r\n\r\n const batch = new G9StatementBatch(connection, store.options.statementsPerBatch);\r\n const base = asLong(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\r\n let advanced = 0;\r\n let removed = 0;\r\n for (const row of released) {\r\n const table = byTid(store, row.tid);\r\n // The .NET store advances its sequence for every released row of a known table, whether or not it moved.\r\n if (!table) continue;\r\n const state = states.get(id(row.tid, row.key)) ?? emptyState();\r\n const plan = planDisposal(store, table, row.key, state, reason, subscriptionKey, report, '$seq', { $seq: base.add(G9Long.fromNumber(++advanced)) });\r\n if (plan.removed) {\r\n removed++;\r\n onRemoved?.(row.tid, row.key);\r\n }\r\n for (const statement of plan.statements) if (batch.add(statement.script, statement.params)) await batch.flush();\r\n }\r\n await batch.flush();\r\n if (advanced > 0) await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: advanced });\r\n return removed;\r\n}\r\n\r\n/**\r\n * disposeReleasedRows under the default policy: the database state of the walk, with the clean rows written as sets.\r\n * `temp.g9_dispose` holds every released row of a known table with its place in the walk (`ord`, so its tombstone gets\r\n * `base + ord` - the value the walk gives it) and its kind: 1 clean with its app row gone (a tombstone only), 2 clean\r\n * with an app row (removed), 0 any other (held, pending change or command: decided from its values, as before).\r\n */\r\nasync function disposeReleasedRowsBySet(\r\n store: StoreInternals,\r\n connection: G9SqliteConnection,\r\n released: readonly { tid: number; key: string }[],\r\n releasedSql: string,\r\n releasedParams: G9Params,\r\n reason: G9ERevocationReason,\r\n subscriptionKey: string | null,\r\n report: G9ApplyReport | null,\r\n onRemoved?: (tid: number, key: string) => void,\r\n): Promise<number> {\r\n const id = (tid: number, key: string): string => tid + '\\u001f' + key;\r\n const states = new Map<string, ReleasedRowState>();\r\n const stateRows = await connection.query(\r\n 'SELECT r.tid, r.pk, r.subs, r.dirty, r.dirty_mask, r.rejected, ' +\r\n 'EXISTS (SELECT 1 FROM g9_command_rows cr JOIN g9_commands c ON c.command_id = cr.command_id WHERE c.state = 0 AND cr.tid = r.tid AND cr.pk = r.pk) ' +\r\n `FROM (${releasedSql}) g JOIN g9_rows r ON r.tid = g.tid AND r.pk = g.pk WHERE r.deleted = 0`,\r\n releasedParams,\r\n );\r\n for (const r of stateRows) {\r\n states.set(id(asNumber(r[0]), asString(r[1])), {\r\n held: !asLong(r[2]).isZero(),\r\n dirty: asNumber(r[3]),\r\n dirtyMask: r[4] as G9SqlValue,\r\n rejected: asNumber(r[5]),\r\n pendingCommand: asNumber(r[6]) !== 0,\r\n values: {},\r\n });\r\n }\r\n\r\n // The walk's order and each row's kind; the clock moves once per released row of a known table.\r\n const walk: { table: LocalTable; tid: number; key: string; ord: number; clean: boolean }[] = [];\r\n let advanced = 0;\r\n for (const row of released) {\r\n const table = byTid(store, row.tid);\r\n if (!table) continue;\r\n const state = states.get(id(row.tid, row.key)) ?? emptyState();\r\n walk.push({ table, tid: row.tid, key: row.key, ord: ++advanced, clean: !state.held && state.dirty === 0 && !state.pendingCommand });\r\n }\r\n if (walk.length === 0) return 0;\r\n\r\n await connection.exec(\r\n 'DROP TABLE IF EXISTS temp.g9_dispose; ' +\r\n 'CREATE TEMP TABLE g9_dispose (tid INTEGER NOT NULL, pk TEXT NOT NULL, ord INTEGER NOT NULL, kind INTEGER NOT NULL, PRIMARY KEY (tid, pk)) WITHOUT ROWID',\r\n );\r\n const CHUNK = 20_000;\r\n for (let i = 0; i < walk.length; i += CHUNK) {\r\n const part = walk.slice(i, i + CHUNK).map((w) => [w.tid, w.key, w.ord, w.clean ? 1 : 0]);\r\n await connection.exec(\r\n \"INSERT INTO temp.g9_dispose (tid, pk, ord, kind) SELECT json_extract(j.value, '$[0]'), json_extract(j.value, '$[1]'), json_extract(j.value, '$[2]'), json_extract(j.value, '$[3]') FROM json_each($rows) AS j\",\r\n { $rows: JSON.stringify(part) },\r\n );\r\n }\r\n\r\n const base = asLong(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\r\n const removedKeys = new Set<string>();\r\n const tables = new Map<number, LocalTable>();\r\n for (const w of walk) tables.set(w.tid, w.table);\r\n for (const [tid, table] of tables) {\r\n const integerKey = table.model.keyType === G9ESyncColumnType.Int32 || table.model.keyType === G9ESyncColumnType.Int64;\r\n const keyOf = integerKey ? 'CAST(d.pk AS INTEGER)' : 'd.pk';\r\n // A clean row whose app row is there is removed (kind 2); one whose app row is gone gets its tombstone only (kind 1).\r\n await connection.exec(\r\n `UPDATE temp.g9_dispose SET kind = 2 WHERE tid = ${tid} AND kind = 1 AND EXISTS (SELECT 1 FROM ${table.quoted} t WHERE t.${table.keyQuoted} = ${keyOf.replace('d.pk', 'g9_dispose.pk')})`,\r\n );\r\n for (const r of await connection.query(`SELECT pk FROM temp.g9_dispose WHERE tid = ${tid} AND kind = 2`)) removedKeys.add(id(tid, asString(r[0])));\r\n await connection.exec(`DELETE FROM ${table.quoted} WHERE ${table.keyQuoted} IN (SELECT ${keyOf} FROM temp.g9_dispose AS d WHERE d.tid = ${tid} AND d.kind = 2)`);\r\n\r\n // Every other released row of the table: decided from its values, as the walk decides it.\r\n const sql = `SELECT d.pk, t.* FROM temp.g9_dispose AS d JOIN ${table.quoted} t ON t.${table.keyQuoted} = ${keyOf} WHERE d.tid = ${tid} AND d.kind = 0`;\r\n const result = (await connection.runStatements(statementsOf(sql, {})))[0];\r\n const values = new Map<string, { [column: string]: G9SqlValue }>();\r\n if (result) {\r\n const columns = result.columns.slice(1);\r\n for (const row of result.rows) {\r\n const v: { [column: string]: G9SqlValue } = {};\r\n columns.forEach((name, i) => (v[name] = row[i + 1] as G9SqlValue));\r\n values.set(asString(row[0] as G9SqlValue), v);\r\n }\r\n }\r\n const batch = new G9StatementBatch(connection, store.options.statementsPerBatch);\r\n for (const w of walk) {\r\n if (w.tid !== tid || w.clean) continue;\r\n const state = states.get(id(w.tid, w.key)) ?? emptyState();\r\n state.values = values.get(w.key) ?? {};\r\n const plan = planDisposal(store, table, w.key, state, reason, subscriptionKey, report, '$seq', { $seq: base.add(G9Long.fromNumber(w.ord)) });\r\n if (plan.removed) removedKeys.add(id(w.tid, w.key));\r\n for (const statement of plan.statements) if (batch.add(statement.script, statement.params)) await batch.flush();\r\n }\r\n await batch.flush();\r\n }\r\n\r\n // The clean rows' metadata, as removeLocalRowStatements and the tombstone-only branch of planDisposal write it.\r\n await connection.exec(\r\n 'UPDATE g9_rows SET deleted = 1, dirty = 0, dirty_mask = 0, rejected = 0, ' +\r\n 'local_seq = $base + (SELECT d.ord FROM temp.g9_dispose AS d WHERE d.tid = g9_rows.tid AND d.pk = g9_rows.pk) ' +\r\n 'WHERE (tid, pk) IN (SELECT tid, pk FROM temp.g9_dispose WHERE kind IN (1, 2)); ' +\r\n 'DELETE FROM g9_rejections WHERE (tid, pk) IN (SELECT tid, pk FROM temp.g9_dispose WHERE kind = 2); ' +\r\n 'DELETE FROM g9_revoked WHERE (tid, pk) IN (SELECT tid, pk FROM temp.g9_dispose WHERE kind = 2); ' +\r\n 'DROP TABLE temp.g9_dispose',\r\n { $base: base },\r\n );\r\n await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: advanced });\r\n\r\n let removed = 0;\r\n for (const w of walk) {\r\n if (!removedKeys.has(id(w.tid, w.key))) continue;\r\n removed++;\r\n if (w.clean && report) report.revokedDeleted++;\r\n onRemoved?.(w.tid, w.key);\r\n }\r\n return removed;\r\n}\r\n\r\nfunction removeLocalRowStatements(table: LocalTable, key: string, seq: string, seqParams: G9Params): Statement[] {\r\n return [\r\n { script: `DELETE FROM ${table.quoted} WHERE ${table.keyQuoted} = $k`, params: { $k: keyValue(table, key) } },\r\n {\r\n script:\r\n 'UPDATE g9_rows SET deleted = 1, dirty = 0, dirty_mask = 0, rejected = 0, local_seq = ' +\r\n seq +\r\n ' WHERE tid = $t AND pk = $pk; ' +\r\n 'DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk; DELETE FROM g9_revoked WHERE tid = $t AND pk = $pk',\r\n params: { ...seqParams, $t: table.tid, $pk: key },\r\n },\r\n ];\r\n}\r\n\r\n/**\r\n * `RevertRejectedAsync` (LES-0070): gives up the local change of rejected rows and takes the server's copy. A row the server never had\r\n * (`server_ver = 0` and held by no subscription) is removed locally. Any other drops its pending change and gets `server_ver = -1`: the\r\n * digest hashes key + server_ver, not the values, and a server reports version 0 for every row unchanged since its tracking began, so\r\n * \"forget the version\" (0) would leave the hash equal and the local values in place for good. -1 is a version no server issues: the\r\n * reconcile fetches the row and the apply writes the server's values and real version. The subscriptions holding the row become\r\n * NeedsReconcile, so their next sync of any kind does it (offline now is fine). A library write: capture is silent, nothing uploads.\r\n */\r\nexport async function revertRejected(store: StoreInternals, localTable: string | null, key: string | null): Promise<number> {\r\n store.ensureInitialized();\r\n let where = 'rejected = 1';\r\n const params: G9Params = {};\r\n if (localTable !== null) {\r\n where += ' AND tid = $t';\r\n params.$t = getLocal(store, localTable).tid;\r\n }\r\n if (key !== null) {\r\n where += ' AND pk = $pk';\r\n params.$pk = key;\r\n }\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const rows = await connection.query('SELECT tid, pk, (server_ver = 0 AND subs = 0) FROM g9_rows WHERE ' + where, params);\r\n if (rows.length === 0) return 0;\r\n await connection.exec('UPDATE g9_ctx SET applying = 1 WHERE id = 1');\r\n for (const r of rows) {\r\n const tid = asNumber(r[0]);\r\n const pk = asString(r[1]);\r\n const table = byTid(store, tid);\r\n if (!table) continue;\r\n if (asNumber(r[2]) === 1) {\r\n for (const statement of removeLocalRowStatements(table, pk, NEXT_SEQ, {})) await connection.exec(statement.script, statement.params);\r\n await connection.exec('UPDATE g9_clock SET seq = seq + 1 WHERE id = 1');\r\n continue;\r\n }\r\n await connection.exec(\r\n 'DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk; ' +\r\n 'UPDATE g9_subscriptions SET state = $needs WHERE (((SELECT subs FROM g9_rows WHERE tid = $t AND pk = $pk) >> slot) & 1) = 1; ' +\r\n 'UPDATE g9_rows SET dirty = 0, dirty_mask = 0, rejected = 0, server_ver = -1 WHERE tid = $t AND pk = $pk',\r\n { $t: tid, $pk: pk, $needs: G9ESubscriptionState.NeedsReconcile },\r\n );\r\n }\r\n await connection.exec('UPDATE g9_ctx SET applying = 0 WHERE id = 1');\r\n return rows.length;\r\n }),\r\n );\r\n}\r\n\r\n/** Canonical keys of `keys` (a GUID key in any spelling finds its row), distinct, as JSON pages of 5000; `[null]` = the whole table. */\r\nfunction keyPages(table: LocalTable, keys: readonly string[] | null): (string | null)[] {\r\n if (keys === null) return [null];\r\n const canonical = [...new Set(keys.map((k) => G9SyncKey.tryNormalize(table.model.keyType, k) ?? k))];\r\n const pages: string[] = [];\r\n for (let i = 0; i < canonical.length; i += 5000) pages.push(JSON.stringify(canonical.slice(i, i + 5000)));\r\n return pages;\r\n}\r\n\r\n/**\r\n * `RefetchRowsAsync` (1.5.19): the next sync fetches these rows again and overwrites their values. Every CLEAN row a subscription\r\n * holds (no pending change, no rejection, not deleted) gets `server_ver = -1` - a version no server issues, so the reconcile's\r\n * digest differs and the apply writes the server's values and real version - and the subscriptions holding them become\r\n * NeedsReconcile. Metadata only: the app's table and the change feed are untouched, nothing uploads.\r\n */\r\nexport async function refetchRows(store: StoreInternals, localTable: string, keys: readonly string[] | null): Promise<number> {\r\n store.ensureInitialized();\r\n const table = getLocal(store, localTable);\r\n const pages = keyPages(table, keys);\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const clean = 'tid = $t AND dirty = 0 AND rejected = 0 AND deleted = 0 AND subs <> 0';\r\n let marked = 0;\r\n for (const page of pages) {\r\n const where = clean + (page === null ? '' : ' AND pk IN (SELECT value FROM json_each($keys))');\r\n const params: G9Params = page === null ? { $t: table.tid } : { $t: table.tid, $keys: page };\r\n // The holders first: every subscription with its bit in one of these rows.\r\n await connection.exec(\r\n `UPDATE g9_subscriptions SET state = $needs WHERE EXISTS (SELECT 1 FROM g9_rows WHERE ${where} AND ((subs >> g9_subscriptions.slot) & 1) = 1)`,\r\n { ...params, $needs: G9ESubscriptionState.NeedsReconcile },\r\n );\r\n marked += await connection.exec('UPDATE g9_rows SET server_ver = -1 WHERE ' + where, params);\r\n }\r\n return marked;\r\n }),\r\n );\r\n}\r\n\r\n/**\r\n * `ReleaseUnclaimedRowsAsync` (1.5.19): disposes rows of one table that no subscription holds and the server never claimed\r\n * (`server_ver = 0`), not decided before (revoked, quarantined), not an ephemeral member and not in a pending command - reason\r\n * Unclaimed, capture off, nothing uploads. A pending change (and a refused one) only with `includePending`: then the revocation\r\n * policy decides it like any released row (the default quarantines it, the refusal with it).\r\n */\r\nexport async function releaseUnclaimedRows(store: StoreInternals, localTable: string, keys: readonly string[] | null, includePending: boolean): Promise<G9ApplyReport> {\r\n store.ensureInitialized();\r\n const table = getLocal(store, localTable);\r\n const pages = keyPages(table, keys);\r\n const report = new G9ApplyReport();\r\n const where =\r\n 'r.tid = $t AND r.subs = 0 AND r.deleted = 0 AND r.server_ver = 0' +\r\n (includePending ? '' : ' AND r.dirty = 0 AND r.rejected = 0') +\r\n ' AND NOT EXISTS (SELECT 1 FROM g9_revoked v WHERE v.tid = r.tid AND v.pk = r.pk)' +\r\n ' AND NOT EXISTS (SELECT 1 FROM g9_quarantine q WHERE q.tid = r.tid AND q.pk = r.pk)' +\r\n ' AND NOT EXISTS (SELECT 1 FROM g9_ephemeral_rows e WHERE e.tid = r.tid AND e.pk = r.pk)' +\r\n ' AND NOT EXISTS (SELECT 1 FROM g9_command_rows cr JOIN g9_commands c ON c.command_id = cr.command_id WHERE c.state = 0 AND cr.tid = r.tid AND cr.pk = r.pk)';\r\n await store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n // Every page is read BEFORE anything is disposed (.NET collects the whole list first), each in key order.\r\n await connection.exec('DROP TABLE IF EXISTS temp.g9_unclaimed; CREATE TEMP TABLE g9_unclaimed (n INTEGER PRIMARY KEY, tid INTEGER NOT NULL, pk TEXT NOT NULL)');\r\n for (const page of pages) {\r\n const byKeys = page === null ? '' : ' AND r.pk IN (SELECT value FROM json_each($keys))';\r\n await connection.exec(\r\n `INSERT INTO temp.g9_unclaimed (tid, pk) SELECT r.tid, r.pk FROM g9_rows r WHERE ${where}${byKeys} ORDER BY r.pk`,\r\n page === null ? { $t: table.tid } : { $t: table.tid, $keys: page },\r\n );\r\n }\r\n if (asNumber(await connection.scalar('SELECT count(*) FROM temp.g9_unclaimed')) > 0) {\r\n // Capture OFF: a release is local housekeeping and must never reach the server as a delete.\r\n await connection.exec('UPDATE g9_ctx SET applying = 1 WHERE id = 1');\r\n const max = store.options.maxChangedKeysPerTable;\r\n await disposeReleasedRows(store, connection, 'SELECT tid, pk FROM temp.g9_unclaimed ORDER BY n', {}, G9ERevocationReason.Unclaimed, null, report, (_tid, key) => {\r\n const changed = report.changedKeys[table.model.localName] ?? (report.changedKeys[table.model.localName] = []);\r\n if (changed.length < max) changed.push(key);\r\n });\r\n await connection.exec('UPDATE g9_ctx SET applying = 0 WHERE id = 1');\r\n }\r\n await connection.exec('DROP TABLE temp.g9_unclaimed');\r\n }),\r\n );\r\n return report;\r\n}\r\n\r\n/** `RemoveLocalRow`: the row leaves the app's table; its metadata becomes a tombstone at the clock's next value. */\r\nexport async function removeLocalRow(connection: G9SqliteConnection, table: LocalTable, key: string): Promise<void> {\r\n for (const statement of removeLocalRowStatements(table, key, NEXT_SEQ, {})) await connection.exec(statement.script, statement.params);\r\n}\r\n\r\n// ================================================================ holding area and retained rows\r\n\r\nexport async function getQuarantined(store: StoreInternals): Promise<G9QuarantinedRow[]> {\r\n store.ensureInitialized();\r\n const rows = await store\r\n .reader()\r\n .query('SELECT t.local_name, q.pk, q.reason, q.rule, q.had_pending, q.row_json, q.at_utc FROM g9_quarantine q JOIN g9_tables t ON t.tid = q.tid ORDER BY q.at_utc');\r\n return rows.map((r) => ({\r\n localTable: asString(r[0]),\r\n key: asString(r[1]),\r\n reason: asNumber(r[2]) as G9ERevocationReason,\r\n rule: asOptionalString(r[3]),\r\n hadPendingChanges: asNumber(r[4]) !== 0,\r\n values: deserializeValues(asString(r[5])),\r\n atUtcMs: asNumber(r[6]),\r\n }));\r\n}\r\n\r\n/** Puts a quarantined row back as a pending local change (capture is ON: the restored values upload on the next push). */\r\nexport async function restoreQuarantined(store: StoreInternals, localTable: string, key: string): Promise<number> {\r\n store.ensureInitialized();\r\n const table = getLocal(store, localTable);\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const rows = await connection.query('SELECT row_json, dirty_mask, had_pending FROM g9_quarantine WHERE tid = $t AND pk = $pk', { $t: table.tid, $pk: key });\r\n const first = rows[0];\r\n if (!first) return 0;\r\n const values = deserializeValues(asString(first[0]));\r\n const mask = asNumber(first[2]) !== 0 ? asLong(first[1]) : null;\r\n const exists = Object.keys(await readLocalValues(connection, table, key)).length > 0;\r\n const lookup = (name: string): string | undefined => Object.keys(values).find((c) => c.toLowerCase() === name.toLowerCase());\r\n if (exists) {\r\n // Only the columns the user had changed are written back, so newer server values of the others survive.\r\n const columns: string[] = [];\r\n table.model.columns.forEach((c, i) => {\r\n const actual = lookup(c.name);\r\n if (actual !== undefined && (mask === null || mask.isZero() || mask.testBit(i))) columns.push(actual);\r\n });\r\n if (columns.length > 0) {\r\n const params: { [name: string]: G9SqlValue } = { $k: keyValue(table, key) };\r\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\r\n await connection.exec(`UPDATE ${table.quoted} SET ${columns.map((c, i) => quote(c) + ' = $v' + i).join(', ')} WHERE ${table.keyQuoted} = $k`, params);\r\n }\r\n } else {\r\n const columns = Object.keys(values);\r\n const params: { [name: string]: G9SqlValue } = {};\r\n columns.forEach((c, i) => (params['$v' + i] = values[c] as G9SqlValue));\r\n await connection.exec(`INSERT INTO ${table.quoted} (${columns.map(quote).join(', ')}) VALUES (${columns.map((_, i) => '$v' + i).join(', ')})`, params);\r\n }\r\n await connection.exec('DELETE FROM g9_quarantine WHERE tid = $t AND pk = $pk', { $t: table.tid, $pk: key });\r\n return 1;\r\n }),\r\n );\r\n}\r\n\r\nexport async function discardQuarantined(store: StoreInternals, localTable: string | null, key: string | null): Promise<number> {\r\n store.ensureInitialized();\r\n const tid = localTable === null ? null : getLocal(store, localTable).tid;\r\n return store.writeLock.run(() =>\r\n store.writer().exec('DELETE FROM g9_quarantine WHERE ($t IS NULL OR tid = $t) AND ($pk IS NULL OR pk = $pk)', { $t: tid, $pk: key }),\r\n );\r\n}\r\n\r\nexport async function getRetained(store: StoreInternals): Promise<G9RetainedRow[]> {\r\n store.ensureInitialized();\r\n const rows = await store.reader().query('SELECT t.local_name, r.pk, r.disposition, r.reason, r.rule, r.at_utc FROM g9_revoked r JOIN g9_tables t ON t.tid = r.tid ORDER BY r.at_utc');\r\n return rows.map((r) => ({\r\n localTable: asString(r[0]),\r\n key: asString(r[1]),\r\n disposition: asNumber(r[2]) as G9ERevocationDisposition,\r\n reason: asNumber(r[3]) as G9ERevocationReason,\r\n rule: asOptionalString(r[4]),\r\n atUtcMs: asNumber(r[5]),\r\n }));\r\n}\r\n\r\n/** Re-checks rows retained by a RetainWhile rule; deletes those no longer retained (`ReevaluateRetainedAsync`). */\r\nexport async function reevaluateRetained(store: StoreInternals): Promise<number> {\r\n store.ensureInitialized();\r\n return store.writeLock.run(() =>\r\n store.writer().transaction('immediate', async () => {\r\n const connection = store.writer();\r\n const retained = (await connection.query('SELECT tid, pk, reason, rule, disposition FROM g9_revoked')).map((r) => ({\r\n tid: asNumber(r[0]),\r\n key: asString(r[1]),\r\n reason: asNumber(r[2]),\r\n rule: asOptionalString(r[3]),\r\n disposition: asNumber(r[4]),\r\n }));\r\n if (retained.length === 0) return 0;\r\n await connection.exec('UPDATE g9_ctx SET applying = 1 WHERE id = 1');\r\n let deleted = 0;\r\n for (const entry of retained) {\r\n const table = byTid(store, entry.tid);\r\n if (!table) continue;\r\n const subs = asLong(\r\n await connection.scalar('SELECT coalesce(max(subs), 0) FROM g9_rows WHERE tid = $t AND pk = $pk AND deleted = 0', { $t: entry.tid, $pk: entry.key }),\r\n );\r\n if (!subs.isZero()) {\r\n // Visible again: no longer revoked, and a pending change parked by the revocation may upload again.\r\n await connection.exec(\r\n 'DELETE FROM g9_revoked WHERE tid = $t AND pk = $pk; DELETE FROM g9_rejections WHERE tid = $t AND pk = $pk AND code = $code; ' +\r\n 'UPDATE g9_rows SET rejected = 0 WHERE tid = $t AND pk = $pk AND NOT EXISTS (SELECT 1 FROM g9_rejections WHERE tid = $t AND pk = $pk)',\r\n { $t: entry.tid, $pk: entry.key, $code: REVOKED_REJECTION_CODE },\r\n );\r\n continue;\r\n }\r\n if (entry.disposition !== G9ERevocationDisposition.Retain) continue;\r\n const values = await readLocalValues(connection, table, entry.key);\r\n const rule = entry.rule === null ? null : store.options.revocation.find(entry.rule);\r\n const row: G9RevokedRow = {\r\n localTable: table.model.localName,\r\n key: entry.key,\r\n reason: entry.reason as G9ERevocationReason,\r\n subscriptionKey: null,\r\n hasPendingChanges: false,\r\n isRejected: false,\r\n values,\r\n };\r\n if (rule && rule.retainWhile && Object.keys(values).length > 0 && rule.retainWhile(row)) continue;\r\n await removeLocalRow(connection, table, entry.key);\r\n await connection.exec('UPDATE g9_clock SET seq = seq + 1 WHERE id = 1');\r\n deleted++;\r\n }\r\n await connection.exec('UPDATE g9_ctx SET applying = 0 WHERE id = 1');\r\n return deleted;\r\n }),\r\n );\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshotFiles.js","sourceRoot":"","sources":["../../src/sqlite/snapshotFiles.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.SnapshotFiles.cs (ADR-0072): a large first download arrives as a\r\n// SQLite file built on the server with this store's own DDL; its segments go straight from the transport to the platform's\r\n// G9SnapshotFileSink, and the apply copies the file's tables in SQL - one statement per table, SQLite's transfer optimisation\r\n// when the table is empty - instead of three statements per row. On Lynx that is one bridge call per table instead of one per\r\n// few thousand statements: the whole reason this exists for the TypeScript client.\r\nimport { G9SyncErrorCodes, G9SyncException } from '../abstractions/errors.js';\r\nimport { parseJson } from '../abstractions/long.js';\r\nimport { FILE_MODE_APPEND, FILE_MODE_COLUMNS, FILE_MODE_COPY, FILE_MODE_MERGE } from '../client/storeTypes.js';\r\nimport { G9EPullPartKind, type G9DtNegotiatedTable, type G9DtPullPlan, type G9DtSnapshotFileManifest, type G9DtSnapshotFileRequest, type G9DtSyncChunk } from '../protocol/dtos.js';\r\nimport { readFileManifest } from '../protocol/wire.js';\r\nimport { G9ESyncDirection } from '../abstractions/enums.js';\r\nimport { asNumber, asOptionalString, asString, statementsOf, type G9SqliteConnection } from './connection.js';\r\nimport type { G9SqlValue } from './driver.js';\r\nimport { findByServerName, persistedJson, type LocalTable, type StoreInternals } from './internals.js';\r\nimport type { G9SnapshotFileSink } from './options.js';\r\nimport { REVOKED_REJECTION_CODE } from './revocation.js';\r\nimport { bit, G9ESqliteDateTimeStorage, G9ESqliteDecimalStorage, keyExpression, quote } from './sql.js';\r\nimport type { ApplyContext } from './apply.js';\r\n\r\n/** The protocol's snapshot-file format this build reads (`G9SyncProtocol.SnapshotFileFormatVersion`). */\r\nexport const SNAPSHOT_FILE_FORMAT_VERSION = 1;\r\n/** \"G9SF\": `PRAGMA application_id` of a snapshot file (`G9CSnapshotFileWriter.ApplicationId`). */\r\nexport const SNAPSHOT_FILE_APPLICATION_ID = 0x47395346;\r\nconst MAX_FILES_PER_PLAN = 8;\r\n\r\n/** A staged file (`StagedFile`). */\r\nexport interface G9StagedFile {\r\n fileId: string;\r\n path: string;\r\n manifest: G9DtSnapshotFileManifest;\r\n subscriptionKey: string | null;\r\n firstSequence: number;\r\n segmentsDone: number;\r\n}\r\n\r\n/** Segments written since a file's last durable checkpoint, per run and file (under the write lock). */\r\nconst pendingSegments = new WeakMap<StoreInternals, Map<string, { segments: number; rows: number; bytes: number; unsynced: number }>>();\r\n\r\nfunction pendingOf(store: StoreInternals): Map<string, { segments: number; rows: number; bytes: number; unsynced: number }> {\r\n let map = pendingSegments.get(store);\r\n if (!map) pendingSegments.set(store, (map = new Map()));\r\n return map;\r\n}\r\n\r\nfunction corrupt(message: string): G9SyncException {\r\n return new G9SyncException(G9SyncErrorCodes.SnapshotFileCorrupt, message);\r\n}\r\n\r\n/** The device's offer (`DescribeSnapshotFiles`): storage forms and, per received table, the shape the store creates it with. */\r\nexport function describeSnapshotFiles(store: StoreInternals, negotiated: readonly G9DtNegotiatedTable[]): G9DtSnapshotFileRequest | null {\r\n if (!store.options.snapshotFiles) return null;\r\n const tables = [];\r\n for (const table of negotiated) {\r\n if (table.direction === G9ESyncDirection.UploadOnly) continue;\r\n const local = findByServerName(store, table.name);\r\n if (!local) continue;\r\n const model = local.model;\r\n tables.push({\r\n tableId: table.tableId,\r\n localName: model.localName,\r\n keyColumn: model.keyColumn,\r\n keyType: model.keyType,\r\n columns: model.columns.map((c) => ({ name: c.name, type: c.type, nullable: c.nullable })),\r\n indexes: model.indexes.map((i) => ({ name: i.name, columns: i.columns.slice(), unique: i.unique })),\r\n });\r\n }\r\n if (tables.length === 0) return null;\r\n return {\r\n formatVersion: SNAPSHOT_FILE_FORMAT_VERSION,\r\n storage: {\r\n dateTimeAsTicks: store.options.dateTimeStorage === G9ESqliteDateTimeStorage.Ticks,\r\n dateTimeFormat: store.options.dateTimeFormat,\r\n decimalAsText: store.options.decimalStorage === G9ESqliteDecimalStorage.Text,\r\n },\r\n tables,\r\n minRows: store.options.snapshotFileMinRows,\r\n maxBytes: store.options.snapshotFileMaxBytes,\r\n maxFiles: MAX_FILES_PER_PLAN,\r\n };\r\n}\r\n\r\nfunction sinkOf(store: StoreInternals): G9SnapshotFileSink {\r\n const sink = store.options.snapshotFiles;\r\n if (!sink) throw corrupt('A snapshot-file segment arrived, but this store has no snapshot-file sink.');\r\n return sink;\r\n}\r\n\r\n/** A .NET DateTime in the JSON form System.Text.Json writes, so persisted rows read the same on both sides. */\r\nfunction dotnetUtc(ms: number): string {\r\n return new Date(ms).toISOString().replace(/\\.(\\d{3})Z$/, '.$10000Z');\r\n}\r\n\r\n/** The persisted (.NET) form of a manifest: `builtUtc` as a DateTime. */\r\nfunction persistedManifest(manifest: G9DtSnapshotFileManifest): string {\r\n const { builtUtcMs, ...rest } = manifest;\r\n return persistedJson({ ...rest, builtUtc: dotnetUtc(builtUtcMs) });\r\n}\r\n\r\n/** The persisted (.NET) form of a plan: each planned file's `snapshotUtc` as a DateTime. */\r\nexport function persistedPlan(plan: G9DtPullPlan): string {\r\n return persistedJson({\r\n ...plan,\r\n parts: plan.parts.map((part) => {\r\n if (!part.file) return part;\r\n const { snapshotUtcMs, ...file } = part.file;\r\n return { ...part, file: { ...file, snapshotUtc: dotnetUtc(snapshotUtcMs) } };\r\n }),\r\n });\r\n}\r\n\r\nfunction validateManifest(manifest: G9DtSnapshotFileManifest, fileId: string): void {\r\n if (manifest.fileId !== fileId) throw corrupt(`Snapshot file ${fileId} came with the manifest of ${manifest.fileId}.`);\r\n if (manifest.formatVersion < 1 || manifest.formatVersion > SNAPSHOT_FILE_FORMAT_VERSION) {\r\n throw corrupt(`Snapshot file ${fileId} has format ${manifest.formatVersion}; this build reads up to ${SNAPSHOT_FILE_FORMAT_VERSION}.`);\r\n }\r\n if (manifest.compression !== 'br') throw corrupt(`Snapshot file ${fileId} uses the unknown codec '${manifest.compression}'.`);\r\n if (\r\n manifest.bytes <= 0 ||\r\n manifest.segmentBytes <= 0 ||\r\n manifest.segments <= 0 ||\r\n manifest.segments * manifest.segmentBytes < manifest.bytes ||\r\n (manifest.segments - 1) * manifest.segmentBytes >= manifest.bytes ||\r\n manifest.sha256.length !== 64\r\n ) {\r\n throw corrupt(`Snapshot file ${fileId} has an inconsistent manifest.`);\r\n }\r\n}\r\n\r\nfunction safeFileName(fileId: string): string {\r\n return fileId.replace(/[^A-Za-z0-9]/g, '_');\r\n}\r\n\r\nasync function readStagedFile(connection: G9SqliteConnection, runId: string, fileId: string): Promise<G9StagedFile | null> {\r\n const rows = await connection.query(\r\n 'SELECT file_id, path, manifest_json, subscription_key, first_seq, segments_done FROM g9_stage_files WHERE run_id = $r AND file_id = $f',\r\n { $r: runId, $f: fileId },\r\n );\r\n return rows[0] ? stagedFileOf(rows[0]) : null;\r\n}\r\n\r\n/** The staged files of a run, in plan order. */\r\nexport async function readStagedFiles(connection: G9SqliteConnection, runId: string): Promise<G9StagedFile[]> {\r\n const rows = await connection.query('SELECT file_id, path, manifest_json, subscription_key, first_seq, segments_done FROM g9_stage_files WHERE run_id = $r ORDER BY first_seq', {\r\n $r: runId,\r\n });\r\n return rows.map(stagedFileOf);\r\n}\r\n\r\nfunction stagedFileOf(r: readonly G9SqlValue[]): G9StagedFile {\r\n const manifest = readFileManifest(parseJson(asString(r[2])));\r\n if (!manifest) throw corrupt('A staged snapshot file has no manifest.');\r\n return { fileId: asString(r[0]), path: asString(r[1]), manifest, subscriptionKey: asOptionalString(r[3]), firstSequence: asNumber(r[4]), segmentsDone: asNumber(r[5]) };\r\n}\r\n\r\n/**\r\n * `StageFileSegment`: one segment to its place in the staged file, checked against its SHA-256 by the sink BEFORE it is\r\n * written. Durable only at checkpoints - every `snapshotFileCheckpointBytes` and at the last segment - in that order: the file\r\n * is flushed first, then the stage row records the resume point.\r\n */\r\nexport async function stageFileSegment(store: StoreInternals, runId: string, chunk: G9DtSyncChunk): Promise<void> {\r\n const segment = chunk.file;\r\n if (!segment) return;\r\n const sink = sinkOf(store);\r\n const connection = store.writer();\r\n const key = runId + '\\u0000' + segment.fileId;\r\n const pending = pendingOf(store);\r\n let staged = await readStagedFile(connection, runId, segment.fileId);\r\n const manifest = segment.manifest;\r\n if (manifest) {\r\n validateManifest(manifest, segment.fileId);\r\n if (!staged || staged.manifest.sha256 !== manifest.sha256) {\r\n // A new file - or a different build of it after a resume on another server instance: the file starts over.\r\n const path = staged ? staged.path : joinPath(sink.directory, runId + '-' + safeFileName(segment.fileId) + '.sqlite');\r\n await sink.create(path, manifest.bytes);\r\n await connection.exec(\r\n 'INSERT INTO g9_stage_files (run_id, file_id, path, manifest_json, subscription_key, first_seq, segments_done, bytes_received) ' +\r\n 'VALUES ($r, $f, $p, $m, $k, $s, 0, 0) ON CONFLICT(run_id, file_id) DO UPDATE SET manifest_json = excluded.manifest_json, segments_done = 0, bytes_received = 0',\r\n { $r: runId, $f: segment.fileId, $p: path, $m: persistedManifest(manifest), $k: chunk.subscriptionKey ?? null, $s: chunk.sequence },\r\n );\r\n pending.delete(key);\r\n staged = await readStagedFile(connection, runId, segment.fileId);\r\n }\r\n }\r\n if (!staged) throw corrupt(`Segment ${segment.index} of snapshot file ${segment.fileId} arrived without its manifest.`);\r\n const layout = staged.manifest;\r\n let state = pending.get(key);\r\n if (!state) pending.set(key, (state = { segments: 0, rows: 0, bytes: 0, unsynced: 0 }));\r\n const expected = staged.segmentsDone + state.segments;\r\n if (segment.index !== expected) throw corrupt(`Snapshot file ${segment.fileId}: segment ${segment.index} arrived where ${expected} was expected.`);\r\n if (\r\n segment.offset !== segment.index * layout.segmentBytes ||\r\n segment.length <= 0 ||\r\n segment.length > layout.segmentBytes ||\r\n segment.offset + segment.length > layout.bytes ||\r\n segment.index >= layout.segments\r\n ) {\r\n throw corrupt(`Snapshot file ${segment.fileId}: segment ${segment.index} does not fit the manifest.`);\r\n }\r\n const payload = chunk.payload;\r\n if (!payload) throw corrupt(`Snapshot file ${segment.fileId}: segment ${segment.index} has no payload.`);\r\n\r\n const last = segment.index === layout.segments - 1;\r\n const sync = last || state.unsynced + segment.length >= Math.max(1, store.options.snapshotFileCheckpointBytes);\r\n try {\r\n await sink.writeSegment(staged.path, segment.offset, payload, segment.length, segment.sha256, sync);\r\n } catch (error) {\r\n throw corrupt(`Snapshot file ${segment.fileId}: segment ${segment.index} was refused (${error instanceof Error ? error.message : String(error)}).`);\r\n }\r\n state.segments++;\r\n state.rows += chunk.rowCount;\r\n state.bytes += payload.length;\r\n state.unsynced += segment.length;\r\n if (!sync) return;\r\n\r\n // The checkpoint, in one atomic call: the data is on disk, so the record that it is there may follow.\r\n await connection.runAtomic([\r\n ...statementsOf('INSERT OR REPLACE INTO g9_stage (run_id, seq, subscription_key, row_count, continuation_json, payload) VALUES ($r, $s, $k, $n, $c, NULL)', {\r\n $r: runId,\r\n $s: chunk.sequence,\r\n $k: chunk.subscriptionKey ?? null,\r\n $n: state.rows,\r\n $c: chunk.continuation ? persistedJson(chunk.continuation) : null,\r\n }),\r\n ...statementsOf('UPDATE g9_stage_files SET segments_done = segments_done + $n, bytes_received = bytes_received + $b WHERE run_id = $r AND file_id = $f', {\r\n $n: state.segments,\r\n $b: state.bytes,\r\n $r: runId,\r\n $f: segment.fileId,\r\n }),\r\n ]);\r\n pending.delete(key);\r\n}\r\n\r\n/** A resumed stream starts at a file's last checkpoint: segments written after it are written again. */\r\nexport function forgetPendingSegments(store: StoreInternals, runId: string): void {\r\n const pending = pendingOf(store);\r\n pending.forEach((_, key) => {\r\n if (key.slice(0, runId.length + 1) === runId + '\\u0000') pending.delete(key);\r\n });\r\n}\r\n\r\n/** The staged files of the runs a statement is about to delete (their rows go in the same transaction, the files after it). */\r\nexport async function takeStagedFiles(connection: G9SqliteConnection, runFilterSql: string, params?: { [name: string]: G9SqlValue }): Promise<string[]> {\r\n const paths = (await connection.query('SELECT path FROM g9_stage_files WHERE run_id IN (' + runFilterSql + ')', params)).map((r) => asString(r[0]));\r\n await connection.exec('DELETE FROM g9_stage_files WHERE run_id IN (' + runFilterSql + ')', params);\r\n return paths;\r\n}\r\n\r\nexport async function deleteFiles(store: StoreInternals, paths: readonly string[]): Promise<void> {\r\n const sink = store.options.snapshotFiles;\r\n if (!sink) return;\r\n for (const path of paths) {\r\n try {\r\n await sink.remove(path);\r\n } catch (error) {\r\n store.log('warning', 20122, `A staged snapshot file could not be deleted and is retried at the next start: ${path} (${error instanceof Error ? error.message : String(error)})`);\r\n }\r\n }\r\n}\r\n\r\n/** Deletes staged files no stage refers to any more (a crash between a stage's commit and its files' deletion). */\r\nexport async function sweepOrphanSnapshotFiles(store: StoreInternals, connection: G9SqliteConnection): Promise<void> {\r\n const sink = store.options.snapshotFiles;\r\n if (!sink) return;\r\n let files: string[];\r\n try {\r\n files = await sink.list(sink.directory);\r\n } catch {\r\n return;\r\n }\r\n const referenced: { [path: string]: true } = {};\r\n for (const r of await connection.query('SELECT path FROM g9_stage_files')) referenced[normalizePath(asString(r[0]))] = true;\r\n // Only names this store writes (<run id>-<file id>.sqlite and SQLite's companions of it): the directory may be shared with\r\n // other files - even the database itself - and a sweep must never touch what it did not create.\r\n await deleteFiles(\r\n store,\r\n files.filter((path) => {\r\n const match = STAGED_FILE_NAME.exec(path);\r\n return match !== null && referenced[normalizePath(path.substring(0, path.length - (match[1] ? match[1].length : 0)))] !== true;\r\n }),\r\n );\r\n}\r\n\r\n/** `<32 hex run id>-<file id>.sqlite`, or its -journal/-wal/-shm companion (group 1), at the end of a path. */\r\nconst STAGED_FILE_NAME = /(?:^|[\\\\/])[0-9a-fA-F]{32}-[A-Za-z0-9_]+\\.sqlite(-journal|-wal|-shm)?$/i;\r\n\r\nfunction normalizePath(path: string): string {\r\n return path.replace(/\\\\/g, '/').toLowerCase();\r\n}\r\n\r\nfunction joinPath(directory: string, name: string): string {\r\n return directory.length === 0 ? name : directory.replace(/[\\\\/]+$/, '') + '/' + name;\r\n}\r\n\r\n/** `VerifyStagedFile`: every segment arrived, the size is the manifest's, and it is a snapshot file (header + \"G9SF\"). */\r\nexport async function verifyStagedFile(store: StoreInternals, file: G9StagedFile): Promise<void> {\r\n const sink = sinkOf(store);\r\n const manifest = file.manifest;\r\n if (file.segmentsDone !== manifest.segments) throw corrupt(`Snapshot file ${file.fileId} has ${file.segmentsDone} of ${manifest.segments} segments.`);\r\n const size = await sink.size(file.path);\r\n if (size !== manifest.bytes) throw corrupt(`Snapshot file ${file.fileId} is missing or not ${manifest.bytes} bytes.`);\r\n const header = await sink.head(file.path, 100);\r\n const magic = 'SQLite format 3\\u0000';\r\n for (let i = 0; i < magic.length; i++) {\r\n if (header[i] !== magic.charCodeAt(i)) throw corrupt(`Snapshot file ${file.fileId} has no SQLite header.`);\r\n }\r\n const id = (((header[68] as number) << 24) | ((header[69] as number) << 16) | ((header[70] as number) << 8) | (header[71] as number)) >>> 0;\r\n if (id !== SNAPSHOT_FILE_APPLICATION_ID) throw corrupt(`Snapshot file ${file.fileId} is not a G9SyncData snapshot file.`);\r\n}\r\n\r\n/** `AttachedFiles.Schema`. */\r\nexport function attachedSchema(index: number): string {\r\n return 'g9snap' + index;\r\n}\r\n\r\n/** ATTACHes the staged files (outside any transaction) and returns the detach action. */\r\nexport async function attachFiles(connection: G9SqliteConnection, files: readonly G9StagedFile[]): Promise<() => Promise<void>> {\r\n let count = 0;\r\n const detach = async (): Promise<void> => {\r\n for (; count > 0; count--) {\r\n try {\r\n await connection.exec('DETACH DATABASE ' + attachedSchema(count - 1));\r\n } catch {\r\n // Left attached: the session closes with the store, and the file is swept at the next start.\r\n }\r\n }\r\n };\r\n try {\r\n for (const file of files) {\r\n await connection.exec('ATTACH DATABASE $p AS ' + attachedSchema(count), { $p: file.path });\r\n count++;\r\n }\r\n } catch (error) {\r\n await detach();\r\n throw error;\r\n }\r\n return detach;\r\n}\r\n\r\n/** The first snapshot-file time per subscription of a plan (the reconcile clock of a file-based subscription starts there). */\r\nexport function fileSnapshotTimes(plan: G9DtPullPlan): { [subscriptionKey: string]: number } {\r\n const out: { [key: string]: number } = {};\r\n for (const part of plan.parts) {\r\n if (part.kind !== G9EPullPartKind.SnapshotFile || !part.file) continue;\r\n const at = part.file.snapshotUtcMs;\r\n const existing = out[part.subscriptionKey];\r\n out[part.subscriptionKey] = existing === undefined ? at : Math.min(existing, at);\r\n }\r\n return out;\r\n}\r\n\r\nasync function tableColumns(connection: G9SqliteConnection, table: string, schema: string): Promise<string[]> {\r\n return (await connection.query('SELECT name FROM pragma_table_info($t, $s) ORDER BY cid', { $t: table, $s: schema })).map((r) => asString(r[0]));\r\n}\r\n\r\nasync function indexSignature(connection: G9SqliteConnection, index: string, unique: boolean, schema: string): Promise<string> {\r\n let text = unique ? 'u' : 'n';\r\n for (const r of await connection.query(\r\n 'SELECT seqno, coalesce(name, \\'\\'), \"desc\", coalesce(coll, \\'\\'), key FROM pragma_index_xinfo($i, $s) ORDER BY seqno',\r\n { $i: index, $s: schema },\r\n )) {\r\n text += '|' + asNumber(r[0]) + ':' + asString(r[1]).toUpperCase() + ':' + asNumber(r[2]) + ':' + asString(r[3]).toUpperCase() + ':' + asNumber(r[4]);\r\n }\r\n return text;\r\n}\r\n\r\nasync function listIndexes(connection: G9SqliteConnection, table: string, schema: string): Promise<{ name: string; unique: boolean; partial: boolean }[]> {\r\n return (await connection.query('SELECT name, \"unique\", partial FROM pragma_index_list($t, $s) WHERE origin = \\'c\\'', { $t: table, $s: schema })).map((r) => ({\r\n name: asString(r[0]),\r\n unique: asNumber(r[1]) !== 0,\r\n partial: asNumber(r[2]) !== 0,\r\n }));\r\n}\r\n\r\n/** `PrepareIndexesForCopy`: drops each index the file cannot supply; they are rebuilt at the end of the apply. */\r\nasync function prepareIndexesForCopy(context: ApplyContext, table: LocalTable, sourceTable: string, schema: string): Promise<void> {\r\n const connection = context.connection;\r\n const available: { [signature: string]: true } = {};\r\n for (const index of await listIndexes(connection, sourceTable, schema)) {\r\n if (!index.partial) available[await indexSignature(connection, index.name, index.unique, schema)] = true;\r\n }\r\n let dropped = 0;\r\n for (const index of await listIndexes(connection, table.model.localName, 'main')) {\r\n if (!index.partial && available[await indexSignature(connection, index.name, index.unique, 'main')] === true) continue;\r\n if (context.deferredIndexes.some((d) => d.name.toLowerCase() === index.name.toLowerCase())) continue;\r\n const sql = await connection.scalar(\"SELECT sql FROM main.sqlite_master WHERE type = 'index' AND name = $n\", { $n: index.name });\r\n if (typeof sql !== 'string') continue;\r\n await connection.exec('DROP INDEX main.' + quote(index.name));\r\n context.deferredIndexes.push({ name: index.name, sql });\r\n dropped++;\r\n }\r\n if (dropped > 0) {\r\n const name = table.model.localName;\r\n context.report.diagnostics.deferredIndexes[name] = (context.report.diagnostics.deferredIndexes[name] ?? 0) + dropped;\r\n }\r\n}\r\n\r\n/** `ApplySnapshotFile`: copy, columns or merge per table, metadata set-based, inside the apply's transaction. */\r\nexport async function applySnapshotFile(store: StoreInternals, context: ApplyContext, schema: string, file: G9StagedFile): Promise<void> {\r\n await context.flush();\r\n const connection = context.connection;\r\n const started = Date.now();\r\n let slot = -1;\r\n if (file.subscriptionKey !== null) {\r\n const subscription = context.subscriptions.get(file.subscriptionKey);\r\n if (subscription) {\r\n if (subscription.ephemeral) throw corrupt(`Snapshot file ${file.fileId} is for an ephemeral subscription.`);\r\n slot = subscription.slot;\r\n }\r\n }\r\n const bitValue = slot >= 0 ? bit(slot).toSqlValue() : 0;\r\n const diagnostics = context.report.diagnostics;\r\n\r\n for (const info of file.manifest.tables) {\r\n const table = store.byServerId.get(info.tableId);\r\n if (!table || !table.negotiated) continue;\r\n const tableStarted = Date.now();\r\n const source = schema + '.' + quote(info.name);\r\n // (pk, ver, r) of every row in the file, in arrival order: the version table is keyed by the data table's rowid.\r\n const sourceKey = keyExpression(table.model, 's');\r\n const pairs = `(SELECT ${sourceKey} AS pk, v.ver AS ver, s.rowid AS r FROM ${source} AS s JOIN ${schema}.${quote(info.versionTable)} AS v ON v.rid = s.rowid)`;\r\n const sourceColumns = await tableColumns(connection, info.name, schema);\r\n if (sourceColumns.length === 0) throw corrupt(`Snapshot file ${file.fileId} does not contain ${info.name}.`);\r\n const versionColumns = (await tableColumns(connection, info.versionTable, schema)).map((c) => c.toLowerCase());\r\n if (versionColumns.indexOf('rid') < 0 || versionColumns.indexOf('ver') < 0) {\r\n // Not this format's version table (rid → ver): a file this build cannot number - rows instead.\r\n throw corrupt(`Snapshot file ${file.fileId}: ${info.versionTable} is not a version table of format ${SNAPSHOT_FILE_FORMAT_VERSION}.`);\r\n }\r\n const localColumns = await tableColumns(connection, table.model.localName, 'main');\r\n const localLower: { [name: string]: true } = {};\r\n for (const c of localColumns) localLower[c.toLowerCase()] = true;\r\n const shared = sourceColumns.filter((c) => localLower[c.toLowerCase()] === true);\r\n if (!shared.some((c) => c.toLowerCase() === table.model.keyColumn.toLowerCase())) throw corrupt(`Snapshot file ${file.fileId}: ${info.name} has no key column.`);\r\n\r\n const isProtected = context.hasDirty(table.tid);\r\n const empty = (await connection.scalar(`SELECT 1 FROM ${table.quoted} LIMIT 1`)) === null;\r\n let rows: number;\r\n let mode: string;\r\n if (empty && !isProtected) {\r\n await prepareIndexesForCopy(context, table, info.name, schema);\r\n const identical = sourceColumns.length === localColumns.length && sourceColumns.every((c, i) => c.toLowerCase() === (localColumns[i] as string).toLowerCase());\r\n mode = identical ? FILE_MODE_COPY : FILE_MODE_COLUMNS;\r\n const list = shared.map(quote).join(', ');\r\n rows = await connection.exec(identical ? `INSERT INTO main.${table.quoted} SELECT * FROM ${source}` : `INSERT INTO main.${table.quoted} (${list}) SELECT ${list} FROM ${source}`);\r\n await numberNewRows(context, table, pairs, bitValue);\r\n if (context.wantsChangedKey(table.model.localName)) await addChangedKeys(context, table, `SELECT ${sourceKey} FROM ${source} AS s ORDER BY s.rowid`);\r\n } else if (!isProtected && !(await overlapsStoredRows(context, table, source))) {\r\n // 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.\r\n // 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).\r\n mode = FILE_MODE_APPEND;\r\n const list = shared.map(quote).join(', ');\r\n rows = await connection.exec(`INSERT INTO main.${table.quoted} (${list}) SELECT ${list} FROM ${source} AS s ORDER BY s.${quote(table.model.keyColumn)}`);\r\n await numberNewRows(context, table, pairs, bitValue);\r\n if (context.wantsChangedKey(table.model.localName)) await addChangedKeys(context, table, `SELECT ${sourceKey} FROM ${source} AS s ORDER BY s.rowid`);\r\n } else {\r\n mode = FILE_MODE_MERGE;\r\n rows = await mergeSnapshotTable(context, table, source, pairs, shared, bitValue, isProtected);\r\n }\r\n\r\n if (context.hasRevoked && slot >= 0) {\r\n await connection.exec(\r\n `DELETE FROM g9_revoked WHERE tid = $t AND pk IN (SELECT ${sourceKey} FROM ${source} AS s); ` +\r\n `DELETE FROM g9_rejections WHERE tid = $t AND code = $code AND pk IN (SELECT ${sourceKey} FROM ${source} AS s)`,\r\n { $t: table.tid, $code: REVOKED_REJECTION_CODE },\r\n );\r\n }\r\n\r\n context.report.upserts += rows;\r\n context.advance(rows);\r\n diagnostics.fileRows += rows;\r\n const before = diagnostics.fileTables[table.model.localName];\r\n diagnostics.fileTables[table.model.localName] = before === undefined ? mode : before.split('+').indexOf(mode) >= 0 ? before : before + '+' + mode;\r\n context.addTableTime(table.model.localName, rows, Date.now() - tableStarted);\r\n store.log('debug', 20121, `Snapshot file: ${table.model.localName} received ${rows} row(s) (${mode})`);\r\n }\r\n\r\n diagnostics.snapshotFiles++;\r\n diagnostics.fileCopyMs += Date.now() - started;\r\n}\r\n\r\n/** `NumberNewRows`: every row of the file is new to the table - membership, server version and the next number on the clock. */\r\nasync function numberNewRows(context: ApplyContext, table: LocalTable, pairs: string, bitValue: G9SqlValue): Promise<void> {\r\n const connection = context.connection;\r\n const clock = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\r\n const numbered = await connection.exec(\r\n 'INSERT INTO g9_rows (tid, pk, server_ver, local_seq, subs, dirty, dirty_mask, rejected, deleted) ' +\r\n `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 ` +\r\n 'ON CONFLICT(tid, pk) DO UPDATE SET server_ver = excluded.server_ver, local_seq = excluded.local_seq, subs = subs | excluded.subs, ' +\r\n 'dirty = 0, dirty_mask = 0, rejected = 0, deleted = 0',\r\n { $t: table.tid, $base: clock, $bit: bitValue },\r\n );\r\n await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: numbered });\r\n}\r\n\r\n/** `OverlapsStoredRows`: whether any row of the file is already in the table - what separates an append from a merge. */\r\nasync function overlapsStoredRows(context: ApplyContext, table: LocalTable, source: string): Promise<boolean> {\r\n const key = quote(table.model.keyColumn);\r\n 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;\r\n}\r\n\r\n/** `MergeSnapshotTable`: changed rows only; protected rows gain membership; unchanged rows keep their feed position. */\r\nasync function mergeSnapshotTable(\r\n context: ApplyContext,\r\n table: LocalTable,\r\n source: string,\r\n pairs: string,\r\n columns: string[],\r\n bitValue: G9SqlValue,\r\n isProtected: boolean,\r\n): Promise<number> {\r\n const connection = context.connection;\r\n const key = quote(table.model.keyColumn);\r\n const sourceKey = keyExpression(table.model, 's');\r\n // The file's (pk, ver, r) by key, once: the statements below look versions up by key.\r\n const versions = 'temp.g9_file_versions';\r\n await connection.exec(\r\n 'DROP TABLE IF EXISTS temp.g9_file_versions; CREATE TEMP TABLE g9_file_versions (pk TEXT NOT NULL PRIMARY KEY, ver INTEGER NOT NULL, r INTEGER NOT NULL) WITHOUT ROWID; ' +\r\n `INSERT OR REPLACE INTO temp.g9_file_versions (pk, ver, r) SELECT pk, ver, r FROM ${pairs}`,\r\n );\r\n await connection.exec('DROP TABLE IF EXISTS temp.g9_file_protect; CREATE TEMP TABLE g9_file_protect (pk TEXT NOT NULL PRIMARY KEY) WITHOUT ROWID');\r\n if (isProtected) {\r\n const prefix = table.tid + '\\u0000';\r\n const keys: string[] = [];\r\n context.dirty.forEach((entry) => {\r\n if (entry.slice(0, prefix.length) === prefix) keys.push(entry.slice(prefix.length));\r\n });\r\n if (keys.length > 0) await connection.exec('INSERT OR IGNORE INTO temp.g9_file_protect (pk) SELECT value FROM json_each($k)', { $k: JSON.stringify(keys) });\r\n }\r\n\r\n const nonKey = columns.filter((c) => c.toLowerCase() !== table.model.keyColumn.toLowerCase());\r\n const differs = nonKey.map((c) => 'm.' + quote(c) + ' IS NOT s.' + quote(c)).join(' OR ');\r\n await connection.exec('DROP TABLE IF EXISTS temp.g9_file_changed; CREATE TEMP TABLE g9_file_changed (r INTEGER PRIMARY KEY, pk TEXT NOT NULL UNIQUE)');\r\n await connection.exec(\r\n `INSERT INTO temp.g9_file_changed (r, pk) SELECT s.rowid, ${sourceKey} FROM ${source} AS s LEFT JOIN main.${table.quoted} AS m ON m.${key} = s.${key} ` +\r\n `WHERE NOT EXISTS (SELECT 1 FROM temp.g9_file_protect AS p WHERE p.pk = ${sourceKey}) ` +\r\n `AND (m.${key} IS NULL${differs.length === 0 ? '' : ' OR ' + differs} ` +\r\n `OR NOT EXISTS (SELECT 1 FROM g9_rows AS r WHERE r.tid = $t AND r.pk = ${sourceKey} AND r.deleted = 0))`,\r\n { $t: table.tid },\r\n );\r\n\r\n const list = columns.map(quote).join(', ');\r\n const updates = nonKey.map((c) => quote(c) + ' = excluded.' + quote(c));\r\n await connection.exec(\r\n `INSERT INTO main.${table.quoted} (${list}) SELECT ${list} FROM ${source} AS s WHERE s.rowid IN (SELECT r FROM temp.g9_file_changed) ` +\r\n (updates.length === 0 ? `ON CONFLICT(${key}) DO NOTHING` : `ON CONFLICT(${key}) DO UPDATE SET ${updates.join(', ')}`),\r\n );\r\n\r\n const clock = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\r\n const numbered = await connection.exec(\r\n 'INSERT INTO g9_rows (tid, pk, server_ver, local_seq, subs, dirty, dirty_mask, rejected, deleted) ' +\r\n `SELECT $t, v.pk, v.ver, $base + row_number() OVER (ORDER BY v.r), $bit, 0, 0, 0, 0 FROM ${versions} AS v ` +\r\n 'WHERE v.pk IN (SELECT pk FROM temp.g9_file_changed) ' +\r\n 'ON CONFLICT(tid, pk) DO UPDATE SET server_ver = excluded.server_ver, local_seq = excluded.local_seq, subs = subs | excluded.subs, ' +\r\n 'dirty = 0, dirty_mask = 0, rejected = 0, deleted = 0',\r\n { $t: table.tid, $base: clock, $bit: bitValue },\r\n );\r\n await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: numbered });\r\n\r\n await connection.exec(\r\n `UPDATE g9_rows SET server_ver = (SELECT v.ver FROM ${versions} AS v WHERE v.pk = g9_rows.pk), subs = subs | $bit, ` +\r\n 'dirty = 0, dirty_mask = 0, rejected = 0, deleted = 0 ' +\r\n `WHERE tid = $t AND pk IN (SELECT pk FROM ${versions}) ` +\r\n 'AND pk NOT IN (SELECT pk FROM temp.g9_file_changed) AND pk NOT IN (SELECT pk FROM temp.g9_file_protect) ' +\r\n `AND (server_ver IS NOT (SELECT v.ver FROM ${versions} AS v WHERE v.pk = g9_rows.pk) OR (subs | $bit) <> subs ` +\r\n 'OR dirty <> 0 OR dirty_mask <> 0 OR rejected <> 0 OR deleted <> 0)',\r\n { $t: table.tid, $bit: bitValue },\r\n );\r\n\r\n let skipped = 0;\r\n if (isProtected) {\r\n skipped = asNumber(await connection.scalar(`SELECT count(*) FROM temp.g9_file_protect AS p WHERE p.pk IN (SELECT pk FROM ${versions})`));\r\n if (bitValue !== 0) {\r\n await connection.exec(\r\n `UPDATE g9_rows SET subs = subs | $bit WHERE tid = $t AND deleted = 0 AND pk IN (SELECT p.pk FROM temp.g9_file_protect AS p WHERE p.pk IN (SELECT pk FROM ${versions}))`,\r\n { $t: table.tid, $bit: bitValue },\r\n );\r\n }\r\n }\r\n\r\n const total = asNumber(await connection.scalar(`SELECT count(*) FROM ${versions}`));\r\n context.report.skippedDirty += skipped;\r\n context.report.unchangedRows += total - skipped - numbered;\r\n if (context.wantsChangedKey(table.model.localName)) await addChangedKeys(context, table, 'SELECT pk FROM temp.g9_file_changed ORDER BY r');\r\n await connection.exec('DROP TABLE IF EXISTS temp.g9_file_changed; DROP TABLE IF EXISTS temp.g9_file_protect; DROP TABLE IF EXISTS temp.g9_file_versions');\r\n return total - skipped;\r\n}\r\n\r\nasync function addChangedKeys(context: ApplyContext, table: LocalTable, sql: string): Promise<void> {\r\n for (const r of await context.connection.query(sql + ' LIMIT $limit', { $limit: context.maxChangedKeys })) {\r\n if (!context.wantsChangedKey(table.model.localName)) break;\r\n context.addChanged(table.model.localName, asString(r[0]));\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"snapshotFiles.js","sourceRoot":"","sources":["../../src/sqlite/snapshotFiles.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client.Sqlite/G9CSqliteSyncStore.SnapshotFiles.cs (ADR-0072): a large first download arrives as a\n// SQLite file built on the server with this store's own DDL; its segments go straight from the transport to the platform's\n// G9SnapshotFileSink, and the apply copies the file's tables in SQL - one statement per table, SQLite's transfer optimisation\n// when the table is empty - instead of three statements per row. On Lynx that is one bridge call per table instead of one per\n// few thousand statements: the whole reason this exists for the TypeScript client.\nimport { G9SyncErrorCodes, G9SyncException } from '../abstractions/errors.js';\nimport { parseJson } from '../abstractions/long.js';\nimport { FILE_MODE_APPEND, FILE_MODE_COLUMNS, FILE_MODE_COPY, FILE_MODE_MERGE } from '../client/storeTypes.js';\nimport { G9EPullPartKind, type G9DtNegotiatedTable, type G9DtPullPlan, type G9DtSnapshotFileManifest, type G9DtSnapshotFileRequest, type G9DtSyncChunk } from '../protocol/dtos.js';\nimport { readFileManifest } from '../protocol/wire.js';\nimport { G9ESyncDirection } from '../abstractions/enums.js';\nimport { asNumber, asOptionalString, asString, statementsOf, type G9SqliteConnection } from './connection.js';\nimport type { G9SqlValue } from './driver.js';\nimport { findByServerName, persistedJson, type LocalTable, type StoreInternals } from './internals.js';\nimport type { G9SnapshotFileSink } from './options.js';\nimport { REVOKED_REJECTION_CODE } from './revocation.js';\nimport { bit, G9ESqliteDateTimeStorage, G9ESqliteDecimalStorage, keyExpression, quote } from './sql.js';\nimport type { ApplyContext } from './apply.js';\n\n/** The protocol's snapshot-file format this build reads (`G9SyncProtocol.SnapshotFileFormatVersion`). */\nexport const SNAPSHOT_FILE_FORMAT_VERSION = 1;\n/** \"G9SF\": `PRAGMA application_id` of a snapshot file (`G9CSnapshotFileWriter.ApplicationId`). */\nexport const SNAPSHOT_FILE_APPLICATION_ID = 0x47395346;\nconst MAX_FILES_PER_PLAN = 8;\n\n/** A staged file (`StagedFile`). */\nexport interface G9StagedFile {\n fileId: string;\n path: string;\n manifest: G9DtSnapshotFileManifest;\n subscriptionKey: string | null;\n firstSequence: number;\n segmentsDone: number;\n}\n\n/** Segments written since a file's last durable checkpoint, per run and file (under the write lock). */\nconst pendingSegments = new WeakMap<StoreInternals, Map<string, { segments: number; rows: number; bytes: number; unsynced: number }>>();\n\nfunction pendingOf(store: StoreInternals): Map<string, { segments: number; rows: number; bytes: number; unsynced: number }> {\n let map = pendingSegments.get(store);\n if (!map) pendingSegments.set(store, (map = new Map()));\n return map;\n}\n\nfunction corrupt(message: string): G9SyncException {\n return new G9SyncException(G9SyncErrorCodes.SnapshotFileCorrupt, message);\n}\n\n/** The device's offer (`DescribeSnapshotFiles`): storage forms and, per received table, the shape the store creates it with. */\nexport function describeSnapshotFiles(store: StoreInternals, negotiated: readonly G9DtNegotiatedTable[]): G9DtSnapshotFileRequest | null {\n if (!store.options.snapshotFiles) return null;\n const tables = [];\n for (const table of negotiated) {\n if (table.direction === G9ESyncDirection.UploadOnly) continue;\n const local = findByServerName(store, table.name);\n if (!local) continue;\n const model = local.model;\n tables.push({\n tableId: table.tableId,\n localName: model.localName,\n keyColumn: model.keyColumn,\n keyType: model.keyType,\n columns: model.columns.map((c) => ({ name: c.name, type: c.type, nullable: c.nullable })),\n indexes: model.indexes.map((i) => ({ name: i.name, columns: i.columns.slice(), unique: i.unique })),\n });\n }\n if (tables.length === 0) return null;\n return {\n formatVersion: SNAPSHOT_FILE_FORMAT_VERSION,\n storage: {\n dateTimeAsTicks: store.options.dateTimeStorage === G9ESqliteDateTimeStorage.Ticks,\n dateTimeFormat: store.options.dateTimeFormat,\n decimalAsText: store.options.decimalStorage === G9ESqliteDecimalStorage.Text,\n },\n tables,\n minRows: store.options.snapshotFileMinRows,\n maxBytes: store.options.snapshotFileMaxBytes,\n maxFiles: MAX_FILES_PER_PLAN,\n };\n}\n\nfunction sinkOf(store: StoreInternals): G9SnapshotFileSink {\n const sink = store.options.snapshotFiles;\n if (!sink) throw corrupt('A snapshot-file segment arrived, but this store has no snapshot-file sink.');\n return sink;\n}\n\n/** A .NET DateTime in the JSON form System.Text.Json writes, so persisted rows read the same on both sides. */\nfunction dotnetUtc(ms: number): string {\n return new Date(ms).toISOString().replace(/\\.(\\d{3})Z$/, '.$10000Z');\n}\n\n/** The persisted (.NET) form of a manifest: `builtUtc` as a DateTime. */\nfunction persistedManifest(manifest: G9DtSnapshotFileManifest): string {\n const { builtUtcMs, ...rest } = manifest;\n return persistedJson({ ...rest, builtUtc: dotnetUtc(builtUtcMs) });\n}\n\n/** The persisted (.NET) form of a plan: each planned file's `snapshotUtc` as a DateTime. */\nexport function persistedPlan(plan: G9DtPullPlan): string {\n return persistedJson({\n ...plan,\n parts: plan.parts.map((part) => {\n if (!part.file) return part;\n const { snapshotUtcMs, ...file } = part.file;\n return { ...part, file: { ...file, snapshotUtc: dotnetUtc(snapshotUtcMs) } };\n }),\n });\n}\n\nfunction validateManifest(manifest: G9DtSnapshotFileManifest, fileId: string): void {\n if (manifest.fileId !== fileId) throw corrupt(`Snapshot file ${fileId} came with the manifest of ${manifest.fileId}.`);\n if (manifest.formatVersion < 1 || manifest.formatVersion > SNAPSHOT_FILE_FORMAT_VERSION) {\n throw corrupt(`Snapshot file ${fileId} has format ${manifest.formatVersion}; this build reads up to ${SNAPSHOT_FILE_FORMAT_VERSION}.`);\n }\n if (manifest.compression !== 'br') throw corrupt(`Snapshot file ${fileId} uses the unknown codec '${manifest.compression}'.`);\n if (\n manifest.bytes <= 0 ||\n manifest.segmentBytes <= 0 ||\n manifest.segments <= 0 ||\n manifest.segments * manifest.segmentBytes < manifest.bytes ||\n (manifest.segments - 1) * manifest.segmentBytes >= manifest.bytes ||\n manifest.sha256.length !== 64\n ) {\n throw corrupt(`Snapshot file ${fileId} has an inconsistent manifest.`);\n }\n}\n\nfunction safeFileName(fileId: string): string {\n return fileId.replace(/[^A-Za-z0-9]/g, '_');\n}\n\nasync function readStagedFile(connection: G9SqliteConnection, runId: string, fileId: string): Promise<G9StagedFile | null> {\n const rows = await connection.query(\n 'SELECT file_id, path, manifest_json, subscription_key, first_seq, segments_done FROM g9_stage_files WHERE run_id = $r AND file_id = $f',\n { $r: runId, $f: fileId },\n );\n return rows[0] ? stagedFileOf(rows[0]) : null;\n}\n\n/** The staged files of a run, in plan order. */\nexport async function readStagedFiles(connection: G9SqliteConnection, runId: string): Promise<G9StagedFile[]> {\n const rows = await connection.query('SELECT file_id, path, manifest_json, subscription_key, first_seq, segments_done FROM g9_stage_files WHERE run_id = $r ORDER BY first_seq', {\n $r: runId,\n });\n return rows.map(stagedFileOf);\n}\n\nfunction stagedFileOf(r: readonly G9SqlValue[]): G9StagedFile {\n const manifest = readFileManifest(parseJson(asString(r[2])));\n if (!manifest) throw corrupt('A staged snapshot file has no manifest.');\n return { fileId: asString(r[0]), path: asString(r[1]), manifest, subscriptionKey: asOptionalString(r[3]), firstSequence: asNumber(r[4]), segmentsDone: asNumber(r[5]) };\n}\n\n/**\n * `StageFileSegment`: one segment to its place in the staged file, checked against its SHA-256 by the sink BEFORE it is\n * written. Durable only at checkpoints - every `snapshotFileCheckpointBytes` and at the last segment - in that order: the file\n * is flushed first, then the stage row records the resume point.\n */\nexport async function stageFileSegment(store: StoreInternals, runId: string, chunk: G9DtSyncChunk): Promise<void> {\n const segment = chunk.file;\n if (!segment) return;\n const sink = sinkOf(store);\n const connection = store.writer();\n const key = runId + '\\u0000' + segment.fileId;\n const pending = pendingOf(store);\n let staged = await readStagedFile(connection, runId, segment.fileId);\n const manifest = segment.manifest;\n if (manifest) {\n validateManifest(manifest, segment.fileId);\n if (!staged || staged.manifest.sha256 !== manifest.sha256) {\n // A new file - or a different build of it after a resume on another server instance: the file starts over.\n const path = staged ? staged.path : joinPath(sink.directory, runId + '-' + safeFileName(segment.fileId) + '.sqlite');\n await sink.create(path, manifest.bytes);\n await connection.exec(\n 'INSERT INTO g9_stage_files (run_id, file_id, path, manifest_json, subscription_key, first_seq, segments_done, bytes_received) ' +\n 'VALUES ($r, $f, $p, $m, $k, $s, 0, 0) ON CONFLICT(run_id, file_id) DO UPDATE SET manifest_json = excluded.manifest_json, segments_done = 0, bytes_received = 0',\n { $r: runId, $f: segment.fileId, $p: path, $m: persistedManifest(manifest), $k: chunk.subscriptionKey ?? null, $s: chunk.sequence },\n );\n pending.delete(key);\n staged = await readStagedFile(connection, runId, segment.fileId);\n }\n }\n if (!staged) throw corrupt(`Segment ${segment.index} of snapshot file ${segment.fileId} arrived without its manifest.`);\n const layout = staged.manifest;\n let state = pending.get(key);\n if (!state) pending.set(key, (state = { segments: 0, rows: 0, bytes: 0, unsynced: 0 }));\n const expected = staged.segmentsDone + state.segments;\n if (segment.index !== expected) throw corrupt(`Snapshot file ${segment.fileId}: segment ${segment.index} arrived where ${expected} was expected.`);\n if (\n segment.offset !== segment.index * layout.segmentBytes ||\n segment.length <= 0 ||\n segment.length > layout.segmentBytes ||\n segment.offset + segment.length > layout.bytes ||\n segment.index >= layout.segments\n ) {\n throw corrupt(`Snapshot file ${segment.fileId}: segment ${segment.index} does not fit the manifest.`);\n }\n const payload = chunk.payload;\n if (!payload) throw corrupt(`Snapshot file ${segment.fileId}: segment ${segment.index} has no payload.`);\n\n const last = segment.index === layout.segments - 1;\n const sync = last || state.unsynced + segment.length >= Math.max(1, store.options.snapshotFileCheckpointBytes);\n try {\n await sink.writeSegment(staged.path, segment.offset, payload, segment.length, segment.sha256, sync);\n } catch (error) {\n throw corrupt(`Snapshot file ${segment.fileId}: segment ${segment.index} was refused (${error instanceof Error ? error.message : String(error)}).`);\n }\n state.segments++;\n state.rows += chunk.rowCount;\n state.bytes += payload.length;\n state.unsynced += segment.length;\n if (!sync) return;\n\n // The checkpoint, in one atomic call: the data is on disk, so the record that it is there may follow.\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, NULL)', {\n $r: runId,\n $s: chunk.sequence,\n $k: chunk.subscriptionKey ?? null,\n $n: state.rows,\n $c: chunk.continuation ? persistedJson(chunk.continuation) : null,\n }),\n ...statementsOf('UPDATE g9_stage_files SET segments_done = segments_done + $n, bytes_received = bytes_received + $b WHERE run_id = $r AND file_id = $f', {\n $n: state.segments,\n $b: state.bytes,\n $r: runId,\n $f: segment.fileId,\n }),\n ]);\n pending.delete(key);\n}\n\n/** A resumed stream starts at a file's last checkpoint: segments written after it are written again. */\nexport function forgetPendingSegments(store: StoreInternals, runId: string): void {\n const pending = pendingOf(store);\n pending.forEach((_, key) => {\n if (key.slice(0, runId.length + 1) === runId + '\\u0000') pending.delete(key);\n });\n}\n\n/** The staged files of the runs a statement is about to delete (their rows go in the same transaction, the files after it). */\nexport async function takeStagedFiles(connection: G9SqliteConnection, runFilterSql: string, params?: { [name: string]: G9SqlValue }): Promise<string[]> {\n const paths = (await connection.query('SELECT path FROM g9_stage_files WHERE run_id IN (' + runFilterSql + ')', params)).map((r) => asString(r[0]));\n await connection.exec('DELETE FROM g9_stage_files WHERE run_id IN (' + runFilterSql + ')', params);\n return paths;\n}\n\nexport async function deleteFiles(store: StoreInternals, paths: readonly string[]): Promise<void> {\n const sink = store.options.snapshotFiles;\n if (!sink) return;\n for (const path of paths) {\n try {\n await sink.remove(path);\n } catch (error) {\n store.log('warning', 20122, `A staged snapshot file could not be deleted and is retried at the next start: ${path} (${error instanceof Error ? error.message : String(error)})`);\n }\n }\n}\n\n/** Deletes staged files no stage refers to any more (a crash between a stage's commit and its files' deletion). */\nexport async function sweepOrphanSnapshotFiles(store: StoreInternals, connection: G9SqliteConnection): Promise<void> {\n const sink = store.options.snapshotFiles;\n if (!sink) return;\n let files: string[];\n try {\n files = await sink.list(sink.directory);\n } catch {\n return;\n }\n const referenced: { [path: string]: true } = {};\n for (const r of await connection.query('SELECT path FROM g9_stage_files')) referenced[normalizePath(asString(r[0]))] = true;\n // Only names this store writes (<run id>-<file id>.sqlite and SQLite's companions of it): the directory may be shared with\n // other files - even the database itself - and a sweep must never touch what it did not create.\n await deleteFiles(\n store,\n files.filter((path) => {\n const match = STAGED_FILE_NAME.exec(path);\n return match !== null && referenced[normalizePath(path.substring(0, path.length - (match[1] ? match[1].length : 0)))] !== true;\n }),\n );\n}\n\n/** `<32 hex run id>-<file id>.sqlite`, or its -journal/-wal/-shm companion (group 1), at the end of a path. */\nconst STAGED_FILE_NAME = /(?:^|[\\\\/])[0-9a-fA-F]{32}-[A-Za-z0-9_]+\\.sqlite(-journal|-wal|-shm)?$/i;\n\nfunction normalizePath(path: string): string {\n return path.replace(/\\\\/g, '/').toLowerCase();\n}\n\nfunction joinPath(directory: string, name: string): string {\n return directory.length === 0 ? name : directory.replace(/[\\\\/]+$/, '') + '/' + name;\n}\n\n/** `VerifyStagedFile`: every segment arrived, the size is the manifest's, and it is a snapshot file (header + \"G9SF\"). */\nexport async function verifyStagedFile(store: StoreInternals, file: G9StagedFile): Promise<void> {\n const sink = sinkOf(store);\n const manifest = file.manifest;\n if (file.segmentsDone !== manifest.segments) throw corrupt(`Snapshot file ${file.fileId} has ${file.segmentsDone} of ${manifest.segments} segments.`);\n const size = await sink.size(file.path);\n if (size !== manifest.bytes) throw corrupt(`Snapshot file ${file.fileId} is missing or not ${manifest.bytes} bytes.`);\n const header = await sink.head(file.path, 100);\n const magic = 'SQLite format 3\\u0000';\n for (let i = 0; i < magic.length; i++) {\n if (header[i] !== magic.charCodeAt(i)) throw corrupt(`Snapshot file ${file.fileId} has no SQLite header.`);\n }\n const id = (((header[68] as number) << 24) | ((header[69] as number) << 16) | ((header[70] as number) << 8) | (header[71] as number)) >>> 0;\n if (id !== SNAPSHOT_FILE_APPLICATION_ID) throw corrupt(`Snapshot file ${file.fileId} is not a G9SyncData snapshot file.`);\n}\n\n/** `AttachedFiles.Schema`. */\nexport function attachedSchema(index: number): string {\n return 'g9snap' + index;\n}\n\n/** ATTACHes the staged files (outside any transaction) and returns the detach action. */\nexport async function attachFiles(connection: G9SqliteConnection, files: readonly G9StagedFile[]): Promise<() => Promise<void>> {\n let count = 0;\n const detach = async (): Promise<void> => {\n for (; count > 0; count--) {\n try {\n await connection.exec('DETACH DATABASE ' + attachedSchema(count - 1));\n } catch {\n // Left attached: the session closes with the store, and the file is swept at the next start.\n }\n }\n };\n try {\n for (const file of files) {\n await connection.exec('ATTACH DATABASE $p AS ' + attachedSchema(count), { $p: file.path });\n count++;\n }\n } catch (error) {\n await detach();\n throw error;\n }\n return detach;\n}\n\n/** The first snapshot-file time per subscription of a plan (the reconcile clock of a file-based subscription starts there). */\nexport function fileSnapshotTimes(plan: G9DtPullPlan): { [subscriptionKey: string]: number } {\n const out: { [key: string]: number } = {};\n for (const part of plan.parts) {\n if (part.kind !== G9EPullPartKind.SnapshotFile || !part.file) continue;\n const at = part.file.snapshotUtcMs;\n const existing = out[part.subscriptionKey];\n out[part.subscriptionKey] = existing === undefined ? at : Math.min(existing, at);\n }\n return out;\n}\n\nasync function tableColumns(connection: G9SqliteConnection, table: string, schema: string): Promise<string[]> {\n return (await connection.query('SELECT name FROM pragma_table_info($t, $s) ORDER BY cid', { $t: table, $s: schema })).map((r) => asString(r[0]));\n}\n\nasync function indexSignature(connection: G9SqliteConnection, index: string, unique: boolean, schema: string): Promise<string> {\n let text = unique ? 'u' : 'n';\n for (const r of await connection.query(\n 'SELECT seqno, coalesce(name, \\'\\'), \"desc\", coalesce(coll, \\'\\'), key FROM pragma_index_xinfo($i, $s) ORDER BY seqno',\n { $i: index, $s: schema },\n )) {\n text += '|' + asNumber(r[0]) + ':' + asString(r[1]).toUpperCase() + ':' + asNumber(r[2]) + ':' + asString(r[3]).toUpperCase() + ':' + asNumber(r[4]);\n }\n return text;\n}\n\nasync function listIndexes(connection: G9SqliteConnection, table: string, schema: string): Promise<{ name: string; unique: boolean; partial: boolean }[]> {\n return (await connection.query('SELECT name, \"unique\", partial FROM pragma_index_list($t, $s) WHERE origin = \\'c\\'', { $t: table, $s: schema })).map((r) => ({\n name: asString(r[0]),\n unique: asNumber(r[1]) !== 0,\n partial: asNumber(r[2]) !== 0,\n }));\n}\n\n/** `PrepareIndexesForCopy`: drops each index the file cannot supply; they are rebuilt at the end of the apply. */\nasync function prepareIndexesForCopy(context: ApplyContext, table: LocalTable, sourceTable: string, schema: string): Promise<void> {\n const connection = context.connection;\n const available: { [signature: string]: true } = {};\n for (const index of await listIndexes(connection, sourceTable, schema)) {\n if (!index.partial) available[await indexSignature(connection, index.name, index.unique, schema)] = true;\n }\n let dropped = 0;\n for (const index of await listIndexes(connection, table.model.localName, 'main')) {\n if (!index.partial && available[await indexSignature(connection, index.name, index.unique, 'main')] === true) continue;\n if (context.deferredIndexes.some((d) => d.name.toLowerCase() === index.name.toLowerCase())) continue;\n const sql = await connection.scalar(\"SELECT sql FROM main.sqlite_master WHERE type = 'index' AND name = $n\", { $n: index.name });\n if (typeof sql !== 'string') continue;\n await connection.exec('DROP INDEX main.' + quote(index.name));\n context.deferredIndexes.push({ name: index.name, sql });\n dropped++;\n }\n if (dropped > 0) {\n const name = table.model.localName;\n context.report.diagnostics.deferredIndexes[name] = (context.report.diagnostics.deferredIndexes[name] ?? 0) + dropped;\n }\n}\n\n/** `ApplySnapshotFile`: copy, columns or merge per table, metadata set-based, inside the apply's transaction. */\nexport async function applySnapshotFile(store: StoreInternals, context: ApplyContext, schema: string, file: G9StagedFile): Promise<void> {\n await context.flush();\n const connection = context.connection;\n const started = Date.now();\n let slot = -1;\n if (file.subscriptionKey !== null) {\n const subscription = context.subscriptions.get(file.subscriptionKey);\n if (subscription) {\n if (subscription.ephemeral) throw corrupt(`Snapshot file ${file.fileId} is for an ephemeral subscription.`);\n slot = subscription.slot;\n }\n }\n const bitValue = slot >= 0 ? bit(slot).toSqlValue() : 0;\n const diagnostics = context.report.diagnostics;\n\n for (const info of file.manifest.tables) {\n const table = store.byServerId.get(info.tableId);\n if (!table || !table.negotiated) continue;\n const tableStarted = Date.now();\n const source = schema + '.' + quote(info.name);\n // (pk, ver, r) of every row in the file, in arrival order: the version table is keyed by the data table's rowid.\n const sourceKey = keyExpression(table.model, 's');\n const pairs = `(SELECT ${sourceKey} AS pk, v.ver AS ver, s.rowid AS r FROM ${source} AS s JOIN ${schema}.${quote(info.versionTable)} AS v ON v.rid = s.rowid)`;\n const sourceColumns = await tableColumns(connection, info.name, schema);\n if (sourceColumns.length === 0) throw corrupt(`Snapshot file ${file.fileId} does not contain ${info.name}.`);\n const versionColumns = (await tableColumns(connection, info.versionTable, schema)).map((c) => c.toLowerCase());\n if (versionColumns.indexOf('rid') < 0 || versionColumns.indexOf('ver') < 0) {\n // Not this format's version table (rid → ver): a file this build cannot number - rows instead.\n throw corrupt(`Snapshot file ${file.fileId}: ${info.versionTable} is not a version table of format ${SNAPSHOT_FILE_FORMAT_VERSION}.`);\n }\n const localColumns = await tableColumns(connection, table.model.localName, 'main');\n const localLower: { [name: string]: true } = {};\n for (const c of localColumns) localLower[c.toLowerCase()] = true;\n const shared = sourceColumns.filter((c) => localLower[c.toLowerCase()] === true);\n if (!shared.some((c) => c.toLowerCase() === table.model.keyColumn.toLowerCase())) throw corrupt(`Snapshot file ${file.fileId}: ${info.name} has no key column.`);\n\n const isProtected = context.hasDirty(table.tid);\n const empty = (await connection.scalar(`SELECT 1 FROM ${table.quoted} LIMIT 1`)) === null;\n let rows: number;\n let mode: string;\n if (empty && !isProtected) {\n await prepareIndexesForCopy(context, table, info.name, schema);\n const identical = sourceColumns.length === localColumns.length && sourceColumns.every((c, i) => c.toLowerCase() === (localColumns[i] as string).toLowerCase());\n mode = identical ? FILE_MODE_COPY : FILE_MODE_COLUMNS;\n const list = shared.map(quote).join(', ');\n rows = await connection.exec(identical ? `INSERT INTO main.${table.quoted} SELECT * FROM ${source}` : `INSERT INTO main.${table.quoted} (${list}) SELECT ${list} FROM ${source}`);\n await numberNewRows(context, table, pairs, bitValue);\n if (context.wantsChangedKey(table.model.localName)) await addChangedKeys(context, table, `SELECT ${sourceKey} FROM ${source} AS s ORDER BY s.rowid`);\n } else if (!isProtected && !(await overlapsStoredRows(context, table, source))) {\n // 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.\n // 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).\n mode = FILE_MODE_APPEND;\n const list = shared.map(quote).join(', ');\n rows = await connection.exec(`INSERT INTO main.${table.quoted} (${list}) SELECT ${list} FROM ${source} AS s ORDER BY s.${quote(table.model.keyColumn)}`);\n await numberNewRows(context, table, pairs, bitValue);\n if (context.wantsChangedKey(table.model.localName)) await addChangedKeys(context, table, `SELECT ${sourceKey} FROM ${source} AS s ORDER BY s.rowid`);\n } else {\n mode = FILE_MODE_MERGE;\n rows = await mergeSnapshotTable(context, table, source, pairs, shared, bitValue, isProtected);\n }\n\n if (context.hasRevoked && slot >= 0) {\n await connection.exec(\n `DELETE FROM g9_revoked WHERE tid = $t AND pk IN (SELECT ${sourceKey} FROM ${source} AS s); ` +\n `DELETE FROM g9_rejections WHERE tid = $t AND code = $code AND pk IN (SELECT ${sourceKey} FROM ${source} AS s)`,\n { $t: table.tid, $code: REVOKED_REJECTION_CODE },\n );\n }\n\n context.report.upserts += rows;\n context.advance(rows);\n diagnostics.fileRows += rows;\n const before = diagnostics.fileTables[table.model.localName];\n diagnostics.fileTables[table.model.localName] = before === undefined ? mode : before.split('+').indexOf(mode) >= 0 ? before : before + '+' + mode;\n context.addTableTime(table.model.localName, rows, Date.now() - tableStarted);\n store.log('debug', 20121, `Snapshot file: ${table.model.localName} received ${rows} row(s) (${mode})`);\n }\n\n diagnostics.snapshotFiles++;\n diagnostics.fileCopyMs += Date.now() - started;\n}\n\n/** `NumberNewRows`: every row of the file is new to the table - membership, server version and the next number on the clock. */\nasync function numberNewRows(context: ApplyContext, table: LocalTable, pairs: string, bitValue: G9SqlValue): Promise<void> {\n const connection = context.connection;\n const clock = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n const numbered = await connection.exec(\n 'INSERT INTO g9_rows (tid, pk, server_ver, local_seq, subs, dirty, dirty_mask, rejected, deleted) ' +\n `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 ` +\n 'ON CONFLICT(tid, pk) DO UPDATE SET server_ver = excluded.server_ver, local_seq = excluded.local_seq, subs = subs | excluded.subs, ' +\n 'dirty = 0, dirty_mask = 0, rejected = 0, deleted = 0',\n { $t: table.tid, $base: clock, $bit: bitValue },\n );\n await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: numbered });\n}\n\n/** `OverlapsStoredRows`: whether any row of the file is already in the table - what separates an append from a merge. */\nasync function overlapsStoredRows(context: ApplyContext, table: LocalTable, source: string): Promise<boolean> {\n const key = quote(table.model.keyColumn);\n 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;\n}\n\n/** `MergeSnapshotTable`: changed rows only; protected rows gain membership; unchanged rows keep their feed position. */\nasync function mergeSnapshotTable(\n context: ApplyContext,\n table: LocalTable,\n source: string,\n pairs: string,\n columns: string[],\n bitValue: G9SqlValue,\n isProtected: boolean,\n): Promise<number> {\n const connection = context.connection;\n const key = quote(table.model.keyColumn);\n const sourceKey = keyExpression(table.model, 's');\n // The file's (pk, ver, r) by key, once: the statements below look versions up by key.\n const versions = 'temp.g9_file_versions';\n await connection.exec(\n 'DROP TABLE IF EXISTS temp.g9_file_versions; CREATE TEMP TABLE g9_file_versions (pk TEXT NOT NULL PRIMARY KEY, ver INTEGER NOT NULL, r INTEGER NOT NULL) WITHOUT ROWID; ' +\n `INSERT OR REPLACE INTO temp.g9_file_versions (pk, ver, r) SELECT pk, ver, r FROM ${pairs}`,\n );\n await connection.exec('DROP TABLE IF EXISTS temp.g9_file_protect; CREATE TEMP TABLE g9_file_protect (pk TEXT NOT NULL PRIMARY KEY) WITHOUT ROWID');\n if (isProtected) {\n const prefix = table.tid + '\\u0000';\n const keys: string[] = [];\n context.dirty.forEach((entry) => {\n if (entry.slice(0, prefix.length) === prefix) keys.push(entry.slice(prefix.length));\n });\n if (keys.length > 0) await connection.exec('INSERT OR IGNORE INTO temp.g9_file_protect (pk) SELECT value FROM json_each($k)', { $k: JSON.stringify(keys) });\n }\n\n const nonKey = columns.filter((c) => c.toLowerCase() !== table.model.keyColumn.toLowerCase());\n const differs = nonKey.map((c) => 'm.' + quote(c) + ' IS NOT s.' + quote(c)).join(' OR ');\n await connection.exec('DROP TABLE IF EXISTS temp.g9_file_changed; CREATE TEMP TABLE g9_file_changed (r INTEGER PRIMARY KEY, pk TEXT NOT NULL UNIQUE)');\n await connection.exec(\n `INSERT INTO temp.g9_file_changed (r, pk) SELECT s.rowid, ${sourceKey} FROM ${source} AS s LEFT JOIN main.${table.quoted} AS m ON m.${key} = s.${key} ` +\n `WHERE NOT EXISTS (SELECT 1 FROM temp.g9_file_protect AS p WHERE p.pk = ${sourceKey}) ` +\n `AND (m.${key} IS NULL${differs.length === 0 ? '' : ' OR ' + differs} ` +\n `OR NOT EXISTS (SELECT 1 FROM g9_rows AS r WHERE r.tid = $t AND r.pk = ${sourceKey} AND r.deleted = 0))`,\n { $t: table.tid },\n );\n\n const list = columns.map(quote).join(', ');\n const updates = nonKey.map((c) => quote(c) + ' = excluded.' + quote(c));\n await connection.exec(\n `INSERT INTO main.${table.quoted} (${list}) SELECT ${list} FROM ${source} AS s WHERE s.rowid IN (SELECT r FROM temp.g9_file_changed) ` +\n (updates.length === 0 ? `ON CONFLICT(${key}) DO NOTHING` : `ON CONFLICT(${key}) DO UPDATE SET ${updates.join(', ')}`),\n );\n\n const clock = asNumber(await connection.scalar('SELECT seq FROM g9_clock WHERE id = 1'));\n const numbered = await connection.exec(\n 'INSERT INTO g9_rows (tid, pk, server_ver, local_seq, subs, dirty, dirty_mask, rejected, deleted) ' +\n `SELECT $t, v.pk, v.ver, $base + row_number() OVER (ORDER BY v.r), $bit, 0, 0, 0, 0 FROM ${versions} AS v ` +\n 'WHERE v.pk IN (SELECT pk FROM temp.g9_file_changed) ' +\n 'ON CONFLICT(tid, pk) DO UPDATE SET server_ver = excluded.server_ver, local_seq = excluded.local_seq, subs = subs | excluded.subs, ' +\n 'dirty = 0, dirty_mask = 0, rejected = 0, deleted = 0',\n { $t: table.tid, $base: clock, $bit: bitValue },\n );\n await connection.exec('UPDATE g9_clock SET seq = seq + $n WHERE id = 1', { $n: numbered });\n\n await connection.exec(\n `UPDATE g9_rows SET server_ver = (SELECT v.ver FROM ${versions} AS v WHERE v.pk = g9_rows.pk), subs = subs | $bit, ` +\n 'dirty = 0, dirty_mask = 0, rejected = 0, deleted = 0 ' +\n `WHERE tid = $t AND pk IN (SELECT pk FROM ${versions}) ` +\n 'AND pk NOT IN (SELECT pk FROM temp.g9_file_changed) AND pk NOT IN (SELECT pk FROM temp.g9_file_protect) ' +\n `AND (server_ver IS NOT (SELECT v.ver FROM ${versions} AS v WHERE v.pk = g9_rows.pk) OR (subs | $bit) <> subs ` +\n 'OR dirty <> 0 OR dirty_mask <> 0 OR rejected <> 0 OR deleted <> 0)',\n { $t: table.tid, $bit: bitValue },\n );\n\n let skipped = 0;\n if (isProtected) {\n skipped = asNumber(await connection.scalar(`SELECT count(*) FROM temp.g9_file_protect AS p WHERE p.pk IN (SELECT pk FROM ${versions})`));\n if (bitValue !== 0) {\n await connection.exec(\n `UPDATE g9_rows SET subs = subs | $bit WHERE tid = $t AND deleted = 0 AND pk IN (SELECT p.pk FROM temp.g9_file_protect AS p WHERE p.pk IN (SELECT pk FROM ${versions}))`,\n { $t: table.tid, $bit: bitValue },\n );\n }\n }\n\n const total = asNumber(await connection.scalar(`SELECT count(*) FROM ${versions}`));\n context.report.skippedDirty += skipped;\n context.report.unchangedRows += total - skipped - numbered;\n if (context.wantsChangedKey(table.model.localName)) await addChangedKeys(context, table, 'SELECT pk FROM temp.g9_file_changed ORDER BY r');\n await connection.exec('DROP TABLE IF EXISTS temp.g9_file_changed; DROP TABLE IF EXISTS temp.g9_file_protect; DROP TABLE IF EXISTS temp.g9_file_versions');\n return total - skipped;\n}\n\nasync function addChangedKeys(context: ApplyContext, table: LocalTable, sql: string): Promise<void> {\n for (const r of await context.connection.query(sql + ' LIMIT $limit', { $limit: context.maxChangedKeys })) {\n if (!context.wantsChangedKey(table.model.localName)) break;\n context.addChanged(table.model.localName, asString(r[0]));\n }\n}\n"]}
@@ -111,6 +111,8 @@ export declare class G9SqliteSyncStore implements G9SyncClientStore, StoreIntern
111
111
  retryRejected(localTable: string | null, key: string | null): Promise<number>;
112
112
  revertRejected(localTable: string | null, key: string | null): Promise<number>;
113
113
  markDirty(localTable: string, keys: readonly string[]): Promise<number>;
114
+ refetchRows(localTable: string, keys: readonly string[] | null): Promise<number>;
115
+ releaseUnclaimedRows(localTable: string, keys: readonly string[] | null, includePending: boolean): Promise<G9ApplyReport>;
114
116
  adoptExistingRows(): Promise<number>;
115
117
  saveRunReport(report: G9SyncRunReport, keep: number): Promise<void>;
116
118
  getRecentRunReports(count: number): Promise<G9SyncRunReport[]>;