@signalium/query 1.0.3 → 1.0.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.
Files changed (89) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/cjs/MemoryEvictionManager.js +43 -0
  3. package/dist/cjs/MemoryEvictionManager.js.map +1 -0
  4. package/dist/cjs/QueryClient.js +10 -599
  5. package/dist/cjs/QueryClient.js.map +1 -1
  6. package/dist/cjs/QueryResult.js +491 -0
  7. package/dist/cjs/QueryResult.js.map +1 -0
  8. package/dist/cjs/QueryStore.js +2 -6
  9. package/dist/cjs/QueryStore.js.map +1 -1
  10. package/dist/cjs/RefetchManager.js +75 -0
  11. package/dist/cjs/RefetchManager.js.map +1 -0
  12. package/dist/cjs/errors.js +13 -12
  13. package/dist/cjs/errors.js.map +1 -1
  14. package/dist/cjs/index.js +1 -11
  15. package/dist/cjs/index.js.map +1 -1
  16. package/dist/cjs/parseEntities.js +1 -1
  17. package/dist/cjs/parseEntities.js.map +1 -1
  18. package/dist/cjs/proxy.js +2 -2
  19. package/dist/cjs/proxy.js.map +1 -1
  20. package/dist/cjs/query.js +60 -19
  21. package/dist/cjs/query.js.map +1 -1
  22. package/dist/cjs/stores/async.js +290 -2
  23. package/dist/cjs/stores/async.js.map +1 -1
  24. package/dist/cjs/stores/shared.js +19 -0
  25. package/dist/cjs/stores/shared.js.map +1 -0
  26. package/dist/cjs/stores/sync.js +201 -4
  27. package/dist/cjs/stores/sync.js.map +1 -1
  28. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -1
  29. package/dist/cjs/typeDefs.js +221 -116
  30. package/dist/cjs/typeDefs.js.map +1 -1
  31. package/dist/cjs/utils.js +0 -42
  32. package/dist/cjs/utils.js.map +1 -1
  33. package/dist/esm/MemoryEvictionManager.d.ts +14 -0
  34. package/dist/esm/MemoryEvictionManager.d.ts.map +1 -0
  35. package/dist/esm/MemoryEvictionManager.js +39 -0
  36. package/dist/esm/MemoryEvictionManager.js.map +1 -0
  37. package/dist/esm/QueryClient.d.ts +32 -85
  38. package/dist/esm/QueryClient.d.ts.map +1 -1
  39. package/dist/esm/QueryClient.js +7 -596
  40. package/dist/esm/QueryClient.js.map +1 -1
  41. package/dist/esm/QueryResult.d.ts +66 -0
  42. package/dist/esm/QueryResult.d.ts.map +1 -0
  43. package/dist/esm/QueryResult.js +487 -0
  44. package/dist/esm/QueryResult.js.map +1 -0
  45. package/dist/esm/QueryStore.d.ts.map +1 -1
  46. package/dist/esm/QueryStore.js +2 -6
  47. package/dist/esm/QueryStore.js.map +1 -1
  48. package/dist/esm/RefetchManager.d.ts +13 -0
  49. package/dist/esm/RefetchManager.d.ts.map +1 -0
  50. package/dist/esm/RefetchManager.js +71 -0
  51. package/dist/esm/RefetchManager.js.map +1 -0
  52. package/dist/esm/errors.d.ts.map +1 -1
  53. package/dist/esm/errors.js +13 -12
  54. package/dist/esm/errors.js.map +1 -1
  55. package/dist/esm/index.d.ts +1 -4
  56. package/dist/esm/index.d.ts.map +1 -1
  57. package/dist/esm/index.js +1 -2
  58. package/dist/esm/index.js.map +1 -1
  59. package/dist/esm/parseEntities.js +2 -2
  60. package/dist/esm/parseEntities.js.map +1 -1
  61. package/dist/esm/proxy.js +3 -3
  62. package/dist/esm/proxy.js.map +1 -1
  63. package/dist/esm/query.d.ts +2 -0
  64. package/dist/esm/query.d.ts.map +1 -1
  65. package/dist/esm/query.js +59 -20
  66. package/dist/esm/query.js.map +1 -1
  67. package/dist/esm/stores/async.d.ts +63 -1
  68. package/dist/esm/stores/async.d.ts.map +1 -1
  69. package/dist/esm/stores/async.js +289 -1
  70. package/dist/esm/stores/async.js.map +1 -1
  71. package/dist/esm/stores/shared.d.ts +8 -0
  72. package/dist/esm/stores/shared.d.ts.map +1 -0
  73. package/dist/esm/stores/shared.js +11 -0
  74. package/dist/esm/stores/shared.js.map +1 -0
  75. package/dist/esm/stores/sync.d.ts +37 -1
  76. package/dist/esm/stores/sync.d.ts.map +1 -1
  77. package/dist/esm/stores/sync.js +198 -1
  78. package/dist/esm/stores/sync.js.map +1 -1
  79. package/dist/esm/typeDefs.d.ts +25 -8
  80. package/dist/esm/typeDefs.d.ts.map +1 -1
  81. package/dist/esm/typeDefs.js +220 -116
  82. package/dist/esm/typeDefs.js.map +1 -1
  83. package/dist/esm/types.d.ts +2 -1
  84. package/dist/esm/types.d.ts.map +1 -1
  85. package/dist/esm/utils.d.ts +1 -4
  86. package/dist/esm/utils.d.ts.map +1 -1
  87. package/dist/esm/utils.js +0 -40
  88. package/dist/esm/utils.js.map +1 -1
  89. package/package.json +7 -11
@@ -1,2 +1,64 @@
1
- export { AsyncQueryStore, type AsyncPersistentStore, type StoreMessage } from '../QueryStore.js';
1
+ import { EntityStore } from '../EntityMap.js';
2
+ import { CachedQuery, QueryDefinition, QueryStore } from '../QueryClient.js';
3
+ export interface AsyncPersistentStore {
4
+ has(key: string): Promise<boolean>;
5
+ getString(key: string): Promise<string | undefined>;
6
+ setString(key: string, value: string): Promise<void>;
7
+ getNumber(key: string): Promise<number | undefined>;
8
+ setNumber(key: string, value: number): Promise<void>;
9
+ getBuffer(key: string): Promise<Uint32Array | undefined>;
10
+ setBuffer(key: string, value: Uint32Array): Promise<void>;
11
+ delete(key: string): Promise<void>;
12
+ }
13
+ export type StoreMessage = {
14
+ type: 'saveQuery';
15
+ queryDefId: string;
16
+ queryKey: number;
17
+ value: unknown;
18
+ updatedAt: number;
19
+ refIds?: number[];
20
+ } | {
21
+ type: 'saveEntity';
22
+ entityKey: number;
23
+ value: unknown;
24
+ refIds?: number[];
25
+ } | {
26
+ type: 'activateQuery';
27
+ queryDefId: string;
28
+ queryKey: number;
29
+ };
30
+ export interface AsyncQueryStoreConfig {
31
+ isWriter: boolean;
32
+ connect: (handleMessage: (msg: StoreMessage) => void) => {
33
+ sendMessage: (msg: StoreMessage) => void;
34
+ };
35
+ delegate?: AsyncPersistentStore;
36
+ }
37
+ export declare class AsyncQueryStore implements QueryStore {
38
+ private readonly isWriter;
39
+ private readonly delegate?;
40
+ private readonly sendMessage;
41
+ private readonly messageQueue;
42
+ private readonly queues;
43
+ private queueProcessorPromise?;
44
+ private resolveQueueWait?;
45
+ constructor(config: AsyncQueryStoreConfig);
46
+ private handleMessage;
47
+ private enqueueMessage;
48
+ private startQueueProcessor;
49
+ private processQueue;
50
+ private processMessage;
51
+ loadQuery(queryDef: QueryDefinition<any, any>, queryKey: number, entityMap: EntityStore): Promise<CachedQuery | undefined>;
52
+ private preloadEntities;
53
+ saveQuery(queryDef: QueryDefinition<any, any>, queryKey: number, value: unknown, updatedAt: number, refIds?: Set<number>): void;
54
+ saveEntity(entityKey: number, value: unknown, refIds?: Set<number>): void;
55
+ activateQuery(queryDef: QueryDefinition<any, any>, queryKey: number): void;
56
+ private writerSaveQuery;
57
+ private writerSaveEntity;
58
+ private writerActivateQuery;
59
+ private setValue;
60
+ private deleteValue;
61
+ private incrementRefCount;
62
+ private decrementRefCount;
63
+ }
2
64
  //# sourceMappingURL=async.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../../src/stores/async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,KAAK,oBAAoB,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../../src/stores/async.ts"],"names":[],"mappings":"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"}
@@ -1,2 +1,290 @@
1
- export { AsyncQueryStore } from '../QueryStore.js';
1
+ import { DEFAULT_GC_TIME, DEFAULT_MAX_COUNT, queueKeyFor, refCountKeyFor, refIdsKeyFor, updatedAtKeyFor, valueKeyFor, } from './shared.js';
2
+ // -----------------------------------------------------------------------------
3
+ // Async QueryStore Implementation
4
+ // -----------------------------------------------------------------------------
5
+ export class AsyncQueryStore {
6
+ isWriter;
7
+ delegate;
8
+ sendMessage;
9
+ messageQueue = [];
10
+ queues = new Map();
11
+ queueProcessorPromise;
12
+ resolveQueueWait;
13
+ constructor(config) {
14
+ this.isWriter = config.isWriter;
15
+ this.delegate = config.delegate;
16
+ // Connect and get sendMessage function
17
+ const { sendMessage } = config.connect(this.handleMessage.bind(this));
18
+ this.sendMessage = sendMessage;
19
+ // Start queue processor if this is a writer
20
+ if (this.isWriter) {
21
+ if (!this.delegate) {
22
+ throw new Error('Writer must have a delegate');
23
+ }
24
+ this.startQueueProcessor();
25
+ }
26
+ }
27
+ handleMessage(msg) {
28
+ if (this.isWriter) {
29
+ // Enqueue the message for serial processing
30
+ this.enqueueMessage(msg);
31
+ }
32
+ // Readers don't handle incoming messages
33
+ }
34
+ enqueueMessage(msg) {
35
+ this.messageQueue.push(msg);
36
+ // Wake up the queue processor if it's waiting
37
+ if (this.resolveQueueWait) {
38
+ this.resolveQueueWait();
39
+ this.resolveQueueWait = undefined;
40
+ }
41
+ }
42
+ startQueueProcessor() {
43
+ this.queueProcessorPromise = this.processQueue();
44
+ }
45
+ async processQueue() {
46
+ while (true) {
47
+ // Wait for messages if queue is empty
48
+ while (this.messageQueue.length === 0) {
49
+ await new Promise(resolve => {
50
+ this.resolveQueueWait = resolve;
51
+ });
52
+ }
53
+ // Process one message at a time
54
+ const msg = this.messageQueue.shift();
55
+ try {
56
+ await this.processMessage(msg);
57
+ }
58
+ catch (error) {
59
+ console.error('Error processing message:', error);
60
+ }
61
+ }
62
+ }
63
+ async processMessage(msg) {
64
+ switch (msg.type) {
65
+ case 'saveQuery':
66
+ await this.writerSaveQuery(msg.queryDefId, msg.queryKey, msg.value, msg.updatedAt, msg.refIds);
67
+ break;
68
+ case 'saveEntity':
69
+ await this.writerSaveEntity(msg.entityKey, msg.value, msg.refIds);
70
+ break;
71
+ case 'activateQuery':
72
+ await this.writerActivateQuery(msg.queryDefId, msg.queryKey);
73
+ break;
74
+ }
75
+ }
76
+ async loadQuery(queryDef, queryKey, entityMap) {
77
+ if (!this.delegate) {
78
+ return undefined;
79
+ }
80
+ const updatedAt = await this.delegate.getNumber(updatedAtKeyFor(queryKey));
81
+ if (updatedAt === undefined || updatedAt < Date.now() - (queryDef.cache?.gcTime ?? DEFAULT_GC_TIME)) {
82
+ return undefined;
83
+ }
84
+ const valueStr = await this.delegate.getString(valueKeyFor(queryKey));
85
+ if (valueStr === undefined) {
86
+ return undefined;
87
+ }
88
+ const entityIds = await this.delegate.getBuffer(refIdsKeyFor(queryKey));
89
+ if (entityIds !== undefined) {
90
+ await this.preloadEntities(entityIds, entityMap);
91
+ }
92
+ this.activateQuery(queryDef, queryKey);
93
+ return {
94
+ value: JSON.parse(valueStr),
95
+ refIds: entityIds === undefined ? undefined : new Set(entityIds ?? []),
96
+ updatedAt,
97
+ };
98
+ }
99
+ async preloadEntities(entityIds, entityMap) {
100
+ if (!this.delegate) {
101
+ return;
102
+ }
103
+ for (const entityId of entityIds) {
104
+ const entityValue = await this.delegate.getString(valueKeyFor(entityId));
105
+ if (entityValue === undefined) {
106
+ continue;
107
+ }
108
+ const entity = JSON.parse(entityValue);
109
+ entityMap.setPreloadedEntity(entityId, entity);
110
+ const childIds = await this.delegate.getBuffer(refIdsKeyFor(entityId));
111
+ if (childIds === undefined) {
112
+ continue;
113
+ }
114
+ await this.preloadEntities(childIds, entityMap);
115
+ }
116
+ }
117
+ saveQuery(queryDef, queryKey, value, updatedAt, refIds) {
118
+ const message = {
119
+ type: 'saveQuery',
120
+ queryDefId: queryDef.id,
121
+ queryKey,
122
+ value,
123
+ updatedAt,
124
+ refIds: refIds ? Array.from(refIds) : undefined,
125
+ };
126
+ if (this.isWriter) {
127
+ this.enqueueMessage(message);
128
+ }
129
+ else {
130
+ this.sendMessage(message);
131
+ }
132
+ }
133
+ saveEntity(entityKey, value, refIds) {
134
+ const message = {
135
+ type: 'saveEntity',
136
+ entityKey,
137
+ value,
138
+ refIds: refIds ? Array.from(refIds) : undefined,
139
+ };
140
+ if (this.isWriter) {
141
+ this.enqueueMessage(message);
142
+ }
143
+ else {
144
+ this.sendMessage(message);
145
+ }
146
+ }
147
+ activateQuery(queryDef, queryKey) {
148
+ const message = {
149
+ type: 'activateQuery',
150
+ queryDefId: queryDef.id,
151
+ queryKey,
152
+ };
153
+ if (this.isWriter) {
154
+ this.enqueueMessage(message);
155
+ }
156
+ else {
157
+ this.sendMessage(message);
158
+ }
159
+ }
160
+ // Writer-specific methods below
161
+ async writerSaveQuery(queryDefId, queryKey, value, updatedAt, refIds) {
162
+ await this.setValue(queryKey, value, refIds ? new Set(refIds) : undefined);
163
+ await this.delegate.setNumber(updatedAtKeyFor(queryKey), updatedAt);
164
+ await this.writerActivateQuery(queryDefId, queryKey);
165
+ }
166
+ async writerSaveEntity(entityKey, value, refIds) {
167
+ await this.setValue(entityKey, value, refIds ? new Set(refIds) : undefined);
168
+ }
169
+ async writerActivateQuery(queryDefId, queryKey) {
170
+ if (!(await this.delegate.has(valueKeyFor(queryKey)))) {
171
+ // Query not in store, nothing to do
172
+ return;
173
+ }
174
+ let queue = this.queues.get(queryDefId);
175
+ if (queue === undefined) {
176
+ // For now, use default max count. In a real implementation,
177
+ // we'd need to pass queryDef or maxCount through the message
178
+ const maxCount = DEFAULT_MAX_COUNT;
179
+ queue = await this.delegate.getBuffer(queueKeyFor(queryDefId));
180
+ if (queue === undefined) {
181
+ queue = new Uint32Array(maxCount);
182
+ await this.delegate.setBuffer(queueKeyFor(queryDefId), queue);
183
+ }
184
+ else if (queue.length !== maxCount) {
185
+ queue = new Uint32Array(queue.buffer, 0, maxCount);
186
+ await this.delegate.setBuffer(queueKeyFor(queryDefId), queue);
187
+ }
188
+ this.queues.set(queryDefId, queue);
189
+ }
190
+ const indexOfKey = queue.indexOf(queryKey);
191
+ // Item already in queue, move to front
192
+ if (indexOfKey >= 0) {
193
+ if (indexOfKey === 0) {
194
+ // Already at front, nothing to do
195
+ return;
196
+ }
197
+ // Shift items right to make space at front
198
+ queue.copyWithin(1, 0, indexOfKey);
199
+ queue[0] = queryKey;
200
+ return;
201
+ }
202
+ // Item not in queue, add to front and evict tail
203
+ const evicted = queue[queue.length - 1];
204
+ queue.copyWithin(1, 0, queue.length - 1);
205
+ queue[0] = queryKey;
206
+ if (evicted !== 0) {
207
+ await this.deleteValue(evicted);
208
+ await this.delegate.delete(updatedAtKeyFor(evicted));
209
+ }
210
+ }
211
+ async setValue(id, value, refIds) {
212
+ const delegate = this.delegate;
213
+ await delegate.setString(valueKeyFor(id), JSON.stringify(value));
214
+ const refIdsKey = refIdsKeyFor(id);
215
+ const prevRefIds = await delegate.getBuffer(refIdsKey);
216
+ if (refIds === undefined || refIds.size === 0) {
217
+ await delegate.delete(refIdsKey);
218
+ // Decrement all previous refs
219
+ if (prevRefIds !== undefined) {
220
+ for (let i = 0; i < prevRefIds.length; i++) {
221
+ const refId = prevRefIds[i];
222
+ await this.decrementRefCount(refId);
223
+ }
224
+ }
225
+ }
226
+ else {
227
+ // Convert the set to a Uint32Array and capture all the refIds before we
228
+ // delete previous ones from the set
229
+ const newRefIds = new Uint32Array(refIds);
230
+ if (prevRefIds !== undefined) {
231
+ // Process new refs: increment if not in old
232
+ for (let i = 0; i < prevRefIds.length; i++) {
233
+ const refId = prevRefIds[i];
234
+ if (refIds.has(refId)) {
235
+ refIds.delete(refId);
236
+ }
237
+ else {
238
+ await this.decrementRefCount(refId);
239
+ }
240
+ }
241
+ }
242
+ // No previous refs, increment all unique new refs
243
+ for (const refId of refIds) {
244
+ await this.incrementRefCount(refId);
245
+ }
246
+ await delegate.setBuffer(refIdsKey, newRefIds);
247
+ }
248
+ }
249
+ async deleteValue(id) {
250
+ const delegate = this.delegate;
251
+ await delegate.delete(valueKeyFor(id));
252
+ await delegate.delete(refCountKeyFor(id));
253
+ const refIds = await delegate.getBuffer(refIdsKeyFor(id));
254
+ await delegate.delete(refIdsKeyFor(id)); // Clean up the refIds key
255
+ if (refIds === undefined) {
256
+ return;
257
+ }
258
+ // Decrement ref counts for all referenced entities
259
+ for (const refId of refIds) {
260
+ if (refId !== 0) {
261
+ await this.decrementRefCount(refId);
262
+ }
263
+ }
264
+ }
265
+ async incrementRefCount(refId) {
266
+ const delegate = this.delegate;
267
+ const refCountKey = refCountKeyFor(refId);
268
+ const currentCount = (await delegate.getNumber(refCountKey)) ?? 0;
269
+ const newCount = currentCount + 1;
270
+ await delegate.setNumber(refCountKey, newCount);
271
+ }
272
+ async decrementRefCount(refId) {
273
+ const delegate = this.delegate;
274
+ const refCountKey = refCountKeyFor(refId);
275
+ const currentCount = await delegate.getNumber(refCountKey);
276
+ if (currentCount === undefined) {
277
+ // Already deleted or never existed
278
+ return;
279
+ }
280
+ const newCount = currentCount - 1;
281
+ if (newCount === 0) {
282
+ // Entity exists, cascade delete it
283
+ await this.deleteValue(refId);
284
+ }
285
+ else {
286
+ await delegate.setNumber(refCountKey, newCount);
287
+ }
288
+ }
289
+ }
2
290
  //# sourceMappingURL=async.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"async.js","sourceRoot":"","sources":["../../../src/stores/async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgD,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"async.js","sourceRoot":"","sources":["../../../src/stores/async.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const valueKeyFor: (id: number) => string;
2
+ export declare const refCountKeyFor: (id: number) => string;
3
+ export declare const refIdsKeyFor: (id: number) => string;
4
+ export declare const updatedAtKeyFor: (id: number) => string;
5
+ export declare const queueKeyFor: (queryDefId: string) => string;
6
+ export declare const DEFAULT_MAX_COUNT = 50;
7
+ export declare const DEFAULT_GC_TIME: number;
8
+ //# sourceMappingURL=shared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../../src/stores/shared.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,WAAW,OAAQ,MAAM,WAAyB,CAAC;AAChE,eAAO,MAAM,cAAc,OAAQ,MAAM,WAA4B,CAAC;AACtE,eAAO,MAAM,YAAY,OAAQ,MAAM,WAA0B,CAAC;AAClE,eAAO,MAAM,eAAe,OAAQ,MAAM,WAA6B,CAAC;AAGxE,eAAO,MAAM,WAAW,eAAgB,MAAM,WAAiC,CAAC;AAGhF,eAAO,MAAM,iBAAiB,KAAK,CAAC;AACpC,eAAO,MAAM,eAAe,QAAsB,CAAC"}
@@ -0,0 +1,11 @@
1
+ // Query Instance keys
2
+ export const valueKeyFor = (id) => `sq:doc:value:${id}`;
3
+ export const refCountKeyFor = (id) => `sq:doc:refCount:${id}`;
4
+ export const refIdsKeyFor = (id) => `sq:doc:refIds:${id}`;
5
+ export const updatedAtKeyFor = (id) => `sq:doc:updatedAt:${id}`;
6
+ // Query Type keys
7
+ export const queueKeyFor = (queryDefId) => `sq:doc:queue:${queryDefId}`;
8
+ // Default values
9
+ export const DEFAULT_MAX_COUNT = 50;
10
+ export const DEFAULT_GC_TIME = 1000 * 60 * 60 * 24; // 24 hours
11
+ //# sourceMappingURL=shared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../../src/stores/shared.ts"],"names":[],"mappings":"AAAA,sBAAsB;AACtB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,gBAAgB,EAAE,EAAE,CAAC;AAChE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,mBAAmB,EAAE,EAAE,CAAC;AACtE,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,iBAAiB,EAAE,EAAE,CAAC;AAClE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,oBAAoB,EAAE,EAAE,CAAC;AAExE,kBAAkB;AAClB,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,UAAkB,EAAE,EAAE,CAAC,gBAAgB,UAAU,EAAE,CAAC;AAEhF,iBAAiB;AACjB,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AACpC,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,WAAW"}
@@ -1,2 +1,38 @@
1
- export { SyncQueryStore, type SyncPersistentStore, MemoryPersistentStore } from '../QueryStore.js';
1
+ import { EntityStore } from '../EntityMap.js';
2
+ import { CachedQuery, QueryDefinition, QueryStore } from '../QueryClient.js';
3
+ export interface SyncPersistentStore {
4
+ has(key: string): boolean;
5
+ getString(key: string): string | undefined;
6
+ setString(key: string, value: string): void;
7
+ getNumber(key: string): number | undefined;
8
+ setNumber(key: string, value: number): void;
9
+ getBuffer(key: string): Uint32Array | undefined;
10
+ setBuffer(key: string, value: Uint32Array): void;
11
+ delete(key: string): void;
12
+ }
13
+ export declare class MemoryPersistentStore implements SyncPersistentStore {
14
+ private readonly kv;
15
+ has(key: string): boolean;
16
+ getString(key: string): string | undefined;
17
+ setString(key: string, value: string): void;
18
+ getNumber(key: string): number | undefined;
19
+ setNumber(key: string, value: number): void;
20
+ getBuffer(key: string): Uint32Array | undefined;
21
+ setBuffer(key: string, value: Uint32Array): void;
22
+ delete(key: string): void;
23
+ }
24
+ export declare class SyncQueryStore implements QueryStore {
25
+ private readonly kv;
26
+ queues: Map<string, Uint32Array>;
27
+ constructor(kv: SyncPersistentStore);
28
+ loadQuery(queryDef: QueryDefinition<any, any>, queryKey: number, entityMap: EntityStore): CachedQuery | undefined;
29
+ private preloadEntities;
30
+ saveQuery(queryDef: QueryDefinition<any, any>, queryKey: number, value: unknown, updatedAt: number, refIds?: Set<number>): void;
31
+ saveEntity(entityKey: number, value: unknown, refIds?: Set<number>): void;
32
+ activateQuery(queryDef: QueryDefinition<any, any>, queryKey: number): void;
33
+ private setValue;
34
+ private deleteValue;
35
+ private incrementRefCount;
36
+ private decrementRefCount;
37
+ }
2
38
  //# sourceMappingURL=sync.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/stores/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/stores/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAe7E,MAAM,WAAW,mBAAmB;IAClC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAE1B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC3C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAAC;IAChD,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAEjD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAMD,qBAAa,qBAAsB,YAAW,mBAAmB;IAC/D,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAgD;IAEnE,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI1C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAI1C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAI3C,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAI/C,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,IAAI;IAIhD,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;CAG1B;AAED,qBAAa,cAAe,YAAW,UAAU;IAGnC,OAAO,CAAC,QAAQ,CAAC,EAAE;IAF/B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAa;gBAEhB,EAAE,EAAE,mBAAmB;IAEpD,SAAS,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,GAAG,WAAW,GAAG,SAAS;IA4BjH,OAAO,CAAC,eAAe;IAqBvB,SAAS,CACP,QAAQ,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EACnC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,OAAO,EACd,SAAS,EAAE,MAAM,EACjB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACnB,IAAI;IAMP,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI;IAIzE,aAAa,CAAC,QAAQ,EAAE,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAiD1E,OAAO,CAAC,QAAQ;IA8ChB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,iBAAiB;CAkB1B"}
@@ -1,2 +1,199 @@
1
- export { SyncQueryStore, MemoryPersistentStore } from '../QueryStore.js';
1
+ import { DEFAULT_GC_TIME, DEFAULT_MAX_COUNT, queueKeyFor, refCountKeyFor, refIdsKeyFor, updatedAtKeyFor, valueKeyFor, } from './shared.js';
2
+ // -----------------------------------------------------------------------------
3
+ // Sync QueryStore Implementation
4
+ // -----------------------------------------------------------------------------
5
+ export class MemoryPersistentStore {
6
+ kv = Object.create(null);
7
+ has(key) {
8
+ return key in this.kv;
9
+ }
10
+ getString(key) {
11
+ return this.kv[key];
12
+ }
13
+ setString(key, value) {
14
+ this.kv[key] = value;
15
+ }
16
+ getNumber(key) {
17
+ return this.kv[key];
18
+ }
19
+ setNumber(key, value) {
20
+ this.kv[key] = value;
21
+ }
22
+ getBuffer(key) {
23
+ return this.kv[key];
24
+ }
25
+ setBuffer(key, value) {
26
+ this.kv[key] = value;
27
+ }
28
+ delete(key) {
29
+ delete this.kv[key];
30
+ }
31
+ }
32
+ export class SyncQueryStore {
33
+ kv;
34
+ queues = new Map();
35
+ constructor(kv) {
36
+ this.kv = kv;
37
+ }
38
+ loadQuery(queryDef, queryKey, entityMap) {
39
+ const updatedAt = this.kv.getNumber(updatedAtKeyFor(queryKey));
40
+ if (updatedAt === undefined || updatedAt < Date.now() - (queryDef.cache?.gcTime ?? DEFAULT_GC_TIME)) {
41
+ return;
42
+ }
43
+ const valueStr = this.kv.getString(valueKeyFor(queryKey));
44
+ if (valueStr === undefined) {
45
+ return;
46
+ }
47
+ const entityIds = this.kv.getBuffer(refIdsKeyFor(queryKey));
48
+ if (entityIds !== undefined) {
49
+ this.preloadEntities(entityIds, entityMap);
50
+ }
51
+ this.activateQuery(queryDef, queryKey);
52
+ return {
53
+ value: JSON.parse(valueStr),
54
+ refIds: entityIds === undefined ? undefined : new Set(entityIds ?? []),
55
+ updatedAt,
56
+ };
57
+ }
58
+ preloadEntities(entityIds, entityMap) {
59
+ for (const entityId of entityIds) {
60
+ const entityValue = this.kv.getString(valueKeyFor(entityId));
61
+ if (entityValue === undefined) {
62
+ continue;
63
+ }
64
+ const entity = JSON.parse(entityValue);
65
+ entityMap.setPreloadedEntity(entityId, entity);
66
+ const childIds = this.kv.getBuffer(refIdsKeyFor(entityId));
67
+ if (childIds === undefined) {
68
+ continue;
69
+ }
70
+ this.preloadEntities(childIds, entityMap);
71
+ }
72
+ }
73
+ saveQuery(queryDef, queryKey, value, updatedAt, refIds) {
74
+ this.setValue(queryKey, value, refIds);
75
+ this.kv.setNumber(updatedAtKeyFor(queryKey), updatedAt);
76
+ this.activateQuery(queryDef, queryKey);
77
+ }
78
+ saveEntity(entityKey, value, refIds) {
79
+ this.setValue(entityKey, value, refIds);
80
+ }
81
+ activateQuery(queryDef, queryKey) {
82
+ if (!this.kv.has(valueKeyFor(queryKey))) {
83
+ // Query not in store, nothing to do. This can happen if the query has
84
+ // been evicted from the cache, but is still active in memory.
85
+ return;
86
+ }
87
+ let queue = this.queues.get(queryDef.id);
88
+ if (queue === undefined) {
89
+ const maxCount = queryDef.cache?.maxCount ?? DEFAULT_MAX_COUNT;
90
+ queue = this.kv.getBuffer(queueKeyFor(queryDef.id));
91
+ if (queue === undefined) {
92
+ queue = new Uint32Array(maxCount);
93
+ this.kv.setBuffer(queueKeyFor(queryDef.id), queue);
94
+ }
95
+ else if (queue.length !== maxCount) {
96
+ queue = new Uint32Array(queue.buffer, 0, maxCount);
97
+ this.kv.setBuffer(queueKeyFor(queryDef.id), queue);
98
+ }
99
+ this.queues.set(queryDef.id, queue);
100
+ }
101
+ const indexOfKey = queue.indexOf(queryKey);
102
+ // Item already in queue, move to front
103
+ if (indexOfKey >= 0) {
104
+ if (indexOfKey === 0) {
105
+ // Already at front, nothing to do
106
+ return;
107
+ }
108
+ // Shift items right to make space at front
109
+ queue.copyWithin(1, 0, indexOfKey);
110
+ queue[0] = queryKey;
111
+ return;
112
+ }
113
+ // Item not in queue, add to front and evict tail
114
+ const evicted = queue[queue.length - 1];
115
+ queue.copyWithin(1, 0, queue.length - 1);
116
+ queue[0] = queryKey;
117
+ if (evicted !== 0) {
118
+ this.deleteValue(evicted);
119
+ this.kv.delete(updatedAtKeyFor(evicted));
120
+ }
121
+ }
122
+ setValue(id, value, refIds) {
123
+ const kv = this.kv;
124
+ kv.setString(valueKeyFor(id), JSON.stringify(value));
125
+ const refIdsKey = refIdsKeyFor(id);
126
+ const prevRefIds = kv.getBuffer(refIdsKey);
127
+ if (refIds === undefined || refIds.size === 0) {
128
+ kv.delete(refIdsKey);
129
+ // Decrement all previous refs
130
+ if (prevRefIds !== undefined) {
131
+ for (let i = 0; i < prevRefIds.length; i++) {
132
+ const refId = prevRefIds[i];
133
+ this.decrementRefCount(refId);
134
+ }
135
+ }
136
+ }
137
+ else {
138
+ // Convert the set to a Uint32Array and capture all the refIds before we
139
+ // delete previous ones from the set
140
+ const newRefIds = new Uint32Array(refIds);
141
+ if (prevRefIds !== undefined) {
142
+ // Process new refs: increment if not in old
143
+ for (let i = 0; i < prevRefIds.length; i++) {
144
+ const refId = prevRefIds[i];
145
+ if (refIds.has(refId)) {
146
+ refIds.delete(refId);
147
+ }
148
+ else {
149
+ this.decrementRefCount(refId);
150
+ }
151
+ }
152
+ }
153
+ // No previous refs, increment all unique new refs
154
+ for (const refId of refIds) {
155
+ this.incrementRefCount(refId);
156
+ }
157
+ kv.setBuffer(refIdsKey, newRefIds);
158
+ }
159
+ }
160
+ deleteValue(id) {
161
+ const kv = this.kv;
162
+ kv.delete(valueKeyFor(id));
163
+ kv.delete(refCountKeyFor(id));
164
+ const refIds = kv.getBuffer(refIdsKeyFor(id));
165
+ kv.delete(refIdsKeyFor(id)); // Clean up the refIds key
166
+ if (refIds === undefined) {
167
+ return;
168
+ }
169
+ // Decrement ref counts for all referenced entities
170
+ for (const refId of refIds) {
171
+ if (refId !== 0) {
172
+ this.decrementRefCount(refId);
173
+ }
174
+ }
175
+ }
176
+ incrementRefCount(refId) {
177
+ const refCountKey = refCountKeyFor(refId);
178
+ const currentCount = this.kv.getNumber(refCountKey) ?? 0;
179
+ const newCount = currentCount + 1;
180
+ this.kv.setNumber(refCountKey, newCount);
181
+ }
182
+ decrementRefCount(refId) {
183
+ const refCountKey = refCountKeyFor(refId);
184
+ const currentCount = this.kv.getNumber(refCountKey);
185
+ if (currentCount === undefined) {
186
+ // Already deleted or never existed
187
+ return;
188
+ }
189
+ const newCount = currentCount - 1;
190
+ if (newCount === 0) {
191
+ // Entity exists, cascade delete it
192
+ this.deleteValue(refId);
193
+ }
194
+ else {
195
+ this.kv.setNumber(refCountKey, newCount);
196
+ }
197
+ }
198
+ }
2
199
  //# sourceMappingURL=sync.js.map