@syncular/client 0.0.1-60

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 (176) hide show
  1. package/dist/blobs/index.d.ts +7 -0
  2. package/dist/blobs/index.d.ts.map +1 -0
  3. package/dist/blobs/index.js +7 -0
  4. package/dist/blobs/index.js.map +1 -0
  5. package/dist/blobs/manager.d.ts +345 -0
  6. package/dist/blobs/manager.d.ts.map +1 -0
  7. package/dist/blobs/manager.js +749 -0
  8. package/dist/blobs/manager.js.map +1 -0
  9. package/dist/blobs/migrate.d.ts +14 -0
  10. package/dist/blobs/migrate.d.ts.map +1 -0
  11. package/dist/blobs/migrate.js +59 -0
  12. package/dist/blobs/migrate.js.map +1 -0
  13. package/dist/blobs/types.d.ts +62 -0
  14. package/dist/blobs/types.d.ts.map +1 -0
  15. package/dist/blobs/types.js +5 -0
  16. package/dist/blobs/types.js.map +1 -0
  17. package/dist/client.d.ts +338 -0
  18. package/dist/client.d.ts.map +1 -0
  19. package/dist/client.js +834 -0
  20. package/dist/client.js.map +1 -0
  21. package/dist/conflicts.d.ts +31 -0
  22. package/dist/conflicts.d.ts.map +1 -0
  23. package/dist/conflicts.js +118 -0
  24. package/dist/conflicts.js.map +1 -0
  25. package/dist/create-client.d.ts +115 -0
  26. package/dist/create-client.d.ts.map +1 -0
  27. package/dist/create-client.js +162 -0
  28. package/dist/create-client.js.map +1 -0
  29. package/dist/engine/SyncEngine.d.ts +215 -0
  30. package/dist/engine/SyncEngine.d.ts.map +1 -0
  31. package/dist/engine/SyncEngine.js +1066 -0
  32. package/dist/engine/SyncEngine.js.map +1 -0
  33. package/dist/engine/index.d.ts +6 -0
  34. package/dist/engine/index.d.ts.map +1 -0
  35. package/dist/engine/index.js +6 -0
  36. package/dist/engine/index.js.map +1 -0
  37. package/dist/engine/types.d.ts +230 -0
  38. package/dist/engine/types.d.ts.map +1 -0
  39. package/dist/engine/types.js +7 -0
  40. package/dist/engine/types.js.map +1 -0
  41. package/dist/handlers/create-handler.d.ts +110 -0
  42. package/dist/handlers/create-handler.d.ts.map +1 -0
  43. package/dist/handlers/create-handler.js +140 -0
  44. package/dist/handlers/create-handler.js.map +1 -0
  45. package/dist/handlers/registry.d.ts +15 -0
  46. package/dist/handlers/registry.d.ts.map +1 -0
  47. package/dist/handlers/registry.js +29 -0
  48. package/dist/handlers/registry.js.map +1 -0
  49. package/dist/handlers/types.d.ts +83 -0
  50. package/dist/handlers/types.d.ts.map +1 -0
  51. package/dist/handlers/types.js +5 -0
  52. package/dist/handlers/types.js.map +1 -0
  53. package/dist/index.d.ts +24 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +24 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/migrate.d.ts +19 -0
  58. package/dist/migrate.d.ts.map +1 -0
  59. package/dist/migrate.js +106 -0
  60. package/dist/migrate.js.map +1 -0
  61. package/dist/mutations.d.ts +138 -0
  62. package/dist/mutations.d.ts.map +1 -0
  63. package/dist/mutations.js +611 -0
  64. package/dist/mutations.js.map +1 -0
  65. package/dist/outbox.d.ts +112 -0
  66. package/dist/outbox.d.ts.map +1 -0
  67. package/dist/outbox.js +304 -0
  68. package/dist/outbox.js.map +1 -0
  69. package/dist/plugins/incrementing-version.d.ts +34 -0
  70. package/dist/plugins/incrementing-version.d.ts.map +1 -0
  71. package/dist/plugins/incrementing-version.js +83 -0
  72. package/dist/plugins/incrementing-version.js.map +1 -0
  73. package/dist/plugins/index.d.ts +3 -0
  74. package/dist/plugins/index.d.ts.map +1 -0
  75. package/dist/plugins/index.js +3 -0
  76. package/dist/plugins/index.js.map +1 -0
  77. package/dist/plugins/types.d.ts +49 -0
  78. package/dist/plugins/types.d.ts.map +1 -0
  79. package/dist/plugins/types.js +15 -0
  80. package/dist/plugins/types.js.map +1 -0
  81. package/dist/proxy/connection.d.ts +33 -0
  82. package/dist/proxy/connection.d.ts.map +1 -0
  83. package/dist/proxy/connection.js +153 -0
  84. package/dist/proxy/connection.js.map +1 -0
  85. package/dist/proxy/dialect.d.ts +46 -0
  86. package/dist/proxy/dialect.d.ts.map +1 -0
  87. package/dist/proxy/dialect.js +58 -0
  88. package/dist/proxy/dialect.js.map +1 -0
  89. package/dist/proxy/driver.d.ts +42 -0
  90. package/dist/proxy/driver.d.ts.map +1 -0
  91. package/dist/proxy/driver.js +78 -0
  92. package/dist/proxy/driver.js.map +1 -0
  93. package/dist/proxy/index.d.ts +10 -0
  94. package/dist/proxy/index.d.ts.map +1 -0
  95. package/dist/proxy/index.js +10 -0
  96. package/dist/proxy/index.js.map +1 -0
  97. package/dist/proxy/mutations.d.ts +9 -0
  98. package/dist/proxy/mutations.d.ts.map +1 -0
  99. package/dist/proxy/mutations.js +11 -0
  100. package/dist/proxy/mutations.js.map +1 -0
  101. package/dist/pull-engine.d.ts +45 -0
  102. package/dist/pull-engine.d.ts.map +1 -0
  103. package/dist/pull-engine.js +391 -0
  104. package/dist/pull-engine.js.map +1 -0
  105. package/dist/push-engine.d.ts +18 -0
  106. package/dist/push-engine.d.ts.map +1 -0
  107. package/dist/push-engine.js +155 -0
  108. package/dist/push-engine.js.map +1 -0
  109. package/dist/query/FingerprintCollector.d.ts +18 -0
  110. package/dist/query/FingerprintCollector.d.ts.map +1 -0
  111. package/dist/query/FingerprintCollector.js +28 -0
  112. package/dist/query/FingerprintCollector.js.map +1 -0
  113. package/dist/query/QueryContext.d.ts +33 -0
  114. package/dist/query/QueryContext.d.ts.map +1 -0
  115. package/dist/query/QueryContext.js +16 -0
  116. package/dist/query/QueryContext.js.map +1 -0
  117. package/dist/query/fingerprint.d.ts +61 -0
  118. package/dist/query/fingerprint.d.ts.map +1 -0
  119. package/dist/query/fingerprint.js +91 -0
  120. package/dist/query/fingerprint.js.map +1 -0
  121. package/dist/query/index.d.ts +7 -0
  122. package/dist/query/index.d.ts.map +1 -0
  123. package/dist/query/index.js +7 -0
  124. package/dist/query/index.js.map +1 -0
  125. package/dist/query/tracked-select.d.ts +18 -0
  126. package/dist/query/tracked-select.d.ts.map +1 -0
  127. package/dist/query/tracked-select.js +90 -0
  128. package/dist/query/tracked-select.js.map +1 -0
  129. package/dist/schema.d.ts +83 -0
  130. package/dist/schema.d.ts.map +1 -0
  131. package/dist/schema.js +7 -0
  132. package/dist/schema.js.map +1 -0
  133. package/dist/sync-loop.d.ts +32 -0
  134. package/dist/sync-loop.d.ts.map +1 -0
  135. package/dist/sync-loop.js +249 -0
  136. package/dist/sync-loop.js.map +1 -0
  137. package/dist/utils/id.d.ts +8 -0
  138. package/dist/utils/id.d.ts.map +1 -0
  139. package/dist/utils/id.js +19 -0
  140. package/dist/utils/id.js.map +1 -0
  141. package/package.json +58 -0
  142. package/src/blobs/index.ts +7 -0
  143. package/src/blobs/manager.ts +1027 -0
  144. package/src/blobs/migrate.ts +67 -0
  145. package/src/blobs/types.ts +84 -0
  146. package/src/client.ts +1222 -0
  147. package/src/conflicts.ts +180 -0
  148. package/src/create-client.ts +297 -0
  149. package/src/engine/SyncEngine.ts +1337 -0
  150. package/src/engine/index.ts +6 -0
  151. package/src/engine/types.ts +268 -0
  152. package/src/handlers/create-handler.ts +287 -0
  153. package/src/handlers/registry.ts +36 -0
  154. package/src/handlers/types.ts +102 -0
  155. package/src/index.ts +25 -0
  156. package/src/migrate.ts +122 -0
  157. package/src/mutations.ts +926 -0
  158. package/src/outbox.ts +397 -0
  159. package/src/plugins/incrementing-version.ts +133 -0
  160. package/src/plugins/index.ts +2 -0
  161. package/src/plugins/types.ts +63 -0
  162. package/src/proxy/connection.ts +191 -0
  163. package/src/proxy/dialect.ts +76 -0
  164. package/src/proxy/driver.ts +126 -0
  165. package/src/proxy/index.ts +10 -0
  166. package/src/proxy/mutations.ts +18 -0
  167. package/src/pull-engine.ts +518 -0
  168. package/src/push-engine.ts +201 -0
  169. package/src/query/FingerprintCollector.ts +29 -0
  170. package/src/query/QueryContext.ts +54 -0
  171. package/src/query/fingerprint.ts +109 -0
  172. package/src/query/index.ts +10 -0
  173. package/src/query/tracked-select.ts +139 -0
  174. package/src/schema.ts +94 -0
  175. package/src/sync-loop.ts +368 -0
  176. package/src/utils/id.ts +20 -0
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @syncular/client - Blob storage exports
3
+ */
4
+ export * from './manager';
5
+ export * from './migrate';
6
+ export * from './types';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/blobs/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @syncular/client - Blob storage exports
3
+ */
4
+ export * from './manager';
5
+ export * from './migrate';
6
+ export * from './types';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/blobs/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,345 @@
1
+ /**
2
+ * @syncular/client - Client-side blob manager
3
+ *
4
+ * Handles blob upload/download with:
5
+ * - Local caching for offline access
6
+ * - Upload queue for offline uploads
7
+ * - SHA-256 hash computation
8
+ * - Optional client-side encryption
9
+ */
10
+ import type { BlobTransport } from '@syncular/core';
11
+ import type { Kysely } from 'kysely';
12
+ import type { BlobUploadStatus, SyncBlobClientDb } from './types';
13
+ export type { BlobTransport } from '@syncular/core';
14
+ interface BlobEncryption {
15
+ /**
16
+ * Encrypt blob content.
17
+ * Returns encrypted bytes and the key ID used.
18
+ */
19
+ encrypt(data: Uint8Array, options?: {
20
+ keyId?: string;
21
+ }): Promise<{
22
+ encrypted: Uint8Array;
23
+ keyId: string;
24
+ }>;
25
+ /**
26
+ * Decrypt blob content.
27
+ */
28
+ decrypt(data: Uint8Array, keyId: string): Promise<Uint8Array>;
29
+ }
30
+ export interface ClientBlobManagerOptions {
31
+ /** Kysely database instance */
32
+ db: Kysely<SyncBlobClientDb>;
33
+ /** Blob transport for server communication */
34
+ transport: BlobTransport;
35
+ /** Optional encryption handler */
36
+ encryption?: BlobEncryption;
37
+ /** Maximum cache size in bytes. Default: 100MB */
38
+ maxCacheSize?: number;
39
+ /** Maximum retry attempts for uploads. Default: 3 */
40
+ maxUploadRetries?: number;
41
+ /** Custom fetch function for blob uploads/downloads. Default: globalThis.fetch */
42
+ fetch?: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
43
+ }
44
+ export interface UploadOptions {
45
+ /** Encrypt the blob before uploading */
46
+ encrypt?: boolean;
47
+ /** Specific encryption key ID to use */
48
+ keyId?: string;
49
+ /** Skip queuing and upload immediately (blocks until complete) */
50
+ immediate?: boolean;
51
+ }
52
+ export interface DownloadOptions {
53
+ /** Skip cache lookup and always fetch from server */
54
+ skipCache?: boolean;
55
+ /** Update last_accessed_at in cache */
56
+ updateAccessTime?: boolean;
57
+ }
58
+ /**
59
+ * Create a client-side blob manager.
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const blobManager = createClientBlobManager({
64
+ * db,
65
+ * transport: {
66
+ * async initiateUpload(args) {
67
+ * const res = await fetch('/api/sync/blobs/upload', {
68
+ * method: 'POST',
69
+ * body: JSON.stringify(args),
70
+ * });
71
+ * return res.json();
72
+ * },
73
+ * async completeUpload(hash) {
74
+ * const res = await fetch(`/api/sync/blobs/${hash}/complete`, { method: 'POST' });
75
+ * return res.json();
76
+ * },
77
+ * async getDownloadUrl(hash) {
78
+ * const res = await fetch(`/api/sync/blobs/${hash}/url`);
79
+ * return res.json();
80
+ * },
81
+ * },
82
+ * });
83
+ *
84
+ * // Upload a file
85
+ * const blobRef = await blobManager.upload(file);
86
+ *
87
+ * // Download a blob
88
+ * const blob = await blobManager.download(blobRef);
89
+ * ```
90
+ */
91
+ export declare function createClientBlobManager(options: ClientBlobManagerOptions): {
92
+ /**
93
+ * Upload a blob to the server.
94
+ *
95
+ * If `immediate` is false (default), the blob is queued for background upload.
96
+ * If `immediate` is true, the upload blocks until complete.
97
+ */
98
+ upload(data: Blob | File | Uint8Array<ArrayBufferLike>, opts?: UploadOptions | undefined): Promise<{
99
+ hash: string;
100
+ size: number;
101
+ mimeType: string;
102
+ encrypted?: boolean | undefined;
103
+ keyId?: string | undefined;
104
+ }>;
105
+ /**
106
+ * Download a blob.
107
+ *
108
+ * First checks the local cache, then fetches from server if needed.
109
+ * Automatically decrypts if the blob was encrypted.
110
+ */
111
+ download(ref: {
112
+ hash: string;
113
+ size: number;
114
+ mimeType: string;
115
+ encrypted?: boolean | undefined;
116
+ keyId?: string | undefined;
117
+ }, opts?: DownloadOptions | undefined): Promise<Uint8Array<ArrayBufferLike>>;
118
+ /**
119
+ * Check if a blob is cached locally.
120
+ */
121
+ isCached(hash: string): Promise<boolean>;
122
+ /**
123
+ * Get a blob URL for display.
124
+ *
125
+ * Returns a blob: URL if cached locally, or fetches and creates one.
126
+ */
127
+ getBlobUrl(ref: {
128
+ hash: string;
129
+ size: number;
130
+ mimeType: string;
131
+ encrypted?: boolean | undefined;
132
+ keyId?: string | undefined;
133
+ }): Promise<string>;
134
+ /**
135
+ * Preload blobs into the cache.
136
+ */
137
+ preload(refs: {
138
+ hash: string;
139
+ size: number;
140
+ mimeType: string;
141
+ encrypted?: boolean | undefined;
142
+ keyId?: string | undefined;
143
+ }[]): Promise<void>;
144
+ /**
145
+ * Process pending uploads in the outbox.
146
+ *
147
+ * Call this periodically or when online to sync pending uploads.
148
+ * Returns the number of blobs processed.
149
+ */
150
+ processUploadQueue(): Promise<{
151
+ uploaded: number;
152
+ failed: number;
153
+ errors: {
154
+ hash: string;
155
+ error: string;
156
+ }[];
157
+ }>;
158
+ /**
159
+ * Get the status of a pending upload.
160
+ */
161
+ getUploadStatus(hash: string): Promise<{
162
+ status: BlobUploadStatus;
163
+ error?: string | undefined;
164
+ } | null>;
165
+ /**
166
+ * Clear failed uploads from the outbox.
167
+ */
168
+ clearFailedUploads(): Promise<number>;
169
+ /**
170
+ * Retry a failed upload.
171
+ */
172
+ retryUpload(hash: string): Promise<boolean>;
173
+ /**
174
+ * Prune the cache to stay under maxCacheSize.
175
+ * Uses LRU (least recently used) eviction.
176
+ */
177
+ pruneCache(): Promise<{
178
+ evicted: number;
179
+ freedBytes: number;
180
+ }>;
181
+ /**
182
+ * Clear the entire cache.
183
+ */
184
+ clearCache(): Promise<number>;
185
+ /**
186
+ * Get cache statistics.
187
+ */
188
+ getCacheStats(): Promise<{
189
+ count: number;
190
+ totalSize: number;
191
+ maxSize: number;
192
+ }>;
193
+ /**
194
+ * Get upload queue statistics.
195
+ */
196
+ getUploadQueueStats(): Promise<{
197
+ pending: number;
198
+ uploading: number;
199
+ failed: number;
200
+ total: number;
201
+ }>;
202
+ };
203
+ type ClientBlobManager = ReturnType<typeof createClientBlobManager>;
204
+ interface BlobCachePruneSchedulerOptions {
205
+ /** Client blob manager instance */
206
+ blobManager: ClientBlobManager;
207
+ /** Interval between prune runs in milliseconds. Default: 300000 (5 minutes) */
208
+ intervalMs?: number;
209
+ /** Optional: Called after each prune run */
210
+ onPrune?: (result: {
211
+ evicted: number;
212
+ freedBytes: number;
213
+ error?: Error;
214
+ }) => void;
215
+ }
216
+ /**
217
+ * Create a cache pruning scheduler for the client blob manager.
218
+ *
219
+ * Periodically prunes the cache to stay under maxCacheSize using LRU eviction.
220
+ *
221
+ * @example
222
+ * ```typescript
223
+ * const scheduler = createBlobCachePruneScheduler({
224
+ * blobManager,
225
+ * intervalMs: 5 * 60 * 1000, // 5 minutes
226
+ * onPrune: (result) => {
227
+ * if (result.evicted > 0) {
228
+ * console.log(`Cache pruned: ${result.evicted} blobs, ${result.freedBytes} bytes freed`);
229
+ * }
230
+ * },
231
+ * });
232
+ *
233
+ * // Start the scheduler
234
+ * scheduler.start();
235
+ *
236
+ * // Stop when unmounting/shutting down
237
+ * scheduler.stop();
238
+ * ```
239
+ */
240
+ export declare function createBlobCachePruneScheduler(options: BlobCachePruneSchedulerOptions): {
241
+ /**
242
+ * Start the prune scheduler.
243
+ * Optionally runs an immediate prune before starting the interval.
244
+ */
245
+ start(options?: {
246
+ immediate?: boolean | undefined;
247
+ } | undefined): void;
248
+ /**
249
+ * Stop the prune scheduler.
250
+ */
251
+ stop(): void;
252
+ /**
253
+ * Run a single prune manually.
254
+ */
255
+ runOnce(): Promise<{
256
+ evicted: number;
257
+ freedBytes: number;
258
+ error?: Error | undefined;
259
+ }>;
260
+ /**
261
+ * Check if the scheduler is currently active.
262
+ */
263
+ readonly active: boolean;
264
+ /**
265
+ * Check if a prune is currently in progress.
266
+ */
267
+ readonly running: boolean;
268
+ };
269
+ interface BlobUploadQueueSchedulerOptions {
270
+ /** Client blob manager instance */
271
+ blobManager: ClientBlobManager;
272
+ /** Interval between processing runs in milliseconds. Default: 30000 (30 seconds) */
273
+ intervalMs?: number;
274
+ /** Optional: Called after each processing run */
275
+ onProcess?: (result: {
276
+ uploaded: number;
277
+ failed: number;
278
+ errors: Array<{
279
+ hash: string;
280
+ error: string;
281
+ }>;
282
+ error?: Error;
283
+ }) => void;
284
+ }
285
+ /**
286
+ * Create an upload queue processor scheduler for the client blob manager.
287
+ *
288
+ * Periodically processes pending uploads when online.
289
+ *
290
+ * @example
291
+ * ```typescript
292
+ * const scheduler = createBlobUploadQueueScheduler({
293
+ * blobManager,
294
+ * intervalMs: 30 * 1000, // 30 seconds
295
+ * onProcess: (result) => {
296
+ * if (result.uploaded > 0) {
297
+ * console.log(`Uploaded ${result.uploaded} blobs`);
298
+ * }
299
+ * if (result.failed > 0) {
300
+ * console.warn(`Failed to upload ${result.failed} blobs`);
301
+ * }
302
+ * },
303
+ * });
304
+ *
305
+ * // Start when online
306
+ * scheduler.start();
307
+ *
308
+ * // Stop when offline or shutting down
309
+ * scheduler.stop();
310
+ * ```
311
+ */
312
+ export declare function createBlobUploadQueueScheduler(options: BlobUploadQueueSchedulerOptions): {
313
+ /**
314
+ * Start the upload queue processor.
315
+ * Optionally runs an immediate processing before starting the interval.
316
+ */
317
+ start(options?: {
318
+ immediate?: boolean | undefined;
319
+ } | undefined): void;
320
+ /**
321
+ * Stop the upload queue processor.
322
+ */
323
+ stop(): void;
324
+ /**
325
+ * Run a single processing manually.
326
+ */
327
+ runOnce(): Promise<{
328
+ uploaded: number;
329
+ failed: number;
330
+ errors: {
331
+ hash: string;
332
+ error: string;
333
+ }[];
334
+ error?: Error | undefined;
335
+ }>;
336
+ /**
337
+ * Check if the processor is currently active.
338
+ */
339
+ readonly active: boolean;
340
+ /**
341
+ * Check if processing is currently in progress.
342
+ */
343
+ readonly running: boolean;
344
+ };
345
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/blobs/manager.ts"],"names":[],"mappings":"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"}