@laboverwire/stitch 0.4.3 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +8 -5
  3. package/dist/index.d.ts +1 -8
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +0 -7
  6. package/dist/index.js.map +1 -1
  7. package/dist/react/provider.d.ts +2 -2
  8. package/dist/react/provider.d.ts.map +1 -1
  9. package/dist/store.d.ts +2 -2
  10. package/dist/store.d.ts.map +1 -1
  11. package/dist/store.js +190 -724
  12. package/dist/store.js.map +1 -1
  13. package/dist/types.d.ts +23 -161
  14. package/dist/types.d.ts.map +1 -1
  15. package/dist/types.js +1 -6
  16. package/dist/types.js.map +1 -1
  17. package/package.json +16 -7
  18. package/dist/internal-utils.d.ts +0 -4
  19. package/dist/internal-utils.d.ts.map +0 -1
  20. package/dist/internal-utils.js +0 -20
  21. package/dist/internal-utils.js.map +0 -1
  22. package/dist/internal-wasm-error.d.ts +0 -9
  23. package/dist/internal-wasm-error.d.ts.map +0 -1
  24. package/dist/internal-wasm-error.js +0 -48
  25. package/dist/internal-wasm-error.js.map +0 -1
  26. package/dist/memory-store.d.ts +0 -3
  27. package/dist/memory-store.d.ts.map +0 -1
  28. package/dist/memory-store.js +0 -572
  29. package/dist/memory-store.js.map +0 -1
  30. package/dist/offline-queue.d.ts +0 -6
  31. package/dist/offline-queue.d.ts.map +0 -1
  32. package/dist/offline-queue.js +0 -363
  33. package/dist/offline-queue.js.map +0 -1
  34. package/dist/persistence-layer.d.ts +0 -7
  35. package/dist/persistence-layer.d.ts.map +0 -1
  36. package/dist/persistence-layer.js +0 -409
  37. package/dist/persistence-layer.js.map +0 -1
  38. package/dist/remote-sync-layer.d.ts +0 -8
  39. package/dist/remote-sync-layer.d.ts.map +0 -1
  40. package/dist/remote-sync-layer.js +0 -439
  41. package/dist/remote-sync-layer.js.map +0 -1
  42. package/dist/sync-engine.d.ts +0 -3
  43. package/dist/sync-engine.d.ts.map +0 -1
  44. package/dist/sync-engine.js +0 -643
  45. package/dist/sync-engine.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-store.js","sourceRoot":"","sources":["../src/memory-store.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Database } from 'mqdb-wasm';\nimport type initWasm from 'mqdb-wasm';\nimport { wrapWasmError, isCorruptionError } from './internal-wasm-error.ts';\nimport type { StoreConfig, MutationEvent, MemoryStore, OriginTag } from './types.ts';\n\ntype SubscriptionCallback = () => void;\ntype MutationListener = (event: MutationEvent) => void;\n\ninterface VersionedSnapshot<T> {\n version: number;\n data: T;\n}\n\nfunction stripNulls(obj: Record<string, unknown>): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value != null) {\n result[key] = value;\n }\n }\n return result;\n}\n\nfunction topologicalDeleteOrder(entities: string[], config: StoreConfig): string[] {\n const entitySet = new Set(entities);\n const refCounts = new Map<string, number>();\n for (const e of entities) refCounts.set(e, 0);\n\n for (const e of entities) {\n const def = config.entities[e];\n if (!def?.foreignKeys) continue;\n for (const fk of def.foreignKeys) {\n if (entitySet.has(fk.references)) {\n refCounts.set(e, (refCounts.get(e) ?? 0) + 1);\n }\n }\n }\n\n return [...entities].sort((a, b) => (refCounts.get(b) ?? 0) - (refCounts.get(a) ?? 0));\n}\n\nclass MemoryStoreImpl implements MemoryStore {\n private _db: Database | null = null;\n private _dbReady = false;\n private _initPromise: Promise<void> | null = null;\n private _wasmReady = false;\n private _corrupted = false;\n private _initWasm: typeof initWasm | null = null;\n private _Database: (new () => Database) | null = null;\n\n private readonly config: StoreConfig;\n private readonly allEntities: string[];\n\n private versions: Map<string, Map<string, number>> = new Map();\n private listSnapshots: Map<string, Map<string, VersionedSnapshot<Record<string, unknown>[]>>> =\n new Map();\n private mapSnapshots: Map<\n string,\n Map<string, VersionedSnapshot<Record<string, Record<string, unknown>>>>\n > = new Map();\n\n private subscribers: Map<string, Map<string, Set<SubscriptionCallback>>> = new Map();\n private globalSubscribers: Map<string, Set<SubscriptionCallback>> = new Map();\n private mutationListeners: Set<MutationListener> = new Set();\n\n private batchDepth = 0;\n private batchedKeys: Set<string> = new Set();\n private batchedMutations: MutationEvent[] = [];\n private originTag: OriginTag | null = null;\n private wasmSubIds: string[] = [];\n private lastOriginTag: OriginTag | null = null;\n private pendingDeleteContext: { scopeId: string } | null = null;\n private pendingInitCallbacks: Array<() => void> = [];\n private corruptionCallbacks: Set<() => void> = new Set();\n\n constructor(config: StoreConfig) {\n this.config = config;\n this.allEntities = [\n config.scope.rootEntity,\n ...config.scope.childEntities,\n ...(config.topLevelEntities?.map((t) => t.entity) ?? []),\n ];\n }\n\n ensureReady(): Promise<void> {\n if (this._dbReady) return Promise.resolve();\n if (!this._initPromise) {\n this._initPromise = this.doInit();\n }\n return this._initPromise;\n }\n\n private async doInit(): Promise<void> {\n try {\n if (!this._initWasm) {\n const mod = await import('mqdb-wasm');\n this._initWasm = mod.default;\n this._Database = mod.Database;\n }\n try {\n await this._initWasm!();\n } catch (err) {\n throw wrapWasmError('init', err);\n }\n this._wasmReady = true;\n this.initDb();\n this.notifyAllGlobalSubscribers();\n const cbs = this.pendingInitCallbacks;\n this.pendingInitCallbacks = [];\n for (const cb of cbs) cb();\n } catch (err) {\n this._initPromise = null;\n throw err;\n }\n }\n\n private initDb(): void {\n if (this._dbReady) return;\n if (!this._wasmReady || !this._Database) return;\n this._db = new this._Database();\n this._dbReady = true;\n this.registerSchemas();\n this.setupSubscriptions();\n }\n\n get isReady(): boolean {\n return this._dbReady;\n }\n\n get corrupted(): boolean {\n return this._corrupted;\n }\n\n onCorruption(callback: () => void): () => void {\n this.corruptionCallbacks.add(callback);\n return () => {\n this.corruptionCallbacks.delete(callback);\n };\n }\n\n private get db(): Database {\n if (this._corrupted) {\n if (!this.tryRecover()) {\n throw new Error('WASM database is corrupted');\n }\n }\n if (!this._dbReady) {\n this.ensureReady();\n throw new Error('WASM not initialized yet');\n }\n return this._db!;\n }\n\n private tryRecover(): boolean {\n if (!this._wasmReady || !this._Database) return false;\n try {\n const testDb = new this._Database();\n testDb.listSync('__test__', {});\n testDb.free();\n } catch {\n return false;\n }\n try {\n this._db = new this._Database();\n this._corrupted = false;\n this._dbReady = true;\n this.registerSchemas();\n this.setupSubscriptions();\n this.clearAllCaches();\n console.warn('[MemoryStore] WASM recovered — reinitialized in-memory database');\n return true;\n } catch {\n return false;\n }\n }\n\n private isWasmCorrupted(err: unknown): boolean {\n return isCorruptionError(err);\n }\n\n private notifyCorruption(): void {\n for (const cb of this.corruptionCallbacks) {\n try {\n cb();\n } catch {}\n }\n }\n\n private clearAllCaches(): void {\n this.listSnapshots.clear();\n this.mapSnapshots.clear();\n this.versions.clear();\n }\n\n private notifyAllGlobalSubscribers(): void {\n for (const entity of this.allEntities) {\n const subs = this.globalSubscribers.get(entity);\n if (subs) {\n for (const cb of subs) cb();\n }\n }\n for (const [, scopeMap] of this.subscribers) {\n for (const [, entitySubs] of scopeMap) {\n for (const cb of entitySubs) cb();\n }\n }\n }\n\n onReady(callback: () => void): void {\n if (this._dbReady) {\n callback();\n } else {\n this.pendingInitCallbacks.push(callback);\n this.ensureReady();\n }\n }\n\n private registerSchemasOn(db: Database): void {\n const { entities } = this.config;\n for (const [entity, definition] of Object.entries(entities)) {\n db.addSchema(entity, definition);\n if (definition.indexes) {\n for (const field of definition.indexes) {\n db.addIndex(entity, [field]);\n }\n }\n }\n }\n\n private registerSchemas(): void {\n this.registerSchemasOn(this._db!);\n }\n\n private unsubscribeAll(): void {\n if (this._db) {\n for (const subId of this.wasmSubIds) {\n try {\n this._db.unsubscribe(subId);\n } catch {}\n }\n }\n this.wasmSubIds = [];\n }\n\n private setupSubscriptions(): void {\n this.unsubscribeAll();\n for (const entity of this.allEntities) {\n const subId = this.db.subscribe(\n '#',\n entity,\n (event: {\n operation: 'create' | 'update' | 'delete';\n id: string;\n data: Record<string, unknown> | null;\n }) => {\n try {\n this.handleChangeEvent(entity, event);\n } catch (err) {\n console.error(`[MemoryStore] subscription callback error for ${entity}:`, err);\n }\n }\n );\n this.wasmSubIds.push(subId);\n }\n }\n\n private handleChangeEvent(\n entity: string,\n event: {\n operation: 'create' | 'update' | 'delete';\n id: string;\n data: Record<string, unknown> | null;\n }\n ): void {\n this.lastOriginTag = this.originTag;\n const { rootEntity, scopeField } = this.config.scope;\n\n let scopeId: string | undefined;\n if (event.operation === 'delete') {\n scopeId =\n this.pendingDeleteContext?.scopeId ?? (entity === rootEntity ? event.id : undefined);\n if (!scopeId) return;\n } else if (entity === rootEntity) {\n scopeId = event.id;\n } else {\n scopeId = event.data?.[scopeField] as string | undefined;\n if (!scopeId) return;\n }\n\n this.bumpVersion(scopeId, entity);\n\n const mutation: MutationEvent = {\n operation: event.operation,\n entity,\n id: event.id,\n scopeId,\n data: event.data,\n originTag: this.originTag,\n };\n\n if (this.batchDepth > 0) {\n this.batchedKeys.add(`${scopeId}\\0${entity}`);\n this.batchedMutations.push(mutation);\n return;\n }\n\n this.notifySubscribers(scopeId, entity);\n this.emitMutation(mutation);\n }\n\n private bumpVersion(scopeId: string, entity: string): void {\n if (!this.versions.has(scopeId)) {\n this.versions.set(scopeId, new Map());\n }\n const entityVersions = this.versions.get(scopeId)!;\n entityVersions.set(entity, (entityVersions.get(entity) ?? 0) + 1);\n }\n\n private getVersion(scopeId: string, entity: string): number {\n return this.versions.get(scopeId)?.get(entity) ?? 0;\n }\n\n private notifySubscribers(scopeId: string, entity: string): void {\n const scopeSubs = this.subscribers.get(scopeId)?.get(entity);\n if (scopeSubs) {\n for (const cb of scopeSubs) cb();\n }\n const globalSubs = this.globalSubscribers.get(entity);\n if (globalSubs) {\n for (const cb of globalSubs) cb();\n }\n }\n\n private emitMutation(event: MutationEvent): void {\n for (const listener of this.mutationListeners) {\n try {\n listener(event);\n } catch (err) {\n console.error('[MemoryStore] mutation listener error:', err);\n }\n }\n }\n\n onMutation(listener: MutationListener): () => void {\n this.mutationListeners.add(listener);\n return () => {\n this.mutationListeners.delete(listener);\n };\n }\n\n getLastOriginTag(): OriginTag | null {\n return this.lastOriginTag;\n }\n\n subscribeToScope(scopeId: string, entity: string, callback: SubscriptionCallback): () => void {\n if (!this.subscribers.has(scopeId)) {\n this.subscribers.set(scopeId, new Map());\n }\n const scopeMap = this.subscribers.get(scopeId)!;\n if (!scopeMap.has(entity)) {\n scopeMap.set(entity, new Set());\n }\n scopeMap.get(entity)!.add(callback);\n\n return () => {\n scopeMap.get(entity)?.delete(callback);\n if (scopeMap.get(entity)?.size === 0) {\n scopeMap.delete(entity);\n }\n if (scopeMap.size === 0) {\n this.subscribers.delete(scopeId);\n }\n };\n }\n\n subscribeToEntity(entity: string, callback: SubscriptionCallback): () => void {\n if (!this.globalSubscribers.has(entity)) {\n this.globalSubscribers.set(entity, new Set());\n }\n this.globalSubscribers.get(entity)!.add(callback);\n return () => {\n this.globalSubscribers.get(entity)?.delete(callback);\n };\n }\n\n private listRecords(entity: string, scopeId: string): Record<string, unknown>[] {\n if (!this._dbReady || this._corrupted) return [];\n const { rootEntity, scopeField } = this.config.scope;\n const filterField = entity === rootEntity ? 'id' : scopeField;\n try {\n return this._db!.listSync(entity, {\n filters: [{ field: filterField, op: 'eq', value: scopeId }],\n }) as Record<string, unknown>[];\n } catch (err) {\n const wrapped = wrapWasmError(`listSync:${entity}`, err);\n if (this.isWasmCorrupted(err)) {\n console.error('[MemoryStore] WASM corruption:', wrapped);\n this._corrupted = true;\n this.notifyCorruption();\n if (this.tryRecover()) {\n return [];\n }\n } else {\n console.error(wrapped);\n }\n return [];\n }\n }\n\n getSnapshot(entity: string, scopeId: string): Record<string, unknown>[] {\n const version = this.getVersion(scopeId, entity);\n\n if (!this.listSnapshots.has(scopeId)) {\n this.listSnapshots.set(scopeId, new Map());\n }\n const entityMap = this.listSnapshots.get(scopeId)!;\n const cached = entityMap.get(entity);\n if (cached && cached.version === version) return cached.data;\n\n const records = this.listRecords(entity, scopeId);\n entityMap.set(entity, { version, data: records });\n return records;\n }\n\n getSnapshotAsMap(entity: string, scopeId: string): Record<string, Record<string, unknown>> {\n const version = this.getVersion(scopeId, entity);\n\n if (!this.mapSnapshots.has(scopeId)) {\n this.mapSnapshots.set(scopeId, new Map());\n }\n const entityMap = this.mapSnapshots.get(scopeId)!;\n const cached = entityMap.get(entity);\n if (cached && cached.version === version) return cached.data;\n\n const records = this.listRecords(entity, scopeId);\n const map: Record<string, Record<string, unknown>> = {};\n for (const r of records) {\n map[r.id as string] = r;\n }\n entityMap.set(entity, { version, data: map });\n return map;\n }\n\n create(entity: string, scopeId: string, data: Record<string, unknown>, tag?: OriginTag): void {\n if (this._corrupted) return;\n try {\n this.originTag = tag ?? null;\n const { rootEntity, scopeField } = this.config.scope;\n const record =\n entity === rootEntity ? stripNulls(data) : stripNulls({ ...data, [scopeField]: scopeId });\n this.db.createSync(entity, record);\n } catch (err) {\n console.error(wrapWasmError(`createSync:${entity}`, err));\n } finally {\n this.originTag = null;\n }\n }\n\n update(entity: string, id: string, fields: Record<string, unknown>, tag?: OriginTag): void {\n if (this._corrupted) return;\n try {\n this.originTag = tag ?? null;\n this.db.updateSync(entity, id, stripNulls(fields));\n } catch (err) {\n console.error(wrapWasmError(`updateSync:${entity}`, err));\n } finally {\n this.originTag = null;\n }\n }\n\n read(entity: string, id: string): Record<string, unknown> | null {\n if (this._corrupted) return null;\n try {\n return this.db.readSync(entity, id) as Record<string, unknown>;\n } catch {\n return null;\n }\n }\n\n delete(entity: string, id: string, tag?: OriginTag): void {\n if (this._corrupted) return;\n try {\n this.originTag = tag ?? null;\n const record = this.read(entity, id);\n if (!record) return;\n const scopeField = this.config.scope.scopeField;\n this.pendingDeleteContext = { scopeId: record[scopeField] as string };\n this.db.deleteSync(entity, id);\n } catch (err) {\n console.error(wrapWasmError(`deleteSync:${entity}`, err));\n } finally {\n this.originTag = null;\n this.pendingDeleteContext = null;\n }\n }\n\n list(entity: string, scopeId: string): Record<string, unknown>[] {\n return this.listRecords(entity, scopeId);\n }\n\n loadScope(\n scopeId: string,\n data: Record<string, Record<string, unknown>[]>,\n tag?: OriginTag\n ): void {\n if (!this._Database) return;\n const newDb = new this._Database();\n this.registerSchemasOn(newDb);\n\n const scopeField = this.config.scope.scopeField;\n\n for (const [entity, records] of Object.entries(data)) {\n for (const record of records) {\n try {\n const rec = { ...record, [scopeField]: scopeId };\n newDb.createSync(entity, rec);\n } catch (err) {\n console.error(wrapWasmError(`loadScope.createSync:${entity}`, err));\n }\n }\n }\n\n this.unsubscribeAll();\n this._db = newDb;\n this._corrupted = false;\n this._dbReady = true;\n this.setupSubscriptions();\n this.clearAllCaches();\n\n this.originTag = tag ?? null;\n try {\n for (const entity of this.allEntities) {\n this.bumpVersion(scopeId, entity);\n this.notifySubscribers(scopeId, entity);\n }\n } finally {\n this.originTag = null;\n }\n }\n\n beginBatch(): void {\n this.batchDepth++;\n }\n\n endBatch(): void {\n if (this.batchDepth <= 0) return;\n this.batchDepth--;\n if (this.batchDepth > 0) return;\n\n const keys = this.batchedKeys;\n const mutations = this.batchedMutations;\n this.batchedKeys = new Set();\n this.batchedMutations = [];\n\n for (const key of keys) {\n try {\n const [scopeId, entity] = key.split('\\0') as [string, string];\n this.notifySubscribers(scopeId, entity);\n } catch (err) {\n console.error('[MemoryStore] endBatch subscriber error:', err);\n }\n }\n for (const mutation of mutations) {\n this.emitMutation(mutation);\n }\n }\n\n clearScope(scopeId: string): void {\n if (this._corrupted) {\n this.clearAllCaches();\n return;\n }\n let recoveredDuringClear = false;\n this.originTag = 'clear';\n this.beginBatch();\n try {\n for (const entity of topologicalDeleteOrder(this.allEntities, this.config)) {\n if (this._corrupted) {\n recoveredDuringClear = true;\n break;\n }\n const records = this.listRecords(entity, scopeId);\n if (this._corrupted) {\n recoveredDuringClear = true;\n break;\n }\n for (const record of records) {\n try {\n this.pendingDeleteContext = { scopeId };\n this.db.deleteSync(entity, record.id as string);\n } catch {\n // cascade\n } finally {\n this.pendingDeleteContext = null;\n }\n }\n }\n } finally {\n this.originTag = null;\n if (recoveredDuringClear) {\n this.batchDepth = Math.max(0, this.batchDepth - 1);\n this.batchedKeys = new Set();\n this.batchedMutations = [];\n } else {\n this.endBatch();\n }\n }\n\n if (this.listSnapshots.has(scopeId)) {\n this.listSnapshots.delete(scopeId);\n }\n if (this.mapSnapshots.has(scopeId)) {\n this.mapSnapshots.delete(scopeId);\n }\n this.versions.delete(scopeId);\n }\n}\n\nexport function createMemoryStore(config: StoreConfig): MemoryStore {\n return new MemoryStoreImpl(config);\n}\n"]}
@@ -1,6 +0,0 @@
1
- import type { OfflineQueue, PersistenceLayer } from './types.ts';
2
- export declare function createPersistentOfflineQueue(persistence: PersistenceLayer, rootEntity: string): OfflineQueue & {
3
- setAuthenticatedUser(userId: string | null): void;
4
- };
5
- export declare function createInMemoryOfflineQueue(rootEntity: string): OfflineQueue;
6
- //# sourceMappingURL=offline-queue.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"offline-queue.d.ts","sourceRoot":"","sources":["../src/offline-queue.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAIV,YAAY,EACZ,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAqYpB,wBAAgB,4BAA4B,CAC1C,WAAW,EAAE,gBAAgB,EAC7B,UAAU,EAAE,MAAM,GACjB,YAAY,GAAG;IAAE,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;CAAE,CAEtE;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,YAAY,CAE3E"}
@@ -1,363 +0,0 @@
1
- import { OwnershipError } from "./types.js";
2
- import { isTransientSyncError, isPermanentMutationError } from "./internal-utils.js";
3
- function consolidateMutations(records) {
4
- const grouped = new Map();
5
- for (const r of records) {
6
- const key = `${r.entity}:${r.entityId}`;
7
- const entry = {
8
- recordId: r.id,
9
- op: r.op,
10
- data: r.data || null,
11
- entity: r.entity,
12
- entityId: r.entityId,
13
- scopeId: r.scopeId,
14
- createdAt: r.createdAt || 0,
15
- };
16
- const arr = grouped.get(key);
17
- if (arr) {
18
- arr.push(entry);
19
- }
20
- else {
21
- grouped.set(key, [entry]);
22
- }
23
- }
24
- const result = [];
25
- for (const [, entries] of grouped) {
26
- entries.sort((a, b) => a.createdAt - b.createdAt);
27
- const recordIds = entries.map((e) => e.recordId);
28
- const minCreatedAt = entries[0].createdAt;
29
- const hasInsert = entries.some((e) => e.op === 'insert');
30
- const hasDelete = entries.some((e) => e.op === 'delete');
31
- const { entity, entityId, scopeId } = entries[0];
32
- if (hasInsert && hasDelete) {
33
- result.push({
34
- op: 'delete',
35
- entity,
36
- id: entityId,
37
- scopeId,
38
- data: null,
39
- recordIds,
40
- minCreatedAt,
41
- });
42
- continue;
43
- }
44
- if (hasInsert) {
45
- const insertEntry = entries.find((e) => e.op === 'insert');
46
- const mergedData = insertEntry.data ? { ...insertEntry.data } : {};
47
- for (const e of entries) {
48
- if (e !== insertEntry && e.data) {
49
- Object.assign(mergedData, e.data);
50
- }
51
- }
52
- result.push({
53
- op: 'insert',
54
- entity,
55
- id: entityId,
56
- scopeId,
57
- data: mergedData,
58
- recordIds,
59
- minCreatedAt,
60
- });
61
- continue;
62
- }
63
- if (hasDelete) {
64
- result.push({
65
- op: 'delete',
66
- entity,
67
- id: entityId,
68
- scopeId,
69
- data: null,
70
- recordIds,
71
- minCreatedAt,
72
- });
73
- continue;
74
- }
75
- const mergedData = {};
76
- for (const e of entries) {
77
- if (e.data)
78
- Object.assign(mergedData, e.data);
79
- }
80
- result.push({
81
- op: 'update',
82
- entity,
83
- id: entityId,
84
- scopeId,
85
- data: Object.keys(mergedData).length > 0 ? mergedData : null,
86
- recordIds,
87
- minCreatedAt,
88
- });
89
- }
90
- const opPriority = { insert: 0, update: 1, delete: 2 };
91
- result.sort((a, b) => {
92
- if (a.minCreatedAt !== b.minCreatedAt)
93
- return a.minCreatedAt - b.minCreatedAt;
94
- return (opPriority[a.op] ?? 1) - (opPriority[b.op] ?? 1);
95
- });
96
- return result;
97
- }
98
- async function flushConsolidated(consolidated, sender, removeRecords, rootEntity) {
99
- for (const mutation of consolidated) {
100
- const { op, entity, id, scopeId, data, recordIds } = mutation;
101
- try {
102
- switch (op) {
103
- case 'insert':
104
- if (data) {
105
- await sender.syncCreate(entity, scopeId, data);
106
- }
107
- break;
108
- case 'update':
109
- if (data) {
110
- await sender.syncUpdate(entity, scopeId, id, data);
111
- }
112
- break;
113
- case 'delete':
114
- await sender.syncDelete(entity, scopeId, id);
115
- break;
116
- }
117
- await removeRecords(recordIds);
118
- }
119
- catch (err) {
120
- if (isTransientSyncError(err))
121
- continue;
122
- const isNotFound = err instanceof Error && /not found/i.test(err.message);
123
- const isConflict = err instanceof Error &&
124
- /already exists|conflict|duplicate|unique constraint violation/i.test(err.message);
125
- if (isNotFound && op === 'update' && entity === rootEntity) {
126
- try {
127
- await sender.deleteEntity(entity, id);
128
- }
129
- catch { }
130
- await removeRecords(recordIds);
131
- }
132
- else if (isNotFound && op === 'update') {
133
- try {
134
- const full = await sender.readEntity(entity, id);
135
- await sender.syncCreate(entity, scopeId, full);
136
- await removeRecords(recordIds);
137
- }
138
- catch (upsertErr) {
139
- if (!isTransientSyncError(upsertErr)) {
140
- console.error(`[OfflineQueue] Failed to upsert ${entity} during flush:`, upsertErr);
141
- await removeRecords(recordIds);
142
- }
143
- }
144
- }
145
- else if (isNotFound && op === 'delete') {
146
- await removeRecords(recordIds);
147
- }
148
- else if (isConflict && op === 'insert') {
149
- if (data) {
150
- try {
151
- await sender.syncUpdate(entity, scopeId, id, data);
152
- await removeRecords(recordIds);
153
- }
154
- catch (updateErr) {
155
- if (updateErr instanceof OwnershipError) {
156
- await removeRecords(recordIds);
157
- }
158
- else if (!isTransientSyncError(updateErr)) {
159
- console.error(`[OfflineQueue] Failed to update-on-conflict ${entity} during flush:`, updateErr);
160
- await removeRecords(recordIds);
161
- }
162
- }
163
- }
164
- else {
165
- await removeRecords(recordIds);
166
- }
167
- }
168
- else if (err instanceof OwnershipError) {
169
- await removeRecords(recordIds);
170
- }
171
- else if (isPermanentMutationError(err)) {
172
- console.error('[OfflineQueue] Dropping mutation after permanent error:', err);
173
- await removeRecords(recordIds);
174
- }
175
- else {
176
- console.error('[OfflineQueue] Dropping mutation after unknown error:', err);
177
- await removeRecords(recordIds);
178
- }
179
- }
180
- }
181
- }
182
- class PersistentOfflineQueue {
183
- persistence;
184
- rootEntity;
185
- authenticatedUser = null;
186
- flushing = false;
187
- constructor(persistence, rootEntity) {
188
- this.persistence = persistence;
189
- this.rootEntity = rootEntity;
190
- }
191
- setAuthenticatedUser(userId) {
192
- this.authenticatedUser = userId;
193
- }
194
- async queue(mutation) {
195
- if (!this.authenticatedUser)
196
- return;
197
- try {
198
- const record = {
199
- id: crypto.randomUUID(),
200
- op: mutation.op,
201
- entity: mutation.entity,
202
- entityId: mutation.id,
203
- scopeId: mutation.scopeId,
204
- userId: this.authenticatedUser,
205
- createdAt: Date.now(),
206
- };
207
- if (mutation.data !== null) {
208
- record.data = mutation.data;
209
- }
210
- await this.persistence.create('pending_sync', record);
211
- }
212
- catch (err) {
213
- console.error('[PersistentOfflineQueue] Failed to persist pending mutation:', err);
214
- }
215
- }
216
- async remove(entity, entityId, scopeId, op) {
217
- try {
218
- const filters = [
219
- { field: 'entity', op: 'eq', value: entity },
220
- { field: 'entityId', op: 'eq', value: entityId },
221
- { field: 'scopeId', op: 'eq', value: scopeId },
222
- { field: 'op', op: 'eq', value: op },
223
- ];
224
- if (this.authenticatedUser) {
225
- filters.push({ field: 'userId', op: 'eq', value: this.authenticatedUser });
226
- }
227
- const records = await this.persistence.list('pending_sync', { filters });
228
- for (const record of records) {
229
- await this.persistence.delete('pending_sync', record.id);
230
- }
231
- }
232
- catch (err) {
233
- console.error('[PersistentOfflineQueue] Failed to remove pending mutation:', err);
234
- }
235
- }
236
- async flush(sender) {
237
- if (this.flushing || !this.authenticatedUser)
238
- return;
239
- this.flushing = true;
240
- try {
241
- const pendingRecords = await this.persistence.list('pending_sync', {
242
- filters: [{ field: 'userId', op: 'eq', value: this.authenticatedUser }],
243
- });
244
- if (pendingRecords.length === 0)
245
- return;
246
- const consolidated = consolidateMutations(pendingRecords);
247
- const removeRecords = async (ids) => {
248
- for (const id of ids) {
249
- try {
250
- await this.persistence.delete('pending_sync', id);
251
- }
252
- catch { }
253
- }
254
- };
255
- await flushConsolidated(consolidated, sender, removeRecords, this.rootEntity);
256
- }
257
- finally {
258
- this.flushing = false;
259
- }
260
- }
261
- async clear() {
262
- if (!this.authenticatedUser)
263
- return;
264
- const records = await this.persistence.list('pending_sync', {
265
- filters: [{ field: 'userId', op: 'eq', value: this.authenticatedUser }],
266
- });
267
- for (const record of records) {
268
- try {
269
- await this.persistence.delete('pending_sync', record.id);
270
- }
271
- catch { }
272
- }
273
- }
274
- async getPendingForScope(scopeId) {
275
- const filters = [
276
- { field: 'scopeId', op: 'eq', value: scopeId },
277
- ];
278
- if (this.authenticatedUser) {
279
- filters.push({ field: 'userId', op: 'eq', value: this.authenticatedUser });
280
- }
281
- const records = await this.persistence.list('pending_sync', { filters });
282
- return records.map((r) => ({
283
- op: r.op,
284
- entity: r.entity,
285
- id: r.entityId,
286
- scopeId: r.scopeId,
287
- data: r.data || null,
288
- }));
289
- }
290
- async hasPendingInsert(entity, entityId) {
291
- const records = await this.persistence.list('pending_sync', {
292
- filters: [
293
- { field: 'entity', op: 'eq', value: entity },
294
- { field: 'entityId', op: 'eq', value: entityId },
295
- { field: 'op', op: 'eq', value: 'insert' },
296
- ],
297
- });
298
- return records.length > 0;
299
- }
300
- }
301
- class InMemoryOfflineQueue {
302
- pending = [];
303
- rootEntity;
304
- flushing = false;
305
- constructor(rootEntity) {
306
- this.rootEntity = rootEntity;
307
- }
308
- async queue(mutation) {
309
- this.pending.push({
310
- ...mutation,
311
- recordId: crypto.randomUUID(),
312
- createdAt: Date.now(),
313
- });
314
- }
315
- async remove(entity, entityId, scopeId, op) {
316
- this.pending = this.pending.filter((p) => !(p.entity === entity && p.id === entityId && p.scopeId === scopeId && p.op === op));
317
- }
318
- async flush(sender) {
319
- if (this.flushing || this.pending.length === 0)
320
- return;
321
- this.flushing = true;
322
- try {
323
- const records = this.pending.map((p) => ({
324
- id: p.recordId,
325
- op: p.op,
326
- entity: p.entity,
327
- entityId: p.id,
328
- scopeId: p.scopeId,
329
- data: p.data,
330
- createdAt: p.createdAt,
331
- }));
332
- const consolidated = consolidateMutations(records);
333
- const flushedIds = new Set();
334
- const removeRecords = async (ids) => {
335
- for (const id of ids)
336
- flushedIds.add(id);
337
- };
338
- await flushConsolidated(consolidated, sender, removeRecords, this.rootEntity);
339
- this.pending = this.pending.filter((p) => !flushedIds.has(p.recordId));
340
- }
341
- finally {
342
- this.flushing = false;
343
- }
344
- }
345
- async clear() {
346
- this.pending = [];
347
- }
348
- async getPendingForScope(scopeId) {
349
- return this.pending
350
- .filter((p) => p.scopeId === scopeId)
351
- .map((p) => ({ op: p.op, entity: p.entity, id: p.id, scopeId: p.scopeId, data: p.data }));
352
- }
353
- async hasPendingInsert(entity, entityId) {
354
- return this.pending.some((p) => p.entity === entity && p.id === entityId && p.op === 'insert');
355
- }
356
- }
357
- export function createPersistentOfflineQueue(persistence, rootEntity) {
358
- return new PersistentOfflineQueue(persistence, rootEntity);
359
- }
360
- export function createInMemoryOfflineQueue(rootEntity) {
361
- return new InMemoryOfflineQueue(rootEntity);
362
- }
363
- //# sourceMappingURL=offline-queue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"offline-queue.js","sourceRoot":"","sources":["../src/offline-queue.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n PendingMutation,\n ConsolidatedMutation,\n MutationSender,\n OfflineQueue,\n PersistenceLayer,\n} from './types.ts';\nimport { OwnershipError } from './types.ts';\nimport { isTransientSyncError, isPermanentMutationError } from './internal-utils.ts';\n\nfunction consolidateMutations(records: Array<Record<string, unknown>>): ConsolidatedMutation[] {\n const grouped = new Map<\n string,\n Array<{\n recordId: string;\n op: PendingMutation['op'];\n data: Record<string, unknown> | null;\n entity: string;\n entityId: string;\n scopeId: string;\n createdAt: number;\n }>\n >();\n\n for (const r of records) {\n const key = `${r.entity as string}:${r.entityId as string}`;\n const entry = {\n recordId: r.id as string,\n op: r.op as PendingMutation['op'],\n data: (r.data as Record<string, unknown>) || null,\n entity: r.entity as string,\n entityId: r.entityId as string,\n scopeId: r.scopeId as string,\n createdAt: (r.createdAt as number) || 0,\n };\n const arr = grouped.get(key);\n if (arr) {\n arr.push(entry);\n } else {\n grouped.set(key, [entry]);\n }\n }\n\n const result: Array<ConsolidatedMutation & { minCreatedAt: number }> = [];\n\n for (const [, entries] of grouped) {\n entries.sort((a, b) => a.createdAt - b.createdAt);\n\n const recordIds = entries.map((e) => e.recordId);\n const minCreatedAt = entries[0].createdAt;\n const hasInsert = entries.some((e) => e.op === 'insert');\n const hasDelete = entries.some((e) => e.op === 'delete');\n const { entity, entityId, scopeId } = entries[0];\n\n if (hasInsert && hasDelete) {\n result.push({\n op: 'delete',\n entity,\n id: entityId,\n scopeId,\n data: null,\n recordIds,\n minCreatedAt,\n });\n continue;\n }\n\n if (hasInsert) {\n const insertEntry = entries.find((e) => e.op === 'insert')!;\n const mergedData = insertEntry.data ? { ...insertEntry.data } : {};\n for (const e of entries) {\n if (e !== insertEntry && e.data) {\n Object.assign(mergedData, e.data);\n }\n }\n result.push({\n op: 'insert',\n entity,\n id: entityId,\n scopeId,\n data: mergedData,\n recordIds,\n minCreatedAt,\n });\n continue;\n }\n\n if (hasDelete) {\n result.push({\n op: 'delete',\n entity,\n id: entityId,\n scopeId,\n data: null,\n recordIds,\n minCreatedAt,\n });\n continue;\n }\n\n const mergedData: Record<string, unknown> = {};\n for (const e of entries) {\n if (e.data) Object.assign(mergedData, e.data);\n }\n result.push({\n op: 'update',\n entity,\n id: entityId,\n scopeId,\n data: Object.keys(mergedData).length > 0 ? mergedData : null,\n recordIds,\n minCreatedAt,\n });\n }\n\n const opPriority: Record<string, number> = { insert: 0, update: 1, delete: 2 };\n result.sort((a, b) => {\n if (a.minCreatedAt !== b.minCreatedAt) return a.minCreatedAt - b.minCreatedAt;\n return (opPriority[a.op] ?? 1) - (opPriority[b.op] ?? 1);\n });\n\n return result;\n}\n\nasync function flushConsolidated(\n consolidated: ConsolidatedMutation[],\n sender: MutationSender,\n removeRecords: (ids: string[]) => Promise<void>,\n rootEntity: string\n): Promise<void> {\n for (const mutation of consolidated) {\n const { op, entity, id, scopeId, data, recordIds } = mutation;\n\n try {\n switch (op) {\n case 'insert':\n if (data) {\n await sender.syncCreate(entity, scopeId, data);\n }\n break;\n case 'update':\n if (data) {\n await sender.syncUpdate(entity, scopeId, id, data);\n }\n break;\n case 'delete':\n await sender.syncDelete(entity, scopeId, id);\n break;\n }\n await removeRecords(recordIds);\n } catch (err) {\n if (isTransientSyncError(err)) continue;\n\n const isNotFound = err instanceof Error && /not found/i.test(err.message);\n const isConflict =\n err instanceof Error &&\n /already exists|conflict|duplicate|unique constraint violation/i.test(err.message);\n\n if (isNotFound && op === 'update' && entity === rootEntity) {\n try {\n await sender.deleteEntity(entity, id);\n } catch {}\n await removeRecords(recordIds);\n } else if (isNotFound && op === 'update') {\n try {\n const full = await sender.readEntity(entity, id);\n await sender.syncCreate(entity, scopeId, full);\n await removeRecords(recordIds);\n } catch (upsertErr) {\n if (!isTransientSyncError(upsertErr)) {\n console.error(`[OfflineQueue] Failed to upsert ${entity} during flush:`, upsertErr);\n await removeRecords(recordIds);\n }\n }\n } else if (isNotFound && op === 'delete') {\n await removeRecords(recordIds);\n } else if (isConflict && op === 'insert') {\n if (data) {\n try {\n await sender.syncUpdate(entity, scopeId, id, data);\n await removeRecords(recordIds);\n } catch (updateErr) {\n if (updateErr instanceof OwnershipError) {\n await removeRecords(recordIds);\n } else if (!isTransientSyncError(updateErr)) {\n console.error(\n `[OfflineQueue] Failed to update-on-conflict ${entity} during flush:`,\n updateErr\n );\n await removeRecords(recordIds);\n }\n }\n } else {\n await removeRecords(recordIds);\n }\n } else if (err instanceof OwnershipError) {\n await removeRecords(recordIds);\n } else if (isPermanentMutationError(err)) {\n console.error('[OfflineQueue] Dropping mutation after permanent error:', err);\n await removeRecords(recordIds);\n } else {\n console.error('[OfflineQueue] Dropping mutation after unknown error:', err);\n await removeRecords(recordIds);\n }\n }\n }\n}\n\nclass PersistentOfflineQueue implements OfflineQueue {\n private readonly persistence: PersistenceLayer;\n private readonly rootEntity: string;\n private authenticatedUser: string | null = null;\n private flushing = false;\n\n constructor(persistence: PersistenceLayer, rootEntity: string) {\n this.persistence = persistence;\n this.rootEntity = rootEntity;\n }\n\n setAuthenticatedUser(userId: string | null): void {\n this.authenticatedUser = userId;\n }\n\n async queue(mutation: PendingMutation): Promise<void> {\n if (!this.authenticatedUser) return;\n try {\n const record: Record<string, unknown> = {\n id: crypto.randomUUID(),\n op: mutation.op,\n entity: mutation.entity,\n entityId: mutation.id,\n scopeId: mutation.scopeId,\n userId: this.authenticatedUser,\n createdAt: Date.now(),\n };\n if (mutation.data !== null) {\n record.data = mutation.data;\n }\n await this.persistence.create('pending_sync', record);\n } catch (err) {\n console.error('[PersistentOfflineQueue] Failed to persist pending mutation:', err);\n }\n }\n\n async remove(entity: string, entityId: string, scopeId: string, op: string): Promise<void> {\n try {\n const filters: Array<Record<string, unknown>> = [\n { field: 'entity', op: 'eq', value: entity },\n { field: 'entityId', op: 'eq', value: entityId },\n { field: 'scopeId', op: 'eq', value: scopeId },\n { field: 'op', op: 'eq', value: op },\n ];\n if (this.authenticatedUser) {\n filters.push({ field: 'userId', op: 'eq', value: this.authenticatedUser });\n }\n const records = await this.persistence.list('pending_sync', { filters });\n for (const record of records) {\n await this.persistence.delete('pending_sync', record.id as string);\n }\n } catch (err) {\n console.error('[PersistentOfflineQueue] Failed to remove pending mutation:', err);\n }\n }\n\n async flush(sender: MutationSender): Promise<void> {\n if (this.flushing || !this.authenticatedUser) return;\n this.flushing = true;\n try {\n const pendingRecords = await this.persistence.list('pending_sync', {\n filters: [{ field: 'userId', op: 'eq', value: this.authenticatedUser }],\n });\n if (pendingRecords.length === 0) return;\n\n const consolidated = consolidateMutations(pendingRecords);\n const removeRecords = async (ids: string[]) => {\n for (const id of ids) {\n try {\n await this.persistence.delete('pending_sync', id);\n } catch {}\n }\n };\n\n await flushConsolidated(consolidated, sender, removeRecords, this.rootEntity);\n } finally {\n this.flushing = false;\n }\n }\n\n async clear(): Promise<void> {\n if (!this.authenticatedUser) return;\n const records = await this.persistence.list('pending_sync', {\n filters: [{ field: 'userId', op: 'eq', value: this.authenticatedUser }],\n });\n for (const record of records) {\n try {\n await this.persistence.delete('pending_sync', record.id as string);\n } catch {}\n }\n }\n\n async getPendingForScope(scopeId: string): Promise<PendingMutation[]> {\n const filters: Array<Record<string, unknown>> = [\n { field: 'scopeId', op: 'eq', value: scopeId },\n ];\n if (this.authenticatedUser) {\n filters.push({ field: 'userId', op: 'eq', value: this.authenticatedUser });\n }\n const records = await this.persistence.list('pending_sync', { filters });\n return records.map((r) => ({\n op: r.op as PendingMutation['op'],\n entity: r.entity as string,\n id: r.entityId as string,\n scopeId: r.scopeId as string,\n data: (r.data as Record<string, unknown>) || null,\n }));\n }\n\n async hasPendingInsert(entity: string, entityId: string): Promise<boolean> {\n const records = await this.persistence.list('pending_sync', {\n filters: [\n { field: 'entity', op: 'eq', value: entity },\n { field: 'entityId', op: 'eq', value: entityId },\n { field: 'op', op: 'eq', value: 'insert' },\n ],\n });\n return records.length > 0;\n }\n}\n\nclass InMemoryOfflineQueue implements OfflineQueue {\n private pending: Array<PendingMutation & { recordId: string; createdAt: number }> = [];\n private readonly rootEntity: string;\n private flushing = false;\n\n constructor(rootEntity: string) {\n this.rootEntity = rootEntity;\n }\n\n async queue(mutation: PendingMutation): Promise<void> {\n this.pending.push({\n ...mutation,\n recordId: crypto.randomUUID(),\n createdAt: Date.now(),\n });\n }\n\n async remove(entity: string, entityId: string, scopeId: string, op: string): Promise<void> {\n this.pending = this.pending.filter(\n (p) => !(p.entity === entity && p.id === entityId && p.scopeId === scopeId && p.op === op)\n );\n }\n\n async flush(sender: MutationSender): Promise<void> {\n if (this.flushing || this.pending.length === 0) return;\n this.flushing = true;\n try {\n const records = this.pending.map((p) => ({\n id: p.recordId,\n op: p.op,\n entity: p.entity,\n entityId: p.id,\n scopeId: p.scopeId,\n data: p.data,\n createdAt: p.createdAt,\n }));\n\n const consolidated = consolidateMutations(records as Array<Record<string, unknown>>);\n const flushedIds = new Set<string>();\n\n const removeRecords = async (ids: string[]) => {\n for (const id of ids) flushedIds.add(id);\n };\n\n await flushConsolidated(consolidated, sender, removeRecords, this.rootEntity);\n this.pending = this.pending.filter((p) => !flushedIds.has(p.recordId));\n } finally {\n this.flushing = false;\n }\n }\n\n async clear(): Promise<void> {\n this.pending = [];\n }\n\n async getPendingForScope(scopeId: string): Promise<PendingMutation[]> {\n return this.pending\n .filter((p) => p.scopeId === scopeId)\n .map((p) => ({ op: p.op, entity: p.entity, id: p.id, scopeId: p.scopeId, data: p.data }));\n }\n\n async hasPendingInsert(entity: string, entityId: string): Promise<boolean> {\n return this.pending.some((p) => p.entity === entity && p.id === entityId && p.op === 'insert');\n }\n}\n\nexport function createPersistentOfflineQueue(\n persistence: PersistenceLayer,\n rootEntity: string\n): OfflineQueue & { setAuthenticatedUser(userId: string | null): void } {\n return new PersistentOfflineQueue(persistence, rootEntity);\n}\n\nexport function createInMemoryOfflineQueue(rootEntity: string): OfflineQueue {\n return new InMemoryOfflineQueue(rootEntity);\n}\n"]}
@@ -1,7 +0,0 @@
1
- import type { StoreConfig, PersistenceLayer } from './types.ts';
2
- export declare function createPersistenceLayer(config: StoreConfig): PersistenceLayer & {
3
- notifyCorruption(): void;
4
- setSuppressNotifications(suppress: boolean): void;
5
- notifyAllEntitySubscribers(): void;
6
- };
7
- //# sourceMappingURL=persistence-layer.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"persistence-layer.d.ts","sourceRoot":"","sources":["../src/persistence-layer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAoB,MAAM,YAAY,CAAC;AAoalF,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,WAAW,GAAG,gBAAgB,GAAG;IAC9E,gBAAgB,IAAI,IAAI,CAAC;IACzB,wBAAwB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAClD,0BAA0B,IAAI,IAAI,CAAC;CACpC,CAEA"}