@baukit/sync-client 0.4.0 → 0.5.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.
- package/README.md +50 -33
- package/dist/error.d.ts +0 -8
- package/dist/error.d.ts.map +1 -1
- package/dist/error.js +0 -5
- package/dist/error.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/scheduler.d.ts +33 -2
- package/dist/scheduler.d.ts.map +1 -1
- package/dist/scheduler.js +89 -9
- package/dist/scheduler.js.map +1 -1
- package/dist/store.d.ts +1 -19
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +0 -19
- package/dist/store.js.map +1 -1
- package/package.json +20 -13
package/README.md
CHANGED
|
@@ -74,11 +74,50 @@ The environment reports foreground state and connectivity. The scheduler runs on
|
|
|
74
74
|
app returns to the foreground, when connectivity returns, and on the interval. It installs no
|
|
75
75
|
interval while backgrounded and ignores connectivity events there.
|
|
76
76
|
|
|
77
|
-
A failing run reaches `onError` and does not stop scheduling.
|
|
78
|
-
|
|
77
|
+
A failing run reaches `onError` and does not stop scheduling. Without `retry`, the next attempt
|
|
78
|
+
waits for the next trigger.
|
|
79
79
|
|
|
80
|
-
|
|
81
|
-
|
|
80
|
+
### Retry and backoff
|
|
81
|
+
|
|
82
|
+
Pass `retry` to retry a failed run after a delay. The product decides which failures are worth a
|
|
83
|
+
retry and how long to wait, because only it knows its error types; the scheduler owns the attempt
|
|
84
|
+
count, the wait, and waking it early. `fullJitterBackoffMs` from `@baukit/api-runtime/backoff` is
|
|
85
|
+
the Baukit delay policy. The root entry of this package still imports nothing, so the product
|
|
86
|
+
passes the policy in:
|
|
87
|
+
|
|
88
|
+
```ts
|
|
89
|
+
import { fullJitterBackoffMs } from '@baukit/api-runtime/backoff';
|
|
90
|
+
import { SyncRateLimitError, SyncScheduler, SyncTransportError } from '@baukit/sync-client';
|
|
91
|
+
|
|
92
|
+
const scheduler = new SyncScheduler(() => engine.syncOnce(), environment, {
|
|
93
|
+
retry: {
|
|
94
|
+
maxRetries: 4,
|
|
95
|
+
delayMs: (error, retryIndex) => {
|
|
96
|
+
if (error instanceof SyncRateLimitError) return Math.max(0, Date.parse(error.retryAt) - Date.now());
|
|
97
|
+
if (error instanceof SyncTransportError && !error.retryable) return null;
|
|
98
|
+
return fullJitterBackoffMs(retryIndex, { baseDelayMs: 500, maxDelayMs: 30_000 });
|
|
99
|
+
},
|
|
100
|
+
onRetryScheduled: ({ delayMs }) => status.showRetryAt(Date.now() + delayMs),
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
After a failed run the scheduler asks `delayMs(error, retryIndex)`. `null` means no retry. A number
|
|
106
|
+
is the wait in milliseconds, and `onRetryScheduled` hears about it before the wait starts. The
|
|
107
|
+
retry index counts from 0 and restarts after a success. After `maxRetries` retries the scheduler
|
|
108
|
+
waits for the next trigger. A delay that is negative or not finite, or a `delayMs` that throws,
|
|
109
|
+
reaches `onError` and ends the retries. A `maxRetries` that is not a non-negative integer throws a
|
|
110
|
+
`RangeError` from the constructor.
|
|
111
|
+
|
|
112
|
+
The wait is a one-shot timer built from the environment's `setInterval`, so no environment
|
|
113
|
+
changes. Any trigger during the wait ends it at once and restarts the retry index at 0: a manual
|
|
114
|
+
`trigger()`, the interval, returning to the foreground, or connectivity returning while in the
|
|
115
|
+
foreground. A follow-up request during the wait does not end it, because the retry will send the
|
|
116
|
+
same writes. `stop()` ends the wait without another run, and a wait that ends while the app is
|
|
117
|
+
backgrounded runs nothing until the app returns.
|
|
118
|
+
|
|
119
|
+
If the engine waits inside its own retry delay instead, pass `onRecoverySignal` to the scheduler
|
|
120
|
+
and wake that delay there. The scheduler calls it with `active` before a foreground-triggered run and with
|
|
82
121
|
`online` before an online-triggered run. Online recovery is reported even while the scheduler is
|
|
83
122
|
backgrounded, although the scheduler still waits for foreground before starting another run.
|
|
84
123
|
Retry wake-up belongs in this scheduler option, not in a decorated environment, because the
|
|
@@ -208,8 +247,8 @@ rejection details its UI needs:
|
|
|
208
247
|
|
|
209
248
|
```ts
|
|
210
249
|
interface ProductAttention {
|
|
211
|
-
|
|
212
|
-
|
|
250
|
+
objectEntityType: string;
|
|
251
|
+
objectEntityId: string;
|
|
213
252
|
rejections: readonly Rejection[];
|
|
214
253
|
}
|
|
215
254
|
|
|
@@ -217,35 +256,13 @@ const status = new SyncStatusStore<ProductAttention>();
|
|
|
217
256
|
status.setAttention(items, pendingCount);
|
|
218
257
|
```
|
|
219
258
|
|
|
220
|
-
For stores and screens that use API-style names, `toSnakeCaseSnapshot` returns a typed projection:
|
|
221
|
-
|
|
222
|
-
```ts
|
|
223
|
-
const snapshot = toSnakeCaseSnapshot(status.getSnapshot());
|
|
224
|
-
|
|
225
|
-
snapshot.last_attempt_at;
|
|
226
|
-
snapshot.last_success_at;
|
|
227
|
-
snapshot.last_sync_at;
|
|
228
|
-
snapshot.failure;
|
|
229
|
-
snapshot.retrying;
|
|
230
|
-
snapshot.retry_at;
|
|
231
|
-
snapshot.pending_count;
|
|
232
|
-
snapshot.initial_pull_status;
|
|
233
|
-
snapshot.refresh_revision;
|
|
234
|
-
snapshot.security_block;
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
`status`, `error`, and `attention` keep their names. Attention items also keep their original
|
|
238
|
-
shape.
|
|
239
|
-
|
|
240
259
|
### Timestamp migration
|
|
241
260
|
|
|
242
|
-
`lastSyncAt`
|
|
243
|
-
|
|
244
|
-
attempt timestamps.
|
|
261
|
+
`lastSyncAt` is a deprecated compatibility field for one release cycle. It is derived from
|
|
262
|
+
`lastSuccessAt`. New code must not write or persist it as an attempt timestamp.
|
|
245
263
|
|
|
246
|
-
Replace `snapshot.lastSyncAt` with `snapshot.lastSuccessAt`.
|
|
247
|
-
|
|
248
|
-
object:
|
|
264
|
+
Replace `snapshot.lastSyncAt` with `snapshot.lastSuccessAt`. Persist both attempt and success
|
|
265
|
+
timestamps, then hydrate with an object:
|
|
249
266
|
|
|
250
267
|
```ts
|
|
251
268
|
status.hydrate({
|
|
@@ -354,7 +371,7 @@ without it receive the original case set and need no adapter change.
|
|
|
354
371
|
`zeroCursor` is the product's explicit full-rebuild cursor. `decodeStaleCursor` maps the product's
|
|
355
372
|
wire error onto `{ code: 'resync_required', horizon }`. The product response must keep the code and
|
|
356
373
|
horizon field stable. For the HTTP 409 envelope, the source value is
|
|
357
|
-
`error.details.
|
|
374
|
+
`error.details.horizonRevision`.
|
|
358
375
|
|
|
359
376
|
`isResetSafe` is the production policy hook. `setResetSafe` lets the isolated test client enter a
|
|
360
377
|
safe or unsafe state. `reset` clears server-backed rows and writes `zeroCursor` in one transaction,
|
package/dist/error.d.ts
CHANGED
|
@@ -15,13 +15,6 @@ export type SyncFailure = {
|
|
|
15
15
|
} | {
|
|
16
16
|
readonly kind: 'local_apply';
|
|
17
17
|
};
|
|
18
|
-
/** Snake-case projection of {@link SyncFailure}. */
|
|
19
|
-
export type SnakeCaseSyncFailure = Exclude<SyncFailure, {
|
|
20
|
-
readonly kind: 'rate_limited';
|
|
21
|
-
}> | {
|
|
22
|
-
readonly kind: 'rate_limited';
|
|
23
|
-
readonly retry_at: string;
|
|
24
|
-
};
|
|
25
18
|
/** A sync request failed. `retryable` decides whether a later attempt may win. */
|
|
26
19
|
export declare class SyncTransportError extends Error {
|
|
27
20
|
readonly retryable: boolean;
|
|
@@ -70,5 +63,4 @@ export declare class SyncLocalApplyError extends Error {
|
|
|
70
63
|
}
|
|
71
64
|
/** Maps package errors onto store failure metadata. */
|
|
72
65
|
export declare function syncFailureFromError(error: unknown): SyncFailure;
|
|
73
|
-
export declare function toSnakeCaseFailure(failure: SyncFailure): SnakeCaseSyncFailure;
|
|
74
66
|
//# sourceMappingURL=error.d.ts.map
|
package/dist/error.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,GACvC;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAA;CAAE,GAC1C;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAErC,
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,oBAAoB,CAAA;CAAE,GACvC;IAAE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GAC3B;IAAE,QAAQ,CAAC,IAAI,EAAE,uBAAuB,CAAA;CAAE,GAC1C;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAA;CAAE,CAAC;AAErC,kFAAkF;AAClF,qBAAa,kBAAmB,SAAQ,KAAK;IAGzC,QAAQ,CAAC,SAAS,EAAE,OAAO;aACT,KAAK,CAAC,EAAE,OAAO;gBAFjC,OAAO,EAAE,MAAM,EACN,SAAS,EAAE,OAAO,EACT,KAAK,CAAC,EAAE,OAAO,YAAA;CAKpC;AAED,4EAA4E;AAC5E,qBAAa,aAAc,SAAQ,kBAAkB;IACnD,QAAQ,CAAC,IAAI,UAAU;gBAEX,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,wDAAwD;AACxD,qBAAa,gBAAiB,SAAQ,kBAAkB;IACtD,QAAQ,CAAC,IAAI,aAAa;gBAEd,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,sFAAsF;AACtF,qBAAa,eAAgB,SAAQ,kBAAkB;IACrD,QAAQ,CAAC,IAAI,YAAY;gBAEb,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,OAAO;CAIjE;AAED,yEAAyE;AACzE,qBAAa,kBAAmB,SAAQ,kBAAkB;IAKtD,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IALpC,QAAQ,CAAC,IAAI,kBAAkB;gBAG7B,OAAO,EAAE,MAAM,EACN,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GAAG,IAAI,EAClC,KAAK,CAAC,EAAE,OAAO;CAKlB;AAED;;;GAGG;AACH,qBAAa,0BAA2B,SAAQ,kBAAkB;IAChE,QAAQ,CAAC,IAAI,wBAAwB;gBAEzB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,6DAA6D;AAC7D,qBAAa,6BAA8B,SAAQ,kBAAkB;IACnE,QAAQ,CAAC,IAAI,2BAA2B;gBAE5B,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,uEAAuE;AACvE,qBAAa,mBAAoB,SAAQ,KAAK;IAC5C,QAAQ,CAAC,IAAI,iBAAiB;gBAElB,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAI7C;AAED,uDAAuD;AACvD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAchE"}
|
package/dist/error.js
CHANGED
|
@@ -94,9 +94,4 @@ export function syncFailureFromError(error) {
|
|
|
94
94
|
}
|
|
95
95
|
return { kind: 'local_apply' };
|
|
96
96
|
}
|
|
97
|
-
export function toSnakeCaseFailure(failure) {
|
|
98
|
-
return failure.kind === 'rate_limited'
|
|
99
|
-
? { kind: failure.kind, retry_at: failure.retryAt }
|
|
100
|
-
: failure;
|
|
101
|
-
}
|
|
102
97
|
//# sourceMappingURL=error.js.map
|
package/dist/error.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export { SyncAuthError, SyncLocalApplyError, SyncNetworkError, SyncPartitionMismatchError, SyncPayloadCompatibilityError, SyncRateLimitError, SyncServerError, SyncTransportError, syncFailureFromError,
|
|
2
|
-
export type {
|
|
1
|
+
export { SyncAuthError, SyncLocalApplyError, SyncNetworkError, SyncPartitionMismatchError, SyncPayloadCompatibilityError, SyncRateLimitError, SyncServerError, SyncTransportError, syncFailureFromError, } from './error.js';
|
|
2
|
+
export type { SyncFailure } from './error.js';
|
|
3
3
|
export { compareHybridLogicalTimestamps, decodeHybridLogicalTimestamp, encodeHybridLogicalTimestamp, HybridLogicalClock, HybridLogicalClockError, HLC_COUNTERS_PER_MILLISECOND, HLC_STORAGE_KEY, MAX_HLC_TIMESTAMP, } from './hlc.js';
|
|
4
4
|
export type { HlcPhysicalClock, HlcStorage, HybridLogicalClockErrorCode, HybridLogicalClockState, } from './hlc.js';
|
|
5
5
|
export { dependencyRankByOrder, rankPushBatch, validatePushOutcomeCoverage } from './push-batch.js';
|
|
6
6
|
export type { PushCandidate, PushOutcomeCoverageOptions, RankedPushItem, RankPushBatchOptions, } from './push-batch.js';
|
|
7
7
|
export { SyncScheduler } from './scheduler.js';
|
|
8
|
-
export type { SyncSchedulerEnvironment, SyncSchedulerOptions, SyncSchedulerRecoverySignal, SyncSchedulerTimer, } from './scheduler.js';
|
|
9
|
-
export { deriveInitialSyncState, deriveLocalStoreReadiness, SyncStatusStore
|
|
10
|
-
export type { InitialPullStatus, InitialSyncState, LocalStoreReadiness, LocalStoreReadinessInput,
|
|
8
|
+
export type { SyncSchedulerEnvironment, SyncSchedulerOptions, SyncSchedulerRecoverySignal, SyncSchedulerRetry, SyncSchedulerRetryOptions, SyncSchedulerTimer, } from './scheduler.js';
|
|
9
|
+
export { deriveInitialSyncState, deriveLocalStoreReadiness, SyncStatusStore } from './store.js';
|
|
10
|
+
export type { InitialPullStatus, InitialSyncState, LocalStoreReadiness, LocalStoreReadinessInput, SyncAttentionItem, SyncFailureUpdate, SyncStatus, SyncStatusHydration, SyncStatusSink, SyncStatusSnapshot, SyncStatusStoreOptions, } from './store.js';
|
|
11
11
|
export { commitCursorAfterLocalTransaction, DEFAULT_RETRY_AFTER_FALLBACK_MS, parseRetryAfter, SyncTransport, validatePullPage, } from './transport.js';
|
|
12
12
|
export type { CursorCommitOptions, ParseRetryAfterOptions, PullPagePosition, SyncCursorComparator, SyncFetch, SyncFetchResponse, SyncResponseHeaders, SyncPrebuiltRequest, SyncPrebuiltRequestTransportOptions, SyncRequestOptions, SyncRequestInit, SyncFetchTransportOptions, SyncTransportOptions, } from './transport.js';
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,0BAA0B,EAC1B,6BAA6B,EAC7B,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,0BAA0B,EAC1B,6BAA6B,EAC7B,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,EAC5B,4BAA4B,EAC5B,kBAAkB,EAClB,uBAAuB,EACvB,4BAA4B,EAC5B,eAAe,EACf,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAClB,YAAY,EACV,gBAAgB,EAChB,UAAU,EACV,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AACpG,YAAY,EACV,aAAa,EACb,0BAA0B,EAC1B,cAAc,EACd,oBAAoB,GACrB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EACV,wBAAwB,EACxB,oBAAoB,EACpB,2BAA2B,EAC3B,kBAAkB,EAClB,yBAAyB,EACzB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAChG,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,UAAU,EACV,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,iCAAiC,EACjC,+BAA+B,EAC/B,eAAe,EACf,aAAa,EACb,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,gBAAgB,EAChB,oBAAoB,EACpB,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACnB,mCAAmC,EACnC,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export { SyncAuthError, SyncLocalApplyError, SyncNetworkError, SyncPartitionMismatchError, SyncPayloadCompatibilityError, SyncRateLimitError, SyncServerError, SyncTransportError, syncFailureFromError,
|
|
1
|
+
export { SyncAuthError, SyncLocalApplyError, SyncNetworkError, SyncPartitionMismatchError, SyncPayloadCompatibilityError, SyncRateLimitError, SyncServerError, SyncTransportError, syncFailureFromError, } from './error.js';
|
|
2
2
|
export { compareHybridLogicalTimestamps, decodeHybridLogicalTimestamp, encodeHybridLogicalTimestamp, HybridLogicalClock, HybridLogicalClockError, HLC_COUNTERS_PER_MILLISECOND, HLC_STORAGE_KEY, MAX_HLC_TIMESTAMP, } from './hlc.js';
|
|
3
3
|
export { dependencyRankByOrder, rankPushBatch, validatePushOutcomeCoverage } from './push-batch.js';
|
|
4
4
|
export { SyncScheduler } from './scheduler.js';
|
|
5
|
-
export { deriveInitialSyncState, deriveLocalStoreReadiness, SyncStatusStore
|
|
5
|
+
export { deriveInitialSyncState, deriveLocalStoreReadiness, SyncStatusStore } from './store.js';
|
|
6
6
|
export { commitCursorAfterLocalTransaction, DEFAULT_RETRY_AFTER_FALLBACK_MS, parseRetryAfter, SyncTransport, validatePullPage, } from './transport.js';
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,0BAA0B,EAC1B,6BAA6B,EAC7B,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,gBAAgB,EAChB,0BAA0B,EAC1B,6BAA6B,EAC7B,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,8BAA8B,EAC9B,4BAA4B,EAC5B,4BAA4B,EAC5B,kBAAkB,EAClB,uBAAuB,EACvB,4BAA4B,EAC5B,eAAe,EACf,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAOlB,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAOpG,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAS/C,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAchG,OAAO,EACL,iCAAiC,EACjC,+BAA+B,EAC/B,eAAe,EACf,aAAa,EACb,gBAAgB,GACjB,MAAM,gBAAgB,CAAC"}
|
package/dist/scheduler.d.ts
CHANGED
|
@@ -16,10 +16,30 @@ export interface SyncSchedulerEnvironment {
|
|
|
16
16
|
export type SyncSchedulerTimer = {
|
|
17
17
|
readonly __syncSchedulerTimer?: never;
|
|
18
18
|
} & object;
|
|
19
|
+
/** A retry the scheduler is about to wait for. */
|
|
20
|
+
export interface SyncSchedulerRetry {
|
|
21
|
+
readonly error: unknown;
|
|
22
|
+
/** Counts retries since the last success or wake-up, from 0. */
|
|
23
|
+
readonly retryIndex: number;
|
|
24
|
+
readonly delayMs: number;
|
|
25
|
+
}
|
|
26
|
+
/** Retries a failed run after a delay the product chooses. */
|
|
27
|
+
export interface SyncSchedulerRetryOptions {
|
|
28
|
+
/** Retries after a failed run before the scheduler waits for the next trigger. */
|
|
29
|
+
readonly maxRetries: number;
|
|
30
|
+
/**
|
|
31
|
+
* The delay before retry `retryIndex`, or `null` when the failure must not be retried.
|
|
32
|
+
* `fullJitterBackoffMs` from `@baukit/api-runtime/backoff` gives bounded, jittered delays.
|
|
33
|
+
*/
|
|
34
|
+
readonly delayMs: (error: unknown, retryIndex: number) => number | null;
|
|
35
|
+
/** Runs before each wait, for example to show when the next attempt starts. */
|
|
36
|
+
readonly onRetryScheduled?: (retry: SyncSchedulerRetry) => void;
|
|
37
|
+
}
|
|
19
38
|
export interface SyncSchedulerOptions {
|
|
20
39
|
intervalMs?: number;
|
|
21
40
|
onError?: (error: unknown) => void;
|
|
22
41
|
onRecoverySignal?: (signal: SyncSchedulerRecoverySignal) => void;
|
|
42
|
+
retry?: SyncSchedulerRetryOptions;
|
|
23
43
|
}
|
|
24
44
|
export type SyncSchedulerRecoverySignal = 'active' | 'online';
|
|
25
45
|
/**
|
|
@@ -27,7 +47,9 @@ export type SyncSchedulerRecoverySignal = 'active' | 'online';
|
|
|
27
47
|
*
|
|
28
48
|
* A trigger that arrives while a run is active joins that run. A follow-up
|
|
29
49
|
* requested during a run replays the callback once after it settles, so writes
|
|
30
|
-
* made mid-run are never left unsent without starting a parallel run.
|
|
50
|
+
* made mid-run are never left unsent without starting a parallel run. With
|
|
51
|
+
* `retry`, a failed run is retried after the chosen delay; a trigger during
|
|
52
|
+
* that delay ends it and restarts the retry count.
|
|
31
53
|
*/
|
|
32
54
|
export declare class SyncScheduler {
|
|
33
55
|
private readonly run;
|
|
@@ -35,20 +57,29 @@ export declare class SyncScheduler {
|
|
|
35
57
|
private readonly intervalMs;
|
|
36
58
|
private readonly onError;
|
|
37
59
|
private readonly onRecoverySignal;
|
|
60
|
+
private readonly retry;
|
|
38
61
|
private active;
|
|
39
62
|
private started;
|
|
40
63
|
private inFlight;
|
|
41
64
|
private rerunRequested;
|
|
42
65
|
private interval;
|
|
43
66
|
private subscriptions;
|
|
67
|
+
private wakeRetry;
|
|
68
|
+
private stops;
|
|
44
69
|
constructor(run: () => Promise<unknown>, environment: SyncSchedulerEnvironment, options?: SyncSchedulerOptions);
|
|
45
70
|
start(): void;
|
|
46
71
|
stop(): void;
|
|
47
|
-
/** Starts a run, or joins the active one. */
|
|
72
|
+
/** Starts a run, or joins the active one and ends its retry delay. */
|
|
48
73
|
trigger(): Promise<void>;
|
|
49
74
|
/** Queues exactly one more run when a run is already active. */
|
|
50
75
|
requestFollowUp(): Promise<void>;
|
|
51
76
|
private runUntilSettled;
|
|
77
|
+
/** Read through a method: a follow-up can arrive while `run` is awaited. */
|
|
78
|
+
private followUpRequested;
|
|
79
|
+
private runOnce;
|
|
80
|
+
private retryDelay;
|
|
81
|
+
/** The environment has interval timers only, so the delay clears its interval on the first tick. */
|
|
82
|
+
private waitForRetry;
|
|
52
83
|
private refreshInterval;
|
|
53
84
|
private stopInterval;
|
|
54
85
|
}
|
package/dist/scheduler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,IAAI,OAAO,CAAC;IACpB,eAAe,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACjE,eAAe,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAClD,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAC5E,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG,MAAM,CAAC;AAEpF,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,2BAA2B,KAAK,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,QAAQ,IAAI,OAAO,CAAC;IACpB,eAAe,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACjE,eAAe,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAClD,WAAW,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,YAAY,EAAE,MAAM,GAAG,kBAAkB,CAAC;IAC5E,aAAa,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACjD;AAED;;;GAGG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAAE,QAAQ,CAAC,oBAAoB,CAAC,EAAE,KAAK,CAAA;CAAE,GAAG,MAAM,CAAC;AAEpF,kDAAkD;AAClD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED,8DAA8D;AAC9D,MAAM,WAAW,yBAAyB;IACxC,kFAAkF;IAClF,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACxE,+EAA+E;IAC/E,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;CACjE;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IACnC,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,2BAA2B,KAAK,IAAI,CAAC;IACjE,KAAK,CAAC,EAAE,yBAAyB,CAAC;CACnC;AAED,MAAM,MAAM,2BAA2B,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAmB9D;;;;;;;;GAQG;AACH,qBAAa,aAAa;IAetB,OAAO,CAAC,QAAQ,CAAC,GAAG;IACpB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAf9B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;IACnD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAgD;IACjF,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAwC;IAC9D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAmC;IACnD,OAAO,CAAC,aAAa,CAAsB;IAC3C,OAAO,CAAC,SAAS,CAA8C;IAC/D,OAAO,CAAC,KAAK,CAAK;gBAGC,GAAG,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC3B,WAAW,EAAE,wBAAwB,EACtD,OAAO,GAAE,oBAAyB;IASpC,KAAK,IAAI,IAAI;IA4Bb,IAAI,IAAI,IAAI;IAYZ,sEAAsE;IACtE,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBxB,gEAAgE;IAChE,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;YAQlB,eAAe;IA0B7B,4EAA4E;IAC5E,OAAO,CAAC,iBAAiB;YAIX,OAAO;IAUrB,OAAO,CAAC,UAAU;IAkBlB,oGAAoG;IACpG,OAAO,CAAC,YAAY;IAgBpB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,YAAY;CAOrB"}
|
package/dist/scheduler.js
CHANGED
|
@@ -2,12 +2,22 @@ const DEFAULT_INTERVAL_MS = 5 * 60 * 1000;
|
|
|
2
2
|
function noop() {
|
|
3
3
|
return;
|
|
4
4
|
}
|
|
5
|
+
function validateRetry(retry) {
|
|
6
|
+
if (retry === undefined) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
if (!Number.isInteger(retry.maxRetries) || retry.maxRetries < 0) {
|
|
10
|
+
throw new RangeError('retry.maxRetries must be a non-negative integer');
|
|
11
|
+
}
|
|
12
|
+
}
|
|
5
13
|
/**
|
|
6
14
|
* Runs one opaque sync callback at most once at a time.
|
|
7
15
|
*
|
|
8
16
|
* A trigger that arrives while a run is active joins that run. A follow-up
|
|
9
17
|
* requested during a run replays the callback once after it settles, so writes
|
|
10
|
-
* made mid-run are never left unsent without starting a parallel run.
|
|
18
|
+
* made mid-run are never left unsent without starting a parallel run. With
|
|
19
|
+
* `retry`, a failed run is retried after the chosen delay; a trigger during
|
|
20
|
+
* that delay ends it and restarts the retry count.
|
|
11
21
|
*/
|
|
12
22
|
export class SyncScheduler {
|
|
13
23
|
run;
|
|
@@ -15,18 +25,23 @@ export class SyncScheduler {
|
|
|
15
25
|
intervalMs;
|
|
16
26
|
onError;
|
|
17
27
|
onRecoverySignal;
|
|
28
|
+
retry;
|
|
18
29
|
active = false;
|
|
19
30
|
started = false;
|
|
20
31
|
inFlight = null;
|
|
21
32
|
rerunRequested = false;
|
|
22
33
|
interval = null;
|
|
23
34
|
subscriptions = [];
|
|
35
|
+
wakeRetry = null;
|
|
36
|
+
stops = 0;
|
|
24
37
|
constructor(run, environment, options = {}) {
|
|
25
38
|
this.run = run;
|
|
26
39
|
this.environment = environment;
|
|
40
|
+
validateRetry(options.retry);
|
|
27
41
|
this.intervalMs = options.intervalMs ?? DEFAULT_INTERVAL_MS;
|
|
28
42
|
this.onError = options.onError ?? noop;
|
|
29
43
|
this.onRecoverySignal = options.onRecoverySignal ?? noop;
|
|
44
|
+
this.retry = options.retry;
|
|
30
45
|
}
|
|
31
46
|
start() {
|
|
32
47
|
if (this.started) {
|
|
@@ -57,16 +72,19 @@ export class SyncScheduler {
|
|
|
57
72
|
}
|
|
58
73
|
stop() {
|
|
59
74
|
this.started = false;
|
|
75
|
+
this.stops += 1;
|
|
60
76
|
this.rerunRequested = false;
|
|
77
|
+
this.wakeRetry?.('stopped');
|
|
61
78
|
this.stopInterval();
|
|
62
79
|
this.subscriptions.forEach((unsubscribe) => {
|
|
63
80
|
unsubscribe();
|
|
64
81
|
});
|
|
65
82
|
this.subscriptions = [];
|
|
66
83
|
}
|
|
67
|
-
/** Starts a run, or joins the active one. */
|
|
84
|
+
/** Starts a run, or joins the active one and ends its retry delay. */
|
|
68
85
|
trigger() {
|
|
69
86
|
if (this.inFlight) {
|
|
87
|
+
this.wakeRetry?.('triggered');
|
|
70
88
|
return this.inFlight;
|
|
71
89
|
}
|
|
72
90
|
const task = Promise.resolve()
|
|
@@ -88,18 +106,80 @@ export class SyncScheduler {
|
|
|
88
106
|
return this.trigger();
|
|
89
107
|
}
|
|
90
108
|
async runUntilSettled() {
|
|
91
|
-
|
|
92
|
-
|
|
109
|
+
const stopsAtStart = this.stops;
|
|
110
|
+
let retryIndex = 0;
|
|
111
|
+
for (;;) {
|
|
93
112
|
this.rerunRequested = false;
|
|
94
|
-
|
|
95
|
-
|
|
113
|
+
const failure = await this.runOnce();
|
|
114
|
+
if (failure === null) {
|
|
115
|
+
retryIndex = 0;
|
|
116
|
+
if (!this.followUpRequested())
|
|
117
|
+
return;
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const delayMs = this.retryDelay(failure.error, retryIndex);
|
|
121
|
+
if (delayMs === null) {
|
|
122
|
+
if (!this.followUpRequested())
|
|
123
|
+
return;
|
|
124
|
+
continue;
|
|
96
125
|
}
|
|
97
|
-
|
|
98
|
-
|
|
126
|
+
this.retry?.onRetryScheduled?.({ error: failure.error, retryIndex, delayMs });
|
|
127
|
+
const wake = await this.waitForRetry(delayMs);
|
|
128
|
+
const stopped = this.stops !== stopsAtStart;
|
|
129
|
+
if (stopped || (wake === 'elapsed' && this.started && !this.active)) {
|
|
130
|
+
return;
|
|
99
131
|
}
|
|
100
|
-
|
|
132
|
+
retryIndex = wake === 'triggered' ? 0 : retryIndex + 1;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
/** Read through a method: a follow-up can arrive while `run` is awaited. */
|
|
136
|
+
followUpRequested() {
|
|
137
|
+
return this.rerunRequested;
|
|
138
|
+
}
|
|
139
|
+
async runOnce() {
|
|
140
|
+
try {
|
|
141
|
+
await this.run();
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
this.onError(error);
|
|
146
|
+
return { error };
|
|
101
147
|
}
|
|
102
148
|
}
|
|
149
|
+
retryDelay(error, retryIndex) {
|
|
150
|
+
if (this.retry === undefined || retryIndex >= this.retry.maxRetries) {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
let delayMs;
|
|
154
|
+
try {
|
|
155
|
+
delayMs = this.retry.delayMs(error, retryIndex);
|
|
156
|
+
}
|
|
157
|
+
catch (delayError) {
|
|
158
|
+
this.onError(delayError);
|
|
159
|
+
return null;
|
|
160
|
+
}
|
|
161
|
+
if (delayMs !== null && (!Number.isFinite(delayMs) || delayMs < 0)) {
|
|
162
|
+
this.onError(new RangeError('retry.delayMs must return a finite non-negative number'));
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
return delayMs;
|
|
166
|
+
}
|
|
167
|
+
/** The environment has interval timers only, so the delay clears its interval on the first tick. */
|
|
168
|
+
waitForRetry(delayMs) {
|
|
169
|
+
return new Promise((resolve) => {
|
|
170
|
+
const wake = (reason) => {
|
|
171
|
+
this.environment.clearInterval(timer);
|
|
172
|
+
if (this.wakeRetry === wake) {
|
|
173
|
+
this.wakeRetry = null;
|
|
174
|
+
}
|
|
175
|
+
resolve(reason);
|
|
176
|
+
};
|
|
177
|
+
const timer = this.environment.setInterval(() => {
|
|
178
|
+
wake('elapsed');
|
|
179
|
+
}, delayMs);
|
|
180
|
+
this.wakeRetry = wake;
|
|
181
|
+
});
|
|
182
|
+
}
|
|
103
183
|
refreshInterval() {
|
|
104
184
|
this.stopInterval();
|
|
105
185
|
if (!this.started || !this.active) {
|
package/dist/scheduler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { SyncFailure } from './error.js';
|
|
2
2
|
/** Sync activity, as named by the offline-readiness contract. */
|
|
3
3
|
export type SyncStatus = 'idle' | 'syncing' | 'pending' | 'attention' | 'auth' | 'error';
|
|
4
4
|
/** Progress of the initial pull that a cold start must complete. */
|
|
@@ -39,22 +39,6 @@ export interface LocalStoreReadinessInput {
|
|
|
39
39
|
deliveredRevision: number | null;
|
|
40
40
|
hasData: boolean;
|
|
41
41
|
}
|
|
42
|
-
export interface SnakeCaseSyncStatusSnapshot<TAttention = SyncAttentionItem> {
|
|
43
|
-
status: SyncStatus;
|
|
44
|
-
last_attempt_at: string | null;
|
|
45
|
-
last_success_at: string | null;
|
|
46
|
-
/** @deprecated Use `last_success_at`. This field will be removed after one release cycle. */
|
|
47
|
-
last_sync_at: string | null;
|
|
48
|
-
error: string | null;
|
|
49
|
-
failure: SnakeCaseSyncFailure | null;
|
|
50
|
-
retrying: boolean;
|
|
51
|
-
retry_at: string | null;
|
|
52
|
-
attention: readonly TAttention[];
|
|
53
|
-
pending_count: number;
|
|
54
|
-
initial_pull_status: InitialPullStatus;
|
|
55
|
-
refresh_revision: number;
|
|
56
|
-
security_block: string | null;
|
|
57
|
-
}
|
|
58
42
|
export interface SyncStatusHydration<TAttention = SyncAttentionItem> {
|
|
59
43
|
lastAttemptAt: string | null;
|
|
60
44
|
lastSuccessAt: string | null;
|
|
@@ -72,8 +56,6 @@ export interface SyncFailureUpdate {
|
|
|
72
56
|
export interface SyncStatusStoreOptions {
|
|
73
57
|
clock?: () => string;
|
|
74
58
|
}
|
|
75
|
-
/** Projects a status snapshot onto API-style snake_case field names. */
|
|
76
|
-
export declare function toSnakeCaseSnapshot<TAttention>(snapshot: SyncStatusSnapshot<TAttention>): SnakeCaseSyncStatusSnapshot<TAttention>;
|
|
77
59
|
/**
|
|
78
60
|
* Maps pull progress and snapshot delivery onto local-store readiness.
|
|
79
61
|
*
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,iEAAiE;AACjE,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAEzF,oEAAoE;AACpE,MAAM,MAAM,iBAAiB,GAAG,eAAe,GAAG,SAAS,GAAG,SAAS,CAAC;AAExE,6EAA6E;AAC7E,MAAM,MAAM,mBAAmB,GAC7B,eAAe,GAAG,SAAS,GAAG,gBAAgB,GAAG,oBAAoB,CAAC;AAExE,oEAAoE;AACpE,MAAM,MAAM,gBAAgB,GAC1B,SAAS,GAAG,SAAS,GAAG,gBAAgB,GAAG,mBAAmB,GAAG,SAAS,CAAC;AAE7E;;;GAGG;AACH,MAAM,MAAM,iBAAiB,CAC3B,CAAC,GAAG;IACF,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB,IACC,CAAC,CAAC;AAEN,MAAM,WAAW,kBAAkB,CAAC,UAAU,GAAG,iBAAiB;IAChE,MAAM,EAAE,UAAU,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,2FAA2F;IAC3F,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,SAAS,UAAU,EAAE,CAAC;IACjC,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,uEAAuE;IACvE,eAAe,EAAE,MAAM,CAAC;IACxB,sEAAsE;IACtE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB,CAAC,UAAU,GAAG,iBAAiB;IACjE,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,SAAS,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IAChC,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,MAAM,MAAM,CAAC;CACtB;AAoBD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,EACxC,iBAAiB,EACjB,eAAe,EACf,iBAAiB,EACjB,OAAO,GACR,EAAE,wBAAwB,GAAG,mBAAmB,CAIhD;AAED,wEAAwE;AACxE,wBAAgB,sBAAsB,CAAC,EACrC,iBAAiB,EACjB,aAAa,EACb,MAAM,EACN,OAAO,GACR,EAAE,IAAI,CACL,kBAAkB,EAClB,SAAS,GAAG,mBAAmB,GAAG,eAAe,GAAG,QAAQ,CAC7D,GAAG,gBAAgB,CAQnB;AAOD;;;;;GAKG;AACH,qBAAa,eAAe,CAAC,UAAU,GAAG,iBAAiB;IACzD,OAAO,CAAC,QAAQ,CAAqD;IACrE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiE;IAC3F,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;gBAEzB,OAAO,GAAE,sBAA2B;IAIhD,WAAW,IAAI,kBAAkB,CAAC,UAAU,CAAC;IAI7C,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI;IAOnF,UAAU,CAAC,SAAS,SAAe,GAAG,IAAI;IAU1C,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;IAgBhC,YAAY,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IActE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,iBAAsB,GAAG,IAAI;IAI9D,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,iBAAsB,GAAG,IAAI;IAyBvF,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAazD,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAQtD,uEAAuE;IACvE,OAAO,CAAC,SAAS,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,IAAI;IACzD,4EAA4E;IAC5E,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI;IAgC9F,KAAK,IAAI,IAAI;IAIb,gBAAgB,CACd,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,OAAO,CAAC,WAAW,EAAE;QAAE,IAAI,EAAE,oBAAoB,GAAG,aAAa,CAAA;KAAE,CAE3E,GACA,IAAI;IAaP,eAAe,IAAI,IAAI;IAUvB,OAAO,CAAC,GAAG;CASZ;AAED,0DAA0D;AAC1D,MAAM,WAAW,cAAc,CAAC,UAAU,GAAG,iBAAiB;IAC5D,UAAU,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,YAAY,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACvE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAC3D,UAAU,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACpF,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3D"}
|
package/dist/store.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { toSnakeCaseFailure } from './error.js';
|
|
2
1
|
function initialSnapshot() {
|
|
3
2
|
return {
|
|
4
3
|
status: 'idle',
|
|
@@ -16,24 +15,6 @@ function initialSnapshot() {
|
|
|
16
15
|
securityBlock: null,
|
|
17
16
|
};
|
|
18
17
|
}
|
|
19
|
-
/** Projects a status snapshot onto API-style snake_case field names. */
|
|
20
|
-
export function toSnakeCaseSnapshot(snapshot) {
|
|
21
|
-
return {
|
|
22
|
-
status: snapshot.status,
|
|
23
|
-
last_attempt_at: snapshot.lastAttemptAt,
|
|
24
|
-
last_success_at: snapshot.lastSuccessAt,
|
|
25
|
-
last_sync_at: snapshot.lastSuccessAt,
|
|
26
|
-
error: snapshot.error,
|
|
27
|
-
failure: snapshot.failure === null ? null : toSnakeCaseFailure(snapshot.failure),
|
|
28
|
-
retrying: snapshot.retrying,
|
|
29
|
-
retry_at: snapshot.retryAt,
|
|
30
|
-
attention: snapshot.attention,
|
|
31
|
-
pending_count: snapshot.pendingCount,
|
|
32
|
-
initial_pull_status: snapshot.initialPullStatus,
|
|
33
|
-
refresh_revision: snapshot.refreshRevision,
|
|
34
|
-
security_block: snapshot.securityBlock,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
18
|
/**
|
|
38
19
|
* Maps pull progress and snapshot delivery onto local-store readiness.
|
|
39
20
|
*
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@baukit/sync-client",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "Client-side scheduling, transport, status reporting, and ordering for offline-capable sync loops.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Patrick Koss",
|
|
@@ -24,23 +24,28 @@
|
|
|
24
24
|
"exports": {
|
|
25
25
|
".": {
|
|
26
26
|
"types": "./dist/index.d.ts",
|
|
27
|
-
"import": "./dist/index.js"
|
|
27
|
+
"import": "./dist/index.js",
|
|
28
|
+
"default": "./dist/index.js"
|
|
28
29
|
},
|
|
29
30
|
"./hlc": {
|
|
30
31
|
"types": "./dist/hlc.d.ts",
|
|
31
|
-
"import": "./dist/hlc.js"
|
|
32
|
+
"import": "./dist/hlc.js",
|
|
33
|
+
"default": "./dist/hlc.js"
|
|
32
34
|
},
|
|
33
35
|
"./expo": {
|
|
34
36
|
"types": "./dist/expo.d.ts",
|
|
35
|
-
"import": "./dist/expo.js"
|
|
37
|
+
"import": "./dist/expo.js",
|
|
38
|
+
"default": "./dist/expo.js"
|
|
36
39
|
},
|
|
37
40
|
"./browser": {
|
|
38
41
|
"types": "./dist/browser.d.ts",
|
|
39
|
-
"import": "./dist/browser.js"
|
|
42
|
+
"import": "./dist/browser.js",
|
|
43
|
+
"default": "./dist/browser.js"
|
|
40
44
|
},
|
|
41
45
|
"./conformance": {
|
|
42
46
|
"types": "./dist/conformance.d.ts",
|
|
43
|
-
"import": "./dist/conformance.js"
|
|
47
|
+
"import": "./dist/conformance.js",
|
|
48
|
+
"default": "./dist/conformance.js"
|
|
44
49
|
}
|
|
45
50
|
},
|
|
46
51
|
"files": [
|
|
@@ -48,7 +53,15 @@
|
|
|
48
53
|
"README.md",
|
|
49
54
|
"LICENSE"
|
|
50
55
|
],
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "tsc -p tsconfig.json",
|
|
58
|
+
"prepare": "pnpm run build",
|
|
59
|
+
"test": "tsc -p tsconfig.test.json && tsc -p tsconfig.exports.json && vitest run --config ../../vitest.config.ts && node ../../scripts/test-packed-exports.mjs",
|
|
60
|
+
"lint": "eslint src --max-warnings=0",
|
|
61
|
+
"format:check": "prettier --check src type-tests package.json tsconfig*.json"
|
|
62
|
+
},
|
|
51
63
|
"devDependencies": {
|
|
64
|
+
"@types/node": "24.10.1",
|
|
52
65
|
"expo-network": "57.0.1",
|
|
53
66
|
"react-native": "0.86.2",
|
|
54
67
|
"typescript": "6.0.3",
|
|
@@ -65,11 +78,5 @@
|
|
|
65
78
|
"react-native": {
|
|
66
79
|
"optional": true
|
|
67
80
|
}
|
|
68
|
-
},
|
|
69
|
-
"scripts": {
|
|
70
|
-
"build": "tsc -p tsconfig.json",
|
|
71
|
-
"test": "tsc -p tsconfig.exports.json && vitest run --config ../../vitest.config.ts",
|
|
72
|
-
"lint": "eslint src --max-warnings=0",
|
|
73
|
-
"format:check": "prettier --check src type-tests package.json tsconfig*.json"
|
|
74
81
|
}
|
|
75
|
-
}
|
|
82
|
+
}
|