@baukit/sync-client 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/error.js CHANGED
@@ -17,15 +17,86 @@ export class SyncAuthError extends SyncTransportError {
17
17
  this.name = 'SyncAuthError';
18
18
  }
19
19
  }
20
+ /** The request did not reach a usable HTTP response. */
21
+ export class SyncNetworkError extends SyncTransportError {
22
+ kind = 'network';
23
+ constructor(message, cause) {
24
+ super(message, true, cause);
25
+ this.name = 'SyncNetworkError';
26
+ }
27
+ }
28
+ /** The server returned an HTTP failure other than authentication or rate limiting. */
29
+ export class SyncServerError extends SyncTransportError {
30
+ kind = 'server';
31
+ constructor(message, retryable, cause) {
32
+ super(message, retryable, cause);
33
+ this.name = 'SyncServerError';
34
+ }
35
+ }
36
+ /** HTTP 429 with its raw `Retry-After` value and resolved retry time. */
37
+ export class SyncRateLimitError extends SyncTransportError {
38
+ retryAt;
39
+ retryAfter;
40
+ kind = 'rate_limited';
41
+ constructor(message, retryAt, retryAfter, cause) {
42
+ super(message, true, cause);
43
+ this.retryAt = retryAt;
44
+ this.retryAfter = retryAfter;
45
+ this.name = 'SyncRateLimitError';
46
+ }
47
+ }
20
48
  /**
21
49
  * The server rejected the caller's local-data partition, so the local database
22
50
  * belongs to an erased or replaced owner and must not be reused.
23
51
  */
24
52
  export class SyncPartitionMismatchError extends SyncTransportError {
25
- kind = 'partition-mismatch';
53
+ kind = 'partition_mismatch';
26
54
  constructor(message, cause) {
27
55
  super(message, false, cause);
28
56
  this.name = 'SyncPartitionMismatchError';
29
57
  }
30
58
  }
59
+ /** A decoded response violates the sync payload contract. */
60
+ export class SyncPayloadCompatibilityError extends SyncTransportError {
61
+ kind = 'payload_compatibility';
62
+ constructor(message, cause) {
63
+ super(message, false, cause);
64
+ this.name = 'SyncPayloadCompatibilityError';
65
+ }
66
+ }
67
+ /** Remote data or a cursor could not be committed to local storage. */
68
+ export class SyncLocalApplyError extends Error {
69
+ kind = 'local_apply';
70
+ constructor(message, cause) {
71
+ super(message, { cause });
72
+ this.name = 'SyncLocalApplyError';
73
+ }
74
+ }
75
+ /** Maps package errors onto store failure metadata. */
76
+ export function syncFailureFromError(error) {
77
+ if (error instanceof SyncRateLimitError) {
78
+ return { kind: 'rate_limited', retryAt: error.retryAt };
79
+ }
80
+ if (error instanceof SyncAuthError)
81
+ return { kind: 'auth' };
82
+ if (error instanceof SyncPartitionMismatchError)
83
+ return { kind: 'partition_mismatch' };
84
+ if (error instanceof SyncNetworkError)
85
+ return { kind: 'network' };
86
+ if (error instanceof SyncServerError)
87
+ return { kind: 'server' };
88
+ if (error instanceof SyncPayloadCompatibilityError)
89
+ return { kind: 'payload_compatibility' };
90
+ if (error instanceof SyncLocalApplyError)
91
+ return { kind: 'local_apply' };
92
+ if (error instanceof SyncTransportError) {
93
+ return error.retryable ? { kind: 'network' } : { kind: 'server' };
94
+ }
95
+ return { kind: 'local_apply' };
96
+ }
97
+ export function toSnakeCaseFailure(failure) {
98
+ return failure.kind === 'rate_limited'
99
+ ? { kind: failure.kind, retry_at: failure.retryAt }
100
+ : failure;
101
+ }
31
102
  //# 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":"AAAA,kFAAkF;AAClF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGhC;IACS;IAHpB,YACE,OAAe,EACN,SAAkB,EACT,KAAe;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,cAAS,GAAT,SAAS,CAAS;QACT,UAAK,GAAL,KAAK,CAAU;QAGjC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,OAAO,aAAc,SAAQ,kBAAkB;IAC1C,IAAI,GAAG,MAAM,CAAC;IAEvB,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,0BAA2B,SAAQ,kBAAkB;IACvD,IAAI,GAAG,oBAAoB,CAAC;IAErC,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF"}
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AAeA,kFAAkF;AAClF,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAGhC;IACS;IAHpB,YACE,OAAe,EACN,SAAkB,EACT,KAAe;QAEjC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,cAAS,GAAT,SAAS,CAAS;QACT,UAAK,GAAL,KAAK,CAAU;QAGjC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,4EAA4E;AAC5E,MAAM,OAAO,aAAc,SAAQ,kBAAkB;IAC1C,IAAI,GAAG,MAAM,CAAC;IAEvB,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;IAC9B,CAAC;CACF;AAED,wDAAwD;AACxD,MAAM,OAAO,gBAAiB,SAAQ,kBAAkB;IAC7C,IAAI,GAAG,SAAS,CAAC;IAE1B,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,sFAAsF;AACtF,MAAM,OAAO,eAAgB,SAAQ,kBAAkB;IAC5C,IAAI,GAAG,QAAQ,CAAC;IAEzB,YAAY,OAAe,EAAE,SAAkB,EAAE,KAAe;QAC9D,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED,yEAAyE;AACzE,MAAM,OAAO,kBAAmB,SAAQ,kBAAkB;IAK7C;IACA;IALF,IAAI,GAAG,cAAc,CAAC;IAE/B,YACE,OAAe,EACN,OAAe,EACf,UAAyB,EAClC,KAAe;QAEf,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAJnB,YAAO,GAAP,OAAO,CAAQ;QACf,eAAU,GAAV,UAAU,CAAe;QAIlC,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,0BAA2B,SAAQ,kBAAkB;IACvD,IAAI,GAAG,oBAAoB,CAAC;IAErC,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,4BAA4B,CAAC;IAC3C,CAAC;CACF;AAED,6DAA6D;AAC7D,MAAM,OAAO,6BAA8B,SAAQ,kBAAkB;IAC1D,IAAI,GAAG,uBAAuB,CAAC;IAExC,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,+BAA+B,CAAC;IAC9C,CAAC;CACF;AAED,uEAAuE;AACvE,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IACnC,IAAI,GAAG,aAAa,CAAC;IAE9B,YAAY,OAAe,EAAE,KAAe;QAC1C,KAAK,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF;AAED,uDAAuD;AACvD,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;QACxC,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAC1D,CAAC;IACD,IAAI,KAAK,YAAY,aAAa;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC5D,IAAI,KAAK,YAAY,0BAA0B;QAAE,OAAO,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC;IACvF,IAAI,KAAK,YAAY,gBAAgB;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAClE,IAAI,KAAK,YAAY,eAAe;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAChE,IAAI,KAAK,YAAY,6BAA6B;QAAE,OAAO,EAAE,IAAI,EAAE,uBAAuB,EAAE,CAAC;IAC7F,IAAI,KAAK,YAAY,mBAAmB;QAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;IACzE,IAAI,KAAK,YAAY,kBAAkB,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACpE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAoB;IACrD,OAAO,OAAO,CAAC,IAAI,KAAK,cAAc;QACpC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE;QACnD,CAAC,CAAC,OAAO,CAAC;AACd,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- export { SyncAuthError, SyncPartitionMismatchError, SyncTransportError } from './error.js';
2
- export { dependencyRankByOrder, rankPushBatch } from './push-batch.js';
3
- export type { PushCandidate, RankedPushItem, RankPushBatchOptions } from './push-batch.js';
1
+ export { SyncAuthError, SyncLocalApplyError, SyncNetworkError, SyncPartitionMismatchError, SyncPayloadCompatibilityError, SyncRateLimitError, SyncServerError, SyncTransportError, syncFailureFromError, toSnakeCaseFailure, } from './error.js';
2
+ export type { SnakeCaseSyncFailure, SyncFailure } from './error.js';
3
+ export { dependencyRankByOrder, rankPushBatch, validatePushOutcomeCoverage } from './push-batch.js';
4
+ export type { PushCandidate, PushOutcomeCoverageOptions, RankedPushItem, RankPushBatchOptions, } from './push-batch.js';
4
5
  export { SyncScheduler } from './scheduler.js';
5
6
  export type { SyncSchedulerEnvironment, SyncSchedulerOptions, SyncSchedulerTimer, } from './scheduler.js';
6
7
  export { deriveInitialSyncState, deriveLocalStoreReadiness, SyncStatusStore, toSnakeCaseSnapshot, } from './store.js';
7
- export type { InitialPullStatus, InitialSyncState, LocalStoreReadiness, LocalStoreReadinessInput, SnakeCaseSyncStatusSnapshot, SyncAttentionItem, SyncStatus, SyncStatusSink, SyncStatusSnapshot, } from './store.js';
8
- export { SyncTransport } from './transport.js';
9
- export type { SyncFetch, SyncFetchResponse, SyncPrebuiltRequest, SyncPrebuiltRequestTransportOptions, SyncRequestOptions, SyncRequestInit, SyncFetchTransportOptions, SyncTransportOptions, } from './transport.js';
8
+ export type { InitialPullStatus, InitialSyncState, LocalStoreReadiness, LocalStoreReadinessInput, SnakeCaseSyncStatusSnapshot, SyncAttentionItem, SyncFailureUpdate, SyncStatus, SyncStatusHydration, SyncStatusSink, SyncStatusSnapshot, SyncStatusStoreOptions, } from './store.js';
9
+ export { commitCursorAfterLocalTransaction, DEFAULT_RETRY_AFTER_FALLBACK_MS, parseRetryAfter, SyncTransport, validatePullPage, } from './transport.js';
10
+ export type { CursorCommitOptions, ParseRetryAfterOptions, PullPagePosition, SyncCursorComparator, SyncFetch, SyncFetchResponse, SyncResponseHeaders, SyncPrebuiltRequest, SyncPrebuiltRequestTransportOptions, SyncRequestOptions, SyncRequestInit, SyncFetchTransportOptions, SyncTransportOptions, } from './transport.js';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACvE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EACV,wBAAwB,EACxB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,eAAe,EACf,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,2BAA2B,EAC3B,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,YAAY,EACV,SAAS,EACT,iBAAiB,EACjB,mBAAmB,EACnB,mCAAmC,EACnC,kBAAkB,EAClB,eAAe,EACf,yBAAyB,EACzB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC"}
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,EACpB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACpE,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,kBAAkB,GACnB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,eAAe,EACf,mBAAmB,GACpB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,2BAA2B,EAC3B,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,6 +1,6 @@
1
- export { SyncAuthError, SyncPartitionMismatchError, SyncTransportError } from './error.js';
2
- export { dependencyRankByOrder, rankPushBatch } from './push-batch.js';
1
+ export { SyncAuthError, SyncLocalApplyError, SyncNetworkError, SyncPartitionMismatchError, SyncPayloadCompatibilityError, SyncRateLimitError, SyncServerError, SyncTransportError, syncFailureFromError, toSnakeCaseFailure, } from './error.js';
2
+ export { dependencyRankByOrder, rankPushBatch, validatePushOutcomeCoverage } from './push-batch.js';
3
3
  export { SyncScheduler } from './scheduler.js';
4
4
  export { deriveInitialSyncState, deriveLocalStoreReadiness, SyncStatusStore, toSnakeCaseSnapshot, } from './store.js';
5
- export { SyncTransport } from './transport.js';
5
+ export { commitCursorAfterLocalTransaction, DEFAULT_RETRY_AFTER_FALLBACK_MS, parseRetryAfter, SyncTransport, validatePullPage, } from './transport.js';
6
6
  //# 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,EAAE,aAAa,EAAE,0BAA0B,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC3F,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEvE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM/C,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,eAAe,EACf,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAYpB,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC"}
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,EACpB,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAOpG,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAM/C,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,eAAe,EACf,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAepB,OAAO,EACL,iCAAiC,EACjC,+BAA+B,EAC/B,eAAe,EACf,aAAa,EACb,gBAAgB,GACjB,MAAM,gBAAgB,CAAC"}
@@ -35,6 +35,17 @@ export interface RankPushBatchOptions<T extends PushCandidate> {
35
35
  */
36
36
  isHeldBack?: (change: T) => boolean;
37
37
  }
38
+ export interface PushOutcomeCoverageOptions<TSubmitted, TOutcome> {
39
+ submittedKey: (submitted: TSubmitted) => string;
40
+ outcomeKey: (outcome: TOutcome) => string;
41
+ }
42
+ /**
43
+ * Rejects a response that omits an outcome for any submitted entity.
44
+ *
45
+ * Call this before acknowledging accepted or rejected changes. Products supply
46
+ * key readers because their wire field names remain product-owned.
47
+ */
48
+ export declare function validatePushOutcomeCoverage<TSubmitted, TOutcome>(submitted: readonly TSubmitted[], outcomes: readonly TOutcome[], { submittedKey, outcomeKey }: PushOutcomeCoverageOptions<TSubmitted, TOutcome>): readonly TOutcome[];
38
49
  /**
39
50
  * Orders a push batch parent-before-child and coalesces per entity.
40
51
  *
@@ -1 +1 @@
1
- {"version":3,"file":"push-batch.d.ts","sourceRoot":"","sources":["../src/push-batch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,aAAa;IACrD,gFAAgF;IAChF,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,aAAa;IAC3D;;;OAGG;IACH,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC;CACrC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,aAAa,EACnD,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC,GACvD,cAAc,CAAC,CAAC,CAAC,EAAE,CAqBrB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAG9F"}
1
+ {"version":3,"file":"push-batch.d.ts","sourceRoot":"","sources":["../src/push-batch.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,sEAAsE;AACtE,MAAM,WAAW,cAAc,CAAC,CAAC,SAAS,aAAa;IACrD,gFAAgF;IAChF,MAAM,EAAE,CAAC,CAAC;IACV;;;OAGG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,SAAS,aAAa;IAC3D;;;OAGG;IACH,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IACrC,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC;CACrC;AAED,MAAM,WAAW,0BAA0B,CAAC,UAAU,EAAE,QAAQ;IAC9D,YAAY,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,MAAM,CAAC;IAChD,UAAU,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,MAAM,CAAC;CAC3C;AAED;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,QAAQ,EAC9D,SAAS,EAAE,SAAS,UAAU,EAAE,EAChC,QAAQ,EAAE,SAAS,QAAQ,EAAE,EAC7B,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,0BAA0B,CAAC,UAAU,EAAE,QAAQ,CAAC,GAC7E,SAAS,QAAQ,EAAE,CASrB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,aAAa,EACnD,OAAO,EAAE,SAAS,CAAC,EAAE,EACrB,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC,GACvD,cAAc,CAAC,CAAC,CAAC,EAAE,CAqBrB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAG9F"}
@@ -1,3 +1,18 @@
1
+ import { SyncPayloadCompatibilityError } from './error.js';
2
+ /**
3
+ * Rejects a response that omits an outcome for any submitted entity.
4
+ *
5
+ * Call this before acknowledging accepted or rejected changes. Products supply
6
+ * key readers because their wire field names remain product-owned.
7
+ */
8
+ export function validatePushOutcomeCoverage(submitted, outcomes, { submittedKey, outcomeKey }) {
9
+ const outcomeKeys = new Set(outcomes.map(outcomeKey));
10
+ const missing = new Set(submitted.map(submittedKey).filter((key) => !outcomeKeys.has(key)));
11
+ if (missing.size > 0) {
12
+ throw new SyncPayloadCompatibilityError(`The push response omitted outcomes for ${String(missing.size)} submitted entities.`);
13
+ }
14
+ return outcomes;
15
+ }
1
16
  /**
2
17
  * Orders a push batch parent-before-child and coalesces per entity.
3
18
  *
@@ -1 +1 @@
1
- {"version":3,"file":"push-batch.js","sourceRoot":"","sources":["../src/push-batch.ts"],"names":[],"mappings":"AAwCA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAqB,EACrB,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAA2B;IAExD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoE,CAAC;IAE5F,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAChC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;YACf,MAAM;YACN,gBAAgB,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC1E,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,KAAK;SAChC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;SACzB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC;SAC7C,IAAI,CACH,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAC3F;SACA,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;SACnB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"push-batch.js","sourceRoot":"","sources":["../src/push-batch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AA+C3D;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CACzC,SAAgC,EAChC,QAA6B,EAC7B,EAAE,YAAY,EAAE,UAAU,EAAoD;IAE9E,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC5F,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,6BAA6B,CACrC,0CAA0C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,sBAAsB,CACrF,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAqB,EACrB,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAA2B;IAExD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAoE,CAAC;IAE5F,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAChC,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;YACf,MAAM;YACN,gBAAgB,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,gBAAgB,IAAI,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC1E,KAAK,EAAE,QAAQ,EAAE,KAAK,IAAI,KAAK;SAChC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;SACzB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC;SAC7C,IAAI,CACH,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CACd,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAC3F;SACA,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC;SACnB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAwB;IAC5D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC;AAC/D,CAAC"}
package/dist/store.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { type SnakeCaseSyncFailure, type SyncFailure } from './error.js';
1
2
  /** Sync activity, as named by the offline-readiness contract. */
2
3
  export type SyncStatus = 'idle' | 'syncing' | 'pending' | 'attention' | 'auth' | 'error';
3
4
  /** Progress of the initial pull that a cold start must complete. */
@@ -5,7 +6,7 @@ export type InitialPullStatus = 'uninitialized' | 'pulling' | 'settled';
5
6
  /** Readiness of the local store, derived from pull progress and delivery. */
6
7
  export type LocalStoreReadiness = 'uninitialized' | 'pulling' | 'hydrated-empty' | 'hydrated-populated';
7
8
  /** Initial readiness as the offline-readiness contract names it. */
8
- export type InitialSyncState = 'unknown' | 'syncing' | 'offline-cached' | 'settled';
9
+ export type InitialSyncState = 'unknown' | 'syncing' | 'offline-cached' | 'sync-error-cached' | 'settled';
9
10
  /**
10
11
  * One rejection that needs product or user action. `entityType` and `entityId`
11
12
  * are opaque to baukit; products name their own entities.
@@ -16,8 +17,14 @@ export type SyncAttentionItem<T = {
16
17
  }> = T;
17
18
  export interface SyncStatusSnapshot<TAttention = SyncAttentionItem> {
18
19
  status: SyncStatus;
20
+ lastAttemptAt: string | null;
21
+ lastSuccessAt: string | null;
22
+ /** @deprecated Use `lastSuccessAt`. This field will be removed after one release cycle. */
19
23
  lastSyncAt: string | null;
20
24
  error: string | null;
25
+ failure: SyncFailure | null;
26
+ retrying: boolean;
27
+ retryAt: string | null;
21
28
  attention: readonly TAttention[];
22
29
  pendingCount: number;
23
30
  initialPullStatus: InitialPullStatus;
@@ -34,14 +41,37 @@ export interface LocalStoreReadinessInput {
34
41
  }
35
42
  export interface SnakeCaseSyncStatusSnapshot<TAttention = SyncAttentionItem> {
36
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. */
37
47
  last_sync_at: string | null;
38
48
  error: string | null;
49
+ failure: SnakeCaseSyncFailure | null;
50
+ retrying: boolean;
51
+ retry_at: string | null;
39
52
  attention: readonly TAttention[];
40
53
  pending_count: number;
41
54
  initial_pull_status: InitialPullStatus;
42
55
  refresh_revision: number;
43
56
  security_block: string | null;
44
57
  }
58
+ export interface SyncStatusHydration<TAttention = SyncAttentionItem> {
59
+ lastAttemptAt: string | null;
60
+ lastSuccessAt: string | null;
61
+ attention?: readonly TAttention[];
62
+ pendingCount?: number;
63
+ }
64
+ export interface SyncFailureUpdate {
65
+ /** Defaults to the store's current pending count. */
66
+ pendingCount?: number;
67
+ /** Defaults to the current time. */
68
+ attemptAt?: string;
69
+ /** Marks a retry as scheduled. Rate-limit failures use their own `retryAt`. */
70
+ retryAt?: string | null;
71
+ }
72
+ export interface SyncStatusStoreOptions {
73
+ clock?: () => string;
74
+ }
45
75
  /** Projects a status snapshot onto API-style snake_case field names. */
46
76
  export declare function toSnakeCaseSnapshot<TAttention>(snapshot: SyncStatusSnapshot<TAttention>): SnakeCaseSyncStatusSnapshot<TAttention>;
47
77
  /**
@@ -52,7 +82,7 @@ export declare function toSnakeCaseSnapshot<TAttention>(snapshot: SyncStatusSnap
52
82
  */
53
83
  export declare function deriveLocalStoreReadiness({ initialPullStatus, refreshRevision, deliveredRevision, hasData, }: LocalStoreReadinessInput): LocalStoreReadiness;
54
84
  /** Maps a snapshot onto the contract's initial-readiness vocabulary. */
55
- export declare function deriveInitialSyncState({ initialPullStatus, lastSyncAt, status, }: Pick<SyncStatusSnapshot, 'initialPullStatus' | 'lastSyncAt' | 'status'>): InitialSyncState;
85
+ export declare function deriveInitialSyncState({ initialPullStatus, lastSuccessAt, status, failure, }: Pick<SyncStatusSnapshot, 'failure' | 'initialPullStatus' | 'lastSuccessAt' | 'status'>): InitialSyncState;
56
86
  /**
57
87
  * Observable sync status, with no React and no state library.
58
88
  *
@@ -62,26 +92,36 @@ export declare function deriveInitialSyncState({ initialPullStatus, lastSyncAt,
62
92
  export declare class SyncStatusStore<TAttention = SyncAttentionItem> {
63
93
  private snapshot;
64
94
  private readonly listeners;
95
+ private readonly clock;
96
+ constructor(options?: SyncStatusStoreOptions);
65
97
  getSnapshot(): SyncStatusSnapshot<TAttention>;
66
98
  subscribe(listener: (snapshot: SyncStatusSnapshot<TAttention>) => void): () => void;
67
- setSyncing(): void;
68
- setIdle(lastSyncAt: string): void;
99
+ setSyncing(attemptAt?: string): void;
100
+ setIdle(successAt: string): void;
69
101
  setAttention(items: readonly TAttention[], pendingCount: number): void;
70
- setAuth(message: string): void;
102
+ setAuth(message: string, update?: SyncFailureUpdate): void;
103
+ setFailure(failure: SyncFailure, message: string, update?: SyncFailureUpdate): void;
104
+ setRetrying(retryAt: string, pendingCount?: number): void;
105
+ /** @deprecated Use `setFailure` with typed metadata. */
71
106
  setError(message: string, pendingCount?: number): void;
72
107
  /** Restores persisted status on a cold start, before the first run. */
108
+ hydrate(hydration: SyncStatusHydration<TAttention>): void;
109
+ /** @deprecated Pass a `SyncStatusHydration` object with both timestamps. */
73
110
  hydrate(lastSyncAt: string | null, items?: readonly TAttention[], pendingCount?: number): void;
74
111
  reset(): void;
75
- setSecurityBlock(message: string): void;
112
+ setSecurityBlock(message: string, failure?: Extract<SyncFailure, {
113
+ kind: 'partition_mismatch' | 'local_apply';
114
+ }>): void;
76
115
  resumeAfterAuth(): void;
77
116
  private set;
78
117
  }
79
118
  /** Write-only view a sync run uses to report progress. */
80
119
  export interface SyncStatusSink<TAttention = SyncAttentionItem> {
81
- setSyncing(): void;
82
- setIdle(lastSyncAt: string): void;
120
+ setSyncing(attemptAt?: string): void;
121
+ setIdle(successAt: string): void;
83
122
  setAttention(items: readonly TAttention[], pendingCount: number): void;
84
- setAuth(message: string): void;
85
- setError(message: string, pendingCount?: number): void;
123
+ setAuth(message: string, update?: SyncFailureUpdate): void;
124
+ setFailure(failure: SyncFailure, message: string, update?: SyncFailureUpdate): void;
125
+ setRetrying(retryAt: string, pendingCount?: number): void;
86
126
  }
87
127
  //# sourceMappingURL=store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,oBAAoB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAE7F,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,2BAA2B,CAAC,UAAU,GAAG,iBAAiB;IACzE,MAAM,EAAE,UAAU,CAAC;IACnB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,6FAA6F;IAC7F,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrC,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,SAAS,UAAU,EAAE,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,iBAAiB,CAAC;IACvC,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;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,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,UAAU,EAC5C,QAAQ,EAAE,kBAAkB,CAAC,UAAU,CAAC,GACvC,2BAA2B,CAAC,UAAU,CAAC,CAgBzC;AAED;;;;;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,8 +1,14 @@
1
+ import { toSnakeCaseFailure } from './error.js';
1
2
  function initialSnapshot() {
2
3
  return {
3
4
  status: 'idle',
5
+ lastAttemptAt: null,
6
+ lastSuccessAt: null,
4
7
  lastSyncAt: null,
5
8
  error: null,
9
+ failure: null,
10
+ retrying: false,
11
+ retryAt: null,
6
12
  attention: [],
7
13
  pendingCount: 0,
8
14
  initialPullStatus: 'uninitialized',
@@ -14,8 +20,13 @@ function initialSnapshot() {
14
20
  export function toSnakeCaseSnapshot(snapshot) {
15
21
  return {
16
22
  status: snapshot.status,
17
- last_sync_at: snapshot.lastSyncAt,
23
+ last_attempt_at: snapshot.lastAttemptAt,
24
+ last_success_at: snapshot.lastSuccessAt,
25
+ last_sync_at: snapshot.lastSuccessAt,
18
26
  error: snapshot.error,
27
+ failure: snapshot.failure === null ? null : toSnakeCaseFailure(snapshot.failure),
28
+ retrying: snapshot.retrying,
29
+ retry_at: snapshot.retryAt,
19
30
  attention: snapshot.attention,
20
31
  pending_count: snapshot.pendingCount,
21
32
  initial_pull_status: snapshot.initialPullStatus,
@@ -37,13 +48,16 @@ export function deriveLocalStoreReadiness({ initialPullStatus, refreshRevision,
37
48
  return hasData ? 'hydrated-populated' : 'hydrated-empty';
38
49
  }
39
50
  /** Maps a snapshot onto the contract's initial-readiness vocabulary. */
40
- export function deriveInitialSyncState({ initialPullStatus, lastSyncAt, status, }) {
51
+ export function deriveInitialSyncState({ initialPullStatus, lastSuccessAt, status, failure, }) {
41
52
  if (initialPullStatus === 'uninitialized')
42
53
  return 'unknown';
43
54
  if (initialPullStatus === 'pulling')
44
55
  return 'syncing';
45
- if (status === 'error' && lastSyncAt === null)
46
- return 'offline-cached';
56
+ if (lastSuccessAt === null && failure !== null) {
57
+ return failure.kind === 'network' ? 'offline-cached' : 'sync-error-cached';
58
+ }
59
+ if (status === 'error' && lastSuccessAt === null)
60
+ return 'sync-error-cached';
47
61
  return 'settled';
48
62
  }
49
63
  function settledStatus(attentionCount, pendingCount) {
@@ -60,6 +74,10 @@ function settledStatus(attentionCount, pendingCount) {
60
74
  export class SyncStatusStore {
61
75
  snapshot = initialSnapshot();
62
76
  listeners = new Set();
77
+ clock;
78
+ constructor(options = {}) {
79
+ this.clock = options.clock ?? (() => new Date().toISOString());
80
+ }
63
81
  getSnapshot() {
64
82
  return this.snapshot;
65
83
  }
@@ -69,18 +87,24 @@ export class SyncStatusStore {
69
87
  this.listeners.delete(listener);
70
88
  };
71
89
  }
72
- setSyncing() {
90
+ setSyncing(attemptAt = this.clock()) {
73
91
  this.set((state) => ({
74
92
  status: 'syncing',
93
+ lastAttemptAt: attemptAt,
75
94
  error: null,
76
- initialPullStatus: state.lastSyncAt === null ? 'pulling' : 'settled',
95
+ retryAt: null,
96
+ initialPullStatus: state.lastSuccessAt === null ? 'pulling' : 'settled',
77
97
  }));
78
98
  }
79
- setIdle(lastSyncAt) {
99
+ setIdle(successAt) {
80
100
  this.set((state) => ({
81
101
  status: 'idle',
82
- lastSyncAt,
102
+ lastAttemptAt: successAt,
103
+ lastSuccessAt: successAt,
83
104
  error: null,
105
+ failure: null,
106
+ retrying: false,
107
+ retryAt: null,
84
108
  attention: [],
85
109
  pendingCount: 0,
86
110
  initialPullStatus: 'settled',
@@ -91,51 +115,94 @@ export class SyncStatusStore {
91
115
  this.set((state) => ({
92
116
  status: items.length > 0 ? 'attention' : 'pending',
93
117
  error: null,
118
+ failure: null,
119
+ retrying: false,
120
+ retryAt: null,
94
121
  attention: [...items],
95
122
  pendingCount,
96
123
  initialPullStatus: 'settled',
97
124
  refreshRevision: state.refreshRevision + 1,
98
125
  }));
99
126
  }
100
- setAuth(message) {
101
- this.set((state) => ({
102
- status: 'auth',
103
- error: message,
104
- initialPullStatus: 'settled',
105
- refreshRevision: state.refreshRevision + 1,
106
- }));
127
+ setAuth(message, update = {}) {
128
+ this.setFailure({ kind: 'auth' }, message, update);
107
129
  }
108
- setError(message, pendingCount) {
130
+ setFailure(failure, message, update = {}) {
109
131
  this.set((state) => {
110
- const nextPendingCount = pendingCount ?? state.pendingCount;
132
+ const nextPendingCount = update.pendingCount ?? state.pendingCount;
133
+ const retryAt = failure.kind === 'rate_limited' ? failure.retryAt : (update.retryAt ?? null);
111
134
  return {
112
- status: state.attention.length > 0 ? 'attention' : nextPendingCount > 0 ? 'pending' : 'error',
135
+ status: failure.kind === 'auth'
136
+ ? 'auth'
137
+ : state.attention.length > 0
138
+ ? 'attention'
139
+ : nextPendingCount > 0
140
+ ? 'pending'
141
+ : 'error',
142
+ lastAttemptAt: update.attemptAt ?? this.clock(),
113
143
  error: message,
144
+ failure,
145
+ retrying: retryAt !== null,
146
+ retryAt,
114
147
  pendingCount: nextPendingCount,
115
148
  initialPullStatus: 'settled',
116
149
  refreshRevision: state.refreshRevision + 1,
117
150
  };
118
151
  });
119
152
  }
120
- /** Restores persisted status on a cold start, before the first run. */
121
- hydrate(lastSyncAt, items = [], pendingCount = 0) {
153
+ setRetrying(retryAt, pendingCount) {
154
+ this.set((state) => {
155
+ const nextPendingCount = pendingCount ?? state.pendingCount;
156
+ return {
157
+ status: state.attention.length > 0 ? 'attention' : nextPendingCount > 0 ? 'pending' : 'error',
158
+ retrying: true,
159
+ retryAt,
160
+ pendingCount: nextPendingCount,
161
+ };
162
+ });
163
+ }
164
+ /** @deprecated Use `setFailure` with typed metadata. */
165
+ setError(message, pendingCount) {
166
+ this.setFailure({ kind: 'network' }, message, pendingCount === undefined ? {} : { pendingCount });
167
+ }
168
+ hydrate(hydrationOrLastSyncAt, legacyItems = [], legacyPendingCount = 0) {
169
+ const hydration = typeof hydrationOrLastSyncAt === 'object' && hydrationOrLastSyncAt !== null
170
+ ? hydrationOrLastSyncAt
171
+ : {
172
+ lastAttemptAt: hydrationOrLastSyncAt,
173
+ lastSuccessAt: hydrationOrLastSyncAt,
174
+ attention: legacyItems,
175
+ pendingCount: legacyPendingCount,
176
+ };
177
+ const items = hydration.attention ?? [];
178
+ const pendingCount = hydration.pendingCount ?? 0;
122
179
  this.set((state) => ({
123
180
  status: settledStatus(items.length, pendingCount),
124
- lastSyncAt,
181
+ lastAttemptAt: hydration.lastAttemptAt,
182
+ lastSuccessAt: hydration.lastSuccessAt,
125
183
  error: null,
184
+ failure: null,
185
+ retrying: false,
186
+ retryAt: null,
126
187
  attention: [...items],
127
188
  pendingCount,
128
- initialPullStatus: lastSyncAt === null ? 'uninitialized' : 'settled',
189
+ initialPullStatus: hydration.lastSuccessAt === null ? 'uninitialized' : 'settled',
129
190
  refreshRevision: state.refreshRevision + 1,
130
191
  }));
131
192
  }
132
193
  reset() {
133
194
  this.set(() => initialSnapshot());
134
195
  }
135
- setSecurityBlock(message) {
196
+ setSecurityBlock(message, failure = {
197
+ kind: 'local_apply',
198
+ }) {
136
199
  this.set(() => ({
137
200
  status: 'error',
201
+ lastAttemptAt: this.clock(),
138
202
  error: message,
203
+ failure,
204
+ retrying: false,
205
+ retryAt: null,
139
206
  initialPullStatus: 'settled',
140
207
  securityBlock: message,
141
208
  }));
@@ -144,10 +211,14 @@ export class SyncStatusStore {
144
211
  this.set((state) => ({
145
212
  status: settledStatus(state.attention.length, state.pendingCount),
146
213
  error: null,
214
+ failure: null,
215
+ retrying: false,
216
+ retryAt: null,
147
217
  }));
148
218
  }
149
219
  set(update) {
150
- this.snapshot = { ...this.snapshot, ...update(this.snapshot) };
220
+ const next = { ...this.snapshot, ...update(this.snapshot) };
221
+ this.snapshot = { ...next, lastSyncAt: next.lastSuccessAt };
151
222
  this.listeners.forEach((listener) => {
152
223
  listener(this.snapshot);
153
224
  });
package/dist/store.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}