@braidlabs/data 0.1.1 → 0.3.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@braidlabs/data",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "Local-first client data layer: persistence-first, skew-tolerant across independently deployed readers.",
5
5
  "keywords": [
6
6
  "local-first",
@@ -23,7 +23,7 @@
23
23
  "./package.json": "./package.json"
24
24
  },
25
25
  "peerDependencies": {
26
- "@braidlabs/skew": "^0.1.1"
26
+ "@braidlabs/skew": "^0.3.0"
27
27
  },
28
28
  "publishConfig": {
29
29
  "access": "public"
@@ -38,4 +38,4 @@
38
38
  "url": "https://github.com/braidjs/braid/issues"
39
39
  },
40
40
  "module": "./src/index.js"
41
- }
41
+ }
package/src/index.d.ts CHANGED
@@ -12,11 +12,15 @@ export type { RecordStore, RecordStoreOptions, RecordDriver, StoredRecord, Proje
12
12
  export { memoryRecordDriver } from './lib/memory-driver.js';
13
13
  export { indexedDbRecordDriver } from './lib/indexeddb-driver.js';
14
14
  export type { IndexedDbDriverOptions } from './lib/indexeddb-driver.js';
15
+ export { sessionStorageRecordDriver } from './lib/session-storage-driver.js';
16
+ export type { SessionStorageDriverOptions } from './lib/session-storage-driver.js';
15
17
  export { withLock, hasCrossContextLocks, outboxFlushLock } from './lib/locks.js';
16
18
  export type { LockResult, LockOptions } from './lib/locks.js';
17
19
  export { createDataClient } from './lib/query.js';
18
- export type { DataClient, DataClientOptions, Query, QueryDefinition, QueryState, QueryStatus, Conflict, ConflictPolicy, MutationDefinition, MutationOutcome, MutationRegistration, } from './lib/query.js';
20
+ export type { DataClient, DataClientOptions, Query, QueryDefinition, CollectionQuery, CollectionQueryDefinition, CollectionState, RecordChange, QueryState, QueryStatus, Conflict, ConflictPolicy, MutationDefinition, MutationOutcome, MutationRegistration, } from './lib/query.js';
19
21
  export { drainOutbox } from './lib/flush.js';
22
+ export { flushOnClosing, trackDirty } from './lib/closing.js';
23
+ export type { ClosingEnv, FlushOnClosingOptions } from './lib/closing.js';
20
24
  export type { DrainOptions, FlushResult, MutationRunner } from './lib/flush.js';
21
25
  export { createInvalidator, sharedInvalidator, resetSharedInvalidators } from './lib/invalidation.js';
22
26
  export type { Invalidator, InvalidationOptions, BroadcastChannelLike } from './lib/invalidation.js';
package/src/index.js CHANGED
@@ -10,9 +10,11 @@
10
10
  export { createRecordStore } from './lib/record-store.js';
11
11
  export { memoryRecordDriver } from './lib/memory-driver.js';
12
12
  export { indexedDbRecordDriver } from './lib/indexeddb-driver.js';
13
+ export { sessionStorageRecordDriver } from './lib/session-storage-driver.js';
13
14
  export { withLock, hasCrossContextLocks, outboxFlushLock } from './lib/locks.js';
14
15
  export { createDataClient } from './lib/query.js';
15
16
  export { drainOutbox } from './lib/flush.js';
17
+ export { flushOnClosing, trackDirty } from './lib/closing.js';
16
18
  export { createInvalidator, sharedInvalidator, resetSharedInvalidators } from './lib/invalidation.js';
17
19
  export { createOutbox, OutboxEntrySchema } from './lib/outbox.js';
18
20
  export { createTenancy, partitionKey, TenancyRecordSchema } from './lib/tenancy.js';
package/src/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/data/src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAS1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAGlE,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAelD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGtG,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGpF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOpD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAU7C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAWjD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../libs/data/src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAS1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAG7E,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGjF,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAmBlD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAGtG,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGlE,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAGpF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOpD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAU7C,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAWjD,OAAO,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { type DrainOptions } from './flush.js';
2
+ /**
3
+ * Flushing the outbox when a fragment closes.
4
+ *
5
+ * `libs/core` gave fragments `env.onClosing()` — a bounded window, before teardown, in which to get
6
+ * work off the device. Nothing was using it. This is the wiring, and it belongs here rather than in
7
+ * core: core must not depend on the data layer, and the drain rules (ordering, locking, retry,
8
+ * give-up) already have exactly one home.
9
+ *
10
+ * What this is *not*: a durability mechanism. The outbox is already durable — entries survive in
11
+ * IndexedDB and replay on the next boot. What a close-time flush buys is **latency to the server**
12
+ * for a user who may not come back to this page soon, which is why an unflushed entry is reported
13
+ * as `deferred` rather than `dropped`. Nothing was lost; it just has not left yet.
14
+ */
15
+ /** The `env.onClosing` shape, structurally — typed here so `@braidlabs/data` need not depend on core. */
16
+ export interface ClosingEnv {
17
+ onClosing(handler: () => Promise<{
18
+ flushed: number;
19
+ dropped: number;
20
+ deferred?: number;
21
+ }>): () => void;
22
+ setDirty(reason: string | null): void;
23
+ }
24
+ export interface FlushOnClosingOptions extends Omit<DrainOptions, 'onError'> {
25
+ /** Reports an entry that could not be replayed. Never silent. */
26
+ onError?: DrainOptions['onError'];
27
+ }
28
+ /**
29
+ * Registers a close-time drain of this owner's queue.
30
+ *
31
+ * ```ts
32
+ * flushOnClosing(env, { outbox, owner: 'checkout', runnerFor });
33
+ * ```
34
+ *
35
+ * Returns the unregister function, so a fragment that swaps its outbox can replace the handler.
36
+ */
37
+ export declare function flushOnClosing(env: ClosingEnv, options: FlushOnClosingOptions): () => void;
38
+ /**
39
+ * Keeps a slot's `dirty` declaration in step with the queue depth.
40
+ *
41
+ * Separate from the flush because they answer different questions at different times: this one
42
+ * answers "would leaving lose something?" continuously, while the flush answers "did it get out?"
43
+ * once. A host's `beforeunload` guard needs the first and cannot await the second.
44
+ *
45
+ * `count` is read on demand rather than tracked, so this stays correct when another tab drains the
46
+ * shared queue.
47
+ */
48
+ export declare function trackDirty(env: ClosingEnv, count: () => Promise<number>, describe?: (pending: number) => string): Promise<void>;
@@ -0,0 +1,44 @@
1
+ import { drainOutbox } from './flush.js';
2
+ /**
3
+ * Registers a close-time drain of this owner's queue.
4
+ *
5
+ * ```ts
6
+ * flushOnClosing(env, { outbox, owner: 'checkout', runnerFor });
7
+ * ```
8
+ *
9
+ * Returns the unregister function, so a fragment that swaps its outbox can replace the handler.
10
+ */
11
+ export function flushOnClosing(env, options) {
12
+ return env.onClosing(async () => {
13
+ const result = await drainOutbox(options);
14
+ /**
15
+ * A skipped drain is not a failed one.
16
+ *
17
+ * `skipped` means another tab held the flush lock — so that tab is sending these entries right
18
+ * now, and reporting them as dropped here would raise an alarm about work that is actively in
19
+ * flight somewhere else.
20
+ */
21
+ return {
22
+ flushed: result.sent,
23
+ // Only entries abandoned after max attempts are truly gone; `failed` counts an attempt that
24
+ // will be retried, so it is deferred rather than dropped.
25
+ dropped: 0,
26
+ deferred: result.remaining,
27
+ };
28
+ });
29
+ }
30
+ /**
31
+ * Keeps a slot's `dirty` declaration in step with the queue depth.
32
+ *
33
+ * Separate from the flush because they answer different questions at different times: this one
34
+ * answers "would leaving lose something?" continuously, while the flush answers "did it get out?"
35
+ * once. A host's `beforeunload` guard needs the first and cannot await the second.
36
+ *
37
+ * `count` is read on demand rather than tracked, so this stays correct when another tab drains the
38
+ * shared queue.
39
+ */
40
+ export async function trackDirty(env, count, describe = (pending) => `${pending} unsent ${pending === 1 ? 'change' : 'changes'}`) {
41
+ const pending = await count();
42
+ env.setDirty(pending > 0 ? describe(pending) : null);
43
+ }
44
+ //# sourceMappingURL=closing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closing.js","sourceRoot":"","sources":["../../../../../libs/data/src/lib/closing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAqB,MAAM,YAAY,CAAC;AA6B5D;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,GAAe,EAAE,OAA8B;IAC5E,OAAO,GAAG,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;QAC9B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;QAE1C;;;;;;WAMG;QACH,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,IAAI;YACpB,4FAA4F;YAC5F,0DAA0D;YAC1D,OAAO,EAAE,CAAC;YACV,QAAQ,EAAE,MAAM,CAAC,SAAS;SAC3B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAe,EACf,KAA4B,EAC5B,WAAwC,CAAC,OAAO,EAAE,EAAE,CAClD,GAAG,OAAO,WAAW,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAAE;IAE7D,MAAM,OAAO,GAAG,MAAM,KAAK,EAAE,CAAC;IAC9B,GAAG,CAAC,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACvD,CAAC"}
@@ -142,6 +142,27 @@ export function indexedDbRecordDriver(options) {
142
142
  tx.onabort = () => reject(tx.error ?? new Error('skew-data: purge aborted'));
143
143
  });
144
144
  },
145
+ async partitions(collection) {
146
+ const db = await database();
147
+ assertDeclared(db, collection);
148
+ return new Promise((resolve, reject) => {
149
+ const found = new Set();
150
+ const tx = db.transaction(collection, 'readonly');
151
+ // A key cursor over the [partition, seq] index: keys only, so no record is deserialized to
152
+ // learn which partition it belongs to. Every key is still visited — skipping ahead a
153
+ // partition at a time is possible, but not worth the code until a collection is large
154
+ // enough for it to show.
155
+ const cursor = tx.objectStore(collection).index(PARTITION_INDEX).openKeyCursor();
156
+ cursor.onsuccess = () => {
157
+ const position = cursor.result;
158
+ if (!position)
159
+ return resolve([...found].sort());
160
+ found.add(position.key[0]);
161
+ position.continue();
162
+ };
163
+ cursor.onerror = () => reject(cursor.error ?? new Error('skew-data: could not list partitions'));
164
+ });
165
+ },
145
166
  async highestSeq(collection) {
146
167
  const db = await database();
147
168
  assertDeclared(db, collection);
@@ -1 +1 @@
1
- {"version":3,"file":"indexeddb-driver.js","sourceRoot":"","sources":["../../../../../libs/data/src/lib/indexeddb-driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indexeddb-driver.js","sourceRoot":"","sources":["../../../../../libs/data/src/lib/indexeddb-driver.ts"],"names":[],"mappings":"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"}
@@ -42,6 +42,9 @@ export function memoryRecordDriver() {
42
42
  records.delete(id);
43
43
  }
44
44
  },
45
+ async partitions(collection) {
46
+ return [...new Set([...of(collection).values()].map((record) => record.partition))].sort();
47
+ },
45
48
  async highestSeq(collection) {
46
49
  let highest = 0;
47
50
  for (const record of of(collection).values())
@@ -1 +1 @@
1
- {"version":3,"file":"memory-driver.js","sourceRoot":"","sources":["../../../../../libs/data/src/lib/memory-driver.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqC,CAAC;IAEjE,MAAM,EAAE,GAAG,CAAC,UAAkB,EAA6B,EAAE;QAC3D,IAAI,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM;YAC1B,yFAAyF;YACzF,oFAAoF;YACpF,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE;YACtB,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC,OAAO,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE;YACzB,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS;YAC9B,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC;iBAChC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC;iBAClD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;iBAC7B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS;YACxC,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;YAC/B,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACnC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;oBAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,UAAU;YACzB,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;gBAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACtF,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"memory-driver.js","sourceRoot":"","sources":["../../../../../libs/data/src/lib/memory-driver.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB;IAChC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAqC,CAAC;IAEjE,MAAM,EAAE,GAAG,CAAC,UAAkB,EAA6B,EAAE;QAC3D,IAAI,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;YACpB,WAAW,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,MAAM;YAC1B,yFAAyF;YACzF,oFAAoF;YACpF,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QACzD,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,EAAE;YACtB,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACtC,OAAO,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE;YACzB,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS;YAC9B,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC;iBAChC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC;iBAClD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC;iBAC7B,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS;YACxC,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;YAC/B,KAAK,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACnC,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS;oBAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,UAAU;YACzB,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7F,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,UAAU;YACzB,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,MAAM,MAAM,IAAI,EAAE,CAAC,UAAU,CAAC,CAAC,MAAM,EAAE;gBAAE,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;YACtF,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { SkewFailureReason, VersionedSchema } from '@braidlabs/skew';
2
- import type { RecordDriver } from './record-store.js';
2
+ import type { ProjectedRecord, RecordDriver } from './record-store.js';
3
3
  import { type Invalidator } from './invalidation.js';
4
4
  import type { Outbox } from './outbox.js';
5
5
  import type { PushConnection } from './adapters.js';
@@ -94,6 +94,42 @@ export interface QueryDefinition<T> {
94
94
  */
95
95
  staleWhileRevalidate?: boolean;
96
96
  }
97
+ /**
98
+ * One change to the client's collection.
99
+ *
100
+ * `'clear'` has no key: it is the whole partition going at once, and reporting it as a delete per
101
+ * record would mean reading every record back just to say it was gone.
102
+ */
103
+ export interface RecordChange {
104
+ type: 'put' | 'delete' | 'clear';
105
+ collection: string;
106
+ partition: string;
107
+ /** The caller's id. Absent for `'clear'`. */
108
+ key?: string;
109
+ }
110
+ export interface CollectionQueryDefinition<T> {
111
+ /** The reader's contract. Records it cannot project are left out, as `RecordStore.list` does. */
112
+ schema: VersionedSchema<T>;
113
+ }
114
+ export interface CollectionState<T> {
115
+ /** Every readable record in the current partition, in `seq` order. */
116
+ data: ProjectedRecord<T>[] | undefined;
117
+ status: QueryStatus;
118
+ error?: unknown;
119
+ }
120
+ /**
121
+ * A live view of a whole collection in the current partition.
122
+ *
123
+ * Read from storage only — it never goes to the network. Something else puts records there (key
124
+ * queries, mutations, a push stream), and this re-reads whenever any of them does, in this client,
125
+ * another client, or another context sharing the invalidator. Writes made directly to the driver —
126
+ * `copyPartition`, a tenancy purge — are not seen until the next change that goes through a client.
127
+ */
128
+ export interface CollectionQuery<T> {
129
+ readonly current: CollectionState<T>;
130
+ subscribe(listener: (state: CollectionState<T>) => void): () => void;
131
+ dispose(): void;
132
+ }
97
133
  export interface DataClientOptions {
98
134
  driver: RecordDriver;
99
135
  /**
@@ -193,6 +229,21 @@ export interface MutationOutcome<T> {
193
229
  }
194
230
  export interface DataClient {
195
231
  query<T>(definition: QueryDefinition<T>): Query<T>;
232
+ /**
233
+ * Every record in the current partition, kept current as the collection changes.
234
+ *
235
+ * Confirmed records only: optimistic overlays are applied per key by `query`, not here.
236
+ */
237
+ collection<T>(definition: CollectionQueryDefinition<T>): CollectionQuery<T>;
238
+ /**
239
+ * The change feed for this client's collection: every put, delete and partition clear that goes
240
+ * through this client, as it lands. Returns a disposer.
241
+ *
242
+ * Typed events reach only this client's listeners. Other clients and contexts hear that the
243
+ * collection changed — their `collection` queries re-read — but not what the change was, because
244
+ * the invalidation channel carries tags rather than payloads.
245
+ */
246
+ watch(listener: (change: RecordChange) => void): () => void;
196
247
  /**
197
248
  * Writes: queue, overlay, send, confirm.
198
249
  *
package/src/lib/query.js CHANGED
@@ -13,6 +13,13 @@ const DEFAULT_COLLECTION = 'entities';
13
13
  function pendingTag(key) {
14
14
  return `skew:pending#${key}`;
15
15
  }
16
+ /**
17
+ * The tag a collection's changes travel on. Like `pendingTag`, it means "re-read storage", never
18
+ * "refetch": whatever changed has already been written.
19
+ */
20
+ function collectionTag(collection) {
21
+ return `skew:collection#${collection}`;
22
+ }
16
23
  export function createDataClient(options) {
17
24
  const collection = options.collection ?? DEFAULT_COLLECTION;
18
25
  // Shared per partition, so a mutation in one application refreshes another's view of the same
@@ -38,6 +45,29 @@ export function createDataClient(options) {
38
45
  /** How to replay each kind of queued write. Populated by `mutate` and by `registerMutation`. */
39
46
  const runners = new Map();
40
47
  const maxAttempts = options.maxAttempts ?? 5;
48
+ const watchers = new Set();
49
+ let closed = false;
50
+ /**
51
+ * Tells this client's watchers what changed, and everyone else that something did.
52
+ *
53
+ * The second half is what keeps another app's collection view current: it shares the
54
+ * invalidator, not this client's listeners.
55
+ */
56
+ function changed(change) {
57
+ // A write still in flight at `close()` lands after it. Nobody is listening by then, and the
58
+ // invalidator's channel may already be closed — posting to it throws.
59
+ if (closed)
60
+ return;
61
+ for (const watcher of [...watchers]) {
62
+ try {
63
+ watcher(change);
64
+ }
65
+ catch {
66
+ // One watcher throwing must not keep the change from the others, or from the invalidator.
67
+ }
68
+ }
69
+ invalidator.invalidate(collectionTag(collection));
70
+ }
41
71
  /**
42
72
  * One store per schema, because the store *is* the projection: the same bytes read through two
43
73
  * chains give two different values, which is the point.
@@ -53,6 +83,10 @@ export function createDataClient(options) {
53
83
  // Recorded per key rather than thrown: a record this reader cannot project is a fact about
54
84
  // the pair of them, and the query that asked is the only place that can act on it.
55
85
  onReadFailure: (id, failure) => void unreadable.set(id, failure.reason),
86
+ // Every write the client makes goes through a store — query fetches, confirmed mutations,
87
+ // pushed records — so this one hook is the feed for all of them. Writes made straight to
88
+ // the driver (`copyPartition`, a tenancy purge) bypass it and are not reported.
89
+ onWrite: (write) => changed({ ...write, collection }),
56
90
  });
57
91
  stores.set(schema, store);
58
92
  }
@@ -144,6 +178,17 @@ export function createDataClient(options) {
144
178
  ...(options.outbox === undefined ? {} : { outbox: options.outbox }),
145
179
  });
146
180
  },
181
+ collection(definition) {
182
+ return createCollectionQuery(storeFor(definition.schema), {
183
+ partition: options.partition,
184
+ invalidator,
185
+ tag: collectionTag(collection),
186
+ });
187
+ },
188
+ watch(listener) {
189
+ watchers.add(listener);
190
+ return () => void watchers.delete(listener);
191
+ },
147
192
  async mutate(definition) {
148
193
  const outbox = options.outbox;
149
194
  if (!outbox) {
@@ -197,7 +242,12 @@ export function createDataClient(options) {
197
242
  else if (policy === 'raise')
198
243
  conflict = { expected, actual, paths };
199
244
  }
200
- await store.put({ id: definition.key, partition, value: stored });
245
+ // A confirmed removal deletes. Storing whatever the server answered a DELETE with — often
246
+ // nothing at all — would leave a record whose value is `undefined` in every collection view.
247
+ if (definition.removes)
248
+ await store.delete(definition.key, partition);
249
+ else
250
+ await store.put({ id: definition.key, partition, value: stored });
201
251
  await outbox.remove(entryId);
202
252
  if (conflict)
203
253
  conflicts.set(definition.key, conflict);
@@ -249,9 +299,13 @@ export function createDataClient(options) {
249
299
  invalidator.invalidate(...tags);
250
300
  },
251
301
  async clearPartition(partition) {
252
- await options.driver.clearPartition(collection, partition ?? options.partition());
302
+ const target = partition ?? options.partition();
303
+ await options.driver.clearPartition(collection, target);
304
+ changed({ type: 'clear', collection, partition: target });
253
305
  },
254
306
  close() {
307
+ closed = true;
308
+ watchers.clear();
255
309
  invalidator.close();
256
310
  },
257
311
  };
@@ -297,6 +351,10 @@ function createQuery(definition, context) {
297
351
  // rather than watching an apparently empty cache go back to the network.
298
352
  if (failure)
299
353
  emit({ unreadable: failure });
354
+ // A record that was here and is not any more was deleted — a confirmed removal, usually.
355
+ // Said so, rather than left showing the overlay that predicted it.
356
+ else if (state.status === 'ready')
357
+ emit({ data: undefined, pending: false, conflict: null });
300
358
  return false;
301
359
  }
302
360
  const overlays = context.outbox
@@ -405,6 +463,85 @@ function createQuery(definition, context) {
405
463
  },
406
464
  };
407
465
  }
466
+ function createCollectionQuery(store, context) {
467
+ const listeners = new Set();
468
+ const controller = new AbortController();
469
+ let state = { data: undefined, status: 'loading' };
470
+ const emit = (next) => {
471
+ state = next;
472
+ for (const listener of listeners)
473
+ listener(state);
474
+ };
475
+ /**
476
+ * Coalesced: at most one read in flight, and at most one more queued behind it.
477
+ *
478
+ * A burst of writes — a push stream delivering two hundred records — would otherwise start two
479
+ * hundred full reads of the partition, each one a scan. Any number of changes during a read are
480
+ * answered by a single read after it, which sees all of them (and `schedule` below batches the
481
+ * ones that arrive before a read starts). Reads are therefore also strictly
482
+ * sequential, so an older result can never land after a newer one.
483
+ */
484
+ let reading = false;
485
+ let again = false;
486
+ async function read() {
487
+ if (reading) {
488
+ again = true;
489
+ return;
490
+ }
491
+ reading = true;
492
+ try {
493
+ do {
494
+ again = false;
495
+ try {
496
+ const data = await store.list(context.partition());
497
+ if (!controller.signal.aborted)
498
+ emit({ data, status: 'ready' });
499
+ }
500
+ catch (error) {
501
+ // Reading the partition throws after sign-out; reported as state, as `createQuery` does.
502
+ if (!controller.signal.aborted)
503
+ emit({ data: state.data, status: 'error', error });
504
+ }
505
+ } while (again && !controller.signal.aborted);
506
+ }
507
+ finally {
508
+ reading = false;
509
+ }
510
+ }
511
+ /**
512
+ * Changes are answered a macrotask later rather than at once. The writes in a burst land spread
513
+ * over many microtasks — each `put` awaits its sequence number and its driver call — so without
514
+ * the wait each read would finish before the next write arrived, and coalescing would catch
515
+ * almost nothing. One tick is enough for the burst to land, and short enough not to be seen.
516
+ */
517
+ let scheduled = false;
518
+ const schedule = () => {
519
+ if (scheduled)
520
+ return;
521
+ scheduled = true;
522
+ setTimeout(() => {
523
+ scheduled = false;
524
+ if (!controller.signal.aborted)
525
+ void read();
526
+ }, 0);
527
+ };
528
+ context.invalidator.subscribe(() => [context.tag], schedule, { signal: controller.signal });
529
+ void read();
530
+ return {
531
+ get current() {
532
+ return state;
533
+ },
534
+ subscribe(listener) {
535
+ listeners.add(listener);
536
+ listener(state);
537
+ return () => void listeners.delete(listener);
538
+ },
539
+ dispose() {
540
+ controller.abort();
541
+ listeners.clear();
542
+ },
543
+ };
544
+ }
408
545
  /**
409
546
  * Which of the patched fields the server did not agree with.
410
547
  *
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../../../libs/data/src/lib/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../../../libs/data/src/lib/query.ts"],"names":[],"mappings":"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"}
@@ -55,6 +55,14 @@ export interface RecordDriver {
55
55
  clearPartition(collection: string, partition: string): Promise<void>;
56
56
  /** Highest `seq` seen in a collection, so ordering survives a reload. */
57
57
  highestSeq(collection: string): Promise<number>;
58
+ /**
59
+ * The partitions that hold at least one record in a collection, sorted and without duplicates.
60
+ *
61
+ * Only partitions with records: a partition is not a thing that exists on its own, it is a prefix
62
+ * records happen to share. Once `clearPartition` empties one, it is gone from this list — which is
63
+ * what lets a sign-out sweep find what is left to purge, and confirm that nothing is.
64
+ */
65
+ partitions(collection: string): Promise<string[]>;
58
66
  }
59
67
  export interface RecordStoreOptions<T> {
60
68
  driver: RecordDriver;
@@ -70,6 +78,17 @@ export interface RecordStoreOptions<T> {
70
78
  onReadFailure?: (id: string, failure: Extract<SkewResult<never>, {
71
79
  ok: false;
72
80
  }>) => void;
81
+ /**
82
+ * Called after a `put` or `delete` lands — never for one the driver rejected.
83
+ *
84
+ * What the data client builds its collection feed on. Carries the caller's id rather than the
85
+ * storage key, for the same reason `onReadFailure` does.
86
+ */
87
+ onWrite?: (write: {
88
+ type: 'put' | 'delete';
89
+ partition: string;
90
+ key: string;
91
+ }) => void;
73
92
  }
74
93
  /** A record as this reader sees it, with the provenance of getting it here. */
75
94
  export interface ProjectedRecord<T> {
@@ -101,6 +120,8 @@ export interface RecordStore<T> {
101
120
  list(partition: string): Promise<ProjectedRecord<T>[]>;
102
121
  delete(id: string, partition: string): Promise<void>;
103
122
  clearPartition(partition: string): Promise<void>;
123
+ /** Partitions holding at least one record in this collection — readable by this reader or not. */
124
+ partitions(): Promise<string[]>;
104
125
  /**
105
126
  * Records that could not be projected to this reader, with why.
106
127
  *
@@ -8,7 +8,7 @@ export function storageKey(partition, key) {
8
8
  return `${partition}\u0000${key}`;
9
9
  }
10
10
  export function createRecordStore(options) {
11
- const { driver, collection, schema, buildId, onReadFailure } = options;
11
+ const { driver, collection, schema, buildId, onReadFailure, onWrite } = options;
12
12
  // Cached rather than read per write: `highestSeq` is a full scan on some drivers, and ordering
13
13
  // only needs to be monotonic within a process — gaps from a concurrent writer are harmless
14
14
  // because nothing derives meaning from consecutive numbers.
@@ -28,6 +28,18 @@ export function createRecordStore(options) {
28
28
  sequence = (sequence ?? driver.highestSeq(collection)).then((last) => last + 1);
29
29
  return sequence;
30
30
  }
31
+ /**
32
+ * Tells the hook a write landed. A hook that throws is the hook's problem: the record is already
33
+ * stored, and failing the write would tell the caller it was not.
34
+ */
35
+ function notifyWrite(write) {
36
+ try {
37
+ onWrite?.(write);
38
+ }
39
+ catch {
40
+ // Swallowed for the reason above.
41
+ }
42
+ }
31
43
  function project(record) {
32
44
  const result = schema.read(record.envelope);
33
45
  if (!result.ok) {
@@ -59,6 +71,7 @@ export function createRecordStore(options) {
59
71
  envelope: buildId ? schema.write(value, buildId) : schema.write(value),
60
72
  ...(owner === undefined ? {} : { owner }),
61
73
  });
74
+ notifyWrite({ type: 'put', partition, key: id });
62
75
  return assigned;
63
76
  },
64
77
  async get(id, partition) {
@@ -78,8 +91,12 @@ export function createRecordStore(options) {
78
91
  }
79
92
  return failures;
80
93
  },
81
- delete: (id, partition) => driver.delete(collection, storageKey(partition, id)),
94
+ async delete(id, partition) {
95
+ await driver.delete(collection, storageKey(partition, id));
96
+ notifyWrite({ type: 'delete', partition, key: id });
97
+ },
82
98
  clearPartition: (partition) => driver.clearPartition(collection, partition),
99
+ partitions: () => driver.partitions(collection),
83
100
  };
84
101
  }
85
102
  //# sourceMappingURL=record-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"record-store.js","sourceRoot":"","sources":["../../../../../libs/data/src/lib/record-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"record-store.js","sourceRoot":"","sources":["../../../../../libs/data/src/lib/record-store.ts"],"names":[],"mappings":"AAgIA;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,SAAiB,EAAE,GAAW;IACvD,OAAO,GAAG,SAAS,SAAS,GAAG,EAAE,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAI,OAA8B;IACjE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAEhF,+FAA+F;IAC/F,2FAA2F;IAC3F,4DAA4D;IAC5D,IAAI,QAAQ,GAA2B,IAAI,CAAC;IAE5C;;;;;;;;;;OAUG;IACH,SAAS,WAAW;QAClB,QAAQ,GAAG,CAAC,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAChF,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;;OAGG;IACH,SAAS,WAAW,CAAC,KAAiE;QACpF,IAAI,CAAC;YACH,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;QACnB,CAAC;QAAC,MAAM,CAAC;YACP,kCAAkC;QACpC,CAAC;IACH,CAAC;IAED,SAAS,OAAO,CAAC,MAAoB;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,wFAAwF;YACxF,uCAAuC;YACvC,aAAa,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,GAAG;YACd,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;YACf,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YAC9D,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE;YAC5C,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC;YAC9C,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE;gBAC3B,EAAE,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC;gBAC7B,GAAG,EAAE,EAAE;gBACP,SAAS;gBACT,GAAG,EAAE,QAAQ;gBACb,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;gBACtE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;aAC1C,CAAC,CAAC;YACH,WAAW,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;YACjD,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS;YACrB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;YACvE,OAAO,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACzC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,SAAS;YAClB,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;YACzD,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAgC,EAAE,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC;QAChG,CAAC;QAED,KAAK,CAAC,UAAU,CAAC,SAAS;YACxB,MAAM,QAAQ,GAAyE,EAAE,CAAC;YAE1F,KAAK,MAAM,MAAM,IAAI,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC9D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC5C,IAAI,CAAC,MAAM,CAAC,EAAE;oBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YACrE,CAAC;YAED,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS;YACxB,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;YAC3D,WAAW,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;QAED,cAAc,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS,CAAC;QAC3E,UAAU,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC;KAChD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { type RecordDriver } from './record-store.js';
2
+ export interface SessionStorageDriverOptions {
3
+ /** Injectable for tests. Defaults to `globalThis.sessionStorage`, looked up on first use. */
4
+ storage?: Storage;
5
+ }
6
+ /**
7
+ * `sessionStorage`, for records that should outlive a reload but not the tab.
8
+ *
9
+ * The cases are narrower than they look: a checkout in progress, a wizard's draft, state that should
10
+ * survive a reload but not be shared with the user's other tabs. Anything the user would mind losing
11
+ * when the tab closes belongs in IndexedDB instead.
12
+ *
13
+ * **Private to the tab is not the same as unique to it.** Browsers copy `sessionStorage` into a
14
+ * duplicated tab, and Chromium into a tab opened from this one. Both then hold the same records —
15
+ * which, for an outbox, means the same queued writes, each sent once per copy. Keep the outbox here
16
+ * only if every mutation it carries is safe to send twice.
17
+ *
18
+ * Every record is its own storage item, keyed by collection and storage id, so a write is one
19
+ * `setItem` and there is still no read-modify-write anywhere. `sessionStorage` is synchronous and
20
+ * private to the tab, which makes each of those single operations atomic without any locking.
21
+ *
22
+ * Reads that span records — `list`, `partitions`, `highestSeq` — scan the tab's keys. That is O(n)
23
+ * in everything stored, which session-sized data keeps small.
24
+ *
25
+ * Two deliberate differences from the `webStorageDriver` in `@braidlabs/skew`, which is a cache:
26
+ *
27
+ * - **No silent fallback to memory.** That driver can afford one because losing a cache entry costs a
28
+ * refetch. This one may hold the outbox, and a store that quietly stopped persisting is a write the
29
+ * user was told had saved. Unusable storage rejects on first use with an error that says so, as
30
+ * the IndexedDB driver does — choose `memoryRecordDriver` explicitly if that is acceptable.
31
+ * - **Quota errors propagate.** For the same reason.
32
+ *
33
+ * Values are stored as JSON rather than structured clones, so a `Date` comes back as a string. The
34
+ * envelopes this stores are JSON-safe by construction, which is also what the rest of the library
35
+ * assumes when it compares them.
36
+ */
37
+ export declare function sessionStorageRecordDriver(options?: SessionStorageDriverOptions): RecordDriver;
@@ -0,0 +1,151 @@
1
+ import { storageKey } from './record-store.js';
2
+ const PREFIX = 'skew:data:';
3
+ /**
4
+ * `sessionStorage`, for records that should outlive a reload but not the tab.
5
+ *
6
+ * The cases are narrower than they look: a checkout in progress, a wizard's draft, state that should
7
+ * survive a reload but not be shared with the user's other tabs. Anything the user would mind losing
8
+ * when the tab closes belongs in IndexedDB instead.
9
+ *
10
+ * **Private to the tab is not the same as unique to it.** Browsers copy `sessionStorage` into a
11
+ * duplicated tab, and Chromium into a tab opened from this one. Both then hold the same records —
12
+ * which, for an outbox, means the same queued writes, each sent once per copy. Keep the outbox here
13
+ * only if every mutation it carries is safe to send twice.
14
+ *
15
+ * Every record is its own storage item, keyed by collection and storage id, so a write is one
16
+ * `setItem` and there is still no read-modify-write anywhere. `sessionStorage` is synchronous and
17
+ * private to the tab, which makes each of those single operations atomic without any locking.
18
+ *
19
+ * Reads that span records — `list`, `partitions`, `highestSeq` — scan the tab's keys. That is O(n)
20
+ * in everything stored, which session-sized data keeps small.
21
+ *
22
+ * Two deliberate differences from the `webStorageDriver` in `@braidlabs/skew`, which is a cache:
23
+ *
24
+ * - **No silent fallback to memory.** That driver can afford one because losing a cache entry costs a
25
+ * refetch. This one may hold the outbox, and a store that quietly stopped persisting is a write the
26
+ * user was told had saved. Unusable storage rejects on first use with an error that says so, as
27
+ * the IndexedDB driver does — choose `memoryRecordDriver` explicitly if that is acceptable.
28
+ * - **Quota errors propagate.** For the same reason.
29
+ *
30
+ * Values are stored as JSON rather than structured clones, so a `Date` comes back as a string. The
31
+ * envelopes this stores are JSON-safe by construction, which is also what the rest of the library
32
+ * assumes when it compares them.
33
+ */
34
+ export function sessionStorageRecordDriver(options = {}) {
35
+ let resolved = null;
36
+ /**
37
+ * Resolved lazily so constructing the driver never throws — on the server, or in a sandboxed
38
+ * iframe where merely *reading* `globalThis.sessionStorage` raises a `SecurityError`.
39
+ */
40
+ function storage() {
41
+ if (resolved)
42
+ return resolved;
43
+ let candidate;
44
+ try {
45
+ candidate = options.storage ?? globalThis.sessionStorage;
46
+ // Present is not the same as usable: Safari's private mode used to expose a storage whose
47
+ // every write threw. Probing once up front turns that into one clear error here rather than
48
+ // an obscure one on the first real write.
49
+ // The NUL keeps the probe out of every collection's key space and anyone else's.
50
+ candidate.setItem(`${PREFIX}\u0000probe`, '1');
51
+ candidate.removeItem(`${PREFIX}\u0000probe`);
52
+ }
53
+ catch (error) {
54
+ throw new Error('skew-data: sessionStorage is not usable in this environment, so the session driver cannot ' +
55
+ `store anything (${error instanceof Error ? error.message : String(error)}). Use ` +
56
+ '`memoryRecordDriver()` if losing records on reload is acceptable.');
57
+ }
58
+ resolved = candidate;
59
+ return resolved;
60
+ }
61
+ /**
62
+ * The collection's key prefix. A collection name containing the separator would make one
63
+ * collection's keys a prefix of another's, so reads leak across and purges miss — refused instead.
64
+ */
65
+ function collectionPrefix(collection) {
66
+ if (collection.includes('\u0000')) {
67
+ throw new Error(`skew-data: collection names cannot contain U+0000 (got ${JSON.stringify(collection)})`);
68
+ }
69
+ return `${PREFIX}${collection}\u0000`;
70
+ }
71
+ const itemKey = (collection, id) => `${collectionPrefix(collection)}${id}`;
72
+ /** Keys in the tab's storage that start with `prefix`. Collected up front: see `clearPartition`. */
73
+ function keysWith(prefix) {
74
+ const store = storage();
75
+ const keys = [];
76
+ for (let index = 0; index < store.length; index += 1) {
77
+ const key = store.key(index);
78
+ if (key?.startsWith(prefix))
79
+ keys.push(key);
80
+ }
81
+ return keys;
82
+ }
83
+ /**
84
+ * Every record in a collection, in no particular order.
85
+ *
86
+ * Items that do not parse as a record are skipped rather than thrown. The storage is shared by
87
+ * every fragment on the origin, so something else — an older build, another library — writing
88
+ * under this prefix is realistic, and one bad item must not take the whole collection with it:
89
+ * a `seq` that is not a number, for one, would poison ordering for every later write.
90
+ */
91
+ function scan(collection) {
92
+ const records = [];
93
+ for (const key of keysWith(collectionPrefix(collection))) {
94
+ const record = parse(storage().getItem(key));
95
+ if (record)
96
+ records.push(record);
97
+ }
98
+ return records;
99
+ }
100
+ return {
101
+ async put(collection, record) {
102
+ // Serializing is also the defensive copy: nothing the caller does to `record` afterwards
103
+ // reaches what was stored.
104
+ storage().setItem(itemKey(collection, record.id), JSON.stringify(record));
105
+ },
106
+ async get(collection, id) {
107
+ return parse(storage().getItem(itemKey(collection, id)));
108
+ },
109
+ async delete(collection, id) {
110
+ storage().removeItem(itemKey(collection, id));
111
+ },
112
+ async list(collection, partition) {
113
+ return scan(collection)
114
+ .filter((record) => record.partition === partition)
115
+ .sort((a, b) => a.seq - b.seq);
116
+ },
117
+ async clearPartition(collection, partition) {
118
+ // Selected by key, not by parsing: a record's id is `storageKey(partition, key)`, so the
119
+ // partition is already in the item key, and a corrupt item cannot stand in the way of a
120
+ // sign-out purge. Keys are collected first and removed after, because removing while walking
121
+ // `key(index)` shifts the indices under the loop and skips every other item.
122
+ for (const key of keysWith(itemKey(collection, storageKey(partition, ''))))
123
+ storage().removeItem(key);
124
+ },
125
+ async partitions(collection) {
126
+ return [...new Set(scan(collection).map((record) => record.partition))].sort();
127
+ },
128
+ async highestSeq(collection) {
129
+ return scan(collection).reduce((highest, record) => Math.max(highest, record.seq), 0);
130
+ },
131
+ };
132
+ }
133
+ /** A stored item as a record, or `null` when it is missing or is not shaped like one. */
134
+ function parse(raw) {
135
+ if (raw === null)
136
+ return null;
137
+ try {
138
+ const value = JSON.parse(raw);
139
+ const shaped = typeof value === 'object' &&
140
+ value !== null &&
141
+ typeof value.id === 'string' &&
142
+ typeof value.key === 'string' &&
143
+ typeof value.partition === 'string' &&
144
+ Number.isFinite(value.seq);
145
+ return shaped ? value : null;
146
+ }
147
+ catch {
148
+ return null;
149
+ }
150
+ }
151
+ //# sourceMappingURL=session-storage-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-storage-driver.js","sourceRoot":"","sources":["../../../../../libs/data/src/lib/session-storage-driver.ts"],"names":[],"mappings":"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"}