@signalium/query 1.0.13 → 1.0.14

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 (151) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/development/index.js +2985 -0
  3. package/dist/cjs/development/index.js.map +1 -0
  4. package/dist/cjs/development/react/index.js +52 -0
  5. package/dist/cjs/development/react/index.js.map +1 -0
  6. package/dist/cjs/{stores/shared.js → development/shared-5acOO-tS.js} +11 -14
  7. package/dist/cjs/development/shared-5acOO-tS.js.map +1 -0
  8. package/dist/cjs/development/stores/async.js +304 -0
  9. package/dist/cjs/development/stores/async.js.map +1 -0
  10. package/dist/cjs/development/stores/sync.js +214 -0
  11. package/dist/cjs/development/stores/sync.js.map +1 -0
  12. package/dist/cjs/production/index.js +2985 -0
  13. package/dist/cjs/production/index.js.map +1 -0
  14. package/dist/cjs/production/package.json +3 -0
  15. package/dist/cjs/production/react/index.js +52 -0
  16. package/dist/cjs/production/react/index.js.map +1 -0
  17. package/dist/cjs/production/shared-5acOO-tS.js +20 -0
  18. package/dist/cjs/production/shared-5acOO-tS.js.map +1 -0
  19. package/dist/cjs/production/stores/async.js +304 -0
  20. package/dist/cjs/production/stores/async.js.map +1 -0
  21. package/dist/cjs/production/stores/sync.js +214 -0
  22. package/dist/cjs/production/stores/sync.js.map +1 -0
  23. package/dist/esm/EntityMap.d.ts +22 -0
  24. package/dist/esm/EntityMap.d.ts.map +1 -1
  25. package/dist/esm/MutationResult.d.ts +43 -0
  26. package/dist/esm/MutationResult.d.ts.map +1 -0
  27. package/dist/esm/QueryClient.d.ts +31 -2
  28. package/dist/esm/QueryClient.d.ts.map +1 -1
  29. package/dist/esm/development/index.js +2985 -0
  30. package/dist/esm/development/index.js.map +1 -0
  31. package/dist/esm/development/react/index.js +52 -0
  32. package/dist/esm/development/react/index.js.map +1 -0
  33. package/dist/esm/development/shared-Br5plsKm.js +21 -0
  34. package/dist/esm/development/shared-Br5plsKm.js.map +1 -0
  35. package/dist/esm/development/stores/async.js +304 -0
  36. package/dist/esm/development/stores/async.js.map +1 -0
  37. package/dist/esm/development/stores/sync.js +214 -0
  38. package/dist/esm/development/stores/sync.js.map +1 -0
  39. package/dist/esm/index.d.ts +4 -0
  40. package/dist/esm/index.d.ts.map +1 -1
  41. package/dist/esm/mutation.d.ts +82 -0
  42. package/dist/esm/mutation.d.ts.map +1 -0
  43. package/dist/esm/parseEntities.d.ts.map +1 -1
  44. package/dist/esm/production/index.js +2985 -0
  45. package/dist/esm/production/index.js.map +1 -0
  46. package/dist/esm/production/react/index.js +52 -0
  47. package/dist/esm/production/react/index.js.map +1 -0
  48. package/dist/esm/production/shared-Br5plsKm.js +21 -0
  49. package/dist/esm/production/shared-Br5plsKm.js.map +1 -0
  50. package/dist/esm/production/stores/async.js +304 -0
  51. package/dist/esm/production/stores/async.js.map +1 -0
  52. package/dist/esm/production/stores/sync.js +214 -0
  53. package/dist/esm/production/stores/sync.js.map +1 -0
  54. package/dist/esm/proxy.d.ts +6 -5
  55. package/dist/esm/proxy.d.ts.map +1 -1
  56. package/dist/esm/query.d.ts +3 -1
  57. package/dist/esm/query.d.ts.map +1 -1
  58. package/dist/esm/typeDefs.d.ts +4 -2
  59. package/dist/esm/typeDefs.d.ts.map +1 -1
  60. package/dist/esm/types.d.ts +71 -4
  61. package/dist/esm/types.d.ts.map +1 -1
  62. package/dist/esm/utils.d.ts +35 -0
  63. package/dist/esm/utils.d.ts.map +1 -1
  64. package/package.json +55 -21
  65. package/stores/async.js +1 -1
  66. package/stores/sync.js +1 -1
  67. package/dist/cjs/EntityMap.js +0 -103
  68. package/dist/cjs/EntityMap.js.map +0 -1
  69. package/dist/cjs/MemoryEvictionManager.js +0 -56
  70. package/dist/cjs/MemoryEvictionManager.js.map +0 -1
  71. package/dist/cjs/NetworkManager.js +0 -125
  72. package/dist/cjs/NetworkManager.js.map +0 -1
  73. package/dist/cjs/QueryClient.js +0 -162
  74. package/dist/cjs/QueryClient.js.map +0 -1
  75. package/dist/cjs/QueryResult.js +0 -920
  76. package/dist/cjs/QueryResult.js.map +0 -1
  77. package/dist/cjs/RefetchManager.js +0 -88
  78. package/dist/cjs/RefetchManager.js.map +0 -1
  79. package/dist/cjs/errors.js +0 -129
  80. package/dist/cjs/errors.js.map +0 -1
  81. package/dist/cjs/index.js +0 -43
  82. package/dist/cjs/index.js.map +0 -1
  83. package/dist/cjs/parseEntities.js +0 -142
  84. package/dist/cjs/parseEntities.js.map +0 -1
  85. package/dist/cjs/pathInterpolator.js +0 -69
  86. package/dist/cjs/pathInterpolator.js.map +0 -1
  87. package/dist/cjs/proxy.js +0 -263
  88. package/dist/cjs/proxy.js.map +0 -1
  89. package/dist/cjs/query.js +0 -184
  90. package/dist/cjs/query.js.map +0 -1
  91. package/dist/cjs/react/index.js +0 -6
  92. package/dist/cjs/react/index.js.map +0 -1
  93. package/dist/cjs/react/use-query.js +0 -56
  94. package/dist/cjs/react/use-query.js.map +0 -1
  95. package/dist/cjs/stores/async.js +0 -344
  96. package/dist/cjs/stores/async.js.map +0 -1
  97. package/dist/cjs/stores/shared.js.map +0 -1
  98. package/dist/cjs/stores/sync.js +0 -240
  99. package/dist/cjs/stores/sync.js.map +0 -1
  100. package/dist/cjs/tsconfig.cjs.tsbuildinfo +0 -1
  101. package/dist/cjs/type-utils.js +0 -3
  102. package/dist/cjs/type-utils.js.map +0 -1
  103. package/dist/cjs/typeDefs.js +0 -620
  104. package/dist/cjs/typeDefs.js.map +0 -1
  105. package/dist/cjs/types.js +0 -33
  106. package/dist/cjs/types.js.map +0 -1
  107. package/dist/cjs/utils.js +0 -23
  108. package/dist/cjs/utils.js.map +0 -1
  109. package/dist/esm/EntityMap.js +0 -99
  110. package/dist/esm/EntityMap.js.map +0 -1
  111. package/dist/esm/MemoryEvictionManager.js +0 -51
  112. package/dist/esm/MemoryEvictionManager.js.map +0 -1
  113. package/dist/esm/NetworkManager.js +0 -120
  114. package/dist/esm/NetworkManager.js.map +0 -1
  115. package/dist/esm/QueryClient.js +0 -154
  116. package/dist/esm/QueryClient.js.map +0 -1
  117. package/dist/esm/QueryResult.js +0 -916
  118. package/dist/esm/QueryResult.js.map +0 -1
  119. package/dist/esm/RefetchManager.js +0 -83
  120. package/dist/esm/RefetchManager.js.map +0 -1
  121. package/dist/esm/errors.js +0 -125
  122. package/dist/esm/errors.js.map +0 -1
  123. package/dist/esm/index.js +0 -8
  124. package/dist/esm/index.js.map +0 -1
  125. package/dist/esm/parseEntities.js +0 -135
  126. package/dist/esm/parseEntities.js.map +0 -1
  127. package/dist/esm/pathInterpolator.js +0 -66
  128. package/dist/esm/pathInterpolator.js.map +0 -1
  129. package/dist/esm/proxy.js +0 -254
  130. package/dist/esm/proxy.js.map +0 -1
  131. package/dist/esm/query.js +0 -177
  132. package/dist/esm/query.js.map +0 -1
  133. package/dist/esm/react/index.js +0 -2
  134. package/dist/esm/react/index.js.map +0 -1
  135. package/dist/esm/react/use-query.js +0 -53
  136. package/dist/esm/react/use-query.js.map +0 -1
  137. package/dist/esm/stores/async.js +0 -340
  138. package/dist/esm/stores/async.js.map +0 -1
  139. package/dist/esm/stores/shared.js +0 -13
  140. package/dist/esm/stores/shared.js.map +0 -1
  141. package/dist/esm/stores/sync.js +0 -234
  142. package/dist/esm/stores/sync.js.map +0 -1
  143. package/dist/esm/type-utils.js +0 -2
  144. package/dist/esm/type-utils.js.map +0 -1
  145. package/dist/esm/typeDefs.js +0 -606
  146. package/dist/esm/typeDefs.js.map +0 -1
  147. package/dist/esm/types.js +0 -30
  148. package/dist/esm/types.js.map +0 -1
  149. package/dist/esm/utils.js +0 -20
  150. package/dist/esm/utils.js.map +0 -1
  151. /package/dist/cjs/{package.json → development/package.json} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sources":["../../../../src/stores/sync.ts"],"sourcesContent":["import { EntityStore } from '../EntityMap.js';\nimport { CachedQuery, CachedQueryExtra, QueryDefinition, QueryStore } from '../QueryClient.js';\nimport {\n optimisticInsertRefsKeyFor,\n refCountKeyFor,\n refIdsKeyFor,\n streamOrphanRefsKeyFor,\n updatedAtKeyFor,\n valueKeyFor,\n} from './shared.js';\n\nexport interface SyncPersistentStore {\n has(key: string): boolean;\n\n getString(key: string): string | undefined;\n setString(key: string, value: string): void;\n\n getNumber(key: string): number | undefined;\n setNumber(key: string, value: number): void;\n\n getBuffer(key: string): Uint32Array | undefined;\n setBuffer(key: string, value: Uint32Array): void;\n\n delete(key: string): void;\n}\n\nconst DEFAULT_MAX_COUNT = 50;\nconst DEFAULT_GC_TIME = 1000 * 60 * 60 * 24; // 24 hours\n\nexport class MemoryPersistentStore implements SyncPersistentStore {\n private readonly kv: Record<string, unknown> = Object.create(null);\n\n has(key: string): boolean {\n return key in this.kv;\n }\n\n getString(key: string): string | undefined {\n return this.kv[key] as string | undefined;\n }\n\n setString(key: string, value: string): void {\n this.kv[key] = value;\n }\n\n getNumber(key: string): number | undefined {\n return this.kv[key] as number | undefined;\n }\n\n setNumber(key: string, value: number): void {\n this.kv[key] = value;\n }\n\n getBuffer(key: string): Uint32Array | undefined {\n return this.kv[key] as Uint32Array | undefined;\n }\n\n setBuffer(key: string, value: Uint32Array): void {\n this.kv[key] = value;\n }\n\n delete(key: string): void {\n delete this.kv[key];\n }\n}\n\n// Query Type keys\nexport const queueKeyFor = (queryDefId: string) => `sq:doc:queue:${queryDefId}`;\n\nexport class SyncQueryStore implements QueryStore {\n queues: Map<string, Uint32Array> = new Map();\n\n constructor(private readonly kv: SyncPersistentStore) {}\n\n loadQuery(\n queryDef: QueryDefinition<any, any, any>,\n queryKey: number,\n entityMap: EntityStore,\n ): CachedQuery | undefined {\n const updatedAt = this.kv.getNumber(updatedAtKeyFor(queryKey));\n\n if (updatedAt === undefined || updatedAt < Date.now() - (queryDef.cache?.gcTime ?? DEFAULT_GC_TIME)) {\n return;\n }\n\n const valueStr = this.kv.getString(valueKeyFor(queryKey));\n\n if (valueStr === undefined) {\n return;\n }\n\n const entityIds = this.kv.getBuffer(refIdsKeyFor(queryKey));\n\n if (entityIds !== undefined) {\n this.preloadEntities(entityIds, entityMap);\n }\n\n // Load extra data (stream orphans and optimistic inserts)\n const streamOrphanRefs = this.kv.getBuffer(streamOrphanRefsKeyFor(queryKey));\n const optimisticInsertRefs = this.kv.getBuffer(optimisticInsertRefsKeyFor(queryKey));\n\n // Preload entities for extra data\n if (streamOrphanRefs !== undefined) {\n this.preloadEntities(streamOrphanRefs, entityMap);\n }\n if (optimisticInsertRefs !== undefined) {\n this.preloadEntities(optimisticInsertRefs, entityMap);\n }\n\n let extra: CachedQueryExtra | undefined;\n if (streamOrphanRefs !== undefined || optimisticInsertRefs !== undefined) {\n extra = {};\n if (streamOrphanRefs !== undefined) {\n extra.streamOrphanRefs = Array.from(streamOrphanRefs);\n }\n if (optimisticInsertRefs !== undefined) {\n extra.optimisticInsertRefs = Array.from(optimisticInsertRefs);\n }\n }\n\n this.activateQuery(queryDef, queryKey);\n\n return {\n value: JSON.parse(valueStr) as Record<string, unknown>,\n refIds: entityIds === undefined ? undefined : new Set(entityIds ?? []),\n updatedAt,\n extra,\n };\n }\n\n private preloadEntities(entityIds: Uint32Array, entityMap: EntityStore): void {\n for (const entityId of entityIds) {\n const entityValue = this.kv.getString(valueKeyFor(entityId));\n\n if (entityValue === undefined) {\n continue;\n }\n\n const entity = JSON.parse(entityValue) as Record<string, unknown>;\n entityMap.setPreloadedEntity(entityId, entity);\n\n const childIds = this.kv.getBuffer(refIdsKeyFor(entityId));\n\n if (childIds === undefined) {\n continue;\n }\n\n this.preloadEntities(childIds, entityMap);\n }\n }\n\n saveQuery(\n queryDef: QueryDefinition<any, any, any>,\n queryKey: number,\n value: unknown,\n updatedAt: number,\n refIds?: Set<number>,\n extra?: CachedQueryExtra,\n ): void {\n this.setValue(queryKey, value, refIds);\n this.kv.setNumber(updatedAtKeyFor(queryKey), updatedAt);\n\n // Save extra data\n if (extra?.streamOrphanRefs !== undefined && extra.streamOrphanRefs.length > 0) {\n this.kv.setBuffer(streamOrphanRefsKeyFor(queryKey), new Uint32Array(extra.streamOrphanRefs));\n } else {\n this.kv.delete(streamOrphanRefsKeyFor(queryKey));\n }\n\n if (extra?.optimisticInsertRefs !== undefined && extra.optimisticInsertRefs.length > 0) {\n this.kv.setBuffer(optimisticInsertRefsKeyFor(queryKey), new Uint32Array(extra.optimisticInsertRefs));\n } else {\n this.kv.delete(optimisticInsertRefsKeyFor(queryKey));\n }\n\n this.activateQuery(queryDef, queryKey);\n }\n\n saveEntity(entityKey: number, value: unknown, refIds?: Set<number>): void {\n this.setValue(entityKey, value, refIds);\n }\n\n activateQuery(queryDef: QueryDefinition<any, any, any>, queryKey: number): void {\n if (!this.kv.has(valueKeyFor(queryKey))) {\n // Query not in store, nothing to do. This can happen if the query has\n // been evicted from the cache, but is still active in memory.\n return;\n }\n\n let queue = this.queues.get(queryDef.id);\n\n if (queue === undefined) {\n const maxCount = queryDef.cache?.maxCount ?? DEFAULT_MAX_COUNT;\n queue = this.kv.getBuffer(queueKeyFor(queryDef.id));\n\n if (queue === undefined) {\n queue = new Uint32Array(maxCount);\n this.kv.setBuffer(queueKeyFor(queryDef.id), queue);\n } else if (queue.length !== maxCount) {\n queue = new Uint32Array(queue.buffer, 0, maxCount);\n this.kv.setBuffer(queueKeyFor(queryDef.id), queue);\n }\n\n this.queues.set(queryDef.id, queue);\n }\n\n const indexOfKey = queue.indexOf(queryKey);\n\n // Item already in queue, move to front\n if (indexOfKey >= 0) {\n if (indexOfKey === 0) {\n // Already at front, nothing to do\n return;\n }\n // Shift items right to make space at front\n queue.copyWithin(1, 0, indexOfKey);\n queue[0] = queryKey;\n return;\n }\n\n // Item not in queue, add to front and evict tail\n const evicted = queue[queue.length - 1];\n queue.copyWithin(1, 0, queue.length - 1);\n queue[0] = queryKey;\n\n if (evicted !== 0) {\n this.deleteQuery(evicted);\n this.kv.delete(updatedAtKeyFor(evicted));\n }\n }\n\n private setValue(id: number, value: unknown, refIds?: Set<number>): void {\n const kv = this.kv;\n\n kv.setString(valueKeyFor(id), JSON.stringify(value));\n\n const refIdsKey = refIdsKeyFor(id);\n\n const prevRefIds = kv.getBuffer(refIdsKey);\n\n if (refIds === undefined || refIds.size === 0) {\n kv.delete(refIdsKey);\n\n // Decrement all previous refs\n if (prevRefIds !== undefined) {\n for (let i = 0; i < prevRefIds.length; i++) {\n const refId = prevRefIds[i];\n this.decrementRefCount(refId);\n }\n }\n } else {\n // Convert the set to a Uint32Array and capture all the refIds before we\n // delete previous ones from the set\n const newRefIds = new Uint32Array(refIds);\n\n if (prevRefIds !== undefined) {\n // Process new refs: increment if not in old\n for (let i = 0; i < prevRefIds.length; i++) {\n const refId = prevRefIds[i];\n\n if (refIds.has(refId)) {\n refIds.delete(refId);\n } else {\n this.decrementRefCount(refId);\n }\n }\n }\n\n // No previous refs, increment all unique new refs\n for (const refId of refIds) {\n this.incrementRefCount(refId);\n }\n\n kv.setBuffer(refIdsKey, newRefIds);\n }\n }\n\n deleteQuery(id: number): void {\n const kv = this.kv;\n\n kv.delete(valueKeyFor(id));\n kv.delete(refCountKeyFor(id));\n\n const refIds = kv.getBuffer(refIdsKeyFor(id));\n kv.delete(refIdsKeyFor(id)); // Clean up the refIds key\n\n if (refIds === undefined) {\n return;\n }\n\n // Decrement ref counts for all referenced entities\n for (const refId of refIds) {\n if (refId !== 0) {\n this.decrementRefCount(refId);\n }\n }\n }\n\n private incrementRefCount(refId: number): void {\n const refCountKey = refCountKeyFor(refId);\n const currentCount = this.kv.getNumber(refCountKey) ?? 0;\n const newCount = currentCount + 1;\n this.kv.setNumber(refCountKey, newCount);\n }\n\n private decrementRefCount(refId: number): void {\n const refCountKey = refCountKeyFor(refId);\n const currentCount = this.kv.getNumber(refCountKey);\n\n if (currentCount === undefined) {\n // Already deleted or never existed\n return;\n }\n\n const newCount = currentCount - 1;\n\n if (newCount === 0) {\n // Entity exists, cascade delete it\n this.deleteQuery(refId);\n } else {\n this.kv.setNumber(refCountKey, newCount);\n }\n }\n}\n"],"names":["updatedAtKeyFor","valueKeyFor","refIdsKeyFor","streamOrphanRefsKeyFor","optimisticInsertRefsKeyFor","refCountKeyFor"],"mappings":"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"}