@laboverwire/stitch 0.6.3 → 0.6.4

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 CHANGED
@@ -6,6 +6,17 @@
6
6
 
7
7
  - _Nothing yet._
8
8
 
9
+ ## 0.6.4
10
+
11
+ ### Fixed
12
+
13
+ - **`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.
14
+ - **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.
15
+
16
+ ### Changed
17
+
18
+ - 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.
19
+
9
20
  ## 0.6.3
10
21
 
11
22
  ### Fixed
@@ -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;AAuUpB,wBAAgB,WAAW,CAAC,CAAC,SAAS,YAAY,GAAG,aAAa,EAChE,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,KAAK,CAAC,CAAC,CAAC,CAIV"}
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;AAqUpB,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
- return subscribeNow();
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(() => {
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":"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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\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 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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@laboverwire/stitch",
3
- "version": "0.6.3",
3
+ "version": "0.6.4",
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.5.1"
77
+ "@laboverwire/stitch-wasm": "^0.6.0"
78
78
  },
79
79
  "peerDependencies": {
80
80
  "react": "^19.0.0",