@laboverwire/stitch 0.6.3 → 0.6.5
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/CHANGELOG.md +17 -0
- package/dist/store.d.ts.map +1 -1
- package/dist/store.js +11 -8
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,23 @@
|
|
|
6
6
|
|
|
7
7
|
- _Nothing yet._
|
|
8
8
|
|
|
9
|
+
## 0.6.5
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **`updateIf` / `deleteIf` — version-fenced compare-and-set writes.** `updateIf(entity, id, fields, expectedVersion): Promise<number>` applies `fields` only if the row's server version still equals `expectedVersion`, resolving with the new version; `deleteIf(entity, id, expectedVersion): Promise<void>` removes the row under the same fence. Both are **remote-first / online-only** — sent to the broker first, never optimistically queued, applied locally only on success — so they reject when there is no connected remote rather than queuing the write for later. A stale-version failure surfaces as the engine's terminal `err.kind = 'preconditionFailed'` (distinct from the retryable `conflict`); the adapter forwards the rejection untouched, so callers read `err.kind` directly. These surface the `@laboverwire/stitch-wasm` 0.6.0 CAS methods (from stitch-rs #47) that the 0.6.4 floor bump already made available, so no new engine floor is needed. Closes #57.
|
|
14
|
+
|
|
15
|
+
## 0.6.4
|
|
16
|
+
|
|
17
|
+
### Fixed
|
|
18
|
+
|
|
19
|
+
- **`subscribeToConnectionStatus` now delivers connection-status transitions.** The callback registered but never fired on any connectivity change — the synchronous `connectionStatus` getter stayed correct, but the push channel was dead, so React/Vue connection indicators showed a permanently stale status. The root cause was in the engine: `@laboverwire/stitch-wasm` 0.5.1 did not fan the MQTT client's connectivity events out to the wasm `Store`'s status subscribers. Fixed upstream in stitch-rs #65 and shipped as `@laboverwire/stitch-wasm` 0.6.0; this release delivers it to consumers by raising the floor below. Tracked as #48.
|
|
20
|
+
- **Deferred subscriptions now emit an initial value when attached to an already-ready store.** `deferrableSubscribe` poked consumers to re-read only on the pre-init path; a subscription attached after `initialize()` had resolved got no initial callback, so a direct `subscribeToConnectionStatus` consumer stayed at its default until the next transition. The ready path now pokes once on attach, matching the pre-init path — `useSyncExternalStore`-style consumers get a current read immediately and a connection indicator reflects the live status on mount instead of waiting for the next change.
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
|
|
24
|
+
- Raised the `@laboverwire/stitch-wasm` floor to `^0.6.0`, which delivers the connection-status forwarding fix above. The 0.5 → 0.6 engine step is additive to the `Store` surface this adapter consumes — two new compare-and-set methods (`updateIf`, `deleteIf`) the wrapper does not expose — with no removed or changed signatures, so there are no `@laboverwire/stitch` type or signature changes. `subscribeToConnectionStatus` and `connectionStatus` keep their exact shapes; only the engine's runtime delivery behind them changed.
|
|
25
|
+
|
|
9
26
|
## 0.6.3
|
|
10
27
|
|
|
11
28
|
### Fixed
|
package/dist/store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,aAAa,EAEb,YAAY,EAKZ,KAAK,EACL,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,aAAa,EAEb,YAAY,EAKZ,KAAK,EACL,WAAW,EACX,YAAY,EACb,MAAM,YAAY,CAAC;AAkVpB,wBAAgB,WAAW,CAAC,CAAC,SAAS,YAAY,GAAG,aAAa,EAChE,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,KAAK,CAAC,CAAC,CAAC,CAIV"}
|
package/dist/store.js
CHANGED
|
@@ -18,15 +18,12 @@ function normalizeStatus(raw) {
|
|
|
18
18
|
function cacheKey(scopeId, entity) {
|
|
19
19
|
return `${scopeId} ${entity}`;
|
|
20
20
|
}
|
|
21
|
-
/**
|
|
22
|
-
* Wire a subscription now if the store is ready, otherwise defer wiring until
|
|
23
|
-
* `whenReady` resolves. Returns an unsubscribe that cancels the pending wire or
|
|
24
|
-
* the live subscription, whichever exists. `poke` fires once the deferred
|
|
25
|
-
* subscription attaches so `useSyncExternalStore`-style consumers re-read.
|
|
26
|
-
*/
|
|
27
21
|
function deferrableSubscribe(isReady, whenReady, subscribeNow, poke) {
|
|
28
|
-
if (isReady())
|
|
29
|
-
|
|
22
|
+
if (isReady()) {
|
|
23
|
+
const live = subscribeNow();
|
|
24
|
+
poke();
|
|
25
|
+
return live;
|
|
26
|
+
}
|
|
30
27
|
let live = null;
|
|
31
28
|
let cancelled = false;
|
|
32
29
|
void whenReady().then(() => {
|
|
@@ -150,6 +147,12 @@ class StitchStore {
|
|
|
150
147
|
delete(entity, id, tag) {
|
|
151
148
|
return this.#afterReady(() => this.#inner.delete(entity, id, tag ?? undefined));
|
|
152
149
|
}
|
|
150
|
+
updateIf(entity, id, fields, expectedVersion) {
|
|
151
|
+
return this.#afterReady(() => this.#inner.updateIf(entity, id, fields, expectedVersion));
|
|
152
|
+
}
|
|
153
|
+
deleteIf(entity, id, expectedVersion) {
|
|
154
|
+
return this.#afterReady(() => this.#inner.deleteIf(entity, id, expectedVersion));
|
|
155
|
+
}
|
|
153
156
|
subscribeToScope(scopeId, entity, callback) {
|
|
154
157
|
return deferrableSubscribe(() => this.#inner.ready(), () => this.#readyPromise, () => this.#inner.subscribeToScope(scopeId, entity, callback), callback);
|
|
155
158
|
}
|
package/dist/store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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","sourcesContent":["import { createStore as createWasmStore } from '@laboverwire/stitch-wasm';\nimport type { Store as WasmStore } from '@laboverwire/stitch-wasm';\nimport type {\n ConnectionStatus,\n DefaultSchema,\n EntityKey,\n EntitySchema,\n ListFilter,\n MemoryStore,\n OriginTag,\n SortField,\n Store,\n StoreConfig,\n StoreOptions,\n} from './types.ts';\n\nconst EMPTY_ARRAY: Record<string, unknown>[] = [];\nconst EMPTY_MAP: Record<string, Record<string, unknown>> = {};\n\nfunction normalizeStatus(raw: string): ConnectionStatus {\n switch (raw) {\n case 'Connected':\n return 'connected';\n case 'Connecting':\n return 'connecting';\n case 'Disconnected':\n return 'disconnected';\n case 'Error':\n return 'error';\n default:\n return 'offline';\n }\n}\n\nfunction cacheKey(scopeId: string, entity: string): string {\n return `${scopeId} ${entity}`;\n}\n\n/**\n * Wire a subscription now if the store is ready, otherwise defer wiring until\n * `whenReady` resolves. Returns an unsubscribe that cancels the pending wire or\n * the live subscription, whichever exists. `poke` fires once the deferred\n * subscription attaches so `useSyncExternalStore`-style consumers re-read.\n */\nfunction deferrableSubscribe(\n isReady: () => boolean,\n whenReady: () => Promise<void>,\n subscribeNow: () => () => void,\n poke: () => void\n): () => void {\n if (isReady()) return subscribeNow();\n let live: (() => void) | null = null;\n let cancelled = false;\n void whenReady().then(() => {\n if (cancelled) return;\n live = subscribeNow();\n poke();\n });\n return () => {\n cancelled = true;\n if (live) {\n live();\n live = null;\n }\n };\n}\n\nclass MemoryView implements MemoryStore {\n #inner: WasmStore;\n #whenReady: () => Promise<void>;\n #arrays = new Map<string, { version: number; data: Record<string, unknown>[] }>();\n #maps = new Map<string, { version: number; data: Record<string, Record<string, unknown>> }>();\n\n constructor(inner: WasmStore, whenReady: () => Promise<void>) {\n this.#inner = inner;\n this.#whenReady = whenReady;\n }\n\n getSnapshot(entity: string, scopeId: string): Record<string, unknown>[] {\n if (!this.#inner.ready()) return EMPTY_ARRAY;\n const version = this.#inner.getVersion(scopeId, entity);\n const key = cacheKey(scopeId, entity);\n const hit = this.#arrays.get(key);\n if (hit && hit.version === version) return hit.data;\n const data = this.#inner.getSnapshot(entity, scopeId) as Record<string, unknown>[];\n this.#arrays.set(key, { version, data });\n return data;\n }\n\n getSnapshotAsMap(entity: string, scopeId: string): Record<string, Record<string, unknown>> {\n if (!this.#inner.ready()) return EMPTY_MAP;\n const version = this.#inner.getVersion(scopeId, entity);\n const key = cacheKey(scopeId, entity);\n const hit = this.#maps.get(key);\n if (hit && hit.version === version) return hit.data;\n const data = this.#inner.getSnapshotAsMap(entity, scopeId) as Record<\n string,\n Record<string, unknown>\n >;\n this.#maps.set(key, { version, data });\n return data;\n }\n\n subscribeToScope(scopeId: string, entity: string, callback: () => void): () => void {\n return deferrableSubscribe(\n () => this.#inner.ready(),\n this.#whenReady,\n () => this.#inner.subscribeToScope(scopeId, entity, callback) as () => void,\n callback\n );\n }\n}\n\nclass StitchStore<S extends EntitySchema = DefaultSchema> implements Store<S> {\n readonly config: StoreConfig;\n readonly memory: MemoryStore;\n #inner: WasmStore;\n #memory: MemoryView;\n #hasPersistence: boolean;\n #hasRemote: boolean;\n #reconnectValidator: (() => Promise<void>) | null = null;\n #readyPromise: Promise<void>;\n #resolveReady!: () => void;\n\n constructor(inner: WasmStore, config: StoreConfig, options: StoreOptions) {\n this.#inner = inner;\n this.config = config;\n this.#hasPersistence = options.persistence != null;\n this.#hasRemote = options.remote != null;\n this.#readyPromise = new Promise<void>((resolve) => {\n this.#resolveReady = resolve;\n });\n this.#memory = new MemoryView(inner, () => this.#readyPromise);\n this.memory = this.#memory;\n }\n\n #afterReady<T>(fn: () => Promise<T>): Promise<T> {\n return this.#inner.ready() ? fn() : this.#readyPromise.then(fn);\n }\n\n async initialize(): Promise<void> {\n await this.#inner.initialize();\n this.#resolveReady();\n }\n\n destroy(): Promise<void> {\n return this.#inner.ready() ? this.#inner.destroy() : Promise.resolve();\n }\n\n get ready(): boolean {\n return this.#inner.ready();\n }\n\n read<K extends EntityKey<S>>(entity: K, id: string): S[K] | null {\n if (!this.#inner.ready()) return null;\n return (this.#inner.read(entity, id) ?? null) as S[K] | null;\n }\n\n getSnapshot<K extends EntityKey<S>>(entity: K, scopeId: string): S[K][] {\n return this.#memory.getSnapshot(entity, scopeId) as S[K][];\n }\n\n getSnapshotAsMap<K extends EntityKey<S>>(entity: K, scopeId: string): Record<string, S[K]> {\n return this.#memory.getSnapshotAsMap(entity, scopeId) as Record<string, S[K]>;\n }\n\n list<K extends EntityKey<S>>(entity: K, filter?: ListFilter): Promise<S[K][]> {\n return this.#afterReady(() => this.#inner.list(entity, filter ?? {})) as Promise<S[K][]>;\n }\n\n listRootEntities(sort?: SortField[]): Promise<Record<string, unknown>[]> {\n return this.#afterReady(() => this.#inner.listRootEntities(sort ?? [])) as Promise<\n Record<string, unknown>[]\n >;\n }\n\n getChildCount<K extends EntityKey<S>>(entity: K, scopeId: string): number {\n if (!this.#inner.ready()) return 0;\n return this.#inner.getChildCount(entity, scopeId);\n }\n\n getVersion<K extends EntityKey<S>>(scopeId: string, entity: K): number {\n if (!this.#inner.ready()) return 0;\n return this.#inner.getVersion(scopeId, entity);\n }\n\n create<K extends EntityKey<S>>(\n entity: K,\n scopeId: string,\n data: Partial<S[K]> & Record<string, unknown>,\n tag?: OriginTag\n ): Promise<string> {\n return this.#afterReady(() => this.#inner.create(entity, scopeId, data, tag ?? undefined));\n }\n\n update<K extends EntityKey<S>>(\n entity: K,\n id: string,\n fields: Partial<S[K]>,\n tag?: OriginTag\n ): Promise<void> {\n return this.#afterReady(() => this.#inner.update(entity, id, fields, tag ?? undefined));\n }\n\n delete<K extends EntityKey<S>>(entity: K, id: string, tag?: OriginTag): Promise<void> {\n return this.#afterReady(() => this.#inner.delete(entity, id, tag ?? undefined));\n }\n\n subscribeToScope<K extends EntityKey<S>>(\n scopeId: string,\n entity: K,\n callback: () => void\n ): () => void {\n return deferrableSubscribe(\n () => this.#inner.ready(),\n () => this.#readyPromise,\n () => this.#inner.subscribeToScope(scopeId, entity, callback) as () => void,\n callback\n );\n }\n\n subscribeToEntity<K extends EntityKey<S>>(\n entity: K,\n callback: (data: S[K] | null, op: 'insert' | 'update' | 'delete') => void\n ): () => void {\n return deferrableSubscribe(\n () => this.#inner.ready(),\n () => this.#readyPromise,\n () =>\n this.#inner.subscribeToEntity(entity, (data: unknown, op: 'insert' | 'update' | 'delete') =>\n callback((data ?? null) as S[K] | null, op)\n ) as () => void,\n () => callback(null, 'update')\n );\n }\n\n beginBatch(): void {\n if (this.#inner.ready()) this.#inner.beginBatch();\n }\n\n endBatch(): void {\n if (this.#inner.ready()) this.#inner.endBatch();\n }\n\n replaceScope(scopeId: string): Promise<void> {\n return this.#afterReady(() => this.#inner.replaceScope(scopeId));\n }\n\n closeScope(scopeId: string): Promise<void> {\n return this.#afterReady(() => this.#inner.closeScope(scopeId));\n }\n\n loadScope(scopeId: string, data: Record<string, Record<string, unknown>[]>): Promise<void> {\n return this.#afterReady(() => this.#inner.loadScope(scopeId, data));\n }\n\n clearScope(scopeId: string): Promise<void> {\n return this.#afterReady(() => this.#inner.clearScope(scopeId));\n }\n\n get connectionStatus(): ConnectionStatus {\n if (!this.#inner.ready()) return 'offline';\n return normalizeStatus(this.#inner.connectionStatus());\n }\n\n subscribeToConnectionStatus(cb: (s: ConnectionStatus) => void): () => void {\n return deferrableSubscribe(\n () => this.#inner.ready(),\n () => this.#readyPromise,\n () =>\n this.#inner.subscribeToConnectionStatus((raw: string) =>\n cb(normalizeStatus(raw))\n ) as () => void,\n () => cb(normalizeStatus(this.#inner.connectionStatus()))\n );\n }\n\n disconnect(): Promise<void> {\n return this.#inner.ready() ? this.#inner.disconnect() : Promise.resolve();\n }\n\n async reconnect(serverUrl: string, getTicket?: () => Promise<string>): Promise<void> {\n if (this.#reconnectValidator) await this.#reconnectValidator();\n const ticket = getTicket ? await getTicket() : undefined;\n await this.#inner.reconnect(serverUrl, ticket ?? undefined);\n }\n\n get isReconnecting(): boolean {\n if (!this.#inner.ready()) return false;\n return this.#inner.isReconnecting();\n }\n\n setAuthenticatedUser(userId: string): void {\n if (this.#inner.ready()) this.#inner.setAuthenticatedUser(userId);\n else void this.#readyPromise.then(() => this.#inner.setAuthenticatedUser(userId));\n }\n\n setSessionInvalidHandler(handler: () => void): void {\n if (this.#inner.ready()) this.#inner.setSessionInvalidHandler(handler);\n else void this.#readyPromise.then(() => this.#inner.setSessionInvalidHandler(handler));\n }\n\n setReconnectValidator(validator: () => Promise<void>): void {\n this.#reconnectValidator = validator;\n }\n\n resetForLogout(): Promise<void> {\n return this.#inner.ready() ? this.#inner.resetForLogout() : Promise.resolve();\n }\n\n readLocalState(entity: string, id: string): Promise<Record<string, unknown> | null> {\n return this.#afterReady(() =>\n this.#inner\n .readLocalState(entity, id)\n .then((r: unknown) => (r ?? null) as Record<string, unknown> | null)\n );\n }\n\n updateLocalState(entity: string, id: string, fields: Record<string, unknown>): Promise<void> {\n return this.#afterReady(() => this.#inner.updateLocalState(entity, id, fields));\n }\n\n pendingMutationCount(scopeId: string): Promise<number> {\n return this.#afterReady(() => this.#inner.pendingMutationCount(scopeId));\n }\n\n request(topic: string, payload: unknown): Promise<Record<string, unknown>> {\n return this.#afterReady(() => this.#inner.request(topic, payload)) as Promise<\n Record<string, unknown>\n >;\n }\n\n get hasPersistence(): boolean {\n return this.#hasPersistence;\n }\n\n get hasRemote(): boolean {\n return this.#hasRemote;\n }\n}\n\nexport function createStore<S extends EntitySchema = DefaultSchema>(\n config: StoreConfig,\n options?: StoreOptions\n): Store<S> {\n const resolvedOptions = options ?? {};\n const inner = createWasmStore(config, resolvedOptions);\n return new StitchStore<S>(inner, config, resolvedOptions);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAgB1E,MAAM,WAAW,GAA8B,EAAE,CAAC;AAClD,MAAM,SAAS,GAA4C,EAAE,CAAC;AAE9D,SAAS,eAAe,CAAC,GAAW;IAClC,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,WAAW;YACd,OAAO,WAAW,CAAC;QACrB,KAAK,YAAY;YACf,OAAO,YAAY,CAAC;QACtB,KAAK,cAAc;YACjB,OAAO,cAAc,CAAC;QACxB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,OAAe,EAAE,MAAc;IAC/C,OAAO,GAAG,OAAO,IAAI,MAAM,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,mBAAmB,CAC1B,OAAsB,EACtB,SAA8B,EAC9B,YAA8B,EAC9B,IAAgB;IAEhB,IAAI,OAAO,EAAE,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;QAC5B,IAAI,EAAE,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,IAAI,GAAwB,IAAI,CAAC;IACrC,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,KAAK,SAAS,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QACzB,IAAI,SAAS;YAAE,OAAO;QACtB,IAAI,GAAG,YAAY,EAAE,CAAC;QACtB,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IACH,OAAO,GAAG,EAAE;QACV,SAAS,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,EAAE,CAAC;YACT,IAAI,EAAE,CAAC;YACP,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU;IACd,MAAM,CAAY;IAClB,UAAU,CAAsB;IAChC,OAAO,GAAG,IAAI,GAAG,EAAgE,CAAC;IAClF,KAAK,GAAG,IAAI,GAAG,EAA8E,CAAC;IAE9F,YAAY,KAAgB,EAAE,SAA8B;QAC1D,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,WAAW,CAAC,MAAc,EAAE,OAAe;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,OAAO,WAAW,CAAC;QAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAA8B,CAAC;QACnF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,MAAc,EAAE,OAAe;QAC9C,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC;QACpD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAGxD,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB,CAAC,OAAe,EAAE,MAAc,EAAE,QAAoB;QACpE,OAAO,mBAAmB,CACxB,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EACzB,IAAI,CAAC,UAAU,EACf,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAe,EAC3E,QAAQ,CACT,CAAC;IACJ,CAAC;CACF;AAED,MAAM,WAAW;IACN,MAAM,CAAc;IACpB,MAAM,CAAc;IAC7B,MAAM,CAAY;IAClB,OAAO,CAAa;IACpB,eAAe,CAAU;IACzB,UAAU,CAAU;IACpB,mBAAmB,GAAiC,IAAI,CAAC;IACzD,aAAa,CAAgB;IAC7B,aAAa,CAAc;IAE3B,YAAY,KAAgB,EAAE,MAAmB,EAAE,OAAqB;QACtE,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACjD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IAC7B,CAAC;IAED,WAAW,CAAI,EAAoB;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,CAAyB,MAAS,EAAE,EAAU;QAChD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,IAAI,CAAgB,CAAC;IAC/D,CAAC;IAED,WAAW,CAAyB,MAAS,EAAE,OAAe;QAC5D,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAW,CAAC;IAC7D,CAAC;IAED,gBAAgB,CAAyB,MAAS,EAAE,OAAe;QACjE,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAyB,CAAC;IAChF,CAAC;IAED,IAAI,CAAyB,MAAS,EAAE,MAAmB;QACzD,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,CAAC,CAAoB,CAAC;IAC3F,CAAC;IAED,gBAAgB,CAAC,IAAkB;QACjC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,IAAI,EAAE,CAAC,CAErE,CAAC;IACJ,CAAC;IAED,aAAa,CAAyB,MAAS,EAAE,OAAe;QAC9D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,OAAO,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,UAAU,CAAyB,OAAe,EAAE,MAAS;QAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,OAAO,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,CACJ,MAAS,EACT,OAAe,EACf,IAA6C,EAC7C,GAAe;QAEf,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,CACJ,MAAS,EACT,EAAU,EACV,MAAqB,EACrB,GAAe;QAEf,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,CAAyB,MAAS,EAAE,EAAU,EAAE,GAAe;QACnE,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,QAAQ,CACN,MAAS,EACT,EAAU,EACV,MAAqB,EACrB,eAAuB;QAEvB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,QAAQ,CAAyB,MAAS,EAAE,EAAU,EAAE,eAAuB;QAC7E,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACnF,CAAC;IAED,gBAAgB,CACd,OAAe,EACf,MAAS,EACT,QAAoB;QAEpB,OAAO,mBAAmB,CACxB,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EACzB,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EACxB,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAe,EAC3E,QAAQ,CACT,CAAC;IACJ,CAAC;IAED,iBAAiB,CACf,MAAS,EACT,QAAyE;QAEzE,OAAO,mBAAmB,CACxB,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EACzB,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EACxB,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,EAAE,CAAC,IAAa,EAAE,EAAkC,EAAE,EAAE,CAC1F,QAAQ,CAAC,CAAC,IAAI,IAAI,IAAI,CAAgB,EAAE,EAAE,CAAC,CAC9B,EACjB,GAAG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAC/B,CAAC;IACJ,CAAC;IAED,UAAU;QACR,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;IACpD,CAAC;IAED,QAAQ;QACN,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;IAClD,CAAC;IAED,YAAY,CAAC,OAAe;QAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,SAAS,CAAC,OAAe,EAAE,IAA+C;QACxE,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,gBAAgB;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,OAAO,SAAS,CAAC;QAC3C,OAAO,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACzD,CAAC;IAED,2BAA2B,CAAC,EAAiC;QAC3D,OAAO,mBAAmB,CACxB,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,EACzB,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,EACxB,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,GAAW,EAAE,EAAE,CACtD,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CACX,EACjB,GAAG,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAC1D,CAAC;IACJ,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,SAAiC;QAClE,IAAI,IAAI,CAAC,mBAAmB;YAAE,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAC/D,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACzD,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,cAAc;QAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,OAAO,KAAK,CAAC;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;IACtC,CAAC;IAED,oBAAoB,CAAC,MAAc;QACjC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;;YAC7D,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;IACpF,CAAC;IAED,wBAAwB,CAAC,OAAmB;QAC1C,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;YAAE,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;;YAClE,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC,CAAC;IACzF,CAAC;IAED,qBAAqB,CAAC,SAA8B;QAClD,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;IACvC,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;IAChF,CAAC;IAED,cAAc,CAAC,MAAc,EAAE,EAAU;QACvC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAC3B,IAAI,CAAC,MAAM;aACR,cAAc,CAAC,MAAM,EAAE,EAAE,CAAC;aAC1B,IAAI,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAmC,CAAC,CACvE,CAAC;IACJ,CAAC;IAED,gBAAgB,CAAC,MAAc,EAAE,EAAU,EAAE,MAA+B;QAC1E,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IAClF,CAAC;IAED,oBAAoB,CAAC,OAAe;QAClC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,CAAC,KAAa,EAAE,OAAgB;QACrC,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAEhE,CAAC;IACJ,CAAC;IAED,IAAI,cAAc;QAChB,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,UAAU,WAAW,CACzB,MAAmB,EACnB,OAAsB;IAEtB,MAAM,eAAe,GAAG,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACvD,OAAO,IAAI,WAAW,CAAI,KAAK,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;AAC5D,CAAC","sourcesContent":["import { createStore as createWasmStore } from '@laboverwire/stitch-wasm';\nimport type { Store as WasmStore } from '@laboverwire/stitch-wasm';\nimport type {\n ConnectionStatus,\n DefaultSchema,\n EntityKey,\n EntitySchema,\n ListFilter,\n MemoryStore,\n OriginTag,\n SortField,\n Store,\n StoreConfig,\n StoreOptions,\n} from './types.ts';\n\nconst EMPTY_ARRAY: Record<string, unknown>[] = [];\nconst EMPTY_MAP: Record<string, Record<string, unknown>> = {};\n\nfunction normalizeStatus(raw: string): ConnectionStatus {\n switch (raw) {\n case 'Connected':\n return 'connected';\n case 'Connecting':\n return 'connecting';\n case 'Disconnected':\n return 'disconnected';\n case 'Error':\n return 'error';\n default:\n return 'offline';\n }\n}\n\nfunction cacheKey(scopeId: string, entity: string): string {\n return `${scopeId} ${entity}`;\n}\n\nfunction deferrableSubscribe(\n isReady: () => boolean,\n whenReady: () => Promise<void>,\n subscribeNow: () => () => void,\n poke: () => void\n): () => void {\n if (isReady()) {\n const live = subscribeNow();\n poke();\n return live;\n }\n let live: (() => void) | null = null;\n let cancelled = false;\n void whenReady().then(() => {\n if (cancelled) return;\n live = subscribeNow();\n poke();\n });\n return () => {\n cancelled = true;\n if (live) {\n live();\n live = null;\n }\n };\n}\n\nclass MemoryView implements MemoryStore {\n #inner: WasmStore;\n #whenReady: () => Promise<void>;\n #arrays = new Map<string, { version: number; data: Record<string, unknown>[] }>();\n #maps = new Map<string, { version: number; data: Record<string, Record<string, unknown>> }>();\n\n constructor(inner: WasmStore, whenReady: () => Promise<void>) {\n this.#inner = inner;\n this.#whenReady = whenReady;\n }\n\n getSnapshot(entity: string, scopeId: string): Record<string, unknown>[] {\n if (!this.#inner.ready()) return EMPTY_ARRAY;\n const version = this.#inner.getVersion(scopeId, entity);\n const key = cacheKey(scopeId, entity);\n const hit = this.#arrays.get(key);\n if (hit && hit.version === version) return hit.data;\n const data = this.#inner.getSnapshot(entity, scopeId) as Record<string, unknown>[];\n this.#arrays.set(key, { version, data });\n return data;\n }\n\n getSnapshotAsMap(entity: string, scopeId: string): Record<string, Record<string, unknown>> {\n if (!this.#inner.ready()) return EMPTY_MAP;\n const version = this.#inner.getVersion(scopeId, entity);\n const key = cacheKey(scopeId, entity);\n const hit = this.#maps.get(key);\n if (hit && hit.version === version) return hit.data;\n const data = this.#inner.getSnapshotAsMap(entity, scopeId) as Record<\n string,\n Record<string, unknown>\n >;\n this.#maps.set(key, { version, data });\n return data;\n }\n\n subscribeToScope(scopeId: string, entity: string, callback: () => void): () => void {\n return deferrableSubscribe(\n () => this.#inner.ready(),\n this.#whenReady,\n () => this.#inner.subscribeToScope(scopeId, entity, callback) as () => void,\n callback\n );\n }\n}\n\nclass StitchStore<S extends EntitySchema = DefaultSchema> implements Store<S> {\n readonly config: StoreConfig;\n readonly memory: MemoryStore;\n #inner: WasmStore;\n #memory: MemoryView;\n #hasPersistence: boolean;\n #hasRemote: boolean;\n #reconnectValidator: (() => Promise<void>) | null = null;\n #readyPromise: Promise<void>;\n #resolveReady!: () => void;\n\n constructor(inner: WasmStore, config: StoreConfig, options: StoreOptions) {\n this.#inner = inner;\n this.config = config;\n this.#hasPersistence = options.persistence != null;\n this.#hasRemote = options.remote != null;\n this.#readyPromise = new Promise<void>((resolve) => {\n this.#resolveReady = resolve;\n });\n this.#memory = new MemoryView(inner, () => this.#readyPromise);\n this.memory = this.#memory;\n }\n\n #afterReady<T>(fn: () => Promise<T>): Promise<T> {\n return this.#inner.ready() ? fn() : this.#readyPromise.then(fn);\n }\n\n async initialize(): Promise<void> {\n await this.#inner.initialize();\n this.#resolveReady();\n }\n\n destroy(): Promise<void> {\n return this.#inner.ready() ? this.#inner.destroy() : Promise.resolve();\n }\n\n get ready(): boolean {\n return this.#inner.ready();\n }\n\n read<K extends EntityKey<S>>(entity: K, id: string): S[K] | null {\n if (!this.#inner.ready()) return null;\n return (this.#inner.read(entity, id) ?? null) as S[K] | null;\n }\n\n getSnapshot<K extends EntityKey<S>>(entity: K, scopeId: string): S[K][] {\n return this.#memory.getSnapshot(entity, scopeId) as S[K][];\n }\n\n getSnapshotAsMap<K extends EntityKey<S>>(entity: K, scopeId: string): Record<string, S[K]> {\n return this.#memory.getSnapshotAsMap(entity, scopeId) as Record<string, S[K]>;\n }\n\n list<K extends EntityKey<S>>(entity: K, filter?: ListFilter): Promise<S[K][]> {\n return this.#afterReady(() => this.#inner.list(entity, filter ?? {})) as Promise<S[K][]>;\n }\n\n listRootEntities(sort?: SortField[]): Promise<Record<string, unknown>[]> {\n return this.#afterReady(() => this.#inner.listRootEntities(sort ?? [])) as Promise<\n Record<string, unknown>[]\n >;\n }\n\n getChildCount<K extends EntityKey<S>>(entity: K, scopeId: string): number {\n if (!this.#inner.ready()) return 0;\n return this.#inner.getChildCount(entity, scopeId);\n }\n\n getVersion<K extends EntityKey<S>>(scopeId: string, entity: K): number {\n if (!this.#inner.ready()) return 0;\n return this.#inner.getVersion(scopeId, entity);\n }\n\n create<K extends EntityKey<S>>(\n entity: K,\n scopeId: string,\n data: Partial<S[K]> & Record<string, unknown>,\n tag?: OriginTag\n ): Promise<string> {\n return this.#afterReady(() => this.#inner.create(entity, scopeId, data, tag ?? undefined));\n }\n\n update<K extends EntityKey<S>>(\n entity: K,\n id: string,\n fields: Partial<S[K]>,\n tag?: OriginTag\n ): Promise<void> {\n return this.#afterReady(() => this.#inner.update(entity, id, fields, tag ?? undefined));\n }\n\n delete<K extends EntityKey<S>>(entity: K, id: string, tag?: OriginTag): Promise<void> {\n return this.#afterReady(() => this.#inner.delete(entity, id, tag ?? undefined));\n }\n\n updateIf<K extends EntityKey<S>>(\n entity: K,\n id: string,\n fields: Partial<S[K]>,\n expectedVersion: number\n ): Promise<number> {\n return this.#afterReady(() => this.#inner.updateIf(entity, id, fields, expectedVersion));\n }\n\n deleteIf<K extends EntityKey<S>>(entity: K, id: string, expectedVersion: number): Promise<void> {\n return this.#afterReady(() => this.#inner.deleteIf(entity, id, expectedVersion));\n }\n\n subscribeToScope<K extends EntityKey<S>>(\n scopeId: string,\n entity: K,\n callback: () => void\n ): () => void {\n return deferrableSubscribe(\n () => this.#inner.ready(),\n () => this.#readyPromise,\n () => this.#inner.subscribeToScope(scopeId, entity, callback) as () => void,\n callback\n );\n }\n\n subscribeToEntity<K extends EntityKey<S>>(\n entity: K,\n callback: (data: S[K] | null, op: 'insert' | 'update' | 'delete') => void\n ): () => void {\n return deferrableSubscribe(\n () => this.#inner.ready(),\n () => this.#readyPromise,\n () =>\n this.#inner.subscribeToEntity(entity, (data: unknown, op: 'insert' | 'update' | 'delete') =>\n callback((data ?? null) as S[K] | null, op)\n ) as () => void,\n () => callback(null, 'update')\n );\n }\n\n beginBatch(): void {\n if (this.#inner.ready()) this.#inner.beginBatch();\n }\n\n endBatch(): void {\n if (this.#inner.ready()) this.#inner.endBatch();\n }\n\n replaceScope(scopeId: string): Promise<void> {\n return this.#afterReady(() => this.#inner.replaceScope(scopeId));\n }\n\n closeScope(scopeId: string): Promise<void> {\n return this.#afterReady(() => this.#inner.closeScope(scopeId));\n }\n\n loadScope(scopeId: string, data: Record<string, Record<string, unknown>[]>): Promise<void> {\n return this.#afterReady(() => this.#inner.loadScope(scopeId, data));\n }\n\n clearScope(scopeId: string): Promise<void> {\n return this.#afterReady(() => this.#inner.clearScope(scopeId));\n }\n\n get connectionStatus(): ConnectionStatus {\n if (!this.#inner.ready()) return 'offline';\n return normalizeStatus(this.#inner.connectionStatus());\n }\n\n subscribeToConnectionStatus(cb: (s: ConnectionStatus) => void): () => void {\n return deferrableSubscribe(\n () => this.#inner.ready(),\n () => this.#readyPromise,\n () =>\n this.#inner.subscribeToConnectionStatus((raw: string) =>\n cb(normalizeStatus(raw))\n ) as () => void,\n () => cb(normalizeStatus(this.#inner.connectionStatus()))\n );\n }\n\n disconnect(): Promise<void> {\n return this.#inner.ready() ? this.#inner.disconnect() : Promise.resolve();\n }\n\n async reconnect(serverUrl: string, getTicket?: () => Promise<string>): Promise<void> {\n if (this.#reconnectValidator) await this.#reconnectValidator();\n const ticket = getTicket ? await getTicket() : undefined;\n await this.#inner.reconnect(serverUrl, ticket ?? undefined);\n }\n\n get isReconnecting(): boolean {\n if (!this.#inner.ready()) return false;\n return this.#inner.isReconnecting();\n }\n\n setAuthenticatedUser(userId: string): void {\n if (this.#inner.ready()) this.#inner.setAuthenticatedUser(userId);\n else void this.#readyPromise.then(() => this.#inner.setAuthenticatedUser(userId));\n }\n\n setSessionInvalidHandler(handler: () => void): void {\n if (this.#inner.ready()) this.#inner.setSessionInvalidHandler(handler);\n else void this.#readyPromise.then(() => this.#inner.setSessionInvalidHandler(handler));\n }\n\n setReconnectValidator(validator: () => Promise<void>): void {\n this.#reconnectValidator = validator;\n }\n\n resetForLogout(): Promise<void> {\n return this.#inner.ready() ? this.#inner.resetForLogout() : Promise.resolve();\n }\n\n readLocalState(entity: string, id: string): Promise<Record<string, unknown> | null> {\n return this.#afterReady(() =>\n this.#inner\n .readLocalState(entity, id)\n .then((r: unknown) => (r ?? null) as Record<string, unknown> | null)\n );\n }\n\n updateLocalState(entity: string, id: string, fields: Record<string, unknown>): Promise<void> {\n return this.#afterReady(() => this.#inner.updateLocalState(entity, id, fields));\n }\n\n pendingMutationCount(scopeId: string): Promise<number> {\n return this.#afterReady(() => this.#inner.pendingMutationCount(scopeId));\n }\n\n request(topic: string, payload: unknown): Promise<Record<string, unknown>> {\n return this.#afterReady(() => this.#inner.request(topic, payload)) as Promise<\n Record<string, unknown>\n >;\n }\n\n get hasPersistence(): boolean {\n return this.#hasPersistence;\n }\n\n get hasRemote(): boolean {\n return this.#hasRemote;\n }\n}\n\nexport function createStore<S extends EntitySchema = DefaultSchema>(\n config: StoreConfig,\n options?: StoreOptions\n): Store<S> {\n const resolvedOptions = options ?? {};\n const inner = createWasmStore(config, resolvedOptions);\n return new StitchStore<S>(inner, config, resolvedOptions);\n}\n"]}
|
package/dist/types.d.ts
CHANGED
|
@@ -97,6 +97,8 @@ export interface Store<S extends EntitySchema = DefaultSchema> {
|
|
|
97
97
|
create<K extends EntityKey<S>>(entity: K, scopeId: string, data: Partial<S[K]> & Record<string, unknown>, tag?: OriginTag): Promise<string>;
|
|
98
98
|
update<K extends EntityKey<S>>(entity: K, id: string, fields: Partial<S[K]>, tag?: OriginTag): Promise<void>;
|
|
99
99
|
delete<K extends EntityKey<S>>(entity: K, id: string, tag?: OriginTag): Promise<void>;
|
|
100
|
+
updateIf<K extends EntityKey<S>>(entity: K, id: string, fields: Partial<S[K]>, expectedVersion: number): Promise<number>;
|
|
101
|
+
deleteIf<K extends EntityKey<S>>(entity: K, id: string, expectedVersion: number): Promise<void>;
|
|
100
102
|
subscribeToScope<K extends EntityKey<S>>(scopeId: string, entity: K, callback: () => void): () => void;
|
|
101
103
|
subscribeToEntity<K extends EntityKey<S>>(entity: K, callback: (data: S[K] | null, op: 'insert' | 'update' | 'delete') => void): () => void;
|
|
102
104
|
beginBatch(): void;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface SchemaField {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n required?: boolean;\n default?: unknown;\n}\n\nexport interface ForeignKeyDefinition {\n field: string;\n references: string;\n onDelete: 'cascade' | 'set_null' | 'restrict';\n}\n\nexport interface EntityDefinition {\n fields: SchemaField[];\n foreignKeys?: ForeignKeyDefinition[];\n uniqueConstraints?: string[][];\n indexes?: string[];\n}\n\nexport interface StoreConfig {\n entities: Record<string, EntityDefinition>;\n scope: {\n rootEntity: string;\n childEntities: string[];\n scopeField: string;\n };\n topLevelEntities?: Array<{\n entity: string;\n subscriptionPattern: string;\n }>;\n localOnlyEntities?: Record<string, EntityDefinition>;\n syncTopicPrefix?: string;\n responseTopicPrefix?: string;\n versionField?: string;\n updatedAtField?: string;\n userScopeField?: string;\n}\n\nexport type OriginTag = 'remote' | 'load' | 'clear';\n\nexport type ConnectionStatus = 'connected' | 'disconnected' | 'connecting' | 'error' | 'offline';\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface SortField {\n field: string;\n direction: SortDirection;\n}\n\nexport interface ListFilter {\n scopeId?: string;\n sort?: SortField[];\n projection?: string[];\n}\n\nexport interface PersistenceConfig {\n dbName: string;\n passphrase?: string;\n}\n\nexport interface RemoteConfig {\n url: string;\n clientId?: string;\n ticket?: string;\n username?: string;\n password?: string;\n autoConnect?: boolean;\n}\n\nexport interface StoreOptions {\n persistence?: PersistenceConfig;\n remote?: RemoteConfig;\n}\n\n/**\n * A schema maps entity name → record type. Users declare their own:\n *\n * ```ts\n * type Schema = { project: Project; task: Task };\n * const store = createStore<Schema>(config, options);\n * ```\n *\n * When no generic argument is supplied, methods fall back to `Record<string, unknown>`.\n */\nexport type EntitySchema = Record<string, object>;\nexport type DefaultSchema = Record<string, Record<string, unknown>>;\nexport type EntityKey<S extends EntitySchema> = keyof S & string;\n\n/**\n * Read-only view over the in-memory cache, exposed for `useSyncExternalStore`-style\n * subscriptions. Snapshots are referentially stable until the scope's version changes.\n */\nexport interface MemoryStore {\n getSnapshot(entity: string, scopeId: string): Record<string, unknown>[];\n getSnapshotAsMap(entity: string, scopeId: string): Record<string, Record<string, unknown>>;\n subscribeToScope(scopeId: string, entity: string, callback: () => void): () => void;\n}\n\nexport interface Store<S extends EntitySchema = DefaultSchema> {\n initialize(): Promise<void>;\n destroy(): Promise<void>;\n readonly ready: boolean;\n\n read<K extends EntityKey<S>>(entity: K, id: string): S[K] | null;\n getSnapshot<K extends EntityKey<S>>(entity: K, scopeId: string): S[K][];\n getSnapshotAsMap<K extends EntityKey<S>>(entity: K, scopeId: string): Record<string, S[K]>;\n\n list<K extends EntityKey<S>>(entity: K, filter?: ListFilter): Promise<S[K][]>;\n listRootEntities(sort?: SortField[]): Promise<Record<string, unknown>[]>;\n getChildCount<K extends EntityKey<S>>(entity: K, scopeId: string): number;\n getVersion<K extends EntityKey<S>>(scopeId: string, entity: K): number;\n\n create<K extends EntityKey<S>>(\n entity: K,\n scopeId: string,\n data: Partial<S[K]> & Record<string, unknown>,\n tag?: OriginTag\n ): Promise<string>;\n update<K extends EntityKey<S>>(\n entity: K,\n id: string,\n fields: Partial<S[K]>,\n tag?: OriginTag\n ): Promise<void>;\n delete<K extends EntityKey<S>>(entity: K, id: string, tag?: OriginTag): Promise<void>;\n\n subscribeToScope<K extends EntityKey<S>>(\n scopeId: string,\n entity: K,\n callback: () => void\n ): () => void;\n subscribeToEntity<K extends EntityKey<S>>(\n entity: K,\n callback: (data: S[K] | null, op: 'insert' | 'update' | 'delete') => void\n ): () => void;\n\n beginBatch(): void;\n endBatch(): void;\n\n replaceScope(scopeId: string): Promise<void>;\n closeScope(scopeId: string): Promise<void>;\n loadScope(scopeId: string, data: Record<string, Record<string, unknown>[]>): Promise<void>;\n clearScope(scopeId: string): Promise<void>;\n\n readonly connectionStatus: ConnectionStatus;\n subscribeToConnectionStatus(cb: (s: ConnectionStatus) => void): () => void;\n disconnect(): Promise<void>;\n reconnect(serverUrl: string, getTicket?: () => Promise<string>): Promise<void>;\n readonly isReconnecting: boolean;\n\n setAuthenticatedUser(userId: string): void;\n setSessionInvalidHandler(handler: () => void): void;\n setReconnectValidator(validator: () => Promise<void>): void;\n resetForLogout(): Promise<void>;\n\n readLocalState(entity: string, id: string): Promise<Record<string, unknown> | null>;\n updateLocalState(entity: string, id: string, fields: Record<string, unknown>): Promise<void>;\n pendingMutationCount(scopeId: string): Promise<number>;\n\n request(topic: string, payload: unknown): Promise<Record<string, unknown>>;\n\n readonly hasPersistence: boolean;\n readonly hasRemote: boolean;\n\n readonly memory: MemoryStore;\n readonly config: StoreConfig;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface SchemaField {\n name: string;\n type: 'string' | 'number' | 'boolean' | 'object' | 'array';\n required?: boolean;\n default?: unknown;\n}\n\nexport interface ForeignKeyDefinition {\n field: string;\n references: string;\n onDelete: 'cascade' | 'set_null' | 'restrict';\n}\n\nexport interface EntityDefinition {\n fields: SchemaField[];\n foreignKeys?: ForeignKeyDefinition[];\n uniqueConstraints?: string[][];\n indexes?: string[];\n}\n\nexport interface StoreConfig {\n entities: Record<string, EntityDefinition>;\n scope: {\n rootEntity: string;\n childEntities: string[];\n scopeField: string;\n };\n topLevelEntities?: Array<{\n entity: string;\n subscriptionPattern: string;\n }>;\n localOnlyEntities?: Record<string, EntityDefinition>;\n syncTopicPrefix?: string;\n responseTopicPrefix?: string;\n versionField?: string;\n updatedAtField?: string;\n userScopeField?: string;\n}\n\nexport type OriginTag = 'remote' | 'load' | 'clear';\n\nexport type ConnectionStatus = 'connected' | 'disconnected' | 'connecting' | 'error' | 'offline';\n\nexport type SortDirection = 'asc' | 'desc';\n\nexport interface SortField {\n field: string;\n direction: SortDirection;\n}\n\nexport interface ListFilter {\n scopeId?: string;\n sort?: SortField[];\n projection?: string[];\n}\n\nexport interface PersistenceConfig {\n dbName: string;\n passphrase?: string;\n}\n\nexport interface RemoteConfig {\n url: string;\n clientId?: string;\n ticket?: string;\n username?: string;\n password?: string;\n autoConnect?: boolean;\n}\n\nexport interface StoreOptions {\n persistence?: PersistenceConfig;\n remote?: RemoteConfig;\n}\n\n/**\n * A schema maps entity name → record type. Users declare their own:\n *\n * ```ts\n * type Schema = { project: Project; task: Task };\n * const store = createStore<Schema>(config, options);\n * ```\n *\n * When no generic argument is supplied, methods fall back to `Record<string, unknown>`.\n */\nexport type EntitySchema = Record<string, object>;\nexport type DefaultSchema = Record<string, Record<string, unknown>>;\nexport type EntityKey<S extends EntitySchema> = keyof S & string;\n\n/**\n * Read-only view over the in-memory cache, exposed for `useSyncExternalStore`-style\n * subscriptions. Snapshots are referentially stable until the scope's version changes.\n */\nexport interface MemoryStore {\n getSnapshot(entity: string, scopeId: string): Record<string, unknown>[];\n getSnapshotAsMap(entity: string, scopeId: string): Record<string, Record<string, unknown>>;\n subscribeToScope(scopeId: string, entity: string, callback: () => void): () => void;\n}\n\nexport interface Store<S extends EntitySchema = DefaultSchema> {\n initialize(): Promise<void>;\n destroy(): Promise<void>;\n readonly ready: boolean;\n\n read<K extends EntityKey<S>>(entity: K, id: string): S[K] | null;\n getSnapshot<K extends EntityKey<S>>(entity: K, scopeId: string): S[K][];\n getSnapshotAsMap<K extends EntityKey<S>>(entity: K, scopeId: string): Record<string, S[K]>;\n\n list<K extends EntityKey<S>>(entity: K, filter?: ListFilter): Promise<S[K][]>;\n listRootEntities(sort?: SortField[]): Promise<Record<string, unknown>[]>;\n getChildCount<K extends EntityKey<S>>(entity: K, scopeId: string): number;\n getVersion<K extends EntityKey<S>>(scopeId: string, entity: K): number;\n\n create<K extends EntityKey<S>>(\n entity: K,\n scopeId: string,\n data: Partial<S[K]> & Record<string, unknown>,\n tag?: OriginTag\n ): Promise<string>;\n update<K extends EntityKey<S>>(\n entity: K,\n id: string,\n fields: Partial<S[K]>,\n tag?: OriginTag\n ): Promise<void>;\n delete<K extends EntityKey<S>>(entity: K, id: string, tag?: OriginTag): Promise<void>;\n updateIf<K extends EntityKey<S>>(\n entity: K,\n id: string,\n fields: Partial<S[K]>,\n expectedVersion: number\n ): Promise<number>;\n deleteIf<K extends EntityKey<S>>(entity: K, id: string, expectedVersion: number): Promise<void>;\n\n subscribeToScope<K extends EntityKey<S>>(\n scopeId: string,\n entity: K,\n callback: () => void\n ): () => void;\n subscribeToEntity<K extends EntityKey<S>>(\n entity: K,\n callback: (data: S[K] | null, op: 'insert' | 'update' | 'delete') => void\n ): () => void;\n\n beginBatch(): void;\n endBatch(): void;\n\n replaceScope(scopeId: string): Promise<void>;\n closeScope(scopeId: string): Promise<void>;\n loadScope(scopeId: string, data: Record<string, Record<string, unknown>[]>): Promise<void>;\n clearScope(scopeId: string): Promise<void>;\n\n readonly connectionStatus: ConnectionStatus;\n subscribeToConnectionStatus(cb: (s: ConnectionStatus) => void): () => void;\n disconnect(): Promise<void>;\n reconnect(serverUrl: string, getTicket?: () => Promise<string>): Promise<void>;\n readonly isReconnecting: boolean;\n\n setAuthenticatedUser(userId: string): void;\n setSessionInvalidHandler(handler: () => void): void;\n setReconnectValidator(validator: () => Promise<void>): void;\n resetForLogout(): Promise<void>;\n\n readLocalState(entity: string, id: string): Promise<Record<string, unknown> | null>;\n updateLocalState(entity: string, id: string, fields: Record<string, unknown>): Promise<void>;\n pendingMutationCount(scopeId: string): Promise<number>;\n\n request(topic: string, payload: unknown): Promise<Record<string, unknown>>;\n\n readonly hasPersistence: boolean;\n readonly hasRemote: boolean;\n\n readonly memory: MemoryStore;\n readonly config: StoreConfig;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@laboverwire/stitch",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.5",
|
|
4
4
|
"description": "Reactive state synchronization library bridging an in-memory store, IndexedDB persistence, and MQTT-based remote sync.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "LabOverWire",
|
|
@@ -74,7 +74,7 @@
|
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
|
-
"@laboverwire/stitch-wasm": "^0.
|
|
77
|
+
"@laboverwire/stitch-wasm": "^0.6.0"
|
|
78
78
|
},
|
|
79
79
|
"peerDependencies": {
|
|
80
80
|
"react": "^19.0.0",
|