@syncular/client 0.0.6-96 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/README.md +713 -11
  2. package/dist/auth-leases.d.ts +11 -0
  3. package/dist/auth-leases.d.ts.map +1 -0
  4. package/dist/auth-leases.js +140 -0
  5. package/dist/auth-leases.js.map +1 -0
  6. package/dist/blob-limits.d.ts +15 -0
  7. package/dist/blob-limits.d.ts.map +1 -0
  8. package/dist/blob-limits.js +66 -0
  9. package/dist/blob-limits.js.map +1 -0
  10. package/dist/bridge-client.d.ts +69 -0
  11. package/dist/bridge-client.d.ts.map +1 -0
  12. package/dist/bridge-client.js +282 -0
  13. package/dist/bridge-client.js.map +1 -0
  14. package/dist/client-config.d.ts +6 -0
  15. package/dist/client-config.d.ts.map +1 -0
  16. package/dist/client-config.js +18 -0
  17. package/dist/client-config.js.map +1 -0
  18. package/dist/client.d.ts +65 -397
  19. package/dist/client.d.ts.map +1 -1
  20. package/dist/client.js +150 -960
  21. package/dist/client.js.map +1 -1
  22. package/dist/command-history.d.ts +35 -0
  23. package/dist/command-history.d.ts.map +1 -0
  24. package/dist/command-history.js +378 -0
  25. package/dist/command-history.js.map +1 -0
  26. package/dist/console-diagnostics.d.ts +33 -0
  27. package/dist/console-diagnostics.d.ts.map +1 -0
  28. package/dist/console-diagnostics.js +496 -0
  29. package/dist/console-diagnostics.js.map +1 -0
  30. package/dist/crdt-yjs/index.d.ts +4 -0
  31. package/dist/crdt-yjs/index.d.ts.map +1 -0
  32. package/dist/crdt-yjs/index.js +4 -0
  33. package/dist/crdt-yjs/index.js.map +1 -0
  34. package/dist/crdt-yjs/webview-host-facade.d.ts +126 -0
  35. package/dist/crdt-yjs/webview-host-facade.d.ts.map +1 -0
  36. package/dist/crdt-yjs/webview-host-facade.js +284 -0
  37. package/dist/crdt-yjs/webview-host-facade.js.map +1 -0
  38. package/dist/crdt-yjs/yjs-document-field-adapter.d.ts +153 -0
  39. package/dist/crdt-yjs/yjs-document-field-adapter.d.ts.map +1 -0
  40. package/dist/crdt-yjs/yjs-document-field-adapter.js +406 -0
  41. package/dist/crdt-yjs/yjs-document-field-adapter.js.map +1 -0
  42. package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts +73 -0
  43. package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts.map +1 -0
  44. package/dist/crdt-yjs/yjs-prosemirror-bridge.js +169 -0
  45. package/dist/crdt-yjs/yjs-prosemirror-bridge.js.map +1 -0
  46. package/dist/database.d.ts +83 -0
  47. package/dist/database.d.ts.map +1 -0
  48. package/dist/database.js +916 -0
  49. package/dist/database.js.map +1 -0
  50. package/dist/diagnostics.d.ts +10 -0
  51. package/dist/diagnostics.d.ts.map +1 -0
  52. package/dist/diagnostics.js +83 -0
  53. package/dist/diagnostics.js.map +1 -0
  54. package/dist/errors.d.ts +24 -0
  55. package/dist/errors.d.ts.map +1 -0
  56. package/dist/errors.js +211 -0
  57. package/dist/errors.js.map +1 -0
  58. package/dist/generated-bridge.d.ts +365 -0
  59. package/dist/generated-bridge.d.ts.map +1 -0
  60. package/dist/generated-bridge.js +250 -0
  61. package/dist/generated-bridge.js.map +1 -0
  62. package/dist/index.d.ts +13 -23
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +14 -25
  65. package/dist/index.js.map +1 -1
  66. package/dist/mutations.d.ts +4 -72
  67. package/dist/mutations.d.ts.map +1 -1
  68. package/dist/mutations.js +2 -568
  69. package/dist/mutations.js.map +1 -1
  70. package/dist/network.d.ts +3 -0
  71. package/dist/network.d.ts.map +1 -0
  72. package/dist/network.js +17 -0
  73. package/dist/network.js.map +1 -0
  74. package/dist/react/index.d.ts +169 -0
  75. package/dist/react/index.d.ts.map +1 -0
  76. package/dist/react/index.js +628 -0
  77. package/dist/react/index.js.map +1 -0
  78. package/dist/react-native/index.d.ts +35 -0
  79. package/dist/react-native/index.d.ts.map +1 -0
  80. package/dist/react-native/index.js +49 -0
  81. package/dist/react-native/index.js.map +1 -0
  82. package/dist/runtime-contract.d.ts +13 -0
  83. package/dist/runtime-contract.d.ts.map +1 -0
  84. package/dist/runtime-contract.js +24 -0
  85. package/dist/runtime-contract.js.map +1 -0
  86. package/dist/rust-client.d.ts +106 -0
  87. package/dist/rust-client.d.ts.map +1 -0
  88. package/dist/rust-client.js +936 -0
  89. package/dist/rust-client.js.map +1 -0
  90. package/dist/sentry.d.ts +35 -0
  91. package/dist/sentry.d.ts.map +1 -0
  92. package/dist/sentry.js +155 -0
  93. package/dist/sentry.js.map +1 -0
  94. package/dist/sql-safety.d.ts +3 -0
  95. package/dist/sql-safety.d.ts.map +1 -0
  96. package/dist/sql-safety.js +62 -0
  97. package/dist/sql-safety.js.map +1 -0
  98. package/dist/syncular-runtime-artifacts.json +61 -0
  99. package/dist/tauri/index.d.ts +35 -0
  100. package/dist/tauri/index.d.ts.map +1 -0
  101. package/dist/tauri/index.js +114 -0
  102. package/dist/tauri/index.js.map +1 -0
  103. package/dist/types.d.ts +1059 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +2 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/wasm/.syncular-wasm-profile +1 -0
  108. package/dist/wasm/syncular-runtime-artifact.json +21 -0
  109. package/dist/wasm/syncular.d.ts +207 -0
  110. package/dist/wasm/syncular.js +2341 -0
  111. package/dist/wasm/syncular_bg.wasm +0 -0
  112. package/dist/wasm/syncular_bg.wasm.d.ts +97 -0
  113. package/dist/wasm-bindings/runtime-contract.d.ts +22 -0
  114. package/dist/wasm-bindings/runtime-contract.d.ts.map +1 -0
  115. package/dist/wasm-bindings/runtime-contract.js +112 -0
  116. package/dist/wasm-bindings/runtime-contract.js.map +1 -0
  117. package/dist/wasm-core/.syncular-wasm-profile +1 -0
  118. package/dist/wasm-core/syncular-runtime-artifact.json +17 -0
  119. package/dist/wasm-core/syncular.d.ts +162 -0
  120. package/dist/wasm-core/syncular.js +1847 -0
  121. package/dist/wasm-core/syncular_bg.wasm +0 -0
  122. package/dist/wasm-core/syncular_bg.wasm.d.ts +77 -0
  123. package/dist/wasm-perf/.syncular-wasm-profile +1 -0
  124. package/dist/wasm-perf/syncular-runtime-artifact.json +21 -0
  125. package/dist/wasm-perf/syncular.d.ts +207 -0
  126. package/dist/wasm-perf/syncular.js +2341 -0
  127. package/dist/wasm-perf/syncular_bg.wasm +0 -0
  128. package/dist/wasm-perf/syncular_bg.wasm.d.ts +97 -0
  129. package/dist/wasm-runtime.d.ts +18 -0
  130. package/dist/wasm-runtime.d.ts.map +1 -0
  131. package/dist/wasm-runtime.js +28 -0
  132. package/dist/wasm-runtime.js.map +1 -0
  133. package/dist/worker-client.d.ts +123 -0
  134. package/dist/worker-client.d.ts.map +1 -0
  135. package/dist/worker-client.js +1686 -0
  136. package/dist/worker-client.js.map +1 -0
  137. package/dist/worker-entry.d.ts +2 -0
  138. package/dist/worker-entry.d.ts.map +1 -0
  139. package/dist/worker-entry.js +479 -0
  140. package/dist/worker-entry.js.map +1 -0
  141. package/dist/worker-protocol.d.ts +64 -0
  142. package/dist/worker-protocol.d.ts.map +1 -0
  143. package/dist/worker-protocol.js +16 -0
  144. package/dist/worker-protocol.js.map +1 -0
  145. package/dist/worker-realtime.d.ts +39 -0
  146. package/dist/worker-realtime.d.ts.map +1 -0
  147. package/dist/worker-realtime.js +677 -0
  148. package/dist/worker-realtime.js.map +1 -0
  149. package/package.json +124 -17
  150. package/src/auth-leases.ts +251 -0
  151. package/src/blob-limits.ts +98 -0
  152. package/src/bridge-client.ts +512 -0
  153. package/src/client-config.ts +29 -0
  154. package/src/client.ts +256 -1414
  155. package/src/command-history.ts +623 -0
  156. package/src/console-diagnostics.ts +617 -0
  157. package/src/crdt-yjs/index.ts +3 -0
  158. package/src/crdt-yjs/webview-host-facade.ts +477 -0
  159. package/src/crdt-yjs/yjs-document-field-adapter.ts +733 -0
  160. package/src/crdt-yjs/yjs-prosemirror-bridge.ts +272 -0
  161. package/src/database.ts +1342 -0
  162. package/src/diagnostics.ts +116 -0
  163. package/src/errors.ts +269 -0
  164. package/src/generated-bridge.ts +741 -0
  165. package/src/index.ts +21 -25
  166. package/src/mutations.ts +12 -821
  167. package/src/network.ts +32 -0
  168. package/src/react/index.ts +1036 -0
  169. package/src/react-native/index.ts +152 -0
  170. package/src/runtime-contract.ts +48 -0
  171. package/src/rust-client.ts +1488 -0
  172. package/src/sentry.ts +215 -0
  173. package/src/sql-safety.ts +61 -0
  174. package/src/tauri/index.ts +211 -0
  175. package/src/types.ts +1356 -0
  176. package/src/wasm-bindings/generated-wasm-bindings.d.ts +70 -0
  177. package/src/wasm-bindings/runtime-contract.ts +158 -0
  178. package/src/wasm-runtime.ts +76 -0
  179. package/src/worker-client.ts +2215 -0
  180. package/src/worker-entry.ts +584 -0
  181. package/src/worker-protocol.ts +109 -0
  182. package/src/worker-realtime.ts +843 -0
  183. package/dist/blobs/index.d.ts +0 -7
  184. package/dist/blobs/index.d.ts.map +0 -1
  185. package/dist/blobs/index.js +0 -7
  186. package/dist/blobs/index.js.map +0 -1
  187. package/dist/blobs/manager.d.ts +0 -345
  188. package/dist/blobs/manager.d.ts.map +0 -1
  189. package/dist/blobs/manager.js +0 -749
  190. package/dist/blobs/manager.js.map +0 -1
  191. package/dist/blobs/migrate.d.ts +0 -14
  192. package/dist/blobs/migrate.d.ts.map +0 -1
  193. package/dist/blobs/migrate.js +0 -59
  194. package/dist/blobs/migrate.js.map +0 -1
  195. package/dist/blobs/types.d.ts +0 -62
  196. package/dist/blobs/types.d.ts.map +0 -1
  197. package/dist/blobs/types.js +0 -5
  198. package/dist/blobs/types.js.map +0 -1
  199. package/dist/conflicts.d.ts +0 -31
  200. package/dist/conflicts.d.ts.map +0 -1
  201. package/dist/conflicts.js +0 -112
  202. package/dist/conflicts.js.map +0 -1
  203. package/dist/create-client.d.ts +0 -118
  204. package/dist/create-client.d.ts.map +0 -1
  205. package/dist/create-client.js +0 -178
  206. package/dist/create-client.js.map +0 -1
  207. package/dist/engine/SyncEngine.d.ts +0 -272
  208. package/dist/engine/SyncEngine.d.ts.map +0 -1
  209. package/dist/engine/SyncEngine.js +0 -1860
  210. package/dist/engine/SyncEngine.js.map +0 -1
  211. package/dist/engine/index.d.ts +0 -6
  212. package/dist/engine/index.d.ts.map +0 -1
  213. package/dist/engine/index.js +0 -6
  214. package/dist/engine/index.js.map +0 -1
  215. package/dist/engine/types.d.ts +0 -345
  216. package/dist/engine/types.d.ts.map +0 -1
  217. package/dist/engine/types.js +0 -7
  218. package/dist/engine/types.js.map +0 -1
  219. package/dist/handlers/collection.d.ts +0 -6
  220. package/dist/handlers/collection.d.ts.map +0 -1
  221. package/dist/handlers/collection.js +0 -21
  222. package/dist/handlers/collection.js.map +0 -1
  223. package/dist/handlers/create-handler.d.ts +0 -120
  224. package/dist/handlers/create-handler.d.ts.map +0 -1
  225. package/dist/handlers/create-handler.js +0 -145
  226. package/dist/handlers/create-handler.js.map +0 -1
  227. package/dist/handlers/types.d.ts +0 -83
  228. package/dist/handlers/types.d.ts.map +0 -1
  229. package/dist/handlers/types.js +0 -5
  230. package/dist/handlers/types.js.map +0 -1
  231. package/dist/migrate.d.ts +0 -19
  232. package/dist/migrate.d.ts.map +0 -1
  233. package/dist/migrate.js +0 -238
  234. package/dist/migrate.js.map +0 -1
  235. package/dist/outbox.d.ts +0 -112
  236. package/dist/outbox.d.ts.map +0 -1
  237. package/dist/outbox.js +0 -294
  238. package/dist/outbox.js.map +0 -1
  239. package/dist/plugins/incrementing-version.d.ts +0 -34
  240. package/dist/plugins/incrementing-version.d.ts.map +0 -1
  241. package/dist/plugins/incrementing-version.js +0 -83
  242. package/dist/plugins/incrementing-version.js.map +0 -1
  243. package/dist/plugins/index.d.ts +0 -3
  244. package/dist/plugins/index.d.ts.map +0 -1
  245. package/dist/plugins/index.js +0 -3
  246. package/dist/plugins/index.js.map +0 -1
  247. package/dist/plugins/types.d.ts +0 -49
  248. package/dist/plugins/types.d.ts.map +0 -1
  249. package/dist/plugins/types.js +0 -15
  250. package/dist/plugins/types.js.map +0 -1
  251. package/dist/proxy/connection.d.ts +0 -33
  252. package/dist/proxy/connection.d.ts.map +0 -1
  253. package/dist/proxy/connection.js +0 -153
  254. package/dist/proxy/connection.js.map +0 -1
  255. package/dist/proxy/dialect.d.ts +0 -46
  256. package/dist/proxy/dialect.d.ts.map +0 -1
  257. package/dist/proxy/dialect.js +0 -58
  258. package/dist/proxy/dialect.js.map +0 -1
  259. package/dist/proxy/driver.d.ts +0 -42
  260. package/dist/proxy/driver.d.ts.map +0 -1
  261. package/dist/proxy/driver.js +0 -78
  262. package/dist/proxy/driver.js.map +0 -1
  263. package/dist/proxy/index.d.ts +0 -10
  264. package/dist/proxy/index.d.ts.map +0 -1
  265. package/dist/proxy/index.js +0 -10
  266. package/dist/proxy/index.js.map +0 -1
  267. package/dist/proxy/mutations.d.ts +0 -9
  268. package/dist/proxy/mutations.d.ts.map +0 -1
  269. package/dist/proxy/mutations.js +0 -11
  270. package/dist/proxy/mutations.js.map +0 -1
  271. package/dist/pull-engine.d.ts +0 -48
  272. package/dist/pull-engine.d.ts.map +0 -1
  273. package/dist/pull-engine.js +0 -648
  274. package/dist/pull-engine.js.map +0 -1
  275. package/dist/push-engine.d.ts +0 -18
  276. package/dist/push-engine.d.ts.map +0 -1
  277. package/dist/push-engine.js +0 -167
  278. package/dist/push-engine.js.map +0 -1
  279. package/dist/query/FingerprintCollector.d.ts +0 -18
  280. package/dist/query/FingerprintCollector.d.ts.map +0 -1
  281. package/dist/query/FingerprintCollector.js +0 -28
  282. package/dist/query/FingerprintCollector.js.map +0 -1
  283. package/dist/query/QueryContext.d.ts +0 -33
  284. package/dist/query/QueryContext.d.ts.map +0 -1
  285. package/dist/query/QueryContext.js +0 -16
  286. package/dist/query/QueryContext.js.map +0 -1
  287. package/dist/query/fingerprint.d.ts +0 -61
  288. package/dist/query/fingerprint.d.ts.map +0 -1
  289. package/dist/query/fingerprint.js +0 -91
  290. package/dist/query/fingerprint.js.map +0 -1
  291. package/dist/query/index.d.ts +0 -7
  292. package/dist/query/index.d.ts.map +0 -1
  293. package/dist/query/index.js +0 -7
  294. package/dist/query/index.js.map +0 -1
  295. package/dist/query/tracked-select.d.ts +0 -18
  296. package/dist/query/tracked-select.d.ts.map +0 -1
  297. package/dist/query/tracked-select.js +0 -90
  298. package/dist/query/tracked-select.js.map +0 -1
  299. package/dist/schema.d.ts +0 -83
  300. package/dist/schema.d.ts.map +0 -1
  301. package/dist/schema.js +0 -7
  302. package/dist/schema.js.map +0 -1
  303. package/dist/subscription-state.d.ts +0 -46
  304. package/dist/subscription-state.d.ts.map +0 -1
  305. package/dist/subscription-state.js +0 -185
  306. package/dist/subscription-state.js.map +0 -1
  307. package/dist/sync-loop.d.ts +0 -34
  308. package/dist/sync-loop.d.ts.map +0 -1
  309. package/dist/sync-loop.js +0 -253
  310. package/dist/sync-loop.js.map +0 -1
  311. package/dist/sync.d.ts +0 -32
  312. package/dist/sync.d.ts.map +0 -1
  313. package/dist/sync.js +0 -55
  314. package/dist/sync.js.map +0 -1
  315. package/dist/utils/id.d.ts +0 -17
  316. package/dist/utils/id.d.ts.map +0 -1
  317. package/dist/utils/id.js +0 -46
  318. package/dist/utils/id.js.map +0 -1
  319. package/src/blobs/index.ts +0 -7
  320. package/src/blobs/manager.ts +0 -1027
  321. package/src/blobs/migrate.ts +0 -67
  322. package/src/blobs/types.ts +0 -84
  323. package/src/client.test.ts +0 -417
  324. package/src/conflicts.ts +0 -171
  325. package/src/create-client.test.ts +0 -83
  326. package/src/create-client.ts +0 -330
  327. package/src/engine/SyncEngine.test.ts +0 -254
  328. package/src/engine/SyncEngine.ts +0 -2375
  329. package/src/engine/index.ts +0 -6
  330. package/src/engine/types.ts +0 -419
  331. package/src/handlers/collection.ts +0 -36
  332. package/src/handlers/create-handler.ts +0 -330
  333. package/src/handlers/types.ts +0 -108
  334. package/src/migrate.ts +0 -318
  335. package/src/outbox.ts +0 -383
  336. package/src/plugins/incrementing-version.ts +0 -133
  337. package/src/plugins/index.ts +0 -2
  338. package/src/plugins/types.ts +0 -63
  339. package/src/proxy/connection.ts +0 -191
  340. package/src/proxy/dialect.ts +0 -76
  341. package/src/proxy/driver.ts +0 -126
  342. package/src/proxy/index.ts +0 -10
  343. package/src/proxy/mutations.ts +0 -18
  344. package/src/pull-engine.test.ts +0 -151
  345. package/src/pull-engine.ts +0 -855
  346. package/src/push-engine.ts +0 -216
  347. package/src/query/FingerprintCollector.ts +0 -29
  348. package/src/query/QueryContext.ts +0 -54
  349. package/src/query/fingerprint.ts +0 -109
  350. package/src/query/index.ts +0 -10
  351. package/src/query/tracked-select.ts +0 -139
  352. package/src/schema.ts +0 -94
  353. package/src/subscription-state.ts +0 -259
  354. package/src/sync-loop.ts +0 -379
  355. package/src/sync.ts +0 -170
  356. package/src/utils/id.ts +0 -55
@@ -1,90 +0,0 @@
1
- /**
2
- * @syncular/client - Tracked SelectFrom
3
- *
4
- * Provides a wrapped selectFrom that:
5
- * 1. Tracks tables as watched scopes when called
6
- * 2. Intercepts .execute() to auto-generate fingerprints
7
- */
8
- import { computeRowFingerprint, computeValueFingerprint, hasKeyField, } from './fingerprint.js';
9
- function isExecutableQuery(value) {
10
- if (typeof value !== 'object' || value === null)
11
- return false;
12
- return (typeof Reflect.get(value, 'execute') === 'function' &&
13
- typeof Reflect.get(value, 'executeTakeFirst') === 'function' &&
14
- typeof Reflect.get(value, 'executeTakeFirstOrThrow') === 'function');
15
- }
16
- function createExecuteProxy(builder, table, collector, engine, keyField) {
17
- return new Proxy(builder, {
18
- get(target, prop) {
19
- if (prop === 'execute') {
20
- return async () => {
21
- const rows = await target.execute();
22
- // Auto-detect fingerprint mode based on result shape
23
- if (Array.isArray(rows)) {
24
- if (hasKeyField(rows, keyField)) {
25
- // Row-level fingerprinting - result has keyField
26
- const fp = computeRowFingerprint(rows, table, engine, keyField);
27
- collector.add(fp);
28
- }
29
- else {
30
- // Value-based fingerprinting - for aggregates/scalars
31
- const fp = computeValueFingerprint(table, rows);
32
- collector.add(fp);
33
- }
34
- }
35
- else {
36
- // Unexpected, but keep rerender behavior deterministic.
37
- const fp = computeValueFingerprint(table, rows);
38
- collector.add(fp);
39
- }
40
- return rows;
41
- };
42
- }
43
- if (prop === 'executeTakeFirst') {
44
- return async () => {
45
- const row = await target.executeTakeFirst();
46
- // Value-based fingerprinting for single-row queries
47
- const fp = computeValueFingerprint(table, row);
48
- collector.add(fp);
49
- return row;
50
- };
51
- }
52
- if (prop === 'executeTakeFirstOrThrow') {
53
- return async () => {
54
- const row = await target.executeTakeFirstOrThrow();
55
- // Value-based fingerprinting for single-row queries
56
- const fp = computeValueFingerprint(table, row);
57
- collector.add(fp);
58
- return row;
59
- };
60
- }
61
- // For other methods, return wrapped builder for chaining
62
- const value = Reflect.get(target, prop, target);
63
- if (typeof value === 'function') {
64
- return (...args) => {
65
- const result = Reflect.apply(value, target, args);
66
- if (isExecutableQuery(result)) {
67
- return createExecuteProxy(result, table, collector, engine, keyField);
68
- }
69
- return result;
70
- };
71
- }
72
- return value;
73
- },
74
- });
75
- }
76
- /**
77
- * Create a tracked selectFrom that registers scopes and generates fingerprints.
78
- */
79
- export function createTrackedSelectFrom(db, scopeCollector, fingerprintCollector, engine, keyField = 'id') {
80
- const selectFrom = (table) => {
81
- // 1. Register this table as a watched scope
82
- scopeCollector.add(table);
83
- // 2. Get the real query builder
84
- const builder = db.selectFrom(table);
85
- // 3. Return a proxy that intercepts .execute()
86
- return createExecuteProxy(builder, table, fingerprintCollector, engine, keyField);
87
- };
88
- return selectFrom;
89
- }
90
- //# sourceMappingURL=tracked-select.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tracked-select.js","sourceRoot":"","sources":["../../src/query/tracked-select.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAQH,OAAO,EACL,qBAAqB,EACrB,uBAAuB,EACvB,WAAW,GAEZ,MAAM,eAAe,CAAC;AAYvB,SAAS,iBAAiB,CAAC,KAAc,EAA4B;IACnE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,OAAO,CACL,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,UAAU;QACnD,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,kBAAkB,CAAC,KAAK,UAAU;QAC5D,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,yBAAyB,CAAC,KAAK,UAAU,CACpE,CAAC;AAAA,CACH;AAED,SAAS,kBAAkB,CACzB,OAAU,EACV,KAAa,EACb,SAA+B,EAC/B,MAA+B,EAC/B,QAAgB,EACb;IACH,OAAO,IAAI,KAAK,CAAC,OAAO,EAAE;QACxB,GAAG,CAAC,MAAM,EAAE,IAAqB,EAAE;YACjC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,KAAK,IAAI,EAAE,CAAC;oBACjB,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpC,qDAAqD;oBACrD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;wBACxB,IAAI,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;4BAChC,iDAAiD;4BACjD,MAAM,EAAE,GAAG,qBAAqB,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;4BAChE,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACpB,CAAC;6BAAM,CAAC;4BACN,sDAAsD;4BACtD,MAAM,EAAE,GAAG,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;4BAChD,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;wBACpB,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,wDAAwD;wBACxD,MAAM,EAAE,GAAG,uBAAuB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;wBAChD,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACpB,CAAC;oBACD,OAAO,IAAI,CAAC;gBAAA,CACb,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBAChC,OAAO,KAAK,IAAI,EAAE,CAAC;oBACjB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,gBAAgB,EAAE,CAAC;oBAC5C,oDAAoD;oBACpD,MAAM,EAAE,GAAG,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBAC/C,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAClB,OAAO,GAAG,CAAC;gBAAA,CACZ,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,KAAK,yBAAyB,EAAE,CAAC;gBACvC,OAAO,KAAK,IAAI,EAAE,CAAC;oBACjB,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,uBAAuB,EAAE,CAAC;oBACnD,oDAAoD;oBACpD,MAAM,EAAE,GAAG,uBAAuB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;oBAC/C,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAClB,OAAO,GAAG,CAAC;gBAAA,CACZ,CAAC;YACJ,CAAC;YACD,yDAAyD;YACzD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;YAChD,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC;oBAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;oBAClD,IAAI,iBAAiB,CAAC,MAAM,CAAC,EAAE,CAAC;wBAC9B,OAAO,kBAAkB,CACvB,MAAM,EACN,KAAK,EACL,SAAS,EACT,MAAM,EACN,QAAQ,CACT,CAAC;oBACJ,CAAC;oBACD,OAAO,MAAM,CAAC;gBAAA,CACf,CAAC;YACJ,CAAC;YACD,OAAO,KAAK,CAAC;QAAA,CACd;KACF,CAAC,CAAC;AAAA,CACJ;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,EAAc,EACd,cAA2B,EAC3B,oBAA0C,EAC1C,MAA+B,EAC/B,QAAQ,GAAG,IAAI,EACQ;IACvB,MAAM,UAAU,GAAG,CAA+B,KAAS,EAAE,EAAE,CAAC;QAC9D,4CAA4C;QAC5C,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAE1B,gCAAgC;QAChC,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAErC,+CAA+C;QAC/C,OAAO,kBAAkB,CACvB,OAAO,EACP,KAAK,EACL,oBAAoB,EACpB,MAAM,EACN,QAAQ,CACT,CAAC;IAAA,CACH,CAAC;IACF,OAAO,UAAmC,CAAC;AAAA,CAC5C"}
package/dist/schema.d.ts DELETED
@@ -1,83 +0,0 @@
1
- /**
2
- * @syncular/client - Sync client schema types (SQLite reference)
3
- *
4
- * These tables are sync-internal and should not collide with app tables.
5
- */
6
- import type { Generated, Kysely } from 'kysely';
7
- import type { SyncBlobClientDb } from './blobs/types';
8
- /**
9
- * Database executor type that both Kysely and Transaction satisfy.
10
- * Use this when a function needs to work with either a raw Kysely instance
11
- * or within a transaction context.
12
- */
13
- export type SyncClientExecutor<DB extends SyncClientDb = SyncClientDb> = Pick<Kysely<DB>, 'selectFrom' | 'insertInto' | 'updateTable' | 'deleteFrom'>;
14
- export type OutboxCommitStatus = 'pending' | 'sending' | 'acked' | 'failed';
15
- export type SubscriptionStatus = 'active' | 'revoked';
16
- export interface SyncSubscriptionStateTable {
17
- /** Logical profile id (default: 'default') */
18
- state_id: string;
19
- /** Subscription identifier (client-chosen) */
20
- subscription_id: string;
21
- /** Table name for this subscription */
22
- table: string;
23
- /** JSON string of ScopeValues for this subscription */
24
- scopes_json: string;
25
- /** JSON string of params */
26
- params_json: string;
27
- /** Per-subscription cursor (last applied commit_seq) */
28
- cursor: number;
29
- /**
30
- * JSON string of SyncBootstrapState (or null).
31
- * When set, indicates a paginated bootstrap is in progress for this subscription.
32
- */
33
- bootstrap_state_json: string | null;
34
- /** active | revoked */
35
- status: SubscriptionStatus;
36
- created_at: number;
37
- updated_at: number;
38
- }
39
- export interface SyncOutboxCommitsTable {
40
- /** Local row id (uuid) */
41
- id: string;
42
- /** Client-provided idempotency key (uuid) */
43
- client_commit_id: string;
44
- /** pending | sending | acked | failed */
45
- status: OutboxCommitStatus;
46
- /** JSON string of SyncOperation[] */
47
- operations_json: string;
48
- /** JSON string of the last SyncPushResponse (optional) */
49
- last_response_json: string | null;
50
- /** Last error (if any) */
51
- error: string | null;
52
- /** Created timestamp (ms since epoch) */
53
- created_at: number;
54
- /** Updated timestamp (ms since epoch) */
55
- updated_at: number;
56
- /** How many send attempts have been made */
57
- attempt_count: Generated<number>;
58
- /** Server commit_seq if acked (optional) */
59
- acked_commit_seq: number | null;
60
- /** Client schema version when commit was created (default: 1 for legacy) */
61
- schema_version: Generated<number>;
62
- }
63
- export interface SyncClientDb extends SyncBlobClientDb {
64
- sync_subscription_state: SyncSubscriptionStateTable;
65
- sync_outbox_commits: SyncOutboxCommitsTable;
66
- sync_conflicts: SyncConflictsTable;
67
- }
68
- export type ConflictResultStatus = 'conflict' | 'error';
69
- export interface SyncConflictsTable {
70
- id: string;
71
- outbox_commit_id: string;
72
- client_commit_id: string;
73
- op_index: number;
74
- result_status: ConflictResultStatus;
75
- message: string;
76
- code: string | null;
77
- server_version: number | null;
78
- server_row_json: string | null;
79
- created_at: number;
80
- resolved_at: number | null;
81
- resolution: string | null;
82
- }
83
- //# sourceMappingURL=schema.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,CAAC,EAAE,SAAS,YAAY,GAAG,YAAY,IAAI,IAAI,CAC3E,MAAM,CAAC,EAAE,CAAC,EACV,YAAY,GAAG,YAAY,GAAG,aAAa,GAAG,YAAY,CAC3D,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5E,MAAM,MAAM,kBAAkB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAEtD,MAAM,WAAW,0BAA0B;IACzC,8CAA8C;IAC9C,QAAQ,EAAE,MAAM,CAAC;IACjB,8CAA8C;IAC9C,eAAe,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,uBAAuB;IACvB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,6CAA6C;IAC7C,gBAAgB,EAAE,MAAM,CAAC;IACzB,yCAAyC;IACzC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,0DAA0D;IAC1D,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,0BAA0B;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,4CAA4C;IAC5C,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IACjC,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,4EAA4E;IAC5E,cAAc,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,YAAa,SAAQ,gBAAgB;IACpD,uBAAuB,EAAE,0BAA0B,CAAC;IACpD,mBAAmB,EAAE,sBAAsB,CAAC;IAC5C,cAAc,EAAE,kBAAkB,CAAC;CACpC;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,GAAG,OAAO,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,oBAAoB,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B"}
package/dist/schema.js DELETED
@@ -1,7 +0,0 @@
1
- /**
2
- * @syncular/client - Sync client schema types (SQLite reference)
3
- *
4
- * These tables are sync-internal and should not collide with app tables.
5
- */
6
- export {};
7
- //# sourceMappingURL=schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -1,46 +0,0 @@
1
- /**
2
- * @syncular/client - Subscription state helpers
3
- *
4
- * Stable accessors for sync subscription metadata.
5
- */
6
- import type { ScopeValues, SyncBootstrapState } from '@syncular/core';
7
- import type { Kysely } from 'kysely';
8
- import type { SubscriptionStatus, SyncClientDb } from './schema';
9
- export declare const DEFAULT_SYNC_STATE_ID = "default";
10
- export interface SubscriptionState {
11
- stateId: string;
12
- subscriptionId: string;
13
- table: string;
14
- scopes: ScopeValues;
15
- params: Record<string, unknown>;
16
- cursor: number;
17
- bootstrapState: SyncBootstrapState | null;
18
- status: SubscriptionStatus;
19
- createdAt: number;
20
- updatedAt: number;
21
- }
22
- export interface ListSubscriptionStatesOptions {
23
- stateId?: string;
24
- table?: string;
25
- status?: SubscriptionStatus;
26
- }
27
- export interface GetSubscriptionStateOptions {
28
- stateId?: string;
29
- subscriptionId: string;
30
- }
31
- export interface UpsertSubscriptionStateInput {
32
- stateId?: string;
33
- subscriptionId: string;
34
- table: string;
35
- scopes: ScopeValues;
36
- params?: Record<string, unknown>;
37
- cursor: number;
38
- bootstrapState?: SyncBootstrapState | null;
39
- status?: SubscriptionStatus;
40
- nowMs?: number;
41
- }
42
- export declare function parseBootstrapState(value: string | object | null | undefined): SyncBootstrapState | null;
43
- export declare function listSubscriptionStates<DB extends SyncClientDb>(db: Kysely<DB>, options?: ListSubscriptionStatesOptions): Promise<SubscriptionState[]>;
44
- export declare function getSubscriptionState<DB extends SyncClientDb>(db: Kysely<DB>, options: GetSubscriptionStateOptions): Promise<SubscriptionState | null>;
45
- export declare function upsertSubscriptionState<DB extends SyncClientDb>(db: Kysely<DB>, input: UpsertSubscriptionStateInput): Promise<SubscriptionState>;
46
- //# sourceMappingURL=subscription-state.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subscription-state.d.ts","sourceRoot":"","sources":["../src/subscription-state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEtE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EAEb,MAAM,UAAU,CAAC;AAElB,eAAO,MAAM,qBAAqB,YAAY,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC1C,MAAM,EAAE,kBAAkB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,4BAA4B;IAC3C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,kBAAkB,GAAG,IAAI,CAAC;IAC3C,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAgBD,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,GACxC,kBAAkB,GAAG,IAAI,CAyB3B;AAqCD,wBAAsB,sBAAsB,CAAC,EAAE,SAAS,YAAY,EAClE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,OAAO,GAAE,6BAAkC,GAC1C,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAiC9B;AAED,wBAAsB,oBAAoB,CAAC,EAAE,SAAS,YAAY,EAChE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAwBnC;AAED,wBAAsB,uBAAuB,CAAC,EAAE,SAAS,YAAY,EACnE,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,KAAK,EAAE,4BAA4B,GAClC,OAAO,CAAC,iBAAiB,CAAC,CAwD5B"}
@@ -1,185 +0,0 @@
1
- /**
2
- * @syncular/client - Subscription state helpers
3
- *
4
- * Stable accessors for sync subscription metadata.
5
- */
6
- import { isRecord } from '@syncular/core';
7
- import { sql } from 'kysely';
8
- export const DEFAULT_SYNC_STATE_ID = 'default';
9
- function isScopeValues(value) {
10
- if (!isRecord(value))
11
- return false;
12
- for (const entry of Object.values(value)) {
13
- if (typeof entry === 'string')
14
- continue;
15
- if (Array.isArray(entry) && entry.every((v) => typeof v === 'string')) {
16
- continue;
17
- }
18
- return false;
19
- }
20
- return true;
21
- }
22
- export function parseBootstrapState(value) {
23
- if (!value)
24
- return null;
25
- try {
26
- const parsed = typeof value === 'string' ? JSON.parse(value) : value;
27
- if (!isRecord(parsed))
28
- return null;
29
- if (typeof parsed.asOfCommitSeq !== 'number')
30
- return null;
31
- if (!Array.isArray(parsed.tables))
32
- return null;
33
- if (!parsed.tables.every((table) => typeof table === 'string'))
34
- return null;
35
- if (typeof parsed.tableIndex !== 'number')
36
- return null;
37
- if (parsed.rowCursor !== null && typeof parsed.rowCursor !== 'string') {
38
- return null;
39
- }
40
- return {
41
- asOfCommitSeq: parsed.asOfCommitSeq,
42
- tables: parsed.tables,
43
- tableIndex: parsed.tableIndex,
44
- rowCursor: parsed.rowCursor,
45
- };
46
- }
47
- catch {
48
- return null;
49
- }
50
- }
51
- function parseScopes(value) {
52
- try {
53
- const parsed = JSON.parse(value);
54
- return isScopeValues(parsed) ? parsed : {};
55
- }
56
- catch {
57
- return {};
58
- }
59
- }
60
- function parseParams(value) {
61
- try {
62
- const parsed = JSON.parse(value);
63
- return isRecord(parsed) ? parsed : {};
64
- }
65
- catch {
66
- return {};
67
- }
68
- }
69
- function mapSubscriptionState(row) {
70
- return {
71
- stateId: row.state_id,
72
- subscriptionId: row.subscription_id,
73
- table: row.table,
74
- scopes: parseScopes(row.scopes_json),
75
- params: parseParams(row.params_json),
76
- cursor: row.cursor,
77
- bootstrapState: parseBootstrapState(row.bootstrap_state_json),
78
- status: row.status,
79
- createdAt: row.created_at,
80
- updatedAt: row.updated_at,
81
- };
82
- }
83
- export async function listSubscriptionStates(db, options = {}) {
84
- const filters = [];
85
- if (options.stateId) {
86
- filters.push(sql `${sql.ref('state_id')} = ${sql.val(options.stateId)}`);
87
- }
88
- if (options.table) {
89
- filters.push(sql `${sql.ref('table')} = ${sql.val(options.table)}`);
90
- }
91
- if (options.status) {
92
- filters.push(sql `${sql.ref('status')} = ${sql.val(options.status)}`);
93
- }
94
- const whereClause = filters.length > 0 ? sql `where ${sql.join(filters, sql ` and `)}` : sql ``;
95
- const rows = await sql `
96
- select
97
- ${sql.ref('state_id')},
98
- ${sql.ref('subscription_id')},
99
- ${sql.ref('table')},
100
- ${sql.ref('scopes_json')},
101
- ${sql.ref('params_json')},
102
- ${sql.ref('cursor')},
103
- ${sql.ref('bootstrap_state_json')},
104
- ${sql.ref('status')},
105
- ${sql.ref('created_at')},
106
- ${sql.ref('updated_at')}
107
- from ${sql.table('sync_subscription_state')}
108
- ${whereClause}
109
- order by ${sql.ref('state_id')} asc, ${sql.ref('subscription_id')} asc
110
- `.execute(db);
111
- return rows.rows.map((row) => mapSubscriptionState(row));
112
- }
113
- export async function getSubscriptionState(db, options) {
114
- const stateId = options.stateId ?? DEFAULT_SYNC_STATE_ID;
115
- const rows = await sql `
116
- select
117
- ${sql.ref('state_id')},
118
- ${sql.ref('subscription_id')},
119
- ${sql.ref('table')},
120
- ${sql.ref('scopes_json')},
121
- ${sql.ref('params_json')},
122
- ${sql.ref('cursor')},
123
- ${sql.ref('bootstrap_state_json')},
124
- ${sql.ref('status')},
125
- ${sql.ref('created_at')},
126
- ${sql.ref('updated_at')}
127
- from ${sql.table('sync_subscription_state')}
128
- where
129
- ${sql.ref('state_id')} = ${sql.val(stateId)}
130
- and ${sql.ref('subscription_id')} = ${sql.val(options.subscriptionId)}
131
- limit 1
132
- `.execute(db);
133
- const row = rows.rows[0];
134
- return row ? mapSubscriptionState(row) : null;
135
- }
136
- export async function upsertSubscriptionState(db, input) {
137
- const now = input.nowMs ?? Date.now();
138
- const stateId = input.stateId ?? DEFAULT_SYNC_STATE_ID;
139
- const bootstrapStateJson = input.bootstrapState === null || input.bootstrapState === undefined
140
- ? null
141
- : JSON.stringify(input.bootstrapState);
142
- await sql `
143
- insert into ${sql.table('sync_subscription_state')} (
144
- ${sql.ref('state_id')},
145
- ${sql.ref('subscription_id')},
146
- ${sql.ref('table')},
147
- ${sql.ref('scopes_json')},
148
- ${sql.ref('params_json')},
149
- ${sql.ref('cursor')},
150
- ${sql.ref('bootstrap_state_json')},
151
- ${sql.ref('status')},
152
- ${sql.ref('created_at')},
153
- ${sql.ref('updated_at')}
154
- ) values (
155
- ${sql.val(stateId)},
156
- ${sql.val(input.subscriptionId)},
157
- ${sql.val(input.table)},
158
- ${sql.val(JSON.stringify(input.scopes ?? {}))},
159
- ${sql.val(JSON.stringify(input.params ?? {}))},
160
- ${sql.val(input.cursor)},
161
- ${sql.val(bootstrapStateJson)},
162
- ${sql.val(input.status ?? 'active')},
163
- ${sql.val(now)},
164
- ${sql.val(now)}
165
- )
166
- on conflict (${sql.join([sql.ref('state_id'), sql.ref('subscription_id')])})
167
- do update set
168
- ${sql.ref('table')} = ${sql.val(input.table)},
169
- ${sql.ref('scopes_json')} = ${sql.val(JSON.stringify(input.scopes ?? {}))},
170
- ${sql.ref('params_json')} = ${sql.val(JSON.stringify(input.params ?? {}))},
171
- ${sql.ref('cursor')} = ${sql.val(input.cursor)},
172
- ${sql.ref('bootstrap_state_json')} = ${sql.val(bootstrapStateJson)},
173
- ${sql.ref('status')} = ${sql.val(input.status ?? 'active')},
174
- ${sql.ref('updated_at')} = ${sql.val(now)}
175
- `.execute(db);
176
- const next = await getSubscriptionState(db, {
177
- stateId,
178
- subscriptionId: input.subscriptionId,
179
- });
180
- if (!next) {
181
- throw new Error(`[subscription-state] Failed to load upserted state for "${input.subscriptionId}"`);
182
- }
183
- return next;
184
- }
185
- //# sourceMappingURL=subscription-state.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"subscription-state.js","sourceRoot":"","sources":["../src/subscription-state.ts"],"names":[],"mappings":"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"}
@@ -1,34 +0,0 @@
1
- /**
2
- * @syncular/client - High-level sync loops
3
- *
4
- * Helpers that run push/pull repeatedly until the client is caught up.
5
- */
6
- import type { SyncPullResponse, SyncSubscriptionRequest, SyncTransport } from '@syncular/core';
7
- import type { Kysely } from 'kysely';
8
- import type { ClientHandlerCollection } from './handlers/collection';
9
- import { type SyncPushOnceOptions } from './push-engine';
10
- import type { SyncClientDb } from './schema';
11
- export interface SyncOnceOptions {
12
- clientId: string;
13
- actorId?: string;
14
- plugins?: SyncPushOnceOptions['plugins'];
15
- subscriptions: Array<Omit<SyncSubscriptionRequest, 'cursor'>>;
16
- limitCommits?: number;
17
- limitSnapshotRows?: number;
18
- maxSnapshotPages?: number;
19
- dedupeRows?: boolean;
20
- stateId?: string;
21
- maxPushCommits?: number;
22
- maxPullRounds?: number;
23
- /** When 'ws', peek outbox first and skip push if empty. */
24
- trigger?: 'ws' | 'local' | 'poll';
25
- /** Custom SHA-256 hash function (for platforms without crypto.subtle) */
26
- sha256?: (bytes: Uint8Array) => Promise<string>;
27
- }
28
- export interface SyncOnceResult {
29
- pushedCommits: number;
30
- pullRounds: number;
31
- pullResponse: SyncPullResponse;
32
- }
33
- export declare function syncOnce<DB extends SyncClientDb>(db: Kysely<DB>, transport: SyncTransport, handlers: ClientHandlerCollection<DB>, options: SyncOnceOptions): Promise<SyncOnceResult>;
34
- //# sourceMappingURL=sync-loop.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-loop.d.ts","sourceRoot":"","sources":["../src/sync-loop.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,gBAAgB,EAIhB,uBAAuB,EACvB,aAAa,EACd,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAErC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAgBrE,OAAO,EAAE,KAAK,mBAAmB,EAAgB,MAAM,eAAe,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AA0H7C,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,mBAAmB,CAAC,SAAS,CAAC,CAAC;IACzC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,IAAI,GAAG,OAAO,GAAG,MAAM,CAAC;IAClC,yEAAyE;IACzE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,cAAc;IAC7B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,gBAAgB,CAAC;CAChC;AAkMD,wBAAsB,QAAQ,CAAC,EAAE,SAAS,YAAY,EACpD,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,EACd,SAAS,EAAE,aAAa,EACxB,QAAQ,EAAE,uBAAuB,CAAC,EAAE,CAAC,EACrC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CAEzB"}