@doync/client 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +1 -17
  2. package/dist/adapter.cjs +1 -1
  3. package/dist/adapter.d.cts +1 -1
  4. package/dist/adapter.d.ts +1 -1
  5. package/dist/adapter.js +1 -1
  6. package/dist/adapter.js.map +1 -1
  7. package/dist/client-Bv6QMenB.cjs +15 -0
  8. package/dist/client-Db0Jfwuy.js +16 -0
  9. package/dist/client-Db0Jfwuy.js.map +1 -0
  10. package/dist/{client-CNyLMCw0.d.ts → client-OAVaC3pt.d.ts} +79 -91
  11. package/dist/client-OAVaC3pt.d.ts.map +1 -0
  12. package/dist/{client-DHXO0dbf.d.cts → client-OPt8Axyp.d.cts} +79 -91
  13. package/dist/client-OPt8Axyp.d.cts.map +1 -0
  14. package/dist/index.d.cts +3 -2
  15. package/dist/index.d.ts +3 -2
  16. package/dist/internal.cjs +1 -1
  17. package/dist/internal.d.cts +3 -12
  18. package/dist/internal.d.cts.map +1 -1
  19. package/dist/internal.d.ts +3 -12
  20. package/dist/internal.d.ts.map +1 -1
  21. package/dist/internal.js +1 -1
  22. package/package.json +3 -3
  23. package/src/client.ts +82 -32
  24. package/src/engine.ts +188 -134
  25. package/src/index.ts +1 -6
  26. package/src/internal.ts +4 -4
  27. package/src/migrate.ts +1 -1
  28. package/src/replica/db/0002_prefs_table.sql +9 -0
  29. package/src/replica/db/meta/0002_snapshot.json +191 -0
  30. package/src/replica/db/meta/_journal.json +7 -0
  31. package/src/replica/db/schema.ts +12 -3
  32. package/src/replica/index.ts +5 -4
  33. package/src/replica/meta.ts +23 -0
  34. package/src/replica/track.ts +20 -39
  35. package/src/socket-reconnect.ts +29 -5
  36. package/dist/client-C6jAdhbe.cjs +0 -15
  37. package/dist/client-CNyLMCw0.d.ts.map +0 -1
  38. package/dist/client-ClV8ce6X.js +0 -16
  39. package/dist/client-ClV8ce6X.js.map +0 -1
  40. package/dist/client-DHXO0dbf.d.cts.map +0 -1
  41. package/src/client-mutation-registry.ts +0 -31
  42. package/src/mutations.ts +0 -96
@@ -0,0 +1,191 @@
1
+ {
2
+ "version": "6",
3
+ "dialect": "sqlite",
4
+ "id": "5170a606-ccac-4a79-9c24-c1dd02d5c075",
5
+ "prevId": "9b4ee178-f435-4f98-aebf-234ba0657b6d",
6
+ "tables": {
7
+ "__doync_membership": {
8
+ "name": "__doync_membership",
9
+ "columns": {
10
+ "instance": {
11
+ "name": "instance",
12
+ "type": "text",
13
+ "primaryKey": false,
14
+ "notNull": true,
15
+ "autoincrement": false
16
+ },
17
+ "level": {
18
+ "name": "level",
19
+ "type": "integer",
20
+ "primaryKey": false,
21
+ "notNull": true,
22
+ "autoincrement": false
23
+ },
24
+ "tbl": {
25
+ "name": "tbl",
26
+ "type": "text",
27
+ "primaryKey": false,
28
+ "notNull": true,
29
+ "autoincrement": false
30
+ },
31
+ "pk": {
32
+ "name": "pk",
33
+ "type": "text",
34
+ "primaryKey": false,
35
+ "notNull": true,
36
+ "autoincrement": false
37
+ }
38
+ },
39
+ "indexes": {
40
+ "__doync_membership_by_row": {
41
+ "name": "__doync_membership_by_row",
42
+ "columns": ["tbl", "pk"],
43
+ "isUnique": false
44
+ }
45
+ },
46
+ "foreignKeys": {},
47
+ "compositePrimaryKeys": {
48
+ "__doync_membership_instance_level_pk_pk": {
49
+ "columns": ["instance", "level", "pk"],
50
+ "name": "__doync_membership_instance_level_pk_pk"
51
+ }
52
+ },
53
+ "uniqueConstraints": {},
54
+ "checkConstraints": {}
55
+ },
56
+ "__doync_meta": {
57
+ "name": "__doync_meta",
58
+ "columns": {
59
+ "k": {
60
+ "name": "k",
61
+ "type": "text",
62
+ "primaryKey": true,
63
+ "notNull": true,
64
+ "autoincrement": false
65
+ },
66
+ "v": {
67
+ "name": "v",
68
+ "type": "blob",
69
+ "primaryKey": false,
70
+ "notNull": false,
71
+ "autoincrement": false
72
+ }
73
+ },
74
+ "indexes": {},
75
+ "foreignKeys": {},
76
+ "compositePrimaryKeys": {},
77
+ "uniqueConstraints": {},
78
+ "checkConstraints": {}
79
+ },
80
+ "__doync_pending": {
81
+ "name": "__doync_pending",
82
+ "columns": {
83
+ "mutation_id": {
84
+ "name": "mutation_id",
85
+ "type": "integer",
86
+ "primaryKey": true,
87
+ "notNull": true,
88
+ "autoincrement": false
89
+ },
90
+ "name": {
91
+ "name": "name",
92
+ "type": "text",
93
+ "primaryKey": false,
94
+ "notNull": true,
95
+ "autoincrement": false
96
+ },
97
+ "args": {
98
+ "name": "args",
99
+ "type": "text",
100
+ "primaryKey": false,
101
+ "notNull": true,
102
+ "autoincrement": false
103
+ },
104
+ "idem_key": {
105
+ "name": "idem_key",
106
+ "type": "text",
107
+ "primaryKey": false,
108
+ "notNull": false,
109
+ "autoincrement": false
110
+ }
111
+ },
112
+ "indexes": {},
113
+ "foreignKeys": {},
114
+ "compositePrimaryKeys": {},
115
+ "uniqueConstraints": {},
116
+ "checkConstraints": {}
117
+ },
118
+ "__doync_prefs": {
119
+ "name": "__doync_prefs",
120
+ "columns": {
121
+ "k": {
122
+ "name": "k",
123
+ "type": "text",
124
+ "primaryKey": true,
125
+ "notNull": true,
126
+ "autoincrement": false
127
+ },
128
+ "v": {
129
+ "name": "v",
130
+ "type": "blob",
131
+ "primaryKey": false,
132
+ "notNull": false,
133
+ "autoincrement": false
134
+ }
135
+ },
136
+ "indexes": {},
137
+ "foreignKeys": {},
138
+ "compositePrimaryKeys": {},
139
+ "uniqueConstraints": {},
140
+ "checkConstraints": {}
141
+ },
142
+ "__doync_release_stamp": {
143
+ "name": "__doync_release_stamp",
144
+ "columns": {
145
+ "instance": {
146
+ "name": "instance",
147
+ "type": "text",
148
+ "primaryKey": true,
149
+ "notNull": true,
150
+ "autoincrement": false
151
+ },
152
+ "cookie": {
153
+ "name": "cookie",
154
+ "type": "integer",
155
+ "primaryKey": false,
156
+ "notNull": true,
157
+ "autoincrement": false
158
+ },
159
+ "released_at": {
160
+ "name": "released_at",
161
+ "type": "integer",
162
+ "primaryKey": false,
163
+ "notNull": true,
164
+ "autoincrement": false
165
+ },
166
+ "ttl_ms": {
167
+ "name": "ttl_ms",
168
+ "type": "integer",
169
+ "primaryKey": false,
170
+ "notNull": true,
171
+ "autoincrement": false
172
+ }
173
+ },
174
+ "indexes": {},
175
+ "foreignKeys": {},
176
+ "compositePrimaryKeys": {},
177
+ "uniqueConstraints": {},
178
+ "checkConstraints": {}
179
+ }
180
+ },
181
+ "views": {},
182
+ "enums": {},
183
+ "_meta": {
184
+ "schemas": {},
185
+ "tables": {},
186
+ "columns": {}
187
+ },
188
+ "internal": {
189
+ "indexes": {}
190
+ }
191
+ }
@@ -15,6 +15,13 @@
15
15
  "when": 1784450022155,
16
16
  "tag": "0001_release_stamps",
17
17
  "breakpoints": true
18
+ },
19
+ {
20
+ "idx": 2,
21
+ "version": "6",
22
+ "when": 1785060176159,
23
+ "tag": "0002_prefs_table",
24
+ "breakpoints": true
18
25
  }
19
26
  ]
20
27
  }
@@ -2,8 +2,10 @@
2
2
  * Replica engine tables (ADR-0024) — client-role Drizzle schema, unshared with
3
3
  * Origin/Mirror (similar `__doync_meta` is coincidence).
4
4
  *
5
- * - `__doync_meta` — durable clientId, next-mutid, cookie, schema version, logout
6
- * behavior, connected clock (#223) as k/v; `v` blob for store-as-bound.
5
+ * - `__doync_meta` — durable sync position as k/v (clientId, next-mutid, cookie,
6
+ * schema version, connected clock #223); `v` blob for store-as-bound.
7
+ * - `__doync_prefs` — durable per-identity user preferences (logout behavior);
8
+ * survives resync (not sync state — ADR-0037).
7
9
  * - `__doync_pending` — optimistic queue outside the overlay savepoint.
8
10
  * - `__doync_membership` — retraction refcount (instance, level, pk); EXISTS
9
11
  * last-ref delete (ADR-0013); by-row index on (tbl, pk).
@@ -22,13 +24,20 @@ import {
22
24
  text,
23
25
  } from 'drizzle-orm/sqlite-core'
24
26
 
25
- /** Client durable kv — see module docblock. without rowid */
27
+ /** Client durable sync-state kv — see module docblock. without rowid */
26
28
  export const doyncMeta = sqliteTable('__doync_meta', {
27
29
  k: text('k').primaryKey(),
28
30
  // blob affinity: store-as-bound for mixed number/string values (ADR-0024)
29
31
  v: blob('v'),
30
32
  })
31
33
 
34
+ /** Client durable preferences kv — see module docblock. without rowid */
35
+ export const doyncPrefs = sqliteTable('__doync_prefs', {
36
+ k: text('k').primaryKey(),
37
+ // blob affinity: store-as-bound for mixed number/string values (ADR-0024)
38
+ v: blob('v'),
39
+ })
40
+
32
41
  /** Durable optimistic mutation queue. (rowid table — INTEGER PRIMARY KEY) */
33
42
  export const doyncPending = sqliteTable('__doync_pending', {
34
43
  mutationId: integer('mutation_id').primaryKey(),
@@ -1,9 +1,9 @@
1
1
  import type { DoyncSchema, SqlValue, TableSchema } from '@doync/core'
2
2
 
3
3
  import {
4
+ declaredSchemaVersion,
4
5
  decodeImageValue,
5
6
  decodePkValue,
6
- declaredSchemaVersion,
7
7
  isInternalTable,
8
8
  isSqlIdentifier,
9
9
  tablePrimaryKey,
@@ -15,7 +15,7 @@ import { bundledSchemaDdl } from '../migrate'
15
15
  import { readMeta, writeMeta } from './meta'
16
16
  import { runReplicaEngineTrack } from './track'
17
17
 
18
- export { readMeta, writeMeta } from './meta'
18
+ export { readMeta, readPref, writeMeta, writePref } from './meta'
19
19
  export {
20
20
  clearReleaseStamps,
21
21
  DEFAULT_RELEASE_TTL_MS,
@@ -164,8 +164,9 @@ export function applyBundledMigrations(
164
164
  * Drop every consumer (synced) table (ADR-0020's wipe fallback): the first step
165
165
  * of wipe-replica-and-resync, run with foreign keys already off so no cascade
166
166
  * fires and drop order is irrelevant (ADR-0009). `__doync_`-prefixed engine
167
- * tables the pending queue, clientId, and `__doync_engine` ledger that
168
- * SURVIVE the wipe are left untouched.
167
+ * tables are left alone here; the caller drops pending / sync meta and mints a
168
+ * fresh clientId (ADR-0037). The `__doync_engine` ledger and `__doync_prefs`
169
+ * survive.
169
170
  */
170
171
  export function dropConsumerTables(db: LocalDb, schema: DoyncSchema): void {
171
172
  for (const table of schema.tables) {
@@ -24,3 +24,26 @@ export function writeMeta(db: LocalDb, key: string, value: string): void {
24
24
  value,
25
25
  )
26
26
  }
27
+
28
+ /**
29
+ * Read one `__doync_prefs` value, or `null` if unset. Columns are `k`/`v`
30
+ * (ADR-0024).
31
+ */
32
+ export function readPref(db: LocalDb, key: string): string | null {
33
+ const row = db.exec<{ v: SqlValue }>(
34
+ `SELECT v FROM __doync_prefs WHERE k = ?`,
35
+ key,
36
+ )[0]
37
+ if (row === undefined || row.v === null) return null
38
+ return String(row.v)
39
+ }
40
+
41
+ /** Upsert one `__doync_prefs` value. Columns are `k`/`v` (ADR-0024). */
42
+ export function writePref(db: LocalDb, key: string, value: string): void {
43
+ db.exec(
44
+ `INSERT INTO __doync_prefs (k, v) VALUES (?, ?)
45
+ ON CONFLICT (k) DO UPDATE SET v = excluded.v`,
46
+ key,
47
+ value,
48
+ )
49
+ }
@@ -1,15 +1,16 @@
1
- import type { LocalDb, LocalRow } from '../port'
1
+ import type { LocalDb } from '../port'
2
2
 
3
3
  /**
4
4
  * Replica engine track + LocalDb twin of server `runEngineTrack` (ADR-0024 /
5
5
  * #159). Drizzle migrations under `./db/` via `*.sql?raw` (#156); journal by
6
- * idx; split on statement-breakpoint. Ledger `__doync_engine` survives wipe
7
- * with pending + clientId.
6
+ * idx; split on statement-breakpoint. Ledger `__doync_engine` and
7
+ * `__doync_prefs` survive wipe; pending + clientId do not (ADR-0037).
8
8
  */
9
9
  import migration0000 from './db/0000_replica_engine_v0.sql?raw'
10
10
  import migration0001 from './db/0001_release_stamps.sql?raw'
11
+ import migration0002 from './db/0002_prefs_table.sql?raw'
11
12
  import journal from './db/meta/_journal.json'
12
- import { readMeta, writeMeta } from './meta'
13
+ import { readPref, writePref } from './meta'
13
14
 
14
15
  /** One ordered engine-track step: the statements of one migration file. */
15
16
  export type EngineTrackStep = readonly string[]
@@ -29,6 +30,7 @@ type Journal = {
29
30
  const MIGRATION_SQL: Readonly<Record<string, string>> = {
30
31
  '0000_replica_engine_v0': migration0000,
31
32
  '0001_release_stamps': migration0001,
33
+ '0002_prefs_table': migration0002,
32
34
  }
33
35
 
34
36
  /**
@@ -57,8 +59,8 @@ export const REPLICA_ENGINE_TRACK: readonly EngineTrackStep[] = (
57
59
  export type EngineTrackResult = {
58
60
  /**
59
61
  * True when ledger was above bundled length: engine tables wiped/rebuilt,
60
- * survivors restored best-effort. Caller should finish consumer
61
- * wipe-and-resync.
62
+ * preferences restored best-effort. Caller finishes consumer wipe-and-resync
63
+ * (drop pending, mint fresh clientId — ADR-0037).
62
64
  */
63
65
  readonly rolledBack: boolean
64
66
  }
@@ -101,8 +103,9 @@ function applyTrackFrom(db: LocalDb, fromVersion: number): void {
101
103
  * 1. Create `__doync_engine (k, v)` unversioned (`CREATE TABLE IF NOT EXISTS`).
102
104
  * 2. Read `track_version` (absent → 0).
103
105
  * 3. Rollback tripwire: version above bundled length → `console.warn`, rebuild
104
- * engine tables from scratch (preserve pending + clientId best-effort),
105
- * return `{ rolledBack: true }`. NOT a throw (Origin-only).
106
+ * engine tables from scratch (preferences restored best-effort; pending and
107
+ * clientId go with the consumer wipe the caller finishes — ADR-0037), return
108
+ * `{ rolledBack: true }`. NOT a throw (Origin-only).
106
109
  * 4. Else apply every step above the ledger in order, record the new version after
107
110
  * each step.
108
111
  */
@@ -140,33 +143,23 @@ export function runReplicaEngineTrack(db: LocalDb): EngineTrackResult {
140
143
  }
141
144
 
142
145
  /**
143
- * Wipe and re-apply engine track (tripwire). Best-effort capture of survivors
144
- * before DROP (wipe-and-resync-shaped, not forget).
146
+ * Wipe and re-apply engine track (tripwire). Preferences are restored
147
+ * best-effort; pending and clientId are not — the caller's consumer
148
+ * wipe-and-resync finishes the fresh-client half (ADR-0037).
145
149
  */
146
150
  function rebuildEngineTables(db: LocalDb): void {
147
- type PendingRow = LocalRow & {
148
- mutation_id: number
149
- name: string
150
- args: string
151
- idem_key: string | null
152
- }
153
- let clientId: string | null = null
154
- let nextMutationId: string | null = null
155
151
  let logoutBehavior: string | null = null
156
- let pending: PendingRow[] = []
157
152
  try {
158
- clientId = readMeta(db, 'client_id')
159
- nextMutationId = readMeta(db, 'next_mutation_id')
160
- logoutBehavior = readMeta(db, 'logout_behavior')
161
- pending = db.exec<PendingRow>(
162
- `SELECT mutation_id, name, args, idem_key FROM __doync_pending`,
163
- )
153
+ // Prefs arrived later in the track than meta/pending, so a replica rolled
154
+ // back below that migration cannot hold one.
155
+ logoutBehavior = readPref(db, 'logout_behavior')
164
156
  } catch {
165
- // Unknown table shape under true rollbacksurvivors gone.
157
+ // No prefs table at this track positionnothing to carry forward.
166
158
  }
167
159
 
168
160
  db.exec(`DROP TABLE IF EXISTS __doync_release_stamp`)
169
161
  db.exec(`DROP TABLE IF EXISTS __doync_membership`)
162
+ db.exec(`DROP TABLE IF EXISTS __doync_prefs`)
170
163
  db.exec(`DROP TABLE IF EXISTS __doync_meta`)
171
164
  db.exec(`DROP TABLE IF EXISTS __doync_pending`)
172
165
  db.exec(`DROP TABLE IF EXISTS __doync_engine`)
@@ -174,17 +167,5 @@ function rebuildEngineTables(db: LocalDb): void {
174
167
  ensureEngineLedger(db)
175
168
  applyTrackFrom(db, 0)
176
169
 
177
- if (clientId !== null) writeMeta(db, 'client_id', clientId)
178
- if (nextMutationId !== null) writeMeta(db, 'next_mutation_id', nextMutationId)
179
- if (logoutBehavior !== null) writeMeta(db, 'logout_behavior', logoutBehavior)
180
- for (const row of pending) {
181
- db.exec(
182
- `INSERT INTO __doync_pending (mutation_id, name, args, idem_key)
183
- VALUES (?, ?, ?, ?)`,
184
- row.mutation_id,
185
- row.name,
186
- row.args,
187
- row.idem_key,
188
- )
189
- }
170
+ if (logoutBehavior !== null) writePref(db, 'logout_behavior', logoutBehavior)
190
171
  }
@@ -222,13 +222,37 @@ export function createReconnectingSocket(
222
222
  socket = null
223
223
  },
224
224
  reconnect(): void {
225
- // Engine drop-and-reopen (client-ahead skew, ADR-0020): onclose schedules
226
- // one backoff (closedByUs false). No-op if no socket.
227
- socket?.close()
225
+ // Engine drop-and-reopen (client-ahead skew, ADR-0020; fresh-client pin
226
+ // change, ADR-0037). Detach before close so:
227
+ // 1. isConnected flips immediately (async browser onclose would leave the
228
+ // pin stale for a tick);
229
+ // 2. a follow-up reconnectNow() can dial under the new pin without
230
+ // no-op'ing on a still-`open` readyState (heal race, ADR-0037 / #361);
231
+ // 3. the abandoned onclose does not null a later socket or double-schedule
232
+ // (#319). Report the drop ourselves because that onclose is going to
233
+ // no-op on the detached generation. No-op if no socket. Backoff is the
234
+ // default recovery; callers that know the pin moved call reconnectNow()
235
+ // to skip it.
236
+ if (socket === null) return
237
+ closedByUs = false
238
+ const stale = socket
239
+ socket = null
240
+ stopPing()
241
+ // Detach handlers so a synchronous close (test fakes) or a queued
242
+ // browser onclose cannot double-report or double-schedule.
243
+ stale.onclose = null
244
+ stale.onerror = null
245
+ stale.onopen = null
246
+ stale.onmessage = null
247
+ config.onDisconnected?.({})
248
+ scheduleReconnect()
249
+ stale.close()
228
250
  },
229
251
  reconnectNow(): void {
230
- // Foreground/online nudge (#185): if not open and no dial in flight, skip
231
- // backoff and dial now. Open/connecting is no-op.
252
+ // Foreground/online nudge (#185) and mid-session pin change after
253
+ // reconnect() (ADR-0037): skip backoff and dial now. Open is a no-op
254
+ // (caller must reconnect() first). Connecting is a no-op (a dial already
255
+ // carries the pin for this attempt).
232
256
  if (socket && socket.readyState !== 'closed') return
233
257
  closedByUs = false
234
258
  reconnectGeneration++
@@ -1,15 +0,0 @@
1
- let e=require("@doync/core/internal"),t=require("@doync/sqlite-parser");function n(t){let n={};for(let[r,i]of Object.entries((0,e.flattenMutations)(t)))n[r]={args:i.args,handler:(e,t,n)=>i.body(e,t,n)};return n}function r(e){return typeof e==`function`?{handler:e}:e}function i(t,n){(0,e.assertWireRepresentable)(n,`mutation args`,{allowBinary:!0});let r=(0,e.canonicalizeArgsBinary)(n),i=t[`~standard`].validate(r);if(i instanceof Promise)throw Error(`doync: async standard-schema validation is not supported for mutation args — use a synchronous validator`);if(i.issues!==void 0){let e=i.issues.map(e=>{let t=(e.path??[]).map(e=>String(typeof e==`object`?e.key:e)).join(`.`);return t===``?e.message:`${t}: ${e.message}`}).join(`; `);throw Error(`doync: mutation args failed validation — ${e}`)}return i.value}var a=class{host;statement;identity;#e=[];#t=0;#n=new Set;#r;constructor(e,t,n,r){this.host=e,this.statement=t,this.identity=n,this.#r=r}get readSet(){return this.identity===void 0?void 0:this.host.readSet()}status(){return this.#r}updateStatus(e){return this.#r.status===e.status&&this.#r.error===e.error?!1:(this.#r=e,!0)}recompute(){let e=this.host.run(this.statement);return o(e,this.#e)?!1:(this.#e=e,this.#t+=1,!0)}rawRows(){return this.#e}get generation(){return this.#t}onChange(e){return this.#n.add(e),()=>this.#n.delete(e)}notify(){for(let e of this.#n)e()}};function o(e,t){if(e.length!==t.length)return!1;for(let n=0;n<e.length;n++){let r=e[n],i=t[n],a=Object.keys(r);if(a.length!==Object.keys(i).length)return!1;for(let e of a)if(!s(r[e]??null,i[e]??null))return!1}return!0}function s(e,t){if(e===t)return!0;if(e instanceof ArrayBuffer&&t instanceof ArrayBuffer){if(e.byteLength!==t.byteLength)return!1;let n=new Uint8Array(e),r=new Uint8Array(t);for(let e=0;e<n.length;e++)if(n[e]!==r[e])return!1;return!0}return!1}const c=new Set([`STMT_CREATE_TABLE`,`STMT_CREATE_INDEX`,`STMT_CREATE_VIEW`,`STMT_CREATE_VTABLE`,`STMT_DROP`,`STMT_ALTER`]),l=new Set([`STMT_INSERT`,`STMT_UPDATE`,`STMT_DELETE`,`STMT_SELECT`,`COMPOUND_SELECT`]);function u(e){try{return(0,t.parse)(e)}catch(e){if(e instanceof t.SQLiteParserError)return null;throw e}}function d(e){try{return(0,t.parseAll)(e)}catch(e){if(e instanceof t.SQLiteParserError)return null;throw e}}function f(e){return e.kind===`STMT_CREATE_TRIGGER`||e.kind===`STMT_DROP`&&e.target===`TRIGGER`?`trigger`:e.kind===`STMT_PRAGMA`?`pragma`:c.has(e.kind)?`ddl`:l.has(e.kind)?`dml`:`other`}function p(e){let n=d(e);if(n===null)throw Error(`could not parse the SQL — a statement has a syntax error; fix it and retry`);return n.map(e=>(0,t.unparse)(e))}function m(e){let t=u(e);return t===null?`other`:f(t)}function h(e,t,n){let r=[];for(let i=t;i<n;i+=1){let a=e.migrations[i];if(a===void 0)throw Error(`doync: bundled migration track has a hole at version ${i} (requested range ${t}..${n}, but the track holds ${e.migrations.length}) — the schema is corrupt or truncated`);for(let e of p(a.sql))m(e)===`ddl`&&r.push(e)}return r}function g(e,t){let n=e.exec(`SELECT v FROM __doync_meta WHERE k = ?`,t)[0];return n===void 0||n.v===null?null:String(n.v)}function _(e,t,n){e.exec(`INSERT INTO __doync_meta (k, v) VALUES (?, ?)
2
- ON CONFLICT (k) DO UPDATE SET v = excluded.v`,t,n)}var ee="CREATE TABLE `__doync_membership` (\n `instance` text NOT NULL,\n `level` integer NOT NULL,\n `tbl` text NOT NULL,\n `pk` text NOT NULL,\n PRIMARY KEY(`instance`, `level`, `pk`)\n) WITHOUT ROWID;\n--> statement-breakpoint\nCREATE INDEX `__doync_membership_by_row` ON `__doync_membership` (`tbl`,`pk`);--> statement-breakpoint\nCREATE TABLE `__doync_meta` (\n `k` text PRIMARY KEY NOT NULL,\n `v` blob\n) WITHOUT ROWID;\n--> statement-breakpoint\nCREATE TABLE `__doync_pending` (\n `mutation_id` integer PRIMARY KEY NOT NULL,\n `name` text NOT NULL,\n `args` text NOT NULL,\n `idem_key` text\n);\n",te="CREATE TABLE `__doync_release_stamp` (\n `instance` text PRIMARY KEY NOT NULL,\n `cookie` integer NOT NULL,\n `released_at` integer NOT NULL,\n `ttl_ms` integer NOT NULL\n) WITHOUT ROWID;\n",ne=[{idx:0,version:`6`,when:1784031358638,tag:`0000_replica_engine_v0`,breakpoints:!0},{idx:1,version:`6`,when:1784450022155,tag:`0001_release_stamps`,breakpoints:!0}];const re={"0000_replica_engine_v0":ee,"0001_release_stamps":te},v=ne.slice().sort((e,t)=>e.idx-t.idx).map(e=>{let t=re[e.tag];if(t===void 0)throw Error(`doync: replica engine track missing sql for journal tag ${JSON.stringify(e.tag)}`);return t.split(/-->\s*statement-breakpoint/).map(e=>e.trim()).filter(e=>e.length>0)});function y(e){e.exec(`CREATE TABLE IF NOT EXISTS __doync_engine (
3
- k TEXT PRIMARY KEY,
4
- v
5
- ) WITHOUT ROWID`)}function b(e,t){let n=t;for(;n<v.length;){let t=v[n];if(t===void 0)break;let r=n+1;for(let n of t)e.exec(n);e.exec(`INSERT INTO __doync_engine (k, v) VALUES ('track_version', ?)
6
- ON CONFLICT (k) DO UPDATE SET v = excluded.v`,r),n=r}}function ie(e){y(e);let t=e.exec(`SELECT v FROM __doync_engine WHERE k = 'track_version'`),n=t.length===0?0:Number(t[0]?.v);if((!Number.isFinite(n)||n<0)&&(n=0),n>v.length)return console.warn(`doync: replica engine track_version ${n} is above bundled track length ${v.length} — wiping engine tables and rebuilding (code rollback against a newer database). Consumer state will resync through wipe-and-resync.`),x(e),{rolledBack:!0};try{b(e,n)}catch(t){return console.warn(`doync: replica engine track failed at version ${n} — wiping engine tables and rebuilding (code rollback against a newer database). Consumer state will resync through wipe-and-resync.`,t),x(e),{rolledBack:!0}}return{rolledBack:!1}}function x(e){let t=null,n=null,r=null,i=[];try{t=g(e,`client_id`),n=g(e,`next_mutation_id`),r=g(e,`logout_behavior`),i=e.exec(`SELECT mutation_id, name, args, idem_key FROM __doync_pending`)}catch{}e.exec(`DROP TABLE IF EXISTS __doync_release_stamp`),e.exec(`DROP TABLE IF EXISTS __doync_membership`),e.exec(`DROP TABLE IF EXISTS __doync_meta`),e.exec(`DROP TABLE IF EXISTS __doync_pending`),e.exec(`DROP TABLE IF EXISTS __doync_engine`),y(e),b(e,0),t!==null&&_(e,`client_id`,t),n!==null&&_(e,`next_mutation_id`,n),r!==null&&_(e,`logout_behavior`,r);for(let t of i)e.exec(`INSERT INTO __doync_pending (mutation_id, name, args, idem_key)
7
- VALUES (?, ?, ?, ?)`,t.mutation_id,t.name,t.args,t.idem_key)}function ae(e){return e===void 0?18e5:e}function oe(e,t){e.exec(`INSERT INTO __doync_release_stamp (instance, cookie, released_at, ttl_ms)
8
- VALUES (?, ?, ?, ?)
9
- ON CONFLICT (instance) DO UPDATE SET
10
- cookie = excluded.cookie,
11
- released_at = excluded.released_at,
12
- ttl_ms = excluded.ttl_ms`,t.instance,t.cookie,t.releasedAt,t.ttlMs)}function S(e,t){e.exec(`DELETE FROM __doync_release_stamp WHERE instance = ?`,t)}function C(e){e.exec(`DELETE FROM __doync_release_stamp`)}function w(e){return{instance:String(e.instance),cookie:Number(e.cookie),releasedAt:Number(e.released_at),ttlMs:Number(e.ttl_ms)}}function T(e,t){let n=e.exec(`SELECT instance, cookie, released_at, ttl_ms
13
- FROM __doync_release_stamp WHERE instance = ?`,t)[0];return n===void 0?null:w(n)}function E(e){return e.exec(`SELECT instance, cookie, released_at, ttl_ms FROM __doync_release_stamp`).map(w)}function D(t){if(!(0,e.isSqlIdentifier)(t))throw Error(`doync: refusing to quote non-identifier ${JSON.stringify(t)}`);return`"${t}"`}function O(t,n){let r=JSON.parse(t),i=(0,e.tablePrimaryKey)(n);if(!Array.isArray(r)||r.length!==i.length)throw Error(`doync: malformed pk ${t} for table ${n.name} (expected ${i.length} key part(s))`);return r.map(t=>(0,e.decodePkValue)(t))}function k(t){return(0,e.tablePrimaryKey)(t).map(e=>`${D(e)} = ?`).join(` AND `)}function se(t,n){let r=Object.keys(n);for(let n of r)if(!(0,e.isSqlIdentifier)(n))throw Error(`doync: patch image for table ${t.name} has an invalid column name ${JSON.stringify(n)}`);return{columns:r,values:r.map(t=>(0,e.decodeImageValue)(n[t]))}}function A(e,t){let n=e.tables.find(e=>e.name===t);if(n===void 0)throw Error(`doync: no synced table named ${JSON.stringify(t)} in the client schema`);return n}function j(e){return ie(e)}function M(t,n){g(t,`schema_version`)===null&&N(t,n,0,(0,e.declaredSchemaVersion)(n))}function N(e,t,n,r){for(let i of h(t,n,r))e.execBatch(i);_(e,`schema_version`,String(r))}function P(e,t){for(let n of t.tables)e.exec(`DROP TABLE IF EXISTS ${D(n.name)}`)}function ce(t){for(let n of t.tables)if((0,e.isInternalTable)(n.name))throw Error(`doync: synced table ${n.name} uses the reserved __doync_ prefix`)}const F=`logout_behavior`,I=`connected_clock`,L=`doync_optimistic`,R=`doync_body`;var z=class{lifecycle;decode;one;#e=!1;#t=null;#n=new Set;#r=Y;#i=X;#a=!1;#o=null;constructor(e,t,n){this.lifecycle=e,this.decode=t,this.one=n}#s(e){if(this.#o?.read!==e||this.#o.generation!==e.generation){let t=e.rawRows();this.#r=this.decode?this.decode(t):t,this.#o={read:e,generation:e.generation}}return this.#r}#c(){if(this.#a)return;this.#a=!0;let e=this.lifecycle.peek();if(e!==null)this.#s(e),this.#i=e.status();else{let e=this.lifecycle.compute();this.#r=e.rows,this.#i=e.status}}current(){let e=this.lifecycle.peek();return e!==null&&e.generation>0?(this.#a=!0,this.#s(e)):(this.#c(),this.#r)}status(){let e=this.lifecycle.peek();return e===null?(this.#c(),this.#i):(this.#a=!0,this.#i=e.status(),this.#i)}onChange(e){return this.#n.add(e),()=>this.#n.delete(e)}retain(){if(this.#e)return;this.#e=!0,this.#a=!0;let e=this.lifecycle.retain();if(this.#t=e.onChange(()=>{this.#s(e),this.#i=e.status();for(let e of this.#n)e()}),e.generation>0&&(this.#o?.read!==e||this.#o.generation!==e.generation)||e.status()!==this.#i){e.generation>0&&this.#s(e),this.#i=e.status();for(let e of this.#n)e()}}release(){this.#e&&(this.#e=!1,this.#t?.(),this.#t=null,this.lifecycle.release())}},B=class{#e;#t;#n;#r;#i;#a;#o=null;#s;#c;#l=1;#u=null;#d=!1;#f=0;#p=null;#m;#h=!1;#g=null;#_=!1;#v=new Set;#y=0;#b=0;#x=null;#S;#C=new Set;#w=!1;#T=[];#E=new Map;#D=new Map;#O=new Set;#k=new Set;#A=new Map;#j=new Map;#M=new Map;#N=new Map;#P=new Map;#F=1;#I=new Map;#L=new Map;#R=new Set;#z=null;#B=[];#V=!1;#H=[];#U=new Set;constructor(e){this.#e=e.db,this.#t=e.schema,this.#n=e.mutations,this.#r=e.socket,this.#i=e.ctx??{},this.#a=e.token,this.#o=e.userId??null,this.#S=e.onSchemaEvent,this.#c=e.generateId??_e,this.#m=e.now??Date.now,this.#W(e),this.#r.setHandlers({message:e=>this.#Ee(e),open:()=>this.#xe(),close:()=>{this.#p=null,this.#tt(!1)},status:e=>this.#nt(e)})}get connectedClock(){return this.#f}releaseStamp(e){return T(this.#e,e)}releaseStamps(){return E(this.#e)}get clientId(){return this.#s}get userId(){return this.#o}get cookie(){return this.#u}get errors(){return this.#B}get recoveredKeys(){return this.#O}get schemaVersion(){return this.#y}get schemaStatus(){return this.#x}#W(t){let n=this.#e;n.exec(`PRAGMA foreign_keys = OFF`),ce(this.#t);let{rolledBack:r}=j(n);r?(P(n,this.#t),n.exec(`DELETE FROM __doync_membership`),_(n,`schema_version`,`0`),N(n,this.#t,0,(0,e.declaredSchemaVersion)(this.#t)),this.#u=null,n.exec(`DELETE FROM __doync_meta WHERE k = ?`,`cookie`)):M(n,this.#t),this.#y=(0,e.declaredSchemaVersion)(this.#t);let i=ye(n);i!==null&&(console.error(`doync: durable meta "${i}" is corrupt — healing by FORGETTING the local store (fresh identity, full re-hydration). A corrupt mutation counter makes the pending queue untrustworthy, so unsynced writes are discarded rather than risk double-apply.`),this.#Ge(n)),this.#b=this.#G(n,`schema_version`)??0;let a=g(n,`client_id`);this.#s=a??t.clientId??this.#c(),a===null&&_(n,`client_id`,this.#s),this.#l=this.#G(n,`next_mutation_id`)??1,this.#u=this.#G(n,`cookie`);let o=Number(g(n,I));Number.isInteger(o)&&o>=0?this.#f=o:(g(n,`connected_clock`)!==null&&console.warn(`doync: durable connected-clock reading is corrupt — resetting to 0 (clock runs slow; GC defers, server full-hydrates)`),this.#f=0),this.#p=null,i!==null&&this.#Ze(`forget`,`corrupt durable meta "${i}" — forgot the local store and reset to a fresh identity`),this.#T=n.exec(`SELECT mutation_id, name, args, idem_key FROM __doync_pending ORDER BY mutation_id ASC`).map(t=>{let n=JSON.parse(String(t.args));return{mutationId:Number(t.mutation_id),name:String(t.name),wireArgs:n,args:(0,e.decodeArgs)(n,`mutation args`),key:t.idem_key===null?void 0:String(t.idem_key)}});for(let e of this.#T){let t=this.#ct(e.mutationId,!0);e.key!==void 0&&(this.#D.set(e.key,t.pair),this.#O.add(e.key))}this.#ge({includeStampless:!1}),n.drainWrittenTables();let s=this.#Q();V(s)&&(this.#V=!0,s.then(()=>this.#J(),()=>this.#J()))}#G(e,t){let n=g(e,t);if(n===null)return null;let r=Number(n);if(!Number.isInteger(r))throw Error(`doync: durable meta "${t}" is corrupt (${JSON.stringify(n)} → ${r}) — a non-integer must never ride the wire (ADR-0019 next-id trap); the boot-time corrupt-meta heal should have caught this`);return r}#K(e){if(this.#V){this.#H.push(e);return}this.#V=!0,this.#q(e)}#q(e){let t;try{t=e()}catch(e){throw this.#V=!1,this.#Y(),e}V(t)?t.then(()=>this.#J(),e=>{this.#B.push(`doync: exclusive-chain step rejected — ${q(e)}`),this.#J()}):this.#J()}#J(){this.#V=!1,this.#Y()}#Y(){let e=this.#H.shift();if(e!==void 0){this.#V=!0,this.#q(e);return}this.#X()}#X(){if(this.#U.size===0)return;let e=[...this.#U];this.#U.clear();for(let t of e)t.recompute()&&t.notify()}#Z(e){this.#V?this.#U.add(e):e.recompute()}#Q(){return this.#e.drainWrittenTables(),this.#e.exec(`SAVEPOINT ${L}`),this.#_=!0,this.#A.clear(),H(this.#$(0),()=>{this.#R=G(this.#e.drainWrittenTables())})}#$(e){for(let t=e;t<this.#T.length;t++){let e=this.#ne(this.#T[t]);if(V(e))return e.then(()=>this.#$(t+1))}}#ee(){this.#_&&=(this.#e.exec(`ROLLBACK TO ${L}`),this.#e.exec(`RELEASE ${L}`),!1)}#te(e){let t=this.#R;this.#ee(),this.#e.drainWrittenTables(),this.#e.exec(`BEGIN`);try{e(),this.#e.exec(`COMMIT`)}catch(e){return this.#e.exec(`ROLLBACK`),H(this.#Q(),()=>{throw e})}let n=G(this.#e.drainWrittenTables());return H(this.#Q(),()=>new Set([...t,...n,...this.#R]))}#ne(e){this.#e.exec(`SAVEPOINT ${R}`);let t;try{let n=this.#n[e.name];if(n===void 0)throw Error(`unknown mutation "${e.name}"`);t=r(n).handler(e.args,this.#i,this.#ae())}catch(t){this.#ie(e.mutationId,t);return}if(V(t))return t.then(()=>this.#re(e.mutationId),t=>this.#ie(e.mutationId,t));this.#re(e.mutationId)}#re(e){this.#e.exec(`RELEASE ${R}`),this.#A.delete(e)}#ie(e,t){this.#e.exec(`ROLLBACK TO ${R}`),this.#e.exec(`RELEASE ${R}`),this.#A.set(e,t)}#ae(){return{exec:(e,...t)=>this.#e.exec(e,...t)}}#oe(e){this.#r.send({type:`push`,clientId:this.#s,mutationId:e.mutationId,name:e.name,args:e.wireArgs})}mutate(t,n,a){let o=a?.key;if(o!==void 0){let e=this.#D.get(o);if(e!==void 0)return e}let s=t.name;if(s===void 0||s===``)return K(Error(`doync: mutate requires a registered mutation — wrap it in defineMutations(...) so it carries a dotted name`));let c=this.#n[s];if(c===void 0)return K(Error(`doync: unknown mutation "${s}"`));let l=r(c),u,d;try{(0,e.assertWireRepresentable)(n,`mutation args`,{allowBinary:!0});let t=(0,e.canonicalizeArgsBinary)(n);u=l.args===void 0?t:i(l.args,t),d=(0,e.encodeArgs)(u,`mutation args`)}catch(e){return K(e)}let f=this.#lt(!1);return o!==void 0&&this.#D.set(o,f.pair),this.#K(()=>this.#se({name:s,args:u,wireArgs:d,key:o,promise:f})),f.pair}#se(e){let t=this.#e,n=this.#l;this.#E.set(n,e.promise);let r={mutationId:n,name:e.name,args:e.args,wireArgs:e.wireArgs,key:e.key};return H(this.#te(()=>{t.exec(`INSERT INTO __doync_pending (mutation_id, name, args, idem_key) VALUES (?, ?, ?, ?)`,n,r.name,JSON.stringify(r.wireArgs??null),r.key??null),this.#l=n+1,_(t,`next_mutation_id`,String(this.#l)),this.#T.push(r)}),e=>this.#ce(r,e))}#ce(e,t){let n=e.mutationId;if(!this.#A.has(n)){this.#ut(n,null),this.#at(t),this.#d&&this.#oe(e);return}let r=this.#A.get(n),i=this.#E.get(n)?.pair;return e.key!==void 0&&this.#D.delete(e.key),H(this.#le(n,!0),e=>{this.#ut(n,r),this.#dt(n,r),i?.client.catch(()=>{}),i?.server.catch(()=>{}),this.#at(new Set([...t,...e]))})}#le(e,t=!1){let n=this.#e;return this.#te(()=>{n.exec(`DELETE FROM __doync_pending WHERE mutation_id = ?`,e),this.#T=this.#T.filter(t=>t.mutationId!==e),t&&(this.#l=e,_(n,`next_mutation_id`,String(e)))})}updateAuth(e,t,n){this.#a=e??void 0,n!==void 0&&(this.#o=n),t!==void 0&&(this.#i=t),this.#d&&!this.#w&&typeof e==`string`&&e!==``&&this.#r.send({type:`updateAuth`,jwt:e})}subscribe(e,t){if(U(e))return new ue;let{query:n,args:r,options:i}=W(`subscribe`,e,t);if(i?.skip)return new ue;let a=n.name,o=n.resolve({args:r,ctx:this.#i}),s={sql:o.sql,params:o.params},c=o.identity,l={name:a,args:r,ttl:i?.ttl,statement:s},u=o.decode;return new z({peek:()=>this.#M.get(c)?.read??null,retain:()=>this.#de(c,l),release:()=>this.#pe(c),compute:()=>{if(this.#V)return{rows:Y,status:X};let e=this.#e.exec(s.sql,...s.params),t=this.#M.get(c);return{rows:u?u(e):e,status:Q(t?.phase??`pending`,t?.error)}}},u,o.one??!1)}preload(e,t){if(U(e))return he;let{query:n,args:r,options:i}=W(`preload`,e,t),a=n.name,o=n.resolve({args:r,ctx:this.#i}),s=o.identity;this.#fe(s,{name:a,args:r,ttl:i?.ttl,statement:{sql:o.sql,params:o.params}});let c=!1;return{cleanup:()=>{c||(c=!0,this.#pe(s))}}}#ue(e,t){let n=this.#M.get(e);if(n===void 0){let r=this.#Te(e);n={name:t.name,args:t.args,ttl:t.ttl,count:0,read:null,phase:`pending`,error:void 0},this.#M.set(e,n),this.#We(()=>S(this.#e,e)),this.#d&&this.#r.send({type:`subscribe`,queries:[this.#we(e,{heldAt:r})]})}else n.phase===`error`&&this.#d?(this.#st(e,`pending`),this.#r.send({type:`subscribe`,queries:[this.#we(e)]})):t.ttl!==void 0&&(n.ttl===void 0||t.ttl>n.ttl)&&(n.ttl=t.ttl,this.#d&&this.#r.send({type:`subscribe`,queries:[this.#we(e)]}));return n.count+=1,n}#de(e,t){let n=this.#ue(e,t);if(n.read===null){let r=this.#L.get(e);if(r!==void 0)clearTimeout(r.timer),this.#L.delete(e),n.read=r.read,this.#Z(r.read);else{let r=new a({run:e=>this.#e.exec(e.sql,...e.params),readSet:()=>{let t=this.#j.get(e);return t===void 0?void 0:new Set(t.readSet)}},t.statement,e,Q(n.phase,n.error));n.read=r,this.#Z(r)}}return n.read}#fe(e,t){this.#ue(e,t)}#pe(t){let n=this.#M.get(t);n===void 0||--n.count>0||(this.#M.delete(t),this.#d&&this.#r.send({type:`unsubscribe`,queries:[{name:n.name,args:n.args===void 0?void 0:(0,e.encodeArgs)(n.args,`query args`)}]}),this.#me(t,n.ttl),n.read!==null&&this.#ve(t,n.read))}#me(e,t){let n=this.#u;if(n===null)return;let r={instance:e,cookie:n,releasedAt:this.#f,ttlMs:ae(t)};this.#K(()=>H(this.#te(()=>{oe(this.#e,r),this.#ge({includeStampless:!0}),this.#he()}),e=>this.#at(e)))}#he(){_(this.#e,I,String(this.#f))}#ge(e){let t=this.#_e(e.includeStampless);if(t.length!==0){for(let e of t)this.#Le(e);this.#he()}}#_e(e){let t=this.#M,n=E(this.#e),r=new Set(n.map(e=>e.instance)),i=[];if(e){let e=this.#e.exec(`SELECT DISTINCT instance FROM __doync_membership`);for(let n of e){let e=String(n.instance);t.has(e)||r.has(e)||i.push(e)}}let a=this.#f;for(let e of n)t.has(e.instance)||(e.ttlMs<=0||a-e.releasedAt>e.ttlMs)&&i.push(e.instance);return i}#ve(e,t){let n=this.#L.get(e);n!==void 0&&clearTimeout(n.timer),this.#L.set(e,{read:t,timer:setTimeout(()=>{let n=this.#L.get(e);n===void 0||n.read!==t||(this.#L.delete(e),this.#U.delete(t))},J)})}once(t){if(U(t))return new me;let{query:n,args:r}=W(`once`,t),i=n.name,a=n.resolve({args:r,ctx:this.#i}),o;if(this.#V)o=[];else{let e=this.#e.exec(a.sql,...a.params);o=a.decode?a.decode(e):e}let s=`once-${this.#F++}`,c=r===void 0?void 0:(0,e.encodeArgs)(r,`query args`),l=new de(o,a.decode,{start:()=>{this.#N.set(s,{view:l,name:i,args:c}),this.#d&&this.#r.send({type:`once`,id:s,name:i,args:c})},drop:()=>{this.#N.delete(s),this.#P.delete(s)}});return l}local(e,...t){let n=`local:${e}\u0000${JSON.stringify(t)}`,r={sql:e,params:t};return new z({peek:()=>this.#I.get(n)?.read??null,retain:()=>this.#ye(n,r),release:()=>this.#be(n),compute:()=>this.#V?{rows:Y,status:X}:{rows:this.#e.exec(r.sql,...r.params),status:Z}},void 0,void 0)}#ye(e,t){let n=this.#I.get(e);if(n===void 0&&(n={count:0,read:null},this.#I.set(e,n)),n.count+=1,n.read===null){let r=this.#L.get(e);if(r!==void 0)clearTimeout(r.timer),this.#L.delete(e),n.read=r.read,this.#Z(r.read);else{let e=new a({run:e=>this.#e.exec(e.sql,...e.params),readSet:()=>void 0},t,void 0,Z);n.read=e,this.#Z(e)}}return n.read}#be(e){let t=this.#I.get(e);t===void 0||--t.count>0||(this.#I.delete(e),t.read!==null&&this.#ve(e,t.read))}#xe(){this.#w||(this.#p=null,this.#tt(!0),this.#Ce())}#Se(){let e=this.#m();if(this.#p!==null){let t=e-this.#p;t>0&&(this.#f+=t)}this.#p=e}#Ce(){for(let e of this.#M.keys())this.#st(e,`pending`);this.#r.send({type:`connect`,clientId:this.#s,...this.#a===void 0?{}:{jwt:this.#a},cookie:this.#u,desiredQueries:[...this.#M.keys()].map(e=>this.#we(e)),schemaVersion:this.#y});for(let e of this.#T)this.#oe(e);for(let[e,t]of this.#N)this.#r.send({type:`once`,id:e,name:t.name,args:t.args})}#we(t,n){let r=this.#M.get(t),i=n===void 0?this.#Te(t):n.heldAt;return{name:r?.name??t,args:r?.args===void 0?void 0:(0,e.encodeArgs)(r.args,`query args`),...r?.ttl===void 0?{}:{ttl:r.ttl},...i===void 0?{}:{heldAt:i}}}#Te(e){if(!(this.#e.exec(`SELECT 1 FROM __doync_membership WHERE instance = ? LIMIT 1`,e).length>0))return;if(this.#M.has(e))return this.#u??void 0;let t=T(this.#e,e);if(t!==null)return t.cookie}#Ee(e){if(this.#w){e.type===`error`&&this.#B.push(e.message);return}if(e.type===`pong`){this.#Se();return}if(e.type===`unauthorized`){this.#B.push(e.message),this.#rt(!0);return}switch(this.#h&&e.type!==`error`&&this.#rt(!1),e.type){case`schemaSkew`:this.#Be(e);break;case`schema`:this.#Ve(e);break;case`subscribeAck`:this.#Qe();for(let t of e.instances){this.#j.set(t.instance,t);let e=this.#M.get(t.instance);e!==void 0&&e.phase!==`complete`&&this.#st(t.instance,`acked`)}break;case`pokeStart`:this.#Qe(),this.#z=[];break;case`pokePart`:this.#z===null?this.#B.push(`doync: pokePart arrived with no open poke`):this.#z.push(...e.patches);break;case`pokeEnd`:this.#z===null?this.#B.push(`doync: pokeEnd arrived with no open poke`):this.#Ae(e.cookie,e.lastMutationId,e.confirms);break;case`pokeReject`:this.#ze(e.mutationId,e.error);break;case`onceStart`:this.#P.set(e.id,[]);break;case`oncePart`:{let t=this.#P.get(e.id);t===void 0?this.#B.push(`doync: oncePart arrived with no open once`):t.push(...e.rows);break}case`onceEnd`:this.#ke(e);break;case`resyncRequired`:this.#B.push(e.message),this.#K(()=>this.#Ye(`heldAt ahead of vouched baseline (instance ${e.instance}: heldAt=${e.heldAt} baseline=${e.baseline}) — ${e.message}`));break;case`error`:if(this.#B.push(e.message),be(e.message)){this.#K(()=>this.#Ye(`cookie above the Origin head (server reset) — ${e.message}`));break}e.instances===void 0?this.#Oe(e.message):this.#De(e.instances,e.message);break;default:this.#B.push(`doync: unknown ServerMessage type ${String(e.type)}`)}}#De(e,t){let n=Error(t);for(let t of e){let e=this.#M.get(t);e!==void 0&&(e.phase===`pending`||e.phase===`acked`)&&this.#st(t,`error`,n)}}#Oe(e){let t=Error(e);for(let[e,n]of this.#M)(n.phase===`pending`||n.phase===`acked`)&&this.#st(e,`error`,t)}#ke(e){let t=this.#P.get(e.id)??[];this.#P.delete(e.id);let n=this.#N.get(e.id);if(n!==void 0){if(this.#N.delete(e.id),e.error!==void 0){n.view.settleError(Error(e.error));return}n.view.deliver(t.map(ge))}}#Ae(e,t,n){let r=this.#z??[];this.#z=null,this.#K(()=>this.#je(r,e,t,n))}#je(e,t,n,r){let i=this.#e,a=[];return H(this.#te(()=>{for(let t of e)t.op===`put`&&this.#Ne(t);for(let t of e)t.op===`del`&&this.#Pe(t);for(let t of e)t.op===`pks`&&this.#Fe(t);if(n!==null){for(let e of this.#T)e.mutationId<=n&&!this.#k.has(e.mutationId)&&a.push(e.mutationId);for(let e of a)i.exec(`DELETE FROM __doync_pending WHERE mutation_id = ?`,e)}this.#u=t,_(i,`cookie`,String(t)),this.#he(),this.#T=this.#T.filter(e=>!a.includes(e.mutationId))}),e=>{for(let e of a)this.#dt(e,null);for(let e of a)this.#k.delete(e);this.#at(e),this.#Me(r)})}#Me(e){if(e!==void 0)for(let t of e){let e=this.#M.get(t);e!==void 0&&e.phase===`acked`&&this.#st(t,`complete`)}}#Ne(e){let t=this.#e,n=this.#Re(e.instance,e.level);t.exec(`INSERT INTO __doync_membership (instance, level, tbl, pk) VALUES (?, ?, ?, ?)
14
- ON CONFLICT (instance, level, pk) DO UPDATE SET tbl = excluded.tbl`,e.instance,e.level,n.name,e.pk);let r=O(e.pk,n);t.exec(`DELETE FROM ${D(n.name)} WHERE ${k(n)}`,...r);let{columns:i,values:a}=se(n,e.image);t.exec(`INSERT INTO ${D(n.name)} (${i.map(D).join(`, `)})
15
- VALUES (${i.map(()=>`?`).join(`, `)})`,...a)}#Pe(e){this.#Ie(e.instance,e.level,e.pk)}#Fe(e){let t=new Set(e.pks),n=this.#e.exec(`SELECT pk FROM __doync_membership WHERE instance = ? AND level = ?`,e.instance,e.level);for(let r of n){let n=String(r.pk);t.has(n)||this.#Ie(e.instance,e.level,n)}}#Ie(e,t,n){let r=this.#e,i=this.#Re(e,t);r.exec(`DELETE FROM __doync_membership WHERE instance = ? AND level = ? AND pk = ?`,e,t,n);let a=r.exec(`SELECT DISTINCT instance FROM __doync_membership WHERE tbl = ? AND pk = ?`,i.name,n);if(!a.some(e=>this.#M.has(String(e.instance)))){r.exec(`DELETE FROM ${D(i.name)} WHERE ${k(i)}`,...O(n,i));for(let e of a)this.#Le(String(e.instance))}}#Le(e){let t=this.#e,n=t.exec(`SELECT DISTINCT tbl, pk FROM __doync_membership WHERE instance = ?`,e);t.exec(`DELETE FROM __doync_membership WHERE instance = ?`,e),S(t,e);for(let e of n){let n=String(e.tbl),r=String(e.pk);if(t.exec(`SELECT 1 FROM __doync_membership WHERE tbl = ? AND pk = ? LIMIT 1`,n,r).length===0){let e=A(this.#t,n);t.exec(`DELETE FROM ${D(e.name)} WHERE ${k(e)}`,...O(r,e))}}}#Re(e,t){let n=this.#j.get(e);if(n===void 0)throw Error(`doync: patch for unknown instance ${e} — a subscribeAck must precede its hydration poke`);let r=n.levels.find(e=>e.level===t);if(r===void 0)throw Error(`doync: instance ${e} has no Level ${t} in its subscribeAck`);return A(this.#t,r.table)}#ze(e,t){this.#k.add(e),this.#K(()=>H(this.#le(e),n=>{this.#dt(e,Error(t)),this.#at(n)}))}#Be(e){let t=e.serverVersion===void 0?``:` (server v${e.serverVersion})`;e.reason===`client-stale`?(this.#Ze(`reload`,`schema client-stale: bundle v${this.#y} is behind the Mirror${t} — reload for the new bundle`),this.#et()):(this.#Ze(`server-behind`,`schema client-ahead: bundle v${this.#y} is ahead of the Mirror${t} — backing off until it deploys`),this.#tt(!1),this.#r.reconnect())}#Ve(e){let t=e.version;if(t>this.#y){this.#Ze(`reload`,`schema directive v${t} is above the bundled track v${this.#y} — reload for the new bundle`),this.#et();return}t<=this.#b||this.#K(()=>this.#He(t))}#He(e){let t=t=>`local migration to schema v${e} failed: ${q(t)}`,n;try{n=this.#te(()=>{N(this.#e,this.#t,this.#b,e)})}catch(e){return this.#Ye(t(e))}return le(n,t=>{this.#b=e,this.#at(new Set([...t,...this.#Xe()]))},e=>this.#Ye(t(e)))}resync(){this.#K(()=>this.#Ye(`resync() requested by the consumer`))}forget(){this.#K(()=>this.#Ke(`forget() requested by the consumer`))}setLogoutBehavior(e){this.#Ue(F,e)}#Ue(e,t){this.#We(()=>_(this.#e,e,t))}#We(e){this.#K(()=>H(this.#te(e),()=>{}))}#Ge(e){P(e,this.#t),e.exec(`DELETE FROM __doync_membership`),C(e),e.exec(`DELETE FROM __doync_pending`),e.exec(`DELETE FROM __doync_meta`),N(e,this.#t,0,this.#y)}#Ke(e){let t=this.#e,n=this.#te(()=>{this.#Je(Error(`doync: ${e} — pending writes were forgotten`)),this.#Ge(t),this.#s=this.#c(),_(t,`client_id`,this.#s),this.#u=null,this.#l=1,this.#f=0,this.#p=null,this.#T=[]});return this.#qe(n,`forget`,`forgot the local store — ${e}`)}#qe(e,t,n){return H(e,e=>{this.#b=this.#y,this.#j.clear(),this.#Ze(t,n),this.#d&&this.#Ce(),this.#at(new Set([...e,...this.#Xe()]))})}#Je(e){for(let t of this.#E.keys())this.#ut(t,e),this.#dt(t,e);this.#D.clear(),this.#O.clear(),this.#k.clear(),this.#A.clear()}#Ye(e){let t=this.#e,n=this.#te(()=>{P(t,this.#t),t.exec(`DELETE FROM __doync_membership`),C(t),_(t,`schema_version`,`0`),N(t,this.#t,0,this.#y),this.#u=null,t.exec(`DELETE FROM __doync_meta WHERE k = ?`,`cookie`)});return this.#qe(n,`resync`,`wiped and resyncing — ${e}`)}#Xe(){return this.#t.tables.map(e=>e.name)}onSchemaChange(e){return this.#C.add(e),()=>this.#C.delete(e)}#Ze(e,t){let n={kind:e,message:t};this.#x=n,this.#S?.(n),this.#$e()}#Qe(){let e=this.#x?.kind;(e===`server-behind`||e===`resync`||e===`forget`)&&(this.#x=null,this.#$e())}#$e(){for(let e of this.#C)e()}#et(){this.#w=!0,this.#tt(!1)}get connectionStatus(){return this.#h?`needs-auth`:this.#d?`connected`:this.#g??`disconnected`}onConnectionChange(e){return this.#v.add(e),()=>this.#v.delete(e)}#tt(e){this.#it(()=>{this.#d=e,e&&(this.#g=null)})}#nt(e){this.#it(()=>{this.#g=e})}#rt(e){this.#it(()=>{this.#h=e})}#it(e){let t=this.connectionStatus;if(e(),this.connectionStatus!==t)for(let e of this.#v)e()}#at(e){let t=G(e),n=new Set(this.#U);this.#U.clear();for(let e of this.#ot()){let r=e.readSet;(n.has(e)||r===void 0||[...r].some(e=>t.has(e)))&&e.recompute()&&e.notify()}}*#ot(){for(let e of this.#M.values())e.read!==null&&(yield e.read);for(let e of this.#I.values())e.read!==null&&(yield e.read)}#st(e,t,n){let r=this.#M.get(e);if(r===void 0)return;r.phase=t,r.error=n;let i=Q(t,n);r.read!==null&&r.read.updateStatus(i)&&r.read.notify()}#ct(e,t){let n=this.#E.get(e);if(n!==void 0)return n;let r=this.#lt(t);return this.#E.set(e,r),r}#lt(e){let t,n,r,i,a=new Promise((e,r)=>{t=e,n=r}),o=new Promise((e,t)=>{r=e,i=t});return e&&(a.catch(()=>{}),o.catch(()=>{})),{pair:{client:a,server:o},resolveClient:t,rejectClient:n,resolveServer:r,rejectServer:i,clientSettled:!1,serverSettled:!1}}#ut(e,t){let n=this.#E.get(e);if(n===void 0){this.#B.push(`doync: settleClient for unknown mutation ${e} — no pending promise (a mutate() awaiting it would hang)`);return}n.clientSettled||(n.clientSettled=!0,t===null?n.resolveClient():n.rejectClient(t))}#dt(e,t){let n=this.#E.get(e);if(n===void 0){this.#B.push(`doync: settleServer for unknown mutation ${e} — no pending promise (a mutate() awaiting it would hang)`);return}n.serverSettled||(n.serverSettled=!0,t===null?n.resolveServer():n.rejectServer(t),n.clientSettled&&this.#E.delete(e))}};function V(e){return e instanceof Promise}function H(e,t){return e instanceof Promise?e.then(t):t(e)}function le(e,t,n){return e instanceof Promise?e.then(t,n):t(e)}var ue=class{current(){return Y}status(){return X}onChange(){return()=>{}}retain(){}release(){}},de=class{#e;#t=new Set;#n=!1;#r=!1;#i=Promise.withResolvers();#a=null;#o;#s;#c;constructor(e,t,n){this.#e=e,this.#o=t,this.#s=n.start,this.#c=n.drop}current(){return this.#l(),this.#e}onChange(e){return this.#l(),this.#t.add(e),()=>this.#t.delete(e)}get server(){return this.#l(),this.#i.promise}deliver(e){if(this.#r)return;let t=this.#o?this.#o(e):e;this.#e=t,this.#i.resolve(t);for(let e of this.#t)e()}settleError(e){this.#r||this.#i.reject(e)}dispose(){this.#r||this.#a===null&&(this.#a=setTimeout(()=>{this.#a=null,!this.#r&&(this.#r=!0,this.#t.clear(),this.#c())},J))}#l(){this.#r||(this.#a!==null&&(clearTimeout(this.#a),this.#a=null),!this.#n&&(this.#n=!0,this.#i=Promise.withResolvers(),this.#i.promise.catch(()=>{}),this.#s()))}};function U(e){return e===!1||e==null}function W(t,n,r){if((0,e.isBoundQuery)(n))return{query:n.query,args:n.args,options:r};throw fe(t,n)}function fe(e,t){return Error(typeof t==`function`?`doync: client.${e} expected a BoundQuery — received a function; did you forget to call it?`:`doync: client.${e} expected a BoundQuery, got ${pe(t)}`)}function pe(e){if(e===null)return`null`;if(Array.isArray(e))return`an array`;let t=typeof e;if(t===`object`){let t=e.kind;return typeof t==`string`?`an object with kind "${t}"`:`an object`}return t}var me=class{current(){return Y}onChange(){return()=>{}}get server(){return new Promise(()=>{})}dispose(){}};const he={cleanup(){}};function ge(t){let n={};for(let[r,i]of Object.entries(t))n[r]=(0,e.decodeImageValue)(i);return n}function G(t){return new Set([...t].filter(t=>!(0,e.isInternalTable)(t)))}function K(e){let t=Promise.reject(e),n=Promise.reject(e);return t.catch(()=>{}),n.catch(()=>{}),{client:t,server:n}}function q(e){return e instanceof Error?e.message:String(e)}const J=0,Y=Object.freeze([]),X=Object.freeze({status:`unknown`}),Z=Object.freeze({status:`complete`});function Q(e,t){return e===`complete`?Z:e===`error`?t===void 0?{status:`error`}:{status:`error`,error:t}:X}const _e=()=>{let e=globalThis.crypto?.randomUUID?.();return e===void 0?`client-${Math.random().toString(16).slice(2)}-${Date.now().toString(16)}`:e},ve=[`schema_version`,`next_mutation_id`,`cookie`];function ye(e){for(let t of ve){let n=g(e,t);if(n!==null&&!Number.isInteger(Number(n)))return t}return null}function be(e){return e.includes(`above the Origin head`)}function xe(e){return $(e)}function $(e){return e.logoutBehavior!==void 0&&(j(e.db),_(e.db,F,e.logoutBehavior)),new B({db:e.db,schema:e.schema,mutations:n(e.mutations),socket:e.socket,ctx:e.ctx??{},token:e.token,userId:e.userId??null,clientId:e.clientId,onSchemaEvent:e.onSchemaEvent})}Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return K}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return I}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return U}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return B}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return W}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return xe}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return i}});
@@ -1 +0,0 @@
1
- {"version":3,"file":"client-CNyLMCw0.d.ts","names":["Input","Output","StandardTypedV1","Props","version","vendor","types","Types","input","output","InferInput","Schema","NonNullable","InferOutput","StandardSchemaV1","validate","value","Options","options","Result","Promise","SuccessResult","FailureResult","issues","libraryOptions","Record","ReadonlyArray","Issue","message","path","PropertyKey","PathSegment","key","StandardJSONSchemaV1","jsonSchema","Converter","Target","target"],"sources":["../../../node_modules/.pnpm/@standard-schema+spec@1.1.0/node_modules/@standard-schema/spec/dist/index.d.ts","../src/port.ts","../src/mutations.ts","../src/socket.ts","../src/replica/meta.ts","../src/replica/stamps.ts","../src/replica/index.ts","../src/engine.ts","../src/client.ts"],"x_google_ignoreList":[0],"mappings":"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"}