@interop/was-react 0.1.7 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +23 -3
- package/dist/config.d.ts +25 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +27 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/react/documentApp.d.ts +116 -0
- package/dist/react/documentApp.d.ts.map +1 -0
- package/dist/react/documentApp.js +182 -0
- package/dist/react/documentApp.js.map +1 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -0
- package/dist/react/index.js.map +1 -1
- package/dist/session/authStore.d.ts.map +1 -1
- package/dist/session/authStore.js +1 -0
- package/dist/session/authStore.js.map +1 -1
- package/dist/storage/entityStore.d.ts +7 -0
- package/dist/storage/entityStore.d.ts.map +1 -1
- package/dist/storage/entityStore.js +8 -0
- package/dist/storage/entityStore.js.map +1 -1
- package/dist/storage/localStore.d.ts +20 -13
- package/dist/storage/localStore.d.ts.map +1 -1
- package/dist/storage/localStore.js +32 -16
- package/dist/storage/localStore.js.map +1 -1
- package/dist/storage/wasRemoteStore.d.ts +16 -3
- package/dist/storage/wasRemoteStore.d.ts.map +1 -1
- package/dist/storage/wasRemoteStore.js +16 -4
- package/dist/storage/wasRemoteStore.js.map +1 -1
- package/dist/storage/wasSync.d.ts +5 -1
- package/dist/storage/wasSync.d.ts.map +1 -1
- package/dist/storage/wasSync.js +10 -3
- package/dist/storage/wasSync.js.map +1 -1
- package/dist/sync/docCipher.d.ts +22 -0
- package/dist/sync/docCipher.d.ts.map +1 -1
- package/dist/sync/docCipher.js +42 -0
- package/dist/sync/docCipher.js.map +1 -1
- package/dist/sync/index.d.ts +1 -1
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +1 -1
- package/dist/sync/index.js.map +1 -1
- package/package.json +2 -1
package/README.md
CHANGED
|
@@ -98,6 +98,24 @@ interoperable apps). `credential` names the self-issued seed credential the
|
|
|
98
98
|
first-run flow mints. All other fields (`mediatorBase`, `dbName`,
|
|
99
99
|
`storageKeyPrefix`, `sync`, `expiry`) are optional with documented defaults.
|
|
100
100
|
|
|
101
|
+
A collection may also declare `visibility: 'public'`
|
|
102
|
+
(`{ key: 'posts', id: 'microblog-posts', visibility: 'public' }`); the default
|
|
103
|
+
is `'private'`. A public collection is world-readable and therefore PLAINTEXT:
|
|
104
|
+
no per-collection key is derived, payloads are stored as-is locally and
|
|
105
|
+
remotely, and the stored resource id is the payload's own logical `id`, so a
|
|
106
|
+
public document keeps a stable, shareable resource URL across edits. Be aware
|
|
107
|
+
that everything in a public payload is world-readable -- including the LWW
|
|
108
|
+
bookkeeping fields `updatedAt` and `deviceId` (`deviceId` is a random
|
|
109
|
+
per-install identifier, but still a linkability handle across a user's public
|
|
110
|
+
documents). Changing a collection's visibility after first use is a
|
|
111
|
+
data-migration event, not a config tweak: rows written in the other mode stop
|
|
112
|
+
being readable. A registry that maps one WAS collection id to both visibilities
|
|
113
|
+
is rejected at store open. Two payload constraints on public collections: a
|
|
114
|
+
top-level object-valued `jwe` field is reserved (the read path uses it to
|
|
115
|
+
recognize a stray encrypted envelope and refuses the row), and payloads should
|
|
116
|
+
carry the `updatedAt` / `deviceId` LWW fields like any other collection --
|
|
117
|
+
without them a concurrent multi-device edit falls back to server-wins.
|
|
118
|
+
|
|
101
119
|
### 2. Entity stores and the registry
|
|
102
120
|
|
|
103
121
|
```ts
|
|
@@ -292,11 +310,13 @@ Hooks:
|
|
|
292
310
|
row is `{ id, updatedAt, version, data }`, where `data` is an EDV envelope
|
|
293
311
|
`{ id, sequence, jwe }`. The app reads exclusively from the in-memory entity
|
|
294
312
|
stores hydrated from this replica, so it works fully offline.
|
|
295
|
-
- **Envelope encryption.** Each collection is encrypted with its own
|
|
296
|
-
key-agreement key, HKDF-derived from the master seed with the label
|
|
313
|
+
- **Envelope encryption.** Each private collection is encrypted with its own
|
|
314
|
+
X25519 key-agreement key, HKDF-derived from the master seed with the label
|
|
297
315
|
`kak:v1:<collectionId>` (`deriveCollectionKeys`). HKDF one-wayness means a
|
|
298
316
|
shared per-collection key exposes nothing about the master seed or the sibling
|
|
299
|
-
collections. The WAS server never sees plaintext.
|
|
317
|
+
collections. The WAS server never sees plaintext. A collection declared
|
|
318
|
+
`visibility: 'public'` opts out entirely: payloads are stored plaintext (no
|
|
319
|
+
key derivation, no envelope) behind the same storage seam.
|
|
300
320
|
- **Replication.** A per-session `SyncController` runs RxDB replication per
|
|
301
321
|
collection over a `WasSyncPort` (signed requests authorized by the granted
|
|
302
322
|
zcaps). Pull is driven by the WAS `changes` feed; a low-frequency periodic
|
package/dist/config.d.ts
CHANGED
|
@@ -35,6 +35,19 @@ export interface WasCollectionConfig {
|
|
|
35
35
|
* WAS collection id (the unprefixed, cross-app generic name).
|
|
36
36
|
*/
|
|
37
37
|
id: string;
|
|
38
|
+
/**
|
|
39
|
+
* Who can read the collection. `'private'` (the default) is the encrypted
|
|
40
|
+
* mode: payloads are stored as EDV envelopes locally and remotely. `'public'`
|
|
41
|
+
* declares a world-readable collection (the wallet provisions it with a
|
|
42
|
+
* public-read policy); public implies PLAINTEXT -- payloads are stored as-is,
|
|
43
|
+
* with no per-collection cipher, and the LWW bookkeeping fields (`updatedAt`,
|
|
44
|
+
* `deviceId`) are world-readable alongside the content (`deviceId` is a
|
|
45
|
+
* random per-device identifier, but still a linkability handle across a
|
|
46
|
+
* user's public documents). Changing a collection's visibility after first
|
|
47
|
+
* use is a data-migration event, not a config tweak: existing rows keep
|
|
48
|
+
* their stored form and stop being readable by the other mode.
|
|
49
|
+
*/
|
|
50
|
+
visibility?: 'private' | 'public';
|
|
38
51
|
}
|
|
39
52
|
/**
|
|
40
53
|
* Optional replication tuning; each field falls back to a documented default.
|
|
@@ -197,6 +210,18 @@ export declare const DEFAULT_EXPIRY_WARNING_MS: number;
|
|
|
197
210
|
* Default near-expiry watch poll interval (ms): 1 minute.
|
|
198
211
|
*/
|
|
199
212
|
export declare const DEFAULT_EXPIRY_WATCH_MS: number;
|
|
213
|
+
/**
|
|
214
|
+
* Validates a collection registry, fail-closed. Rejects an unknown `visibility`
|
|
215
|
+
* value (a config written against a future library version must not silently
|
|
216
|
+
* fall back to either mode) and the encrypted-but-public combination: the same
|
|
217
|
+
* WAS collection id registered under conflicting visibilities, which would
|
|
218
|
+
* treat one server-side collection as both encrypted (private) and plaintext
|
|
219
|
+
* (public). Called by the storage layer before any replica is opened.
|
|
220
|
+
*
|
|
221
|
+
* @param collections {WasCollectionConfig[]} the collection registry
|
|
222
|
+
* @returns {void}
|
|
223
|
+
*/
|
|
224
|
+
export declare function validateCollections(collections: WasCollectionConfig[]): void;
|
|
200
225
|
/**
|
|
201
226
|
* Resolves a localStore/RxDB collection `key` from its WAS collection `id`.
|
|
202
227
|
*
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AAExE;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAClC;;OAEG;IACH,GAAG,EAAE,MAAM,CAAA;IACX;;OAEG;IACH,EAAE,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/config.js
CHANGED
|
@@ -26,6 +26,33 @@ export const DEFAULT_EXPIRY_WARNING_MS = 60 * 60 * 1000;
|
|
|
26
26
|
* Default near-expiry watch poll interval (ms): 1 minute.
|
|
27
27
|
*/
|
|
28
28
|
export const DEFAULT_EXPIRY_WATCH_MS = 60 * 1000;
|
|
29
|
+
/**
|
|
30
|
+
* Validates a collection registry, fail-closed. Rejects an unknown `visibility`
|
|
31
|
+
* value (a config written against a future library version must not silently
|
|
32
|
+
* fall back to either mode) and the encrypted-but-public combination: the same
|
|
33
|
+
* WAS collection id registered under conflicting visibilities, which would
|
|
34
|
+
* treat one server-side collection as both encrypted (private) and plaintext
|
|
35
|
+
* (public). Called by the storage layer before any replica is opened.
|
|
36
|
+
*
|
|
37
|
+
* @param collections {WasCollectionConfig[]} the collection registry
|
|
38
|
+
* @returns {void}
|
|
39
|
+
*/
|
|
40
|
+
export function validateCollections(collections) {
|
|
41
|
+
const visibilityById = new Map();
|
|
42
|
+
for (const { key, id, visibility } of collections) {
|
|
43
|
+
const effective = visibility ?? 'private';
|
|
44
|
+
if (effective !== 'private' && effective !== 'public') {
|
|
45
|
+
throw new Error(`Collection "${key}" has unknown visibility "${String(visibility)}" ` +
|
|
46
|
+
`(expected 'private' or 'public').`);
|
|
47
|
+
}
|
|
48
|
+
const prior = visibilityById.get(id);
|
|
49
|
+
if (prior !== undefined && prior !== effective) {
|
|
50
|
+
throw new Error(`Collection id "${id}" is registered as both '${prior}' and ` +
|
|
51
|
+
`'${effective}': a collection cannot be encrypted and public at once.`);
|
|
52
|
+
}
|
|
53
|
+
visibilityById.set(id, effective);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
29
56
|
/**
|
|
30
57
|
* Resolves a localStore/RxDB collection `key` from its WAS collection `id`.
|
|
31
58
|
*
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AA6LA;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAA;AAE1C;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAA;AAE/C;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,YAAY,CAAA;AAEtD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAA;AAEzC;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;AAEvD;;GAEG;AACH,MAAM,CAAC,MAAM,uBAAuB,GAAG,EAAE,GAAG,IAAI,CAAA;AAEhD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,mBAAmB,CAAC,WAAkC;IACpE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAgC,CAAA;IAC9D,KAAK,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,UAAU,EAAE,IAAI,WAAW,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,UAAU,IAAI,SAAS,CAAA;QACzC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CACb,eAAe,GAAG,6BAA6B,MAAM,CAAC,UAAU,CAAC,IAAI;gBACnE,mCAAmC,CACtC,CAAA;QACH,CAAC;QACD,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACpC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CACb,kBAAkB,EAAE,4BAA4B,KAAK,QAAQ;gBAC3D,IAAI,SAAS,yDAAyD,CACzE,CAAA;QACH,CAAC;QACD,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,CAAC,CAAA;IACnC,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,kBAAkB,CAAC,EACjC,WAAW,EACX,EAAE,EAIH;IACC,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAA;AACxD,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* `@interop/was-react/mui`; the Node-only dev-grant provisioner lives at
|
|
11
11
|
* `@interop/was-react/dev`. Neither is re-exported here.
|
|
12
12
|
*/
|
|
13
|
-
export { DEFAULT_DB_NAME, DEFAULT_STORAGE_KEY_PREFIX, DEFAULT_SYNC_POLL_MS, DEFAULT_EXPIRY_WARNING_MS, DEFAULT_EXPIRY_WATCH_MS, collectionKeyForId, type WasCollectionConfig, type WasSyncConfig, type WasExpiryConfig, type WasAppConfig, type StoreRegistryEntry, type StoreRegistry } from './config.js';
|
|
13
|
+
export { DEFAULT_DB_NAME, DEFAULT_STORAGE_KEY_PREFIX, DEFAULT_SYNC_POLL_MS, DEFAULT_EXPIRY_WARNING_MS, DEFAULT_EXPIRY_WATCH_MS, collectionKeyForId, validateCollections, type WasCollectionConfig, type WasSyncConfig, type WasExpiryConfig, type WasAppConfig, type StoreRegistryEntry, type StoreRegistry } from './config.js';
|
|
14
14
|
export { parseInvocationTarget, parseGrants, type ParsedGrants } from './grants.js';
|
|
15
15
|
export { deriveIdentity, deriveCollectionKeys, DEFAULT_IDENTITY_HANDLE, DEFAULT_KAK_HANDLE, type IdentityAgents, type CollectionKeys } from './identity/agents.js';
|
|
16
16
|
export { createDocumentLoader, type DocumentLoader } from './identity/documentLoader.js';
|
|
@@ -33,5 +33,5 @@ export { hydrateAll, clearAllEntityStores, patchFromChange, scheduleRehydrate, c
|
|
|
33
33
|
export { isAuthError, SyncController, createSyncController } from './storage/syncController.js';
|
|
34
34
|
export { startWasSync } from './storage/wasSync.js';
|
|
35
35
|
export { createAuthStore, type SessionStatus, type AuthState, type WasAuthStore } from './session/index.js';
|
|
36
|
-
export { WasSessionProvider, WasSessionContext, useAuthStore, useSession, useLogin, useLogout, useClearData, useHasLocalData, useReconnect, useSyncStatus, type SyncRollup } from './react/index.js';
|
|
36
|
+
export { WasSessionProvider, WasSessionContext, useAuthStore, useSession, useLogin, useLogout, useClearData, useHasLocalData, useReconnect, useSyncStatus, type SyncRollup, defineDocumentApp, DOCUMENT_COLLECTION_KEY, DOCUMENT_EXPORT_FORMAT, type DocumentApp } from './react/index.js';
|
|
37
37
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;GAQG;AAGH,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EACnB,KAAK,mBAAmB,EACxB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EACnB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,KAAK,YAAY,EAClB,MAAM,aAAa,CAAA;AAGpB,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,eAAe,EAAE,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACzE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,YAAY,EACZ,cAAc,EACd,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EACxB,MAAM,0BAA0B,CAAA;AAGjC,OAAO,EACL,qBAAqB,EACrB,SAAS,EACT,QAAQ,EACR,UAAU,EACX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,WAAW,EACX,KAAK,aAAa,EACnB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,eAAe,EACf,aAAa,EACb,mBAAmB,EACnB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EACV,gBAAgB,EAChB,QAAQ,EACR,UAAU,EACV,WAAW,EACX,SAAS,EACT,eAAe,EACf,uBAAuB,EACvB,UAAU,EACV,sBAAsB,EACtB,cAAc,EACd,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EACvB,KAAK,EACN,MAAM,8BAA8B,CAAA;AAGrC,cAAc,iBAAiB,CAAA;AAK/B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,WAAW,EACZ,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC/E,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,KAAK,UAAU,EAChB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,WAAW,EACX,cAAc,EACd,oBAAoB,EACrB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAGnD,OAAO,EACL,eAAe,EACf,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,YAAY,EAClB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,UAAU,EACf,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* `@interop/was-react/dev`. Neither is re-exported here.
|
|
12
12
|
*/
|
|
13
13
|
// Configuration contract.
|
|
14
|
-
export { DEFAULT_DB_NAME, DEFAULT_STORAGE_KEY_PREFIX, DEFAULT_SYNC_POLL_MS, DEFAULT_EXPIRY_WARNING_MS, DEFAULT_EXPIRY_WATCH_MS, collectionKeyForId } from './config.js';
|
|
14
|
+
export { DEFAULT_DB_NAME, DEFAULT_STORAGE_KEY_PREFIX, DEFAULT_SYNC_POLL_MS, DEFAULT_EXPIRY_WARNING_MS, DEFAULT_EXPIRY_WATCH_MS, collectionKeyForId, validateCollections } from './config.js';
|
|
15
15
|
// Grant parsing / topology routing.
|
|
16
16
|
export { parseInvocationTarget, parseGrants } from './grants.js';
|
|
17
17
|
// Identity: seed-derived agents + per-collection vault keys.
|
|
@@ -42,5 +42,5 @@ export { startWasSync } from './storage/wasSync.js';
|
|
|
42
42
|
// Session lifecycle: the session auth store factory (the four-state machine).
|
|
43
43
|
export { createAuthStore } from './session/index.js';
|
|
44
44
|
// React: the session provider + hooks.
|
|
45
|
-
export { WasSessionProvider, WasSessionContext, useAuthStore, useSession, useLogin, useLogout, useClearData, useHasLocalData, useReconnect, useSyncStatus } from './react/index.js';
|
|
45
|
+
export { WasSessionProvider, WasSessionContext, useAuthStore, useSession, useLogin, useLogout, useClearData, useHasLocalData, useReconnect, useSyncStatus, defineDocumentApp, DOCUMENT_COLLECTION_KEY, DOCUMENT_EXPORT_FORMAT } from './react/index.js';
|
|
46
46
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;GAQG;AAEH,0BAA0B;AAC1B,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;GAQG;AAEH,0BAA0B;AAC1B,OAAO,EACL,eAAe,EACf,0BAA0B,EAC1B,oBAAoB,EACpB,yBAAyB,EACzB,uBAAuB,EACvB,kBAAkB,EAClB,mBAAmB,EAOpB,MAAM,aAAa,CAAA;AAEpB,oCAAoC;AACpC,OAAO,EACL,qBAAqB,EACrB,WAAW,EAEZ,MAAM,aAAa,CAAA;AAEpB,6DAA6D;AAC7D,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAGnB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,oBAAoB,EAErB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,eAAe,EAAkB,MAAM,yBAAyB,CAAA;AACzE,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAGjB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,SAAS,EACT,YAAY,EACZ,cAAc,EAGf,MAAM,0BAA0B,CAAA;AAEjC,2EAA2E;AAC3E,OAAO,EACL,qBAAqB,EACrB,SAAS,EACT,QAAQ,EACR,UAAU,EACX,MAAM,iBAAiB,CAAA;AACxB,OAAO,EACL,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,cAAc,EACf,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,WAAW,EAEZ,MAAM,0BAA0B,CAAA;AACjC,OAAO,EACL,eAAe,EACf,aAAa,EACb,mBAAmB,EAIpB,MAAM,qBAAqB,CAAA;AAkB5B,qDAAqD;AACrD,cAAc,iBAAiB,CAAA;AAE/B,0EAA0E;AAC1E,gFAAgF;AAChF,0BAA0B;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACpD,OAAO,EACL,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,eAAe,EACf,WAAW,EACZ,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,iBAAiB,EAAoB,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAqB,MAAM,6BAA6B,CAAA;AAC/E,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAEjB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EACL,UAAU,EACV,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,yBAAyB,EAC1B,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EACL,WAAW,EACX,cAAc,EACd,oBAAoB,EACrB,MAAM,6BAA6B,CAAA;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEnD,8EAA8E;AAC9E,OAAO,EACL,eAAe,EAIhB,MAAM,oBAAoB,CAAA;AAE3B,uCAAuC;AACvC,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EAEb,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EAEvB,MAAM,kBAAkB,CAAA"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import type { StoreRegistry, WasAppConfig, WasExpiryConfig, WasSyncConfig } from '../config.js';
|
|
2
|
+
import type { SeedCredentialConfig } from '../identity/seedCredential.js';
|
|
3
|
+
import type { SessionStatus } from '../session/authStore.js';
|
|
4
|
+
import type { SyncRollup } from '../storage/syncStatusStore.js';
|
|
5
|
+
/**
|
|
6
|
+
* The localStore / RxDB collection key the facade's one collection uses.
|
|
7
|
+
*/
|
|
8
|
+
export declare const DOCUMENT_COLLECTION_KEY = "document";
|
|
9
|
+
/**
|
|
10
|
+
* The `format` tag stamped into (and required of) export files.
|
|
11
|
+
*/
|
|
12
|
+
export declare const DOCUMENT_EXPORT_FORMAT = "was-document/v1";
|
|
13
|
+
/**
|
|
14
|
+
* Everything `defineDocumentApp` hands back: the config + registry to spread
|
|
15
|
+
* into `WasSessionProvider`, and the typed document hook for components.
|
|
16
|
+
*/
|
|
17
|
+
export interface DocumentApp<T extends object> {
|
|
18
|
+
/**
|
|
19
|
+
* The app-wide was-react configuration (one sandbox collection,
|
|
20
|
+
* local-first onboarding). Pass to `WasSessionProvider`.
|
|
21
|
+
*/
|
|
22
|
+
config: WasAppConfig;
|
|
23
|
+
/**
|
|
24
|
+
* The singleton-document store registry. Pass to `WasSessionProvider`.
|
|
25
|
+
*/
|
|
26
|
+
registry: StoreRegistry;
|
|
27
|
+
/**
|
|
28
|
+
* The tier-1 document hook. Usable in any component below the provider.
|
|
29
|
+
*/
|
|
30
|
+
useDocument: () => {
|
|
31
|
+
/**
|
|
32
|
+
* The document: `undefined` during boot, then the stored value or the
|
|
33
|
+
* configured `initial` when nothing has been written yet.
|
|
34
|
+
*/
|
|
35
|
+
doc: T | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Merge a partial patch (or apply an updater function) onto the current
|
|
38
|
+
* document and persist it, stamping the LWW fields. The write lands in the
|
|
39
|
+
* encrypted local replica first and replicates in the background when
|
|
40
|
+
* connected.
|
|
41
|
+
*/
|
|
42
|
+
update: (patch: Partial<T> | ((prev: T) => T)) => Promise<void>;
|
|
43
|
+
/**
|
|
44
|
+
* The session state: `'local'` (no wallet, fully usable) is home for a
|
|
45
|
+
* tier-1 app; `'connected'`/`'reconnect'` mirror the session machine.
|
|
46
|
+
*/
|
|
47
|
+
status: SessionStatus;
|
|
48
|
+
/**
|
|
49
|
+
* The aggregate replication rollup (`'offline'` until connected).
|
|
50
|
+
*/
|
|
51
|
+
sync: SyncRollup;
|
|
52
|
+
/**
|
|
53
|
+
* Serialize the current document to a downloadable JSON blob.
|
|
54
|
+
*/
|
|
55
|
+
exportFile: () => Promise<Blob>;
|
|
56
|
+
/**
|
|
57
|
+
* Replace the document with one previously exported via `exportFile`.
|
|
58
|
+
* Rejects when the file is not a `was-document/v1` export.
|
|
59
|
+
*/
|
|
60
|
+
importFile: (file: File) => Promise<void>;
|
|
61
|
+
/**
|
|
62
|
+
* "Save to Web Spaces": run the CHAPI wallet login, requesting a grant for
|
|
63
|
+
* exactly this app's one sandbox collection, then adopt (merge) the local
|
|
64
|
+
* document into it and start background sync.
|
|
65
|
+
*/
|
|
66
|
+
connect: () => Promise<void>;
|
|
67
|
+
/**
|
|
68
|
+
* Detach the wallet session (data already synced stays on the server and
|
|
69
|
+
* in the kept device replica) and land back in a fresh `local` state.
|
|
70
|
+
*/
|
|
71
|
+
disconnect: () => Promise<void>;
|
|
72
|
+
/**
|
|
73
|
+
* True while the CHAPI login is in flight.
|
|
74
|
+
*/
|
|
75
|
+
connecting: boolean;
|
|
76
|
+
/**
|
|
77
|
+
* The last session error (a failed login or boot), or `null`.
|
|
78
|
+
*/
|
|
79
|
+
error: string | null;
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Builds the complete wiring for a one-document app: a `WasAppConfig` with a
|
|
84
|
+
* single sandbox collection and local-first onboarding, the singleton-document
|
|
85
|
+
* store registry, and the typed `useDocument` hook bound to both.
|
|
86
|
+
*
|
|
87
|
+
* @param options {object}
|
|
88
|
+
* @param options.appName {string} human-readable name (consent reason lines)
|
|
89
|
+
* @param options.appOrigin {string} this app's own web origin
|
|
90
|
+
* @param [options.wasServerUrl] {string} expected WAS server URL
|
|
91
|
+
* @param [options.mediatorBase] {string} CHAPI mediator base URL
|
|
92
|
+
* @param options.document {object} `collectionId` (the WAS sandbox
|
|
93
|
+
* collection id) and `initial` (the document value before the first write)
|
|
94
|
+
* @param options.credential {SeedCredentialConfig} seed-credential naming
|
|
95
|
+
* @param [options.dbName] {string} local database base name
|
|
96
|
+
* @param [options.storageKeyPrefix] {string} localStorage key prefix
|
|
97
|
+
* @param [options.sync] {WasSyncConfig} replication tuning
|
|
98
|
+
* @param [options.expiry] {WasExpiryConfig} near-expiry warning tuning
|
|
99
|
+
* @returns {DocumentApp<T>}
|
|
100
|
+
*/
|
|
101
|
+
export declare function defineDocumentApp<T extends object>({ appName, appOrigin, wasServerUrl, mediatorBase, document, credential, dbName, storageKeyPrefix, sync, expiry }: {
|
|
102
|
+
appName: string;
|
|
103
|
+
appOrigin: string;
|
|
104
|
+
wasServerUrl?: string;
|
|
105
|
+
mediatorBase?: string;
|
|
106
|
+
document: {
|
|
107
|
+
collectionId: string;
|
|
108
|
+
initial: T;
|
|
109
|
+
};
|
|
110
|
+
credential: SeedCredentialConfig;
|
|
111
|
+
dbName?: string;
|
|
112
|
+
storageKeyPrefix?: string;
|
|
113
|
+
sync?: WasSyncConfig;
|
|
114
|
+
expiry?: WasExpiryConfig;
|
|
115
|
+
}): DocumentApp<T>;
|
|
116
|
+
//# sourceMappingURL=documentApp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentApp.d.ts","sourceRoot":"","sources":["../../src/react/documentApp.ts"],"names":[],"mappings":"AA8BA,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,eAAe,EACf,aAAa,EACd,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAG5D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAG/D;;GAEG;AACH,eAAO,MAAM,uBAAuB,aAAa,CAAA;AAOjD;;GAEG;AACH,eAAO,MAAM,sBAAsB,oBAAoB,CAAA;AAavD;;;GAGG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,SAAS,MAAM;IAC3C;;;OAGG;IACH,MAAM,EAAE,YAAY,CAAA;IACpB;;OAEG;IACH,QAAQ,EAAE,aAAa,CAAA;IACvB;;OAEG;IACH,WAAW,EAAE,MAAM;QACjB;;;WAGG;QACH,GAAG,EAAE,CAAC,GAAG,SAAS,CAAA;QAClB;;;;;WAKG;QACH,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/D;;;WAGG;QACH,MAAM,EAAE,aAAa,CAAA;QACrB;;WAEG;QACH,IAAI,EAAE,UAAU,CAAA;QAChB;;WAEG;QACH,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/B;;;WAGG;QACH,UAAU,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;QACzC;;;;WAIG;QACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;QAC5B;;;WAGG;QACH,UAAU,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;QAC/B;;WAEG;QACH,UAAU,EAAE,OAAO,CAAA;QACnB;;WAEG;QACH,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KACrB,CAAA;CACF;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,SAAS,MAAM,EAAE,EAClD,OAAO,EACP,SAAS,EACT,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,MAAM,EACN,gBAAgB,EAChB,IAAI,EACJ,MAAM,EACP,EAAE;IACD,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,CAAC,CAAA;KAAE,CAAA;IAC9C,UAAU,EAAE,oBAAoB,CAAA;IAChC,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,IAAI,CAAC,EAAE,aAAa,CAAA;IACpB,MAAM,CAAC,EAAE,eAAe,CAAA;CACzB,GAAG,WAAW,CAAC,CAAC,CAAC,CAiIjB"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/*!
|
|
2
|
+
* Copyright (c) 2026 Interop Alliance. All rights reserved.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* The tier-1 "one sandbox document" facade: `defineDocumentApp` builds the
|
|
6
|
+
* whole was-react wiring (config, store registry, entity store) for an app
|
|
7
|
+
* whose entire model is a single key-value document -- an Excalidraw-style
|
|
8
|
+
* editor, a browser-game save file -- and returns a typed `useDocument` hook
|
|
9
|
+
* over it. The app never sees `createEntityStore`, grants parsing, or sync
|
|
10
|
+
* internals: it renders `doc`, calls `update`, and optionally offers file
|
|
11
|
+
* export/import and a "Save to Web Spaces" connect button.
|
|
12
|
+
*
|
|
13
|
+
* The facade is a degenerate entity store: one collection (the app-named
|
|
14
|
+
* sandbox collection) holding one logical document under a fixed id. The
|
|
15
|
+
* stored row wraps the app's data (`{ id, updatedAt, deviceId, data }`) so app
|
|
16
|
+
* fields can never collide with the LWW fields the sync layer requires, and
|
|
17
|
+
* the facade stamps `updatedAt`/`deviceId` on every write itself. Hydration
|
|
18
|
+
* goes through `LocalStore.hydrateSingleton`, which LWW-reconciles the
|
|
19
|
+
* duplicate envelope rows two devices can mint for the same logical document.
|
|
20
|
+
*
|
|
21
|
+
* `connect()` is plain `login()`: the config registers exactly one collection,
|
|
22
|
+
* so the wallet consent screen shows a single legible request, and the default
|
|
23
|
+
* adopt-on-login merge carries the local document into the granted collection.
|
|
24
|
+
*
|
|
25
|
+
* Multi-document ("slot") variants are deliberately not supported yet:
|
|
26
|
+
* `hydrateSingleton` reconciles ALL rows of the collection down to one winner,
|
|
27
|
+
* so named slots need a grouped per-id reconciler first. An app that has
|
|
28
|
+
* outgrown one document should move to `createEntityStore`.
|
|
29
|
+
*/
|
|
30
|
+
import { useStore } from 'zustand';
|
|
31
|
+
import { createEntityStore } from '../storage/entityStore.js';
|
|
32
|
+
import { getDeviceId, requireStore } from '../storage/storageManager.js';
|
|
33
|
+
import { useAuthStore, useSession, useSyncStatus } from './hooks.js';
|
|
34
|
+
/**
|
|
35
|
+
* The localStore / RxDB collection key the facade's one collection uses.
|
|
36
|
+
*/
|
|
37
|
+
export const DOCUMENT_COLLECTION_KEY = 'document';
|
|
38
|
+
/**
|
|
39
|
+
* The fixed logical id of the singleton document row.
|
|
40
|
+
*/
|
|
41
|
+
const DOCUMENT_ID = 'main';
|
|
42
|
+
/**
|
|
43
|
+
* The `format` tag stamped into (and required of) export files.
|
|
44
|
+
*/
|
|
45
|
+
export const DOCUMENT_EXPORT_FORMAT = 'was-document/v1';
|
|
46
|
+
/**
|
|
47
|
+
* Builds the complete wiring for a one-document app: a `WasAppConfig` with a
|
|
48
|
+
* single sandbox collection and local-first onboarding, the singleton-document
|
|
49
|
+
* store registry, and the typed `useDocument` hook bound to both.
|
|
50
|
+
*
|
|
51
|
+
* @param options {object}
|
|
52
|
+
* @param options.appName {string} human-readable name (consent reason lines)
|
|
53
|
+
* @param options.appOrigin {string} this app's own web origin
|
|
54
|
+
* @param [options.wasServerUrl] {string} expected WAS server URL
|
|
55
|
+
* @param [options.mediatorBase] {string} CHAPI mediator base URL
|
|
56
|
+
* @param options.document {object} `collectionId` (the WAS sandbox
|
|
57
|
+
* collection id) and `initial` (the document value before the first write)
|
|
58
|
+
* @param options.credential {SeedCredentialConfig} seed-credential naming
|
|
59
|
+
* @param [options.dbName] {string} local database base name
|
|
60
|
+
* @param [options.storageKeyPrefix] {string} localStorage key prefix
|
|
61
|
+
* @param [options.sync] {WasSyncConfig} replication tuning
|
|
62
|
+
* @param [options.expiry] {WasExpiryConfig} near-expiry warning tuning
|
|
63
|
+
* @returns {DocumentApp<T>}
|
|
64
|
+
*/
|
|
65
|
+
export function defineDocumentApp({ appName, appOrigin, wasServerUrl, mediatorBase, document, credential, dbName, storageKeyPrefix, sync, expiry }) {
|
|
66
|
+
const { collectionId, initial } = document;
|
|
67
|
+
const docStore = createEntityStore(DOCUMENT_COLLECTION_KEY);
|
|
68
|
+
const config = {
|
|
69
|
+
appName,
|
|
70
|
+
appOrigin,
|
|
71
|
+
...(wasServerUrl !== undefined && { wasServerUrl }),
|
|
72
|
+
...(mediatorBase !== undefined && { mediatorBase }),
|
|
73
|
+
collections: [{ key: DOCUMENT_COLLECTION_KEY, id: collectionId }],
|
|
74
|
+
onboarding: 'local-first',
|
|
75
|
+
credential,
|
|
76
|
+
...(dbName !== undefined && { dbName }),
|
|
77
|
+
...(storageKeyPrefix !== undefined && { storageKeyPrefix }),
|
|
78
|
+
...(sync !== undefined && { sync }),
|
|
79
|
+
...(expiry !== undefined && { expiry })
|
|
80
|
+
};
|
|
81
|
+
const registry = {
|
|
82
|
+
[DOCUMENT_COLLECTION_KEY]: {
|
|
83
|
+
// Whole-collection hydrate doubles as the duplicate-singleton
|
|
84
|
+
// reconciler: keep the LWW winner, tombstone the losers.
|
|
85
|
+
hydrate: async () => {
|
|
86
|
+
const winner = await requireStore().hydrateSingleton(DOCUMENT_COLLECTION_KEY);
|
|
87
|
+
docStore.getState().replaceAll(winner ? [winner] : []);
|
|
88
|
+
},
|
|
89
|
+
upsert: doc => docStore.getState().patch(doc),
|
|
90
|
+
drop: uuid => docStore.getState().drop(uuid),
|
|
91
|
+
clear: () => docStore.getState().replaceAll([])
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
/**
|
|
95
|
+
* Merges the patch (or applies the updater) and persists the result under
|
|
96
|
+
* the fixed document id with fresh LWW stamps.
|
|
97
|
+
*
|
|
98
|
+
* @param patch {Partial<T> | ((prev: T) => T)}
|
|
99
|
+
* @returns {Promise<void>}
|
|
100
|
+
*/
|
|
101
|
+
async function update(patch) {
|
|
102
|
+
const held = docStore.getState().byId.get(DOCUMENT_ID);
|
|
103
|
+
const prev = held?.data ?? initial;
|
|
104
|
+
const data = typeof patch === 'function' ? patch(prev) : { ...prev, ...patch };
|
|
105
|
+
await docStore.getState().upsert({
|
|
106
|
+
id: DOCUMENT_ID,
|
|
107
|
+
updatedAt: new Date().toISOString(),
|
|
108
|
+
deviceId: getDeviceId({
|
|
109
|
+
...(storageKeyPrefix !== undefined && { storageKeyPrefix })
|
|
110
|
+
}),
|
|
111
|
+
data
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Serializes the current document (or `initial` before any write) into a
|
|
116
|
+
* tagged, versioned JSON blob.
|
|
117
|
+
*
|
|
118
|
+
* @returns {Promise<Blob>}
|
|
119
|
+
*/
|
|
120
|
+
async function exportFile() {
|
|
121
|
+
const held = docStore.getState().byId.get(DOCUMENT_ID);
|
|
122
|
+
const body = {
|
|
123
|
+
format: DOCUMENT_EXPORT_FORMAT,
|
|
124
|
+
app: appName,
|
|
125
|
+
exportedAt: new Date().toISOString(),
|
|
126
|
+
document: held?.data ?? initial
|
|
127
|
+
};
|
|
128
|
+
return new Blob([JSON.stringify(body, null, 2)], {
|
|
129
|
+
type: 'application/json'
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Parses an export file and replaces the document with its contents (a
|
|
134
|
+
* persisted write with fresh LWW stamps).
|
|
135
|
+
*
|
|
136
|
+
* @param file {File}
|
|
137
|
+
* @returns {Promise<void>}
|
|
138
|
+
*/
|
|
139
|
+
async function importFile(file) {
|
|
140
|
+
let parsed;
|
|
141
|
+
try {
|
|
142
|
+
parsed = JSON.parse(await file.text());
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
throw new Error('Not a valid export file (unreadable JSON).');
|
|
146
|
+
}
|
|
147
|
+
const record = parsed;
|
|
148
|
+
if (record === null ||
|
|
149
|
+
record.format !== DOCUMENT_EXPORT_FORMAT ||
|
|
150
|
+
typeof record.document !== 'object' ||
|
|
151
|
+
record.document === null) {
|
|
152
|
+
throw new Error(`Not a "${DOCUMENT_EXPORT_FORMAT}" export file; nothing imported.`);
|
|
153
|
+
}
|
|
154
|
+
const imported = record.document;
|
|
155
|
+
await update(() => imported);
|
|
156
|
+
}
|
|
157
|
+
function useDocument() {
|
|
158
|
+
const held = docStore(state => state.byId.get(DOCUMENT_ID));
|
|
159
|
+
const { status, authenticating, error } = useSession();
|
|
160
|
+
const { state: syncState } = useSyncStatus();
|
|
161
|
+
const store = useAuthStore();
|
|
162
|
+
const login = useStore(store, state => state.login);
|
|
163
|
+
const logout = useStore(store, state => state.logout);
|
|
164
|
+
// Hydration completes before the machine leaves `boot`, so "left boot" is
|
|
165
|
+
// exactly "the stored document (or its absence) is now known".
|
|
166
|
+
const doc = status === 'boot' ? undefined : (held?.data ?? initial);
|
|
167
|
+
return {
|
|
168
|
+
doc,
|
|
169
|
+
update,
|
|
170
|
+
status,
|
|
171
|
+
sync: syncState,
|
|
172
|
+
exportFile,
|
|
173
|
+
importFile,
|
|
174
|
+
connect: () => login(),
|
|
175
|
+
disconnect: () => logout(),
|
|
176
|
+
connecting: authenticating,
|
|
177
|
+
error
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
return { config, registry, useDocument };
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=documentApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documentApp.js","sourceRoot":"","sources":["../../src/react/documentApp.ts"],"names":[],"mappings":"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"}
|
package/dist/react/index.d.ts
CHANGED
|
@@ -8,4 +8,5 @@
|
|
|
8
8
|
*/
|
|
9
9
|
export { WasSessionProvider, WasSessionContext } from './WasSessionProvider.js';
|
|
10
10
|
export { useAuthStore, useSession, useLogin, useLogout, useClearData, useHasLocalData, useReconnect, useSyncStatus, type SyncRollup } from './hooks.js';
|
|
11
|
+
export { defineDocumentApp, DOCUMENT_COLLECTION_KEY, DOCUMENT_EXPORT_FORMAT, type DocumentApp } from './documentApp.js';
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,UAAU,EAChB,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EACb,KAAK,UAAU,EAChB,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EACtB,KAAK,WAAW,EACjB,MAAM,kBAAkB,CAAA"}
|
package/dist/react/index.js
CHANGED
|
@@ -8,4 +8,5 @@
|
|
|
8
8
|
*/
|
|
9
9
|
export { WasSessionProvider, WasSessionContext } from './WasSessionProvider.js';
|
|
10
10
|
export { useAuthStore, useSession, useLogin, useLogout, useClearData, useHasLocalData, useReconnect, useSyncStatus } from './hooks.js';
|
|
11
|
+
export { defineDocumentApp, DOCUMENT_COLLECTION_KEY, DOCUMENT_EXPORT_FORMAT } from './documentApp.js';
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EAEd,MAAM,YAAY,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;GAIG;AACH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EACL,YAAY,EACZ,UAAU,EACV,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,eAAe,EACf,YAAY,EACZ,aAAa,EAEd,MAAM,YAAY,CAAA;AACnB,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,sBAAsB,EAEvB,MAAM,kBAAkB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authStore.d.ts","sourceRoot":"","sources":["../../src/session/authStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAA;AAIrB,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAQ1E,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAA;AAwB7B;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,CAAA;AAqBxE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,aAAa,CAAA;IACrB;;;;OAIG;IACH,UAAU,EAAE,aAAa,GAAG,aAAa,CAAA;IACzC;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAA;IACvB;;OAEG;IACH,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B;;;OAGG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;IACrB;;;;OAIG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB;;;;;;;;;;;;OAYG;IACH,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjE;;;;;;;;;;;OAWG;IACH,iBAAiB,EAAE,CAAC,OAAO,EAAE;QAC3B,IAAI,EAAE,UAAU,CAAA;QAChB,MAAM,EAAE,KAAK,EAAE,CAAA;QACf,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;KAC1B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnB;;OAEG;IACH,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B;;;;;;;OAOG;IACH,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD;;;;OAIG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC;;;;OAIG;IACH,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IACpC,mBAAmB,EAAE,MAAM,IAAI,CAAA;IAC/B;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;AAQ9C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,QAAQ,EACR,SAAS,EACT,OAAO,EACR,EAAE;IACD,MAAM,EAAE,YAAY,CAAA;IACpB,QAAQ,EAAE,aAAa,CAAA;IACvB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;CACtC,GAAG,YAAY,
|
|
1
|
+
{"version":3,"file":"authStore.d.ts","sourceRoot":"","sources":["../../src/session/authStore.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAClD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAA;AACzD,OAAO,EAKL,KAAK,aAAa,EAClB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAA;AAIrB,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,0BAA0B,CAAA;AAQ1E,OAAO,EAKL,KAAK,UAAU,EAChB,MAAM,sBAAsB,CAAA;AAwB7B;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,CAAA;AAqBxE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,aAAa,CAAA;IACrB;;;;OAIG;IACH,UAAU,EAAE,aAAa,GAAG,aAAa,CAAA;IACzC;;;OAGG;IACH,cAAc,EAAE,OAAO,CAAA;IACvB;;OAEG;IACH,KAAK,EAAE,UAAU,GAAG,IAAI,CAAA;IACxB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B;;;OAGG;IACH,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB;;;OAGG;IACH,aAAa,EAAE,OAAO,CAAA;IACtB,YAAY,EAAE,OAAO,CAAA;IACrB;;;;OAIG;IACH,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACzB;;;;;;;;;;;;OAYG;IACH,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACjE;;;;;;;;;;;OAWG;IACH,iBAAiB,EAAE,CAAC,OAAO,EAAE;QAC3B,IAAI,EAAE,UAAU,CAAA;QAChB,MAAM,EAAE,KAAK,EAAE,CAAA;QACf,KAAK,CAAC,EAAE,OAAO,GAAG,OAAO,CAAA;KAC1B,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACnB;;OAEG;IACH,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IAC9B;;;;;;;OAOG;IACH,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IACvD;;;;OAIG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;IACnC;;;;OAIG;IACH,YAAY,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IACpC,mBAAmB,EAAE,MAAM,IAAI,CAAA;IAC/B;;;;;;OAMG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAA;AAQ9C;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,QAAQ,EACR,SAAS,EACT,OAAO,EACR,EAAE;IACD,MAAM,EAAE,YAAY,CAAA;IACpB,QAAQ,EAAE,aAAa,CAAA;IACvB,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;CACtC,GAAG,YAAY,CAipBf"}
|
|
@@ -147,6 +147,7 @@ export function createAuthStore({ config, registry, seedStore, storage }) {
|
|
|
147
147
|
return startWasSync({
|
|
148
148
|
parsed,
|
|
149
149
|
zcapClient,
|
|
150
|
+
collections: config.collections,
|
|
150
151
|
localStore: requireStore(),
|
|
151
152
|
syncController: controller,
|
|
152
153
|
onRemoteChange: (key, event) => void patchFromChange(registry, key, event),
|