@syncular/client 0.1.2 → 0.2.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 (233) hide show
  1. package/README.md +227 -709
  2. package/dist/apply.d.ts +80 -0
  3. package/dist/apply.js +301 -0
  4. package/dist/blob.d.ts +127 -0
  5. package/dist/blob.js +201 -0
  6. package/dist/bun-database.d.ts +22 -0
  7. package/dist/bun-database.js +61 -0
  8. package/dist/client.d.ts +320 -69
  9. package/dist/client.js +1627 -163
  10. package/dist/content-type.d.ts +2 -0
  11. package/dist/content-type.js +2 -0
  12. package/dist/database.d.ts +35 -80
  13. package/dist/database.js +32 -947
  14. package/dist/encryption.d.ts +47 -0
  15. package/dist/encryption.js +75 -0
  16. package/dist/errors.d.ts +8 -22
  17. package/dist/errors.js +10 -207
  18. package/dist/http.d.ts +32 -0
  19. package/dist/http.js +196 -0
  20. package/dist/index.d.ts +28 -16
  21. package/dist/index.js +25 -12
  22. package/dist/invalidation.d.ts +69 -0
  23. package/dist/invalidation.js +84 -0
  24. package/dist/leader-lock.d.ts +28 -0
  25. package/dist/leader-lock.js +38 -0
  26. package/dist/multi-tab.d.ts +134 -0
  27. package/dist/multi-tab.js +399 -0
  28. package/dist/node-database.d.ts +41 -0
  29. package/dist/node-database.js +133 -0
  30. package/dist/outbox.d.ts +56 -0
  31. package/dist/outbox.js +140 -0
  32. package/dist/schema.d.ts +107 -0
  33. package/dist/schema.js +267 -0
  34. package/dist/state.d.ts +40 -0
  35. package/dist/state.js +77 -0
  36. package/dist/transport.d.ts +44 -0
  37. package/dist/transport.js +7 -0
  38. package/dist/wasm-database.d.ts +30 -0
  39. package/dist/wasm-database.js +170 -0
  40. package/dist/window.d.ts +64 -0
  41. package/dist/window.js +0 -0
  42. package/dist/worker-entry.d.ts +16 -2
  43. package/dist/worker-entry.js +300 -456
  44. package/dist/worker-host.d.ts +174 -0
  45. package/dist/worker-host.js +536 -0
  46. package/dist/worker-protocol.d.ts +173 -61
  47. package/dist/worker-protocol.js +7 -16
  48. package/package.json +45 -112
  49. package/src/apply.ts +435 -0
  50. package/src/blob.ts +333 -0
  51. package/src/bun-database.ts +75 -0
  52. package/src/client.ts +2247 -277
  53. package/src/content-type.ts +2 -0
  54. package/src/database.ts +63 -1389
  55. package/src/encryption.ts +123 -0
  56. package/src/errors.ts +11 -265
  57. package/src/http.ts +254 -0
  58. package/src/index.ts +25 -20
  59. package/src/invalidation.ts +128 -0
  60. package/src/leader-lock.ts +68 -0
  61. package/src/multi-tab.ts +550 -0
  62. package/src/node-database.ts +180 -0
  63. package/src/outbox.ts +206 -0
  64. package/src/schema.ts +397 -0
  65. package/src/state.ts +126 -0
  66. package/src/transport.ts +52 -0
  67. package/src/wasm-database.ts +279 -0
  68. package/src/window.ts +0 -0
  69. package/src/worker-entry.ts +391 -545
  70. package/src/worker-host.ts +800 -0
  71. package/src/worker-protocol.ts +204 -99
  72. package/dist/auth-leases.d.ts +0 -11
  73. package/dist/auth-leases.d.ts.map +0 -1
  74. package/dist/auth-leases.js +0 -140
  75. package/dist/auth-leases.js.map +0 -1
  76. package/dist/blob-limits.d.ts +0 -15
  77. package/dist/blob-limits.d.ts.map +0 -1
  78. package/dist/blob-limits.js +0 -66
  79. package/dist/blob-limits.js.map +0 -1
  80. package/dist/bridge-client.d.ts +0 -69
  81. package/dist/bridge-client.d.ts.map +0 -1
  82. package/dist/bridge-client.js +0 -282
  83. package/dist/bridge-client.js.map +0 -1
  84. package/dist/client-config.d.ts +0 -6
  85. package/dist/client-config.d.ts.map +0 -1
  86. package/dist/client-config.js +0 -18
  87. package/dist/client-config.js.map +0 -1
  88. package/dist/client.d.ts.map +0 -1
  89. package/dist/client.js.map +0 -1
  90. package/dist/command-history.d.ts +0 -35
  91. package/dist/command-history.d.ts.map +0 -1
  92. package/dist/command-history.js +0 -378
  93. package/dist/command-history.js.map +0 -1
  94. package/dist/console-diagnostics.d.ts +0 -33
  95. package/dist/console-diagnostics.d.ts.map +0 -1
  96. package/dist/console-diagnostics.js +0 -496
  97. package/dist/console-diagnostics.js.map +0 -1
  98. package/dist/crdt-yjs/index.d.ts +0 -4
  99. package/dist/crdt-yjs/index.d.ts.map +0 -1
  100. package/dist/crdt-yjs/index.js +0 -4
  101. package/dist/crdt-yjs/index.js.map +0 -1
  102. package/dist/crdt-yjs/webview-host-facade.d.ts +0 -126
  103. package/dist/crdt-yjs/webview-host-facade.d.ts.map +0 -1
  104. package/dist/crdt-yjs/webview-host-facade.js +0 -284
  105. package/dist/crdt-yjs/webview-host-facade.js.map +0 -1
  106. package/dist/crdt-yjs/yjs-document-field-adapter.d.ts +0 -153
  107. package/dist/crdt-yjs/yjs-document-field-adapter.d.ts.map +0 -1
  108. package/dist/crdt-yjs/yjs-document-field-adapter.js +0 -406
  109. package/dist/crdt-yjs/yjs-document-field-adapter.js.map +0 -1
  110. package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts +0 -73
  111. package/dist/crdt-yjs/yjs-prosemirror-bridge.d.ts.map +0 -1
  112. package/dist/crdt-yjs/yjs-prosemirror-bridge.js +0 -169
  113. package/dist/crdt-yjs/yjs-prosemirror-bridge.js.map +0 -1
  114. package/dist/database.d.ts.map +0 -1
  115. package/dist/database.js.map +0 -1
  116. package/dist/diagnostics.d.ts +0 -10
  117. package/dist/diagnostics.d.ts.map +0 -1
  118. package/dist/diagnostics.js +0 -83
  119. package/dist/diagnostics.js.map +0 -1
  120. package/dist/errors.d.ts.map +0 -1
  121. package/dist/errors.js.map +0 -1
  122. package/dist/generated-bridge.d.ts +0 -365
  123. package/dist/generated-bridge.d.ts.map +0 -1
  124. package/dist/generated-bridge.js +0 -250
  125. package/dist/generated-bridge.js.map +0 -1
  126. package/dist/index.d.ts.map +0 -1
  127. package/dist/index.js.map +0 -1
  128. package/dist/mutations.d.ts +0 -72
  129. package/dist/mutations.d.ts.map +0 -1
  130. package/dist/mutations.js +0 -63
  131. package/dist/mutations.js.map +0 -1
  132. package/dist/network.d.ts +0 -3
  133. package/dist/network.d.ts.map +0 -1
  134. package/dist/network.js +0 -17
  135. package/dist/network.js.map +0 -1
  136. package/dist/react/index.d.ts +0 -169
  137. package/dist/react/index.d.ts.map +0 -1
  138. package/dist/react/index.js +0 -628
  139. package/dist/react/index.js.map +0 -1
  140. package/dist/react-native/index.d.ts +0 -35
  141. package/dist/react-native/index.d.ts.map +0 -1
  142. package/dist/react-native/index.js +0 -49
  143. package/dist/react-native/index.js.map +0 -1
  144. package/dist/runtime-contract.d.ts +0 -13
  145. package/dist/runtime-contract.d.ts.map +0 -1
  146. package/dist/runtime-contract.js +0 -24
  147. package/dist/runtime-contract.js.map +0 -1
  148. package/dist/rust-client.d.ts +0 -106
  149. package/dist/rust-client.d.ts.map +0 -1
  150. package/dist/rust-client.js +0 -938
  151. package/dist/rust-client.js.map +0 -1
  152. package/dist/sentry.d.ts +0 -35
  153. package/dist/sentry.d.ts.map +0 -1
  154. package/dist/sentry.js +0 -155
  155. package/dist/sentry.js.map +0 -1
  156. package/dist/sql-safety.d.ts +0 -3
  157. package/dist/sql-safety.d.ts.map +0 -1
  158. package/dist/sql-safety.js +0 -62
  159. package/dist/sql-safety.js.map +0 -1
  160. package/dist/syncular-runtime-artifacts.json +0 -61
  161. package/dist/tauri/index.d.ts +0 -35
  162. package/dist/tauri/index.d.ts.map +0 -1
  163. package/dist/tauri/index.js +0 -114
  164. package/dist/tauri/index.js.map +0 -1
  165. package/dist/types.d.ts +0 -1096
  166. package/dist/types.d.ts.map +0 -1
  167. package/dist/types.js +0 -2
  168. package/dist/types.js.map +0 -1
  169. package/dist/wasm/.syncular-wasm-profile +0 -1
  170. package/dist/wasm/syncular-runtime-artifact.json +0 -21
  171. package/dist/wasm/syncular.d.ts +0 -207
  172. package/dist/wasm/syncular.js +0 -2341
  173. package/dist/wasm/syncular_bg.wasm +0 -0
  174. package/dist/wasm/syncular_bg.wasm.d.ts +0 -97
  175. package/dist/wasm-bindings/runtime-contract.d.ts +0 -22
  176. package/dist/wasm-bindings/runtime-contract.d.ts.map +0 -1
  177. package/dist/wasm-bindings/runtime-contract.js +0 -112
  178. package/dist/wasm-bindings/runtime-contract.js.map +0 -1
  179. package/dist/wasm-core/.syncular-wasm-profile +0 -1
  180. package/dist/wasm-core/syncular-runtime-artifact.json +0 -17
  181. package/dist/wasm-core/syncular.d.ts +0 -162
  182. package/dist/wasm-core/syncular.js +0 -1847
  183. package/dist/wasm-core/syncular_bg.wasm +0 -0
  184. package/dist/wasm-core/syncular_bg.wasm.d.ts +0 -77
  185. package/dist/wasm-perf/.syncular-wasm-profile +0 -1
  186. package/dist/wasm-perf/syncular-runtime-artifact.json +0 -21
  187. package/dist/wasm-perf/syncular.d.ts +0 -207
  188. package/dist/wasm-perf/syncular.js +0 -2341
  189. package/dist/wasm-perf/syncular_bg.wasm +0 -0
  190. package/dist/wasm-perf/syncular_bg.wasm.d.ts +0 -97
  191. package/dist/wasm-runtime.d.ts +0 -23
  192. package/dist/wasm-runtime.d.ts.map +0 -1
  193. package/dist/wasm-runtime.js +0 -69
  194. package/dist/wasm-runtime.js.map +0 -1
  195. package/dist/worker-client.d.ts +0 -123
  196. package/dist/worker-client.d.ts.map +0 -1
  197. package/dist/worker-client.js +0 -1735
  198. package/dist/worker-client.js.map +0 -1
  199. package/dist/worker-entry.d.ts.map +0 -1
  200. package/dist/worker-entry.js.map +0 -1
  201. package/dist/worker-protocol.d.ts.map +0 -1
  202. package/dist/worker-protocol.js.map +0 -1
  203. package/dist/worker-realtime.d.ts +0 -39
  204. package/dist/worker-realtime.d.ts.map +0 -1
  205. package/dist/worker-realtime.js +0 -677
  206. package/dist/worker-realtime.js.map +0 -1
  207. package/src/auth-leases.ts +0 -251
  208. package/src/blob-limits.ts +0 -98
  209. package/src/bridge-client.ts +0 -512
  210. package/src/client-config.ts +0 -29
  211. package/src/command-history.ts +0 -623
  212. package/src/console-diagnostics.ts +0 -617
  213. package/src/crdt-yjs/index.ts +0 -3
  214. package/src/crdt-yjs/webview-host-facade.ts +0 -477
  215. package/src/crdt-yjs/yjs-document-field-adapter.ts +0 -733
  216. package/src/crdt-yjs/yjs-prosemirror-bridge.ts +0 -272
  217. package/src/diagnostics.ts +0 -116
  218. package/src/generated-bridge.ts +0 -741
  219. package/src/mutations.ts +0 -168
  220. package/src/network.ts +0 -32
  221. package/src/react/index.ts +0 -1036
  222. package/src/react-native/index.ts +0 -152
  223. package/src/runtime-contract.ts +0 -48
  224. package/src/rust-client.ts +0 -1491
  225. package/src/sentry.ts +0 -215
  226. package/src/sql-safety.ts +0 -61
  227. package/src/tauri/index.ts +0 -211
  228. package/src/types.ts +0 -1397
  229. package/src/wasm-bindings/generated-wasm-bindings.d.ts +0 -70
  230. package/src/wasm-bindings/runtime-contract.ts +0 -158
  231. package/src/wasm-runtime.ts +0 -145
  232. package/src/worker-client.ts +0 -2289
  233. package/src/worker-realtime.ts +0 -843
@@ -0,0 +1,2 @@
1
+ /** SSP2 body content type (SPEC.md §1.1). */
2
+ export declare const SSP2_CONTENT_TYPE = "application/vnd.syncular.sync.v2";
@@ -0,0 +1,2 @@
1
+ /** SSP2 body content type (SPEC.md §1.1). */
2
+ export const SSP2_CONTENT_TYPE = 'application/vnd.syncular.sync.v2';
@@ -1,83 +1,38 @@
1
- import { type BlobRef, type ColumnCodecDialect, type ColumnCodecSource, type SyncAuthLeaseIssueRequest, type SyncOperation } from '@syncular/core';
2
- import { type Dialect, Kysely } from 'kysely';
3
- import { SyncularClientLifecycle, type SyncularClientStatus, type SyncularConflictsClientLike, type SyncularPresenceClientLike } from './client';
4
- import { type MutationsApi, type MutationsCommitFn } from './mutations';
5
- import type { CreateSyncularDatabaseOptions, SyncularAuthLeaseRecord, SyncularBlobStoreOptions, SyncularBlobs, SyncularClientEventSink, SyncularClientEventType, SyncularDiagnosticSnapshot, SyncularLiveQueries, SyncularRuntimeClient, SyncularSubscriptionSpec, SyncularSyncRequestOptions, SyncularSyncResult, SyncularTableConfigMap } from './types';
6
- export interface SyncularDialect extends Dialect, SyncularLiveQueries {
7
- destroyLiveQueries(): Promise<void>;
8
- }
9
- export interface SyncularDialectOptions {
10
- appTables?: readonly string[];
11
- tableConfig?: SyncularTableConfigMap;
12
- unsafeWrites?: boolean;
13
- }
14
- export interface SyncularDatabase<DB> extends SyncularLiveQueries {
15
- db: Kysely<DB>;
16
- client: SyncularRuntimeClient;
17
- dialect: SyncularDialect;
18
- mutations: MutationsApi<DB, undefined>;
19
- leasedMutations: MutationsApi<DB, undefined>;
20
- blobs: SyncularBlobs;
1
+ /**
2
+ * Storage abstraction (REVISE B3): the client core runs on any SQLite that
3
+ * implements this minimal synchronous surface. Tests use bun:sqlite
4
+ * (`./bun-database`); browsers use sqlite-wasm + OPFS (`./wasm-database`).
5
+ * Methods are synchronous because both backends execute synchronously once
6
+ * open only opening a database is async, which lives in the factories.
7
+ */
8
+ export type SqlValue = string | number | bigint | boolean | Uint8Array | null;
9
+ export type SqlRow = Record<string, SqlValue>;
10
+ export interface ClientDatabase {
11
+ /** Execute a single statement (no result rows). */
12
+ exec(sql: string, params?: readonly SqlValue[]): void;
13
+ /** Execute a single statement and return its rows as objects. */
14
+ query(sql: string, params?: readonly SqlValue[]): SqlRow[];
21
15
  /**
22
- * The sync lifecycle owned by this database. It starts automatically while
23
- * the database opens (remote mode, unless `lifecycle.autoStart` is false)
24
- * and stops on `close()`. Reach for it directly only for advanced control;
25
- * `start`/`stop`/`sync` proxy to it.
16
+ * Run `fn` atomically. Nested calls are savepoints: an inner failure
17
+ * rolls back only the inner scope.
26
18
  */
27
- lifecycle: SyncularClientLifecycle;
28
- start(): Promise<void>;
29
- stop(): Promise<void>;
30
- sync(): Promise<SyncularSyncResult>;
31
- on<T extends SyncularClientEventType>(event: T, listener: SyncularClientEventSink<T>): () => void;
32
- getStatus(): SyncularClientStatus;
33
- setSubscriptions(subscriptions: readonly SyncularSubscriptionSpec[]): Promise<void>;
34
- resumeFromBackground(options?: SyncularSyncRequestOptions): Promise<SyncularSyncResult>;
35
- issueAuthLease(request: SyncAuthLeaseIssueRequest): Promise<SyncularAuthLeaseRecord>;
36
- upsertAuthLease(lease: SyncularAuthLeaseRecord): Promise<void>;
37
- authLease(leaseId: string): Promise<SyncularAuthLeaseRecord | null>;
38
- activeAuthLeases(actorId?: string | null, nowMs?: number): Promise<SyncularAuthLeaseRecord[]>;
39
- diagnosticSnapshot(): Promise<SyncularDiagnosticSnapshot>;
40
- presence: SyncularPresenceClientLike;
41
- conflicts: SyncularConflictsClientLike;
42
- close(): Promise<void>;
43
- }
44
- export declare function withSyncularSchemaWrites<DB, Result>(database: Pick<SyncularDatabase<DB>, 'client'>, callback: (db: Kysely<any>) => Promise<Result>): Promise<Result>;
45
- export interface SyncularMutationsMeta {
46
- operations: SyncOperation[];
47
- localMutations: Array<{
48
- table: string;
49
- rowId: string;
50
- op: 'upsert' | 'delete';
51
- }>;
52
- clientCommitIds: string[];
53
- }
54
- export interface SyncularMutationsOptions {
55
- client: Pick<SyncularRuntimeClient, 'applyMutation' | 'applyMutationsBatch' | 'applyMutationsCommit' | 'applyYjsEnvelopeToPayload' | 'executeSql'> & Partial<Pick<SyncularRuntimeClient, 'applyLeasedMutation' | 'applyLeasedMutationsCommit'>>;
56
- requireAuthLease?: boolean;
57
- codecs?: ColumnCodecSource;
58
- codecDialect?: ColumnCodecDialect;
59
- idColumn?: string;
60
- versionColumn?: string | null;
61
- omitColumns?: string[];
62
- tableConfig?: SyncularTableConfigMap;
63
- readBaseVersion?: (args: {
64
- table: string;
65
- rowId: string;
66
- idColumn: string;
67
- versionColumn: string;
68
- }) => Promise<number | null>;
69
- afterCommit?: (meta: SyncularMutationsMeta) => void | Promise<void>;
19
+ transaction<T>(fn: () => T): T;
20
+ /**
21
+ * Optional sqlite-image capability (SPEC §5.3): expose `bytes` as an
22
+ * attached read-only database schema named `alias` for the duration of
23
+ * `fn`, then detach. Presence of this method is what makes the client
24
+ * advertise `accept` bit 2 (§4.2). MUST be called outside any open
25
+ * transaction (SQLite cannot ATTACH inside one); `fn` may open its own.
26
+ */
27
+ withSqliteImage?<T>(bytes: Uint8Array, alias: string, fn: () => T): T;
28
+ close(): void;
70
29
  }
71
- export declare function createSyncularDatabase<DB>(options: CreateSyncularDatabaseOptions): Promise<SyncularDatabase<DB>>;
72
- export declare function createSyncularBlobClient(client: Pick<SyncularRuntimeClient, 'storeBlob' | 'retrieveBlob' | 'isBlobLocal' | 'processBlobUploadQueue' | 'blobUploadQueueStats' | 'blobCacheStats' | 'pruneBlobCache' | 'clearBlobCache'>, hooks?: {
73
- limits?: CreateSyncularDatabaseOptions['blobLimits'];
74
- diagnostics?: CreateSyncularDatabaseOptions['diagnostics'];
75
- afterStore?: (args: {
76
- ref: BlobRef;
77
- options?: SyncularBlobStoreOptions;
78
- }) => void | Promise<void>;
79
- }): SyncularBlobs;
80
- export declare function createSyncularDialect(client: SyncularRuntimeClient, options?: SyncularDialectOptions): SyncularDialect;
81
- export declare function createSyncularMutations<DB>(options: SyncularMutationsOptions): MutationsApi<DB, undefined>;
82
- export declare function createSyncularCommit<DB>(options: SyncularMutationsOptions): MutationsCommitFn<DB, SyncularMutationsMeta, undefined>;
83
- //# sourceMappingURL=database.d.ts.map
30
+ /** Attach-schema aliases are code-chosen, never user input — enforce it. */
31
+ export declare function assertImageAlias(alias: string): void;
32
+ /**
33
+ * Savepoint-based transaction helper shared by database implementations.
34
+ * `run` executes a parameterless statement.
35
+ */
36
+ export declare function runTransaction<T>(depthHolder: {
37
+ depth: number;
38
+ }, run: (sql: string) => void, fn: () => T): T;