@powersync/common 0.0.0-dev-20260630144038 → 0.0.0-dev-20261015114518

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 (48) hide show
  1. package/lib/attachments/AttachmentContext.js +2 -1
  2. package/lib/attachments/AttachmentContext.js.map +1 -1
  3. package/lib/attachments/AttachmentQueue.d.ts +98 -42
  4. package/lib/attachments/AttachmentQueue.js +103 -22
  5. package/lib/attachments/AttachmentQueue.js.map +1 -1
  6. package/lib/attachments/AttachmentTransportAdapter.d.ts +47 -0
  7. package/lib/attachments/AttachmentTransportAdapter.js +2 -0
  8. package/lib/attachments/AttachmentTransportAdapter.js.map +1 -0
  9. package/lib/attachments/BufferedAttachmentTransport.d.ts +24 -0
  10. package/lib/attachments/BufferedAttachmentTransport.js +32 -0
  11. package/lib/attachments/BufferedAttachmentTransport.js.map +1 -0
  12. package/lib/attachments/LocalStorageAdapter.d.ts +19 -0
  13. package/lib/attachments/Schema.d.ts +21 -2
  14. package/lib/attachments/Schema.js +14 -10
  15. package/lib/attachments/Schema.js.map +1 -1
  16. package/lib/attachments/SyncingService.d.ts +21 -8
  17. package/lib/attachments/SyncingService.js +59 -30
  18. package/lib/attachments/SyncingService.js.map +1 -1
  19. package/lib/client/CommonPowerSyncDatabase.d.ts +25 -1
  20. package/lib/client/connection/PowerSyncBackendConnector.d.ts +11 -0
  21. package/lib/client/connection/PowerSyncCredentials.d.ts +1 -1
  22. package/lib/client/runOnSchemaChange.js +2 -0
  23. package/lib/client/runOnSchemaChange.js.map +1 -1
  24. package/lib/client/sync/CheckpointRequest.d.ts +32 -0
  25. package/lib/client/sync/CheckpointRequest.js +2 -0
  26. package/lib/client/sync/CheckpointRequest.js.map +1 -0
  27. package/lib/client/sync/options.d.ts +42 -0
  28. package/lib/client/sync/options.js.map +1 -1
  29. package/lib/db/crud/SyncStatus.d.ts +1 -1
  30. package/lib/index.d.ts +3 -1
  31. package/lib/index.js +2 -0
  32. package/lib/index.js.map +1 -1
  33. package/package.json +4 -3
  34. package/src/attachments/AttachmentContext.ts +2 -1
  35. package/src/attachments/AttachmentQueue.ts +176 -68
  36. package/src/attachments/AttachmentTransportAdapter.ts +49 -0
  37. package/src/attachments/BufferedAttachmentTransport.ts +37 -0
  38. package/src/attachments/LocalStorageAdapter.ts +20 -0
  39. package/src/attachments/Schema.ts +29 -20
  40. package/src/attachments/SyncingService.ts +67 -34
  41. package/src/client/CommonPowerSyncDatabase.ts +26 -1
  42. package/src/client/connection/PowerSyncBackendConnector.ts +12 -0
  43. package/src/client/connection/PowerSyncCredentials.ts +1 -1
  44. package/src/client/runOnSchemaChange.ts +2 -0
  45. package/src/client/sync/CheckpointRequest.ts +31 -0
  46. package/src/client/sync/options.ts +44 -0
  47. package/src/db/crud/SyncStatus.ts +1 -1
  48. package/src/index.ts +9 -1
@@ -189,8 +189,9 @@ export class AttachmentContext {
189
189
  ?
190
190
  `, [AttachmentState.ARCHIVED, limit, this.archivedCacheLimit]);
191
191
  const archivedAttachments = results.map(attachmentFromSql);
192
+ // Nothing above the cache limit, so the paginated cleanup in `expireCache` is complete.
192
193
  if (archivedAttachments.length === 0)
193
- return false;
194
+ return true;
194
195
  await callback?.(archivedAttachments);
195
196
  this.logger.log({
196
197
  level: LogLevels.info,
@@ -1 +1 @@
1
- {"version":3,"file":"AttachmentContext.js","sourceRoot":"","sources":["../../src/attachments/AttachmentContext.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AttachmentContext.js","sourceRoot":"","sources":["../../src/attachments/AttachmentContext.ts"],"names":[],"mappings":"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"}
@@ -2,30 +2,29 @@ import { PowerSyncLogger } from '../utils/Logger.js';
2
2
  import { Transaction } from '../db/DBAdapter.js';
3
3
  import { AttachmentContext } from './AttachmentContext.js';
4
4
  import { AttachmentErrorHandler } from './AttachmentErrorHandler.js';
5
- import { AttachmentData, LocalStorageAdapter } from './LocalStorageAdapter.js';
5
+ import { AttachmentTransportAdapter } from './AttachmentTransportAdapter.js';
6
+ import { AttachmentData, LocalStorageAdapter, StreamingLocalStorageAdapter } from './LocalStorageAdapter.js';
6
7
  import { RemoteStorageAdapter } from './RemoteStorageAdapter.js';
7
8
  import { AttachmentRecord } from './Schema.js';
8
9
  import { WatchedAttachmentItem } from './WatchedAttachmentItem.js';
9
10
  import { CommonPowerSyncDatabase } from '../client/CommonPowerSyncDatabase.js';
10
11
  /**
11
- * Configuration options for {@link AttachmentQueue}.
12
+ * Fields common to every {@link AttachmentQueueOptions} variant.
12
13
  *
13
14
  * @experimental
14
15
  * @alpha This is currently experimental and may change without a major version bump.
15
16
  */
16
- export interface AttachmentQueueOptions {
17
+ export interface BaseAttachmentQueueOptions<TLocal extends LocalStorageAdapter = LocalStorageAdapter> {
17
18
  /**
18
19
  * PowerSync database instance
19
20
  */
20
21
  db: CommonPowerSyncDatabase;
21
22
  /**
22
- * Remote storage adapter for upload/download operations
23
+ * Local storage adapter for file persistence. Its type determines whether
24
+ * {@link AttachmentQueue.saveFileFromUri} is available (a
25
+ * {@link StreamingLocalStorageAdapter} enables it).
23
26
  */
24
- remoteStorage: RemoteStorageAdapter;
25
- /**
26
- * Local storage adapter for file persistence
27
- */
28
- localStorage: LocalStorageAdapter;
27
+ localStorage: TLocal;
29
28
  /**
30
29
  * Callback for monitoring attachment changes in your data model
31
30
  */
@@ -57,6 +56,48 @@ export interface AttachmentQueueOptions {
57
56
  /** Handler for upload, download and delete errors */
58
57
  errorHandler?: AttachmentErrorHandler;
59
58
  }
59
+ /**
60
+ * Configuration options for {@link AttachmentQueue}.
61
+ *
62
+ * Provide **exactly one** remote mechanism:
63
+ * - `remoteStorage` — a {@link RemoteStorageAdapter}, wrapped in the default
64
+ * default buffered transport that delegates upload/download/delete to it.
65
+ * - `transportAdapter` — an {@link AttachmentTransportAdapter} that owns all remote
66
+ * operations directly (e.g. a native file-URI implementation for buffer-free
67
+ * transfer of large files). No `remoteStorage` is needed in this case.
68
+ *
69
+ * Supplying both, or neither, is a type error.
70
+ *
71
+ * @experimental
72
+ * @alpha This is currently experimental and may change without a major version bump.
73
+ */
74
+ export type AttachmentQueueOptions<TLocal extends LocalStorageAdapter = LocalStorageAdapter> = BaseAttachmentQueueOptions<TLocal> & ({
75
+ remoteStorage: RemoteStorageAdapter;
76
+ transportAdapter?: never;
77
+ } | {
78
+ transportAdapter: AttachmentTransportAdapter;
79
+ remoteStorage?: never;
80
+ });
81
+ /**
82
+ * Fields shared by {@link AttachmentQueue.saveFile} and {@link AttachmentQueue.saveFileFromUri}.
83
+ *
84
+ * @alpha
85
+ */
86
+ export interface SaveAttachmentOptions {
87
+ /** File extension (e.g., 'jpg', 'pdf') */
88
+ fileExtension: string;
89
+ /** MIME type of the file (e.g., 'image/jpeg') */
90
+ mediaType?: string;
91
+ /** Optional metadata to associate with the attachment */
92
+ metaData?: string;
93
+ /** Optional custom ID. If not provided, a UUID will be generated */
94
+ id?: string;
95
+ /**
96
+ * Optional callback to execute additional database operations within the same transaction as the
97
+ * attachment creation.
98
+ */
99
+ updateHook?: (transaction: Transaction, attachment: AttachmentRecord) => Promise<void>;
100
+ }
60
101
  /**
61
102
  * AttachmentQueue manages the lifecycle and synchronization of attachments
62
103
  * between local and remote storage.
@@ -66,15 +107,13 @@ export interface AttachmentQueueOptions {
66
107
  * @experimental
67
108
  * @alpha This is currently experimental and may change without a major version bump.
68
109
  */
69
- export declare class AttachmentQueue {
110
+ export declare class AttachmentQueue<TLocal extends LocalStorageAdapter = LocalStorageAdapter> {
70
111
  /** Timer for periodic synchronization operations */
71
112
  private periodicSyncTimer?;
72
113
  /** Service for synchronizing attachments between local and remote storage */
73
114
  private readonly syncingService;
74
115
  /** Adapter for local file storage operations */
75
- readonly localStorage: LocalStorageAdapter;
76
- /** Adapter for remote file storage operations */
77
- readonly remoteStorage: RemoteStorageAdapter;
116
+ readonly localStorage: TLocal;
78
117
  /**
79
118
  * Callback function to watch for changes in attachment references in your data model.
80
119
  *
@@ -109,12 +148,25 @@ export declare class AttachmentQueue {
109
148
  private statusListenerDispose?;
110
149
  private watchActiveAttachments;
111
150
  private watchAttachmentsAbortController;
151
+ /**
152
+ * Serializes concurrent `syncStorage()` triggers (periodic timer, watch-onDiff,
153
+ * status-changed). Held across the whole batch, but only contended by other
154
+ * sync triggers — foreground `saveFile` / `deleteFile` / watched-attachment
155
+ * processing don't take this lock and proceed in parallel via the
156
+ * `AttachmentService` mutex, which is acquired only briefly per row.
157
+ */
158
+ private syncLoopMutex;
159
+ /**
160
+ * Aborted by `stopSync()` to interrupt an in-flight batch within one
161
+ * attachment's processing time. Polled between rows by `SyncingService`.
162
+ */
163
+ private syncAbortController?;
112
164
  /**
113
165
  * Creates a new AttachmentQueue instance.
114
166
  *
115
167
  * @param options - Configuration options
116
168
  */
117
- constructor({ db, localStorage, remoteStorage, watchAttachments, logger, tableName, syncIntervalMs, syncThrottleDuration, downloadAttachments, archivedCacheLimit, errorHandler }: AttachmentQueueOptions);
169
+ constructor({ db, localStorage, remoteStorage, transportAdapter, watchAttachments, logger, tableName, syncIntervalMs, syncThrottleDuration, downloadAttachments, archivedCacheLimit, errorHandler }: AttachmentQueueOptions<TLocal>);
118
170
  /**
119
171
  * Generates a new attachment ID using a SQLite UUID function.
120
172
  *
@@ -137,14 +189,19 @@ export declare class AttachmentQueue {
137
189
  *
138
190
  * This is called automatically at regular intervals when sync is started,
139
191
  * but can also be called manually to trigger an immediate sync.
192
+ *
193
+ * Concurrent invocations are serialized via `syncLoopMutex`.
140
194
  */
141
195
  syncStorage(): Promise<void>;
142
196
  /**
143
197
  * Stops the attachment synchronization process.
144
198
  *
145
- * Clears the periodic sync timer and closes all active attachment watchers.
199
+ * Clears the periodic sync timer, closes all active attachment watchers, and
200
+ * aborts any in-flight `syncStorage()` call so it exits within one
201
+ * attachment's processing time instead of running the batch to completion.
146
202
  */
147
203
  stopSync(): Promise<void>;
204
+ private stopSyncAfterAbort;
148
205
  /**
149
206
  * Provides an {@link AttachmentContext} to a callback.
150
207
  *
@@ -154,37 +211,36 @@ export declare class AttachmentQueue {
154
211
  */
155
212
  withAttachmentContext<T>(callback: (context: AttachmentContext) => Promise<T>): Promise<T>;
156
213
  /**
157
- * Saves a file to local storage and queues it for upload to remote storage.
214
+ * Creates a `QUEUED_UPLOAD` attachment record, placing the file at the managed
215
+ * `localUri` from the given `source`, and persists the record
216
+ * alongside the caller's `updateHook` in a single transaction.
217
+ */
218
+ private createUploadAttachment;
219
+ /**
220
+ * Saves in-memory file data to local storage and queues it for upload.
158
221
  *
159
- * @param options - File save options
222
+ * @param options - File data plus {@link SaveAttachmentOptions}
160
223
  * @returns Promise resolving to the created attachment record
161
224
  */
162
- saveFile({ data, fileExtension, mediaType, metaData, id, updateHook }: {
163
- /**
164
- * The file data as ArrayBuffer, Blob, or base64 string
165
- */
225
+ saveFile(options: SaveAttachmentOptions & {
166
226
  data: AttachmentData;
167
- /**
168
- * File extension (e.g., 'jpg', 'pdf')
169
- */
170
- fileExtension: string;
171
- /**
172
- * MIME type of the file (e.g., 'image/jpeg')
173
- */
174
- mediaType?: string;
175
- /**
176
- * Optional metadata to associate with the attachment
177
- */
178
- metaData?: string;
179
- /**
180
- * Optional custom ID. If not provided, a UUID will be generated
181
- */
182
- id?: string;
183
- /**
184
- * Optional callback to execute additional database operations within the same transaction as the attachment
185
- * creation.
186
- */
187
- updateHook?: (transaction: Transaction, attachment: AttachmentRecord) => Promise<void>;
227
+ }): Promise<AttachmentRecord>;
228
+ /**
229
+ * Registers a file that already exists on disk and queues it for upload, moving it
230
+ * into managed storage without loading it into memory.
231
+ *
232
+ * Prefer this over {@link AttachmentQueue.saveFile} for large, app-originated files
233
+ * (recordings, videos): it avoids reading the file into an `ArrayBuffer` just to write
234
+ * it back to disk. Requires the local storage adapter to implement `moveFile`.
235
+ *
236
+ * Only available when the queue is configured with a {@link StreamingLocalStorageAdapter}
237
+ * (one that implements `moveFile`).
238
+ *
239
+ * @param options - The existing file's `localUri` plus {@link SaveAttachmentOptions}
240
+ * @returns Promise resolving to the created attachment record
241
+ */
242
+ saveFileFromUri(this: AttachmentQueue<StreamingLocalStorageAdapter>, options: SaveAttachmentOptions & {
243
+ localUri: string;
188
244
  }): Promise<AttachmentRecord>;
189
245
  deleteFile({ id, updateHook }: {
190
246
  id: string;
@@ -1,5 +1,6 @@
1
1
  import { LogLevels } from '../utils/Logger.js';
2
2
  import { AttachmentService } from './AttachmentService.js';
3
+ import { BufferedAttachmentTransport } from './BufferedAttachmentTransport.js';
3
4
  import { ATTACHMENT_TABLE, AttachmentState } from './Schema.js';
4
5
  import { SyncingService } from './SyncingService.js';
5
6
  /**
@@ -18,8 +19,6 @@ export class AttachmentQueue {
18
19
  syncingService;
19
20
  /** Adapter for local file storage operations */
20
21
  localStorage;
21
- /** Adapter for remote file storage operations */
22
- remoteStorage;
23
22
  /**
24
23
  * Callback function to watch for changes in attachment references in your data model.
25
24
  *
@@ -54,14 +53,27 @@ export class AttachmentQueue {
54
53
  statusListenerDispose;
55
54
  watchActiveAttachments;
56
55
  watchAttachmentsAbortController;
56
+ /**
57
+ * Serializes concurrent `syncStorage()` triggers (periodic timer, watch-onDiff,
58
+ * status-changed). Held across the whole batch, but only contended by other
59
+ * sync triggers — foreground `saveFile` / `deleteFile` / watched-attachment
60
+ * processing don't take this lock and proceed in parallel via the
61
+ * `AttachmentService` mutex, which is acquired only briefly per row.
62
+ */
63
+ syncLoopMutex;
64
+ /**
65
+ * Aborted by `stopSync()` to interrupt an in-flight batch within one
66
+ * attachment's processing time. Polled between rows by `SyncingService`.
67
+ */
68
+ syncAbortController;
57
69
  /**
58
70
  * Creates a new AttachmentQueue instance.
59
71
  *
60
72
  * @param options - Configuration options
61
73
  */
62
- constructor({ db, localStorage, remoteStorage, watchAttachments, logger, tableName = ATTACHMENT_TABLE, syncIntervalMs = 30 * 1000, syncThrottleDuration, downloadAttachments = true, archivedCacheLimit = 100, errorHandler }) {
74
+ constructor({ db, localStorage, remoteStorage, transportAdapter, watchAttachments, logger, tableName = ATTACHMENT_TABLE, syncIntervalMs = 30 * 1000, syncThrottleDuration, downloadAttachments = true, archivedCacheLimit = 100, errorHandler }) {
63
75
  this.db = db;
64
- this.remoteStorage = remoteStorage;
76
+ this.syncLoopMutex = db.createMutex();
65
77
  this.localStorage = localStorage;
66
78
  this.watchAttachments = watchAttachments;
67
79
  this.tableName = tableName;
@@ -71,7 +83,8 @@ export class AttachmentQueue {
71
83
  this.downloadAttachments = downloadAttachments;
72
84
  this.logger = logger ?? db.logger;
73
85
  this.attachmentService = new AttachmentService(db, this.logger, tableName, archivedCacheLimit);
74
- this.syncingService = new SyncingService(this.attachmentService, localStorage, remoteStorage, this.logger, errorHandler);
86
+ const transport = transportAdapter ?? new BufferedAttachmentTransport(localStorage, remoteStorage);
87
+ this.syncingService = new SyncingService(this.attachmentService, localStorage, transport, this.logger, errorHandler);
75
88
  }
76
89
  /**
77
90
  * Generates a new attachment ID using a SQLite UUID function.
@@ -92,13 +105,19 @@ export class AttachmentQueue {
92
105
  * - Handles state transitions for archived and new attachments
93
106
  */
94
107
  async startSync() {
95
- await this.stopSync();
96
- this.watchActiveAttachments = this.attachmentService.watchActiveAttachments({
97
- throttleMs: this.syncThrottleDuration
98
- });
108
+ this.syncAbortController?.abort();
109
+ const syncAbortController = (this.syncAbortController = new AbortController());
110
+ await this.stopSyncAfterAbort();
99
111
  // immediately invoke the sync storage to initialize local storage
100
112
  await this.localStorage.initialize();
101
113
  await this.verifyAttachments();
114
+ // Skip rest of setup if a stopSync() aborted this call during the async setup steps.
115
+ if (syncAbortController.signal.aborted) {
116
+ return;
117
+ }
118
+ this.watchActiveAttachments = this.attachmentService.watchActiveAttachments({
119
+ throttleMs: this.syncThrottleDuration
120
+ });
102
121
  // Sync storage periodically
103
122
  this.periodicSyncTimer = setInterval(async () => {
104
123
  await this.syncStorage();
@@ -207,21 +226,46 @@ export class AttachmentQueue {
207
226
  *
208
227
  * This is called automatically at regular intervals when sync is started,
209
228
  * but can also be called manually to trigger an immediate sync.
229
+ *
230
+ * Concurrent invocations are serialized via `syncLoopMutex`.
210
231
  */
211
232
  async syncStorage() {
212
- await this.attachmentService.withContext(async (ctx) => {
213
- const activeAttachments = await ctx.getActiveAttachments();
214
- await this.localStorage.initialize();
215
- await this.syncingService.processAttachments(activeAttachments, ctx);
216
- await this.syncingService.deleteArchivedAttachments(ctx);
217
- });
233
+ const signal = this.syncAbortController?.signal;
234
+ // We have a signal from startSync() to stopSync(), so treat the absence of one like an aborted sync.
235
+ if (signal == null || signal?.aborted)
236
+ return;
237
+ try {
238
+ await this.syncLoopMutex.runExclusive(async () => {
239
+ const activeAttachments = await this.attachmentService.withContext((ctx) => ctx.getActiveAttachments());
240
+ await this.localStorage.initialize();
241
+ await this.syncingService.processAttachments(activeAttachments, { signal });
242
+ if (signal.aborted)
243
+ return;
244
+ await this.attachmentService.withContext((ctx) => this.syncingService.deleteArchivedAttachments(ctx));
245
+ }, signal);
246
+ }
247
+ catch (error) {
248
+ // A queued batch's acquire rejects when `stopSync` aborts — expected, not an error.
249
+ if (signal.aborted)
250
+ return;
251
+ throw error;
252
+ }
218
253
  }
219
254
  /**
220
255
  * Stops the attachment synchronization process.
221
256
  *
222
- * Clears the periodic sync timer and closes all active attachment watchers.
257
+ * Clears the periodic sync timer, closes all active attachment watchers, and
258
+ * aborts any in-flight `syncStorage()` call so it exits within one
259
+ * attachment's processing time instead of running the batch to completion.
223
260
  */
224
261
  async stopSync() {
262
+ if (this.syncAbortController) {
263
+ this.syncAbortController.abort();
264
+ this.syncAbortController = undefined;
265
+ }
266
+ return this.stopSyncAfterAbort();
267
+ }
268
+ async stopSyncAfterAbort() {
225
269
  clearInterval(this.periodicSyncTimer);
226
270
  this.periodicSyncTimer = undefined;
227
271
  if (this.watchActiveAttachments)
@@ -249,16 +293,27 @@ export class AttachmentQueue {
249
293
  return this.attachmentService.withContext(callback);
250
294
  }
251
295
  /**
252
- * Saves a file to local storage and queues it for upload to remote storage.
253
- *
254
- * @param options - File save options
255
- * @returns Promise resolving to the created attachment record
296
+ * Creates a `QUEUED_UPLOAD` attachment record, placing the file at the managed
297
+ * `localUri` from the given `source`, and persists the record
298
+ * alongside the caller's `updateHook` in a single transaction.
256
299
  */
257
- async saveFile({ data, fileExtension, mediaType, metaData, id, updateHook }) {
300
+ async createUploadAttachment({ fileExtension, mediaType, metaData, id, updateHook }, source) {
258
301
  const resolvedId = id ?? (await this.generateAttachmentId());
259
302
  const filename = `${resolvedId}.${fileExtension}`;
260
303
  const localUri = this.localStorage.getLocalUri(filename);
261
- const size = await this.localStorage.saveFile(localUri, data);
304
+ let size;
305
+ if (source.kind === 'data') {
306
+ size = await this.localStorage.saveFile(localUri, source.data);
307
+ }
308
+ else {
309
+ // saveFileFromUri is only exposed for streaming-capable local adapters; guard at
310
+ // runtime too for plain-JS callers.
311
+ const localStorage = this.localStorage;
312
+ if (!localStorage.moveFile) {
313
+ throw new Error('The configured local storage adapter does not support moveFile, required by saveFileFromUri.');
314
+ }
315
+ size = await localStorage.moveFile(source.localUri, localUri);
316
+ }
262
317
  const attachment = {
263
318
  id: resolvedId,
264
319
  filename,
@@ -278,6 +333,32 @@ export class AttachmentQueue {
278
333
  });
279
334
  return attachment;
280
335
  }
336
+ /**
337
+ * Saves in-memory file data to local storage and queues it for upload.
338
+ *
339
+ * @param options - File data plus {@link SaveAttachmentOptions}
340
+ * @returns Promise resolving to the created attachment record
341
+ */
342
+ async saveFile(options) {
343
+ return this.createUploadAttachment(options, { kind: 'data', data: options.data });
344
+ }
345
+ /**
346
+ * Registers a file that already exists on disk and queues it for upload, moving it
347
+ * into managed storage without loading it into memory.
348
+ *
349
+ * Prefer this over {@link AttachmentQueue.saveFile} for large, app-originated files
350
+ * (recordings, videos): it avoids reading the file into an `ArrayBuffer` just to write
351
+ * it back to disk. Requires the local storage adapter to implement `moveFile`.
352
+ *
353
+ * Only available when the queue is configured with a {@link StreamingLocalStorageAdapter}
354
+ * (one that implements `moveFile`).
355
+ *
356
+ * @param options - The existing file's `localUri` plus {@link SaveAttachmentOptions}
357
+ * @returns Promise resolving to the created attachment record
358
+ */
359
+ async saveFileFromUri(options) {
360
+ return this.createUploadAttachment(options, { kind: 'uri', localUri: options.localUri });
361
+ }
281
362
  async deleteFile({ id, updateHook }) {
282
363
  await this.attachmentService.withContext(async (ctx) => {
283
364
  const attachment = await ctx.getAttachment(id);
@@ -1 +1 @@
1
- {"version":3,"file":"AttachmentQueue.js","sourceRoot":"","sources":["../../src/attachments/AttachmentQueue.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AttachmentQueue.js","sourceRoot":"","sources":["../../src/attachments/AttachmentQueue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ import { AttachmentRecord } from './Schema.js';
2
+ /**
3
+ * An {@link AttachmentRecord} that is guaranteed to have a `localUri`.
4
+ *
5
+ * The syncing service assigns `localUri` before invoking a transport download,
6
+ * so implementations always receive both the metadata and the destination path.
7
+ *
8
+ * @alpha
9
+ */
10
+ export type LocatedAttachmentRecord = AttachmentRecord & {
11
+ localUri: string;
12
+ };
13
+ /**
14
+ * AttachmentTransportAdapter owns all remote-side operations for an attachment —
15
+ * transfer (upload/download) and delete — as single operations.
16
+ *
17
+ * A transport owns the entire transfer, letting implementations pick the most
18
+ * efficient mechanism available (buffer, stream, or a platform-native file-URI
19
+ * upload/download API). On platforms like React Native this allows large files to
20
+ * be transferred without ever materializing them in the JS heap.
21
+ *
22
+ * The default transport composes the local and remote storage adapters. Provide a custom transport (via
23
+ * `AttachmentQueue`'s `transportAdapter` option) to own the whole remote side; in
24
+ * that case a separate `remoteStorage` is not required.
25
+ *
26
+ * @experimental
27
+ * @alpha This is currently experimental and may change without a major version bump.
28
+ */
29
+ export interface AttachmentTransportAdapter {
30
+ /**
31
+ * Uploads the attachment's local file to remote storage.
32
+ * @param attachment - The attachment to upload. `localUri` points at the source file.
33
+ */
34
+ upload(attachment: LocatedAttachmentRecord): Promise<void>;
35
+ /**
36
+ * Downloads the remote file into `attachment.localUri`.
37
+ * @param attachment - The attachment to download. `localUri` is the destination path,
38
+ * assigned by the syncing service before this call.
39
+ */
40
+ download(attachment: LocatedAttachmentRecord): Promise<void>;
41
+ /**
42
+ * Deletes the attachment's file from remote storage. Local file removal is handled
43
+ * separately by the syncing service.
44
+ * @param attachment - The attachment to delete.
45
+ */
46
+ delete(attachment: AttachmentRecord): Promise<void>;
47
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=AttachmentTransportAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AttachmentTransportAdapter.js","sourceRoot":"","sources":["../../src/attachments/AttachmentTransportAdapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import { AttachmentTransportAdapter, LocatedAttachmentRecord } from './AttachmentTransportAdapter.js';
2
+ import { LocalStorageAdapter } from './LocalStorageAdapter.js';
3
+ import { RemoteStorageAdapter } from './RemoteStorageAdapter.js';
4
+ import { AttachmentRecord } from './Schema.js';
5
+ /**
6
+ * Default {@link AttachmentTransportAdapter}, composing the local and remote
7
+ * storage adapters.
8
+ *
9
+ * The full file body is materialized as an `ArrayBuffer` in JS memory between the
10
+ * two adapter calls. This is fine for small files but can cause memory pressure on
11
+ * large ones — environments that support native transfer should provide a custom
12
+ * transport instead.
13
+ *
14
+ * @experimental
15
+ * @alpha This is currently experimental and may change without a major version bump.
16
+ */
17
+ export declare class BufferedAttachmentTransport implements AttachmentTransportAdapter {
18
+ private localStorage;
19
+ private remoteStorage;
20
+ constructor(localStorage: LocalStorageAdapter, remoteStorage: RemoteStorageAdapter);
21
+ upload(attachment: LocatedAttachmentRecord): Promise<void>;
22
+ download(attachment: LocatedAttachmentRecord): Promise<void>;
23
+ delete(attachment: AttachmentRecord): Promise<void>;
24
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Default {@link AttachmentTransportAdapter}, composing the local and remote
3
+ * storage adapters.
4
+ *
5
+ * The full file body is materialized as an `ArrayBuffer` in JS memory between the
6
+ * two adapter calls. This is fine for small files but can cause memory pressure on
7
+ * large ones — environments that support native transfer should provide a custom
8
+ * transport instead.
9
+ *
10
+ * @experimental
11
+ * @alpha This is currently experimental and may change without a major version bump.
12
+ */
13
+ export class BufferedAttachmentTransport {
14
+ localStorage;
15
+ remoteStorage;
16
+ constructor(localStorage, remoteStorage) {
17
+ this.localStorage = localStorage;
18
+ this.remoteStorage = remoteStorage;
19
+ }
20
+ async upload(attachment) {
21
+ const fileData = await this.localStorage.readFile(attachment.localUri);
22
+ await this.remoteStorage.uploadFile(fileData, attachment);
23
+ }
24
+ async download(attachment) {
25
+ const fileData = await this.remoteStorage.downloadFile(attachment);
26
+ await this.localStorage.saveFile(attachment.localUri, fileData);
27
+ }
28
+ async delete(attachment) {
29
+ await this.remoteStorage.deleteFile(attachment);
30
+ }
31
+ }
32
+ //# sourceMappingURL=BufferedAttachmentTransport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BufferedAttachmentTransport.js","sourceRoot":"","sources":["../../src/attachments/BufferedAttachmentTransport.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,2BAA2B;IAE5B;IACA;IAFV,YACU,YAAiC,EACjC,aAAmC;QADnC,iBAAY,GAAZ,YAAY,CAAqB;QACjC,kBAAa,GAAb,aAAa,CAAsB;IAC1C,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,UAAmC;QAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvE,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,UAAmC;QAChD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACnE,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAA4B;QACvC,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;CACF"}
@@ -66,3 +66,22 @@ export interface LocalStorageAdapter {
66
66
  */
67
67
  getLocalUri(filename: string): string;
68
68
  }
69
+ /**
70
+ * A {@link LocalStorageAdapter} that can relocate a file into managed storage without
71
+ * loading it into memory. Required for {@link AttachmentQueue.saveFileFromUri}; only
72
+ * queues configured with a streaming-capable local adapter expose that method.
73
+ *
74
+ * @experimental
75
+ * @alpha This is currently experimental and may change without a major version bump.
76
+ */
77
+ export interface StreamingLocalStorageAdapter extends LocalStorageAdapter {
78
+ /**
79
+ * Moves a file into managed storage without loading it into memory.
80
+ * Overwrites any existing file at the target. When source and target are the same
81
+ * path, this is a no-op that just reports the size.
82
+ * @param sourceUri - Path of the existing file
83
+ * @param targetUri - Destination path within managed storage
84
+ * @returns Number of bytes in the moved file
85
+ */
86
+ moveFile(sourceUri: string, targetUri: string): Promise<number>;
87
+ }