@powersync/common 2.1.0 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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":"AAAA,OAAO,EAAE,SAAS,EAAmB,MAAM,oBAAoB,CAAC;AAEhE,OAAO,EAAoB,eAAe,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGnF;;;;;;;;GAQG;AACH,MAAM,OAAO,iBAAiB;IAC5B,wDAAwD;IAC/C,EAAE,CAA0B;IAErC,4DAA4D;IACnD,SAAS,CAAS;IAE3B,iDAAiD;IACxC,MAAM,CAAkB;IAEjC,oEAAoE;IAC3D,kBAAkB,GAAW,GAAG,CAAC;IAE1C;;;;;;OAMG;IACH,YACE,EAA2B,EAC3B,YAAoB,aAAa,EACjC,MAAuB,EACvB,kBAA0B;QAE1B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;IAC/C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,oBAAoB;QACxB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM;QACtC,SAAS;QACT;;;;YAIM,IAAI,CAAC,SAAS;;;;;;;OAOnB,EACD,CAAC,eAAe,CAAC,aAAa,EAAE,eAAe,CAAC,eAAe,EAAE,eAAe,CAAC,aAAa,CAAC,CAChG,CAAC;QAEF,OAAO,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,sBAAsB;QAC1B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM;QACtC,SAAS;QACT;;;;YAIM,IAAI,CAAC,SAAS;;;;;OAKnB,EACD,CAAC,eAAe,CAAC,QAAQ,CAAC,CAC3B,CAAC;QAEF,OAAO,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM;QACtC,SAAS;QACT;;;;YAIM,IAAI,CAAC,SAAS;;;OAGnB,EACD,EAAE,CACH,CAAC;QAEF,OAAO,WAAW,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,gBAAgB,CAAC,UAA4B,EAAE,OAAoB;QACvE,MAAM,OAAO,CAAC,OAAO;QACnB,SAAS;QACT;;0BAEoB,IAAI,CAAC,SAAS;;;;;;;;;;;;;OAajC,EACD;YACE,UAAU,CAAC,EAAE;YACb,UAAU,CAAC,QAAQ;YACnB,UAAU,CAAC,QAAQ,IAAI,IAAI;YAC3B,UAAU,CAAC,IAAI,IAAI,IAAI;YACvB,UAAU,CAAC,SAAS,IAAI,IAAI;YAC5B,UAAU,CAAC,SAAS;YACpB,UAAU,CAAC,KAAK;YAChB,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,UAAU,CAAC,QAAQ,IAAI,IAAI;SAC5B,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,EAAU;QAC5B,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG;QAClC,SAAS;QACT;;;;YAIM,IAAI,CAAC,SAAS;;;OAGnB,EACD,CAAC,EAAE,CAAC,CACL,CAAC;QAEF,OAAO,UAAU,CAAC,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,CAAC;IAED;;;;;;;;OAQG;IACH,KAAK,CAAC,gBAAgB,CAAC,YAAoB;QACzC,MAAM,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,CACpC,EAAE,CAAC,OAAO;QACR,SAAS;QACT;wBACgB,IAAI,CAAC,SAAS;;;SAG7B,EACD,CAAC,YAAY,CAAC,CACf,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,gBAAgB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,yBAAyB,CAAC,QAA6D;QAC3F,MAAM,KAAK,GAAG,IAAI,CAAC;QAEnB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM;QAClC,SAAS;QACT;;;;YAIM,IAAI,CAAC,SAAS;;;;;;;;;OASnB,EACD,CAAC,eAAe,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAC3D,CAAC;QAEF,MAAM,mBAAmB,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QAC3D,wFAAwF;QACxF,IAAI,mBAAmB,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAElD,MAAM,QAAQ,EAAE,CAAC,mBAAmB,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YACd,KAAK,EAAE,SAAS,CAAC,IAAI;YACrB,OAAO,EAAE,YAAY,mBAAmB,CAAC,MAAM,iFAAiF,IAAI,CAAC,kBAAkB,GAAG;SAC3J,CAAC,CAAC;QAEH,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAEnE,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO;QACnB,SAAS;QACT;sBACgB,IAAI,CAAC,SAAS;;;;;;;;OAQ7B,EACD,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CACtB,CAAC;QAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,mBAAmB,CAAC,MAAM,uBAAuB,EAAE,CAAC,CAAC;QAClH,OAAO,mBAAmB,CAAC,MAAM,GAAG,KAAK,CAAC;IAC5C,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,eAAe,CAAC,WAA+B;QACnD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YAC1C,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YAC9C,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -16,6 +16,7 @@ import { ArrayQueryDefinition, Query } from './Query.js';
16
16
  import { WatchCompatibleQuery } from './watched/WatchedQuery.js';
17
17
  import { Mutex } from '../utils/mutex.js';
18
18
  import { QueryResult } from '../db/QueryResult.js';
19
+ import { CheckpointRequest } from './sync/CheckpointRequest.js';
19
20
  /**
20
21
  * @public
21
22
  */
@@ -205,6 +206,18 @@ export interface CommonPowerSyncDatabase extends BaseObserverInterface<PowerSync
205
206
  * @returns A {@link SyncStream} instance that can be subscribed to.
206
207
  */
207
208
  syncStream(name: string, params?: Record<string, any>): SyncStream;
209
+ /**
210
+ * Requests a checkpoint from the PowerSync service.
211
+ *
212
+ * The returned request can be awaited (using {@link CheckpointRequest#waitForSync}) to confirm that the local
213
+ * database has applied server-side changes up to the checkpoint. This method requires an active or connecting sync
214
+ * client connected with a {@link CheckpointMode} set to `requests` and PowerSync service version 1.24.0 or later.
215
+ *
216
+ * It can throw for connection, mode, authentication, or service request failures.
217
+ *
218
+ * @alpha
219
+ */
220
+ requestCheckpoint(): Promise<CheckpointRequest>;
208
221
  /**
209
222
  * Close the database, releasing resources.
210
223
  *
@@ -23,4 +23,15 @@ export interface PowerSyncBackendConnector {
23
23
  * Any thrown errors will result in a retry after the configured wait period (default: 5 seconds).
24
24
  */
25
25
  uploadData: (database: CommonPowerSyncDatabase) => Promise<void>;
26
+ /**
27
+ * Posts a client-generated checkpoint request to the backend and returns the effective checkpoint request state.
28
+ *
29
+ * This method is optional. It only needs to be implemented when the selected {@link CheckpointMode} is `requests`
30
+ * and [asynchronous backend uploads](https://docs.powersync.com/client-sdks/advanced/checkpoint-requests#asynchronous-upload-backends)
31
+ * are used. In any other case, this method should not be present on backend connectors.
32
+ *
33
+ * @param requestId - The client-generated checkpoint request ID (a positive 64-bit integer encoded as a string).
34
+ * @param clientId - The PowerSync client ID for the current device.
35
+ */
36
+ postCheckpointRequest?(clientId: string, requestId: string): Promise<string>;
26
37
  }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * A checkpoint request created by {@link CommonPowerSyncDatabase#requestCheckpoint}.
3
+ *
4
+ * Use this value to wait until the local database has applied server-side changes up to the requested checkpoint. This
5
+ * is useful for explicit refresh flows where the caller wants confirmation that the local view has caught up to the
6
+ * service.
7
+ *
8
+ * Checkpoint requests are backed by request ids tracked in the local database, so they are reusable across disconnect
9
+ * and reconnect cycles. A wait interrupted by a disconnect throws an error, but the same request can be awaited again
10
+ * once a new connection is established.
11
+ *
12
+ * Requests do not survive {@link CommonPowerSyncDatabase#disconnectAndClear}, instances created before a clear should
13
+ * be discarded and requested again.
14
+ *
15
+ * @alpha
16
+ */
17
+ export interface CheckpointRequest {
18
+ /**
19
+ * Whether this checkpoint request has synced before.
20
+ */
21
+ readonly hasSynced: boolean;
22
+ /**
23
+ * Waits until this checkpoint has been synced locally.
24
+ *
25
+ * This method fails on sync errors: If a download or upload error occurs before this checkpoint request has synced,
26
+ * that error is rethrown here. This makes it easier to observe sync errors when relying on checkpoints. Once sync has
27
+ * recovered, it is valid to call this method again to await the checkpoint.
28
+ */
29
+ waitForSync(options?: {
30
+ signal?: AbortSignal;
31
+ }): Promise<void>;
32
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CheckpointRequest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckpointRequest.js","sourceRoot":"","sources":["../../../src/client/sync/CheckpointRequest.ts"],"names":[],"mappings":""}
@@ -40,6 +40,10 @@ export interface SyncOptions {
40
40
  * milliseconds.
41
41
  */
42
42
  crudUploadThrottleMs?: number;
43
+ /**
44
+ * The mode used to request checkpoints from the service (used after uploading local data).
45
+ */
46
+ checkpointMode?: CheckpointMode;
43
47
  }
44
48
  /**
45
49
  * @public
@@ -63,3 +67,33 @@ export declare enum FetchStrategy {
63
67
  */
64
68
  Sequential = "sequential"
65
69
  }
70
+ /**
71
+ * The mechanism to request checkpoints from the PowerSync service.
72
+ *
73
+ * Checkpoint requests are used after a client uploads local mutations. The PowerSync service later references them in
74
+ * downloaded data, allowing the SDK to assume that uploaded data has been synced down again.
75
+ *
76
+ * There are two ways to send checkpoint requests: A legacy (but default and stable) format supported by all PowerSync
77
+ * service versions, and a newer (`requests`) method which is only available from PowerSync service version 1.24.0 or
78
+ * later.
79
+ *
80
+ * Note that the requests checkpoint mode is an alpha API.
81
+ *
82
+ * @public
83
+ */
84
+ export type CheckpointMode = 'legacy' | 'requests' | {
85
+ requests: CheckpointRequestsOptions;
86
+ };
87
+ /**
88
+ * Options associated with a {@link CheckpointMode} when the requests-based checkpoint option is used.
89
+ *
90
+ * @public
91
+ */
92
+ export interface CheckpointRequestsOptions {
93
+ /**
94
+ * The delay, in milliseconds, to wait before re-sending a checkpoint request when it hasn't been applied in time.
95
+ *
96
+ * The minimum value for this is 10 seconds, lower values will be ignored.
97
+ */
98
+ retryDelay: number;
99
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/client/sync/options.ts"],"names":[],"mappings":"AAqDA;;GAEG;AACH,MAAM,CAAN,IAAY,0BAGX;AAHD,WAAY,0BAA0B;IACpC,2CAAa,CAAA;IACb,uDAAyB,CAAA;AAC3B,CAAC,EAHW,0BAA0B,KAA1B,0BAA0B,QAGrC;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,aAYX;AAZD,WAAY,aAAa;IACvB;;;OAGG;IACH,sCAAqB,CAAA;IAErB;;;OAGG;IACH,0CAAyB,CAAA;AAC3B,CAAC,EAZW,aAAa,KAAb,aAAa,QAYxB"}
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../../src/client/sync/options.ts"],"names":[],"mappings":"AA0DA;;GAEG;AACH,MAAM,CAAN,IAAY,0BAGX;AAHD,WAAY,0BAA0B;IACpC,2CAAa,CAAA;IACb,uDAAyB,CAAA;AAC3B,CAAC,EAHW,0BAA0B,KAA1B,0BAA0B,QAGrC;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,aAYX;AAZD,WAAY,aAAa;IACvB;;;OAGG;IACH,sCAAqB,CAAA;IAErB;;;OAGG;IACH,0CAAyB,CAAA;AAC3B,CAAC,EAZW,aAAa,KAAb,aAAa,QAYxB"}
package/lib/index.d.ts CHANGED
@@ -14,9 +14,10 @@ export * from './client/SQLOpenFactory.js';
14
14
  export * from './client/sync/bucket/CrudBatch.js';
15
15
  export { CrudEntry, OpId, UpdateType } from './client/sync/bucket/CrudEntry.js';
16
16
  export * from './client/sync/bucket/CrudTransaction.js';
17
+ export * from './client/sync/CheckpointRequest.js';
17
18
  export * from './client/sync/stream/JsonValue.js';
18
19
  export * from './client/sync/sync-streams.js';
19
- export { SyncOptions, SyncStreamConnectionMethod, FetchStrategy } from './client/sync/options.js';
20
+ export { SyncOptions, SyncStreamConnectionMethod, FetchStrategy, CheckpointMode, CheckpointRequestsOptions } from './client/sync/options.js';
20
21
  export { ProgressWithOperations, SyncProgress } from './db/crud/SyncProgress.js';
21
22
  export * from './db/crud/SyncStatus.js';
22
23
  export * from './db/crud/UploadQueueStatus.js';
package/lib/index.js CHANGED
@@ -14,6 +14,7 @@ export * from './client/SQLOpenFactory.js';
14
14
  export * from './client/sync/bucket/CrudBatch.js';
15
15
  export { UpdateType } from './client/sync/bucket/CrudEntry.js';
16
16
  export * from './client/sync/bucket/CrudTransaction.js';
17
+ export * from './client/sync/CheckpointRequest.js';
17
18
  export * from './client/sync/stream/JsonValue.js';
18
19
  export * from './client/sync/sync-streams.js';
19
20
  export { SyncStreamConnectionMethod, FetchStrategy } from './client/sync/options.js';
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yBAAyB,CAAC;AACxC,cAAc,wCAAwC,CAAC;AAEvD,cAAc,qCAAqC,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAA+B,MAAM,kCAAkC,CAAC;AACrG,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAAmB,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAChF,cAAc,yCAAyC,CAAC;AACxD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAAe,0BAA0B,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGlG,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AAErC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,2DAA2D,CAAC;AAC1E,cAAc,uDAAuD,CAAC;AACtE,cAAc,kCAAkC,CAAC;AAGjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAElC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oCAAoC,CAAC;AACnD,cAAc,yCAAyC,CAAC;AACxD,cAAc,kCAAkC,CAAC;AACjD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,sCAAsC,CAAC;AACrD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yBAAyB,CAAC;AACxC,cAAc,wCAAwC,CAAC;AAEvD,cAAc,qCAAqC,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAA+B,MAAM,kCAAkC,CAAC;AACrG,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,4BAA4B,CAAC;AAC3C,cAAc,mCAAmC,CAAC;AAClD,OAAO,EAAmB,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAChF,cAAc,yCAAyC,CAAC;AACxD,cAAc,oCAAoC,CAAC;AACnD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,OAAO,EAEL,0BAA0B,EAC1B,aAAa,EAGd,MAAM,0BAA0B,CAAC;AAGlC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,8BAA8B,CAAC;AAE7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AAErC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kCAAkC,CAAC;AACjD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iCAAiC,CAAC;AAChD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,2DAA2D,CAAC;AAC1E,cAAc,uDAAuD,CAAC;AACtE,cAAc,kCAAkC,CAAC;AAGjD,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,mBAAmB,CAAC;AAElC,cAAc,kBAAkB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@powersync/common",
3
- "version": "2.1.0",
3
+ "version": "2.2.1",
4
4
  "publishConfig": {
5
5
  "registry": "https://registry.npmjs.org/",
6
6
  "access": "public"
@@ -32,13 +32,14 @@
32
32
  "devDependencies": {
33
33
  "@types/node": "^24.0.0",
34
34
  "@types/uuid": "^9.0.6",
35
- "@microsoft/api-extractor": "^7.58.7"
35
+ "@microsoft/api-extractor": "^7.59.0"
36
36
  },
37
37
  "scripts": {
38
38
  "build": "tsc -b",
39
39
  "build:prod": "tsc -b",
40
40
  "clean": "rm -rf lib dist tsconfig.tsbuildinfo",
41
41
  "test": "vitest",
42
- "test:exports": "attw --pack . --ignore-rules no-resolution cjs-resolves-to-esm"
42
+ "test:exports": "attw --pack . --ignore-rules no-resolution cjs-resolves-to-esm",
43
+ "api-diff": "api-extractor run --verbose"
43
44
  }
44
45
  }
@@ -231,7 +231,8 @@ export class AttachmentContext {
231
231
  );
232
232
 
233
233
  const archivedAttachments = results.map(attachmentFromSql);
234
- if (archivedAttachments.length === 0) return false;
234
+ // Nothing above the cache limit, so the paginated cleanup in `expireCache` is complete.
235
+ if (archivedAttachments.length === 0) return true;
235
236
 
236
237
  await callback?.(archivedAttachments);
237
238
  this.logger.log({
@@ -16,6 +16,7 @@ import { ArrayQueryDefinition, Query } from './Query.js';
16
16
  import { WatchCompatibleQuery } from './watched/WatchedQuery.js';
17
17
  import { Mutex } from '../utils/mutex.js';
18
18
  import { QueryResult } from '../db/QueryResult.js';
19
+ import { CheckpointRequest } from './sync/CheckpointRequest.js';
19
20
 
20
21
  /**
21
22
  * @public
@@ -233,6 +234,19 @@ export interface CommonPowerSyncDatabase extends BaseObserverInterface<PowerSync
233
234
  */
234
235
  syncStream(name: string, params?: Record<string, any>): SyncStream;
235
236
 
237
+ /**
238
+ * Requests a checkpoint from the PowerSync service.
239
+ *
240
+ * The returned request can be awaited (using {@link CheckpointRequest#waitForSync}) to confirm that the local
241
+ * database has applied server-side changes up to the checkpoint. This method requires an active or connecting sync
242
+ * client connected with a {@link CheckpointMode} set to `requests` and PowerSync service version 1.24.0 or later.
243
+ *
244
+ * It can throw for connection, mode, authentication, or service request failures.
245
+ *
246
+ * @alpha
247
+ */
248
+ requestCheckpoint(): Promise<CheckpointRequest>;
249
+
236
250
  /**
237
251
  * Close the database, releasing resources.
238
252
  *
@@ -25,4 +25,16 @@ export interface PowerSyncBackendConnector {
25
25
  * Any thrown errors will result in a retry after the configured wait period (default: 5 seconds).
26
26
  */
27
27
  uploadData: (database: CommonPowerSyncDatabase) => Promise<void>;
28
+
29
+ /**
30
+ * Posts a client-generated checkpoint request to the backend and returns the effective checkpoint request state.
31
+ *
32
+ * This method is optional. It only needs to be implemented when the selected {@link CheckpointMode} is `requests`
33
+ * and [asynchronous backend uploads](https://docs.powersync.com/client-sdks/advanced/checkpoint-requests#asynchronous-upload-backends)
34
+ * are used. In any other case, this method should not be present on backend connectors.
35
+ *
36
+ * @param requestId - The client-generated checkpoint request ID (a positive 64-bit integer encoded as a string).
37
+ * @param clientId - The PowerSync client ID for the current device.
38
+ */
39
+ postCheckpointRequest?(clientId: string, requestId: string): Promise<string>;
28
40
  }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * A checkpoint request created by {@link CommonPowerSyncDatabase#requestCheckpoint}.
3
+ *
4
+ * Use this value to wait until the local database has applied server-side changes up to the requested checkpoint. This
5
+ * is useful for explicit refresh flows where the caller wants confirmation that the local view has caught up to the
6
+ * service.
7
+ *
8
+ * Checkpoint requests are backed by request ids tracked in the local database, so they are reusable across disconnect
9
+ * and reconnect cycles. A wait interrupted by a disconnect throws an error, but the same request can be awaited again
10
+ * once a new connection is established.
11
+ *
12
+ * Requests do not survive {@link CommonPowerSyncDatabase#disconnectAndClear}, instances created before a clear should
13
+ * be discarded and requested again.
14
+ *
15
+ * @alpha
16
+ */
17
+ export interface CheckpointRequest {
18
+ /**
19
+ * Whether this checkpoint request has synced before.
20
+ */
21
+ readonly hasSynced: boolean;
22
+
23
+ /**
24
+ * Waits until this checkpoint has been synced locally.
25
+ *
26
+ * This method fails on sync errors: If a download or upload error occurs before this checkpoint request has synced,
27
+ * that error is rethrown here. This makes it easier to observe sync errors when relying on checkpoints. Once sync has
28
+ * recovered, it is valid to call this method again to await the checkpoint.
29
+ */
30
+ waitForSync(options?: { signal?: AbortSignal }): Promise<void>;
31
+ }
@@ -49,6 +49,11 @@ export interface SyncOptions {
49
49
  * milliseconds.
50
50
  */
51
51
  crudUploadThrottleMs?: number;
52
+
53
+ /**
54
+ * The mode used to request checkpoints from the service (used after uploading local data).
55
+ */
56
+ checkpointMode?: CheckpointMode;
52
57
  }
53
58
 
54
59
  /**
@@ -75,3 +80,33 @@ export enum FetchStrategy {
75
80
  */
76
81
  Sequential = 'sequential'
77
82
  }
83
+
84
+ /**
85
+ * The mechanism to request checkpoints from the PowerSync service.
86
+ *
87
+ * Checkpoint requests are used after a client uploads local mutations. The PowerSync service later references them in
88
+ * downloaded data, allowing the SDK to assume that uploaded data has been synced down again.
89
+ *
90
+ * There are two ways to send checkpoint requests: A legacy (but default and stable) format supported by all PowerSync
91
+ * service versions, and a newer (`requests`) method which is only available from PowerSync service version 1.24.0 or
92
+ * later.
93
+ *
94
+ * Note that the requests checkpoint mode is an alpha API.
95
+ *
96
+ * @public
97
+ */
98
+ export type CheckpointMode = 'legacy' | 'requests' | { requests: CheckpointRequestsOptions };
99
+
100
+ /**
101
+ * Options associated with a {@link CheckpointMode} when the requests-based checkpoint option is used.
102
+ *
103
+ * @public
104
+ */
105
+ export interface CheckpointRequestsOptions {
106
+ /**
107
+ * The delay, in milliseconds, to wait before re-sending a checkpoint request when it hasn't been applied in time.
108
+ *
109
+ * The minimum value for this is 10 seconds, lower values will be ignored.
110
+ */
111
+ retryDelay: number;
112
+ }
package/src/index.ts CHANGED
@@ -15,9 +15,16 @@ export * from './client/SQLOpenFactory.js';
15
15
  export * from './client/sync/bucket/CrudBatch.js';
16
16
  export { CrudEntry, OpId, UpdateType } from './client/sync/bucket/CrudEntry.js';
17
17
  export * from './client/sync/bucket/CrudTransaction.js';
18
+ export * from './client/sync/CheckpointRequest.js';
18
19
  export * from './client/sync/stream/JsonValue.js';
19
20
  export * from './client/sync/sync-streams.js';
20
- export { SyncOptions, SyncStreamConnectionMethod, FetchStrategy } from './client/sync/options.js';
21
+ export {
22
+ SyncOptions,
23
+ SyncStreamConnectionMethod,
24
+ FetchStrategy,
25
+ CheckpointMode,
26
+ CheckpointRequestsOptions
27
+ } from './client/sync/options.js';
21
28
 
22
29
  export { ProgressWithOperations, SyncProgress } from './db/crud/SyncProgress.js';
23
30
  export * from './db/crud/SyncStatus.js';