@braidlabs/data 0.1.1 → 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/package.json +3 -3
- package/src/index.d.ts +5 -1
- package/src/index.js +2 -0
- package/src/index.js.map +1 -1
- package/src/lib/closing.d.ts +48 -0
- package/src/lib/closing.js +44 -0
- package/src/lib/closing.js.map +1 -0
- package/src/lib/indexeddb-driver.js +21 -0
- package/src/lib/indexeddb-driver.js.map +1 -1
- package/src/lib/memory-driver.js +3 -0
- package/src/lib/memory-driver.js.map +1 -1
- package/src/lib/query.d.ts +52 -1
- package/src/lib/query.js +139 -2
- package/src/lib/query.js.map +1 -1
- package/src/lib/record-store.d.ts +21 -0
- package/src/lib/record-store.js +19 -2
- package/src/lib/record-store.js.map +1 -1
- package/src/lib/session-storage-driver.d.ts +37 -0
- package/src/lib/session-storage-driver.js +151 -0
- package/src/lib/session-storage-driver.js.map +1 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@braidlabs/data",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.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.
|
|
26
|
+
"@braidlabs/skew": "^0.2.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;
|
|
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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"}
|
package/src/lib/memory-driver.js
CHANGED
|
@@ -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"}
|
package/src/lib/query.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
*
|
package/src/lib/query.js.map
CHANGED
|
@@ -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
|
*
|
package/src/lib/record-store.js
CHANGED
|
@@ -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
|
|
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":"
|
|
1
|
+
{"version":3,"file":"record-store.js","sourceRoot":"","sources":["../../../../../libs/data/src/lib/record-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -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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"}
|