@signalium/query 0.0.0 → 0.0.1
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/.turbo/turbo-build.log +12 -0
- package/CHANGELOG.md +9 -0
- package/dist/cjs/EntityMap.js +46 -0
- package/dist/cjs/EntityMap.js.map +1 -0
- package/dist/cjs/QueryClient.js +180 -0
- package/dist/cjs/QueryClient.js.map +1 -0
- package/dist/cjs/QueryStore.js +219 -0
- package/dist/cjs/QueryStore.js.map +1 -0
- package/dist/cjs/errors.js +105 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/parseEntities.js +127 -0
- package/dist/cjs/parseEntities.js.map +1 -0
- package/dist/cjs/pathInterpolator.js +69 -0
- package/dist/cjs/pathInterpolator.js.map +1 -0
- package/dist/cjs/proxy.js +187 -0
- package/dist/cjs/proxy.js.map +1 -0
- package/dist/cjs/query.js +41 -0
- package/dist/cjs/query.js.map +1 -0
- package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
- package/dist/cjs/typeDefs.js +249 -0
- package/dist/cjs/typeDefs.js.map +1 -0
- package/dist/cjs/types.js +6 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/cjs/utils.js +65 -0
- package/dist/cjs/utils.js.map +1 -0
- package/dist/esm/EntityMap.d.ts +18 -0
- package/dist/esm/EntityMap.d.ts.map +1 -0
- package/dist/esm/EntityMap.js +42 -0
- package/dist/esm/EntityMap.js.map +1 -0
- package/dist/esm/QueryClient.d.ts +82 -0
- package/dist/esm/QueryClient.d.ts.map +1 -0
- package/dist/esm/QueryClient.js +175 -0
- package/dist/esm/QueryClient.js.map +1 -0
- package/dist/esm/QueryStore.d.ts +73 -0
- package/dist/esm/QueryStore.d.ts.map +1 -0
- package/dist/esm/QueryStore.js +209 -0
- package/dist/esm/QueryStore.js.map +1 -0
- package/dist/esm/errors.d.ts +4 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +101 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +4 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/parseEntities.d.ts +8 -0
- package/dist/esm/parseEntities.d.ts.map +1 -0
- package/dist/esm/parseEntities.js +120 -0
- package/dist/esm/parseEntities.js.map +1 -0
- package/dist/esm/pathInterpolator.d.ts +29 -0
- package/dist/esm/pathInterpolator.d.ts.map +1 -0
- package/dist/esm/pathInterpolator.js +66 -0
- package/dist/esm/pathInterpolator.js.map +1 -0
- package/dist/esm/proxy.d.ts +8 -0
- package/dist/esm/proxy.d.ts.map +1 -0
- package/dist/esm/proxy.js +180 -0
- package/dist/esm/proxy.js.map +1 -0
- package/dist/esm/query.d.ts +40 -0
- package/dist/esm/query.d.ts.map +1 -0
- package/dist/esm/query.js +38 -0
- package/dist/esm/query.js.map +1 -0
- package/dist/esm/typeDefs.d.ts +25 -0
- package/dist/esm/typeDefs.d.ts.map +1 -0
- package/dist/esm/typeDefs.js +239 -0
- package/dist/esm/typeDefs.js.map +1 -0
- package/dist/esm/types.d.ts +86 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +3 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/utils.d.ts +6 -0
- package/dist/esm/utils.d.ts.map +1 -0
- package/dist/esm/utils.js +60 -0
- package/dist/esm/utils.js.map +1 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/package.json +3 -3
- package/vitest.config.ts +4 -10
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Client with Entity Caching and Deduplication
|
|
3
|
+
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Global entity map for deduplication
|
|
6
|
+
* - Entity definitions with cached sub-entity paths
|
|
7
|
+
* - Eager entity discovery and caching
|
|
8
|
+
* - Permanent proxy cache for entities
|
|
9
|
+
* - Response caching for offline access
|
|
10
|
+
* - Signalium-based reactivity for entity updates
|
|
11
|
+
* - Self-contained validator (no external dependencies except Signalium)
|
|
12
|
+
*/
|
|
13
|
+
import { relay, context, notifier, } from 'signalium';
|
|
14
|
+
import { hashValue, setReactivePromise } from 'signalium/utils';
|
|
15
|
+
import { parseValue } from './proxy.js';
|
|
16
|
+
import { parseEntities } from './parseEntities.js';
|
|
17
|
+
import { EntityStore } from './EntityMap.js';
|
|
18
|
+
import { ValidatorDef } from './typeDefs.js';
|
|
19
|
+
const queryKeyFor = (queryDef, params) => {
|
|
20
|
+
return hashValue([queryDef.id, params]);
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* QueryResult wraps a DiscriminatedReactivePromise and adds additional functionality
|
|
24
|
+
* like refetch, while forwarding all the base relay properties.
|
|
25
|
+
*/
|
|
26
|
+
export class QueryResultImpl {
|
|
27
|
+
relay;
|
|
28
|
+
instance;
|
|
29
|
+
constructor(relay, instance) {
|
|
30
|
+
this.relay = relay;
|
|
31
|
+
this.instance = instance;
|
|
32
|
+
setReactivePromise(this);
|
|
33
|
+
}
|
|
34
|
+
// Forward all ReactivePromise properties through getters
|
|
35
|
+
get value() {
|
|
36
|
+
return this.relay.value;
|
|
37
|
+
}
|
|
38
|
+
get error() {
|
|
39
|
+
return this.relay.error;
|
|
40
|
+
}
|
|
41
|
+
get isPending() {
|
|
42
|
+
return this.relay.isPending;
|
|
43
|
+
}
|
|
44
|
+
get isRejected() {
|
|
45
|
+
return this.relay.isRejected;
|
|
46
|
+
}
|
|
47
|
+
get isResolved() {
|
|
48
|
+
return this.relay.isResolved;
|
|
49
|
+
}
|
|
50
|
+
get isSettled() {
|
|
51
|
+
return this.relay.isSettled;
|
|
52
|
+
}
|
|
53
|
+
get isReady() {
|
|
54
|
+
return this.relay.isReady;
|
|
55
|
+
}
|
|
56
|
+
// TODO: Intimate APIs needed for `useReactive`, this is a code smell and
|
|
57
|
+
// we should find a better way to entangle these more generically
|
|
58
|
+
get _version() {
|
|
59
|
+
return this.relay._version;
|
|
60
|
+
}
|
|
61
|
+
get _signal() {
|
|
62
|
+
return this.relay._signal;
|
|
63
|
+
}
|
|
64
|
+
get _flags() {
|
|
65
|
+
return this.relay._flags;
|
|
66
|
+
}
|
|
67
|
+
// Forward Promise methods
|
|
68
|
+
then(onfulfilled, onrejected) {
|
|
69
|
+
return this.relay.then(onfulfilled, onrejected);
|
|
70
|
+
}
|
|
71
|
+
catch(onrejected) {
|
|
72
|
+
return this.relay.catch(onrejected);
|
|
73
|
+
}
|
|
74
|
+
finally(onfinally) {
|
|
75
|
+
return this.relay.finally(onfinally);
|
|
76
|
+
}
|
|
77
|
+
// Additional methods
|
|
78
|
+
refetch() {
|
|
79
|
+
this.instance.notifier.notify();
|
|
80
|
+
// pull the value to make sure the relay is activated
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
|
|
82
|
+
this.instance.relay.value;
|
|
83
|
+
return this.relay;
|
|
84
|
+
}
|
|
85
|
+
// Make it work with Symbol.toStringTag for Promise detection
|
|
86
|
+
get [Symbol.toStringTag]() {
|
|
87
|
+
return 'QueryResult';
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
export class QueryClient {
|
|
91
|
+
store;
|
|
92
|
+
context;
|
|
93
|
+
entityMap = new EntityStore();
|
|
94
|
+
queryInstances = new Map();
|
|
95
|
+
constructor(store, context = { fetch }) {
|
|
96
|
+
this.store = store;
|
|
97
|
+
this.context = context;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Loads a query from the document store and returns a QueryResult
|
|
101
|
+
* that triggers fetches and prepopulates with cached data
|
|
102
|
+
*/
|
|
103
|
+
getQuery(queryDef, params) {
|
|
104
|
+
const queryKey = queryKeyFor(queryDef, params);
|
|
105
|
+
let queryInstance = this.queryInstances.get(queryKey);
|
|
106
|
+
// Create a new relay if it doesn't exist
|
|
107
|
+
if (queryInstance === undefined) {
|
|
108
|
+
queryInstance = {
|
|
109
|
+
relay: undefined,
|
|
110
|
+
initialized: false,
|
|
111
|
+
notifier: notifier(),
|
|
112
|
+
};
|
|
113
|
+
const queryRelay = relay(state => {
|
|
114
|
+
// Load from cache first, then fetch fresh data
|
|
115
|
+
queryInstance.notifier.consume();
|
|
116
|
+
this.store.activateQuery(queryDef, queryKey);
|
|
117
|
+
if (queryInstance.initialized) {
|
|
118
|
+
state.setPromise(this.runQuery(queryDef, queryKey, params));
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
this.initializeQuery(queryDef, params, state, queryInstance);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
queryInstance.relay = new QueryResultImpl(queryRelay, queryInstance);
|
|
125
|
+
// Store the relay for future use
|
|
126
|
+
this.queryInstances.set(queryKey, queryInstance);
|
|
127
|
+
}
|
|
128
|
+
return queryInstance.relay;
|
|
129
|
+
}
|
|
130
|
+
async initializeQuery(queryDef, params, state, instance) {
|
|
131
|
+
try {
|
|
132
|
+
instance.initialized = true;
|
|
133
|
+
const queryKey = queryKeyFor(queryDef, params);
|
|
134
|
+
// Load from cache first
|
|
135
|
+
const query = this.store.loadQuery(queryDef, queryKey, this.entityMap);
|
|
136
|
+
if (query !== undefined) {
|
|
137
|
+
const shape = queryDef.shape;
|
|
138
|
+
state.value =
|
|
139
|
+
shape instanceof ValidatorDef
|
|
140
|
+
? parseEntities(query, shape, this, new Set())
|
|
141
|
+
: parseValue(query, shape, queryDef.id);
|
|
142
|
+
}
|
|
143
|
+
state.setPromise(this.runQuery(queryDef, queryKey, params));
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
// Relay will handle the error state automatically
|
|
147
|
+
state.setError(error);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Fetches fresh data and updates the cache
|
|
152
|
+
*/
|
|
153
|
+
async runQuery(queryDef, queryKey, params) {
|
|
154
|
+
const freshData = await queryDef.fetchFn(this.context, params);
|
|
155
|
+
// Parse and cache the fresh data
|
|
156
|
+
const entityRefs = new Set();
|
|
157
|
+
const shape = queryDef.shape;
|
|
158
|
+
const parsedData = shape instanceof ValidatorDef
|
|
159
|
+
? parseEntities(freshData, shape, this, entityRefs)
|
|
160
|
+
: parseValue(freshData, shape, queryDef.id);
|
|
161
|
+
// Cache the data (synchronous, fire-and-forget)
|
|
162
|
+
this.store.saveQuery(queryDef, queryKey, freshData, entityRefs);
|
|
163
|
+
return parsedData;
|
|
164
|
+
}
|
|
165
|
+
hydrateEntity(key, shape) {
|
|
166
|
+
return this.entityMap.hydratePreloadedEntity(key, shape);
|
|
167
|
+
}
|
|
168
|
+
saveEntity(key, obj, shape, entityRefs) {
|
|
169
|
+
const record = this.entityMap.setEntity(key, obj, shape);
|
|
170
|
+
this.store.saveEntity(key, obj, entityRefs);
|
|
171
|
+
return record;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
export const QueryClientContext = context(undefined);
|
|
175
|
+
//# sourceMappingURL=QueryClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryClient.js","sourceRoot":"","sources":["../../src/QueryClient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QueryStore - Minimal interface for query persistence
|
|
3
|
+
*
|
|
4
|
+
* Provides a clean abstraction over document storage, reference counting,
|
|
5
|
+
* and LRU cache management. Supports both synchronous (in-memory) and
|
|
6
|
+
* asynchronous (writer-backed) implementations.
|
|
7
|
+
*/
|
|
8
|
+
import { EntityStore } from './EntityMap.js';
|
|
9
|
+
import { QueryDefinition } from './QueryClient.js';
|
|
10
|
+
export interface QueryStore {
|
|
11
|
+
/**
|
|
12
|
+
* Asynchronously retrieves a document by key.
|
|
13
|
+
* May return undefined if the document is not in the store.
|
|
14
|
+
*/
|
|
15
|
+
loadQuery(queryDef: QueryDefinition<any, any>, queryKey: number, entityMap: EntityStore): MaybePromise<unknown | undefined>;
|
|
16
|
+
/**
|
|
17
|
+
* Synchronously stores a document with optional reference IDs.
|
|
18
|
+
* This is fire-and-forget for async implementations.
|
|
19
|
+
*/
|
|
20
|
+
saveQuery(queryDef: QueryDefinition<any, any>, queryKey: number, value: unknown, refIds?: Set<number>): void;
|
|
21
|
+
/**
|
|
22
|
+
* Synchronously stores an entity with optional reference IDs.
|
|
23
|
+
* This is fire-and-forget for async implementations.
|
|
24
|
+
*/
|
|
25
|
+
saveEntity(entityKey: number, value: unknown, refIds?: Set<number>): void;
|
|
26
|
+
/**
|
|
27
|
+
* Marks a query as accessed, updating the LRU queue.
|
|
28
|
+
* Handles eviction internally when the cache is full.
|
|
29
|
+
*/
|
|
30
|
+
activateQuery(queryDef: QueryDefinition<any, any>, queryKey: number): void;
|
|
31
|
+
}
|
|
32
|
+
export type MaybePromise<T> = T | Promise<T>;
|
|
33
|
+
export interface SyncPersistentStore {
|
|
34
|
+
has(key: string): boolean;
|
|
35
|
+
getString(key: string): string | undefined;
|
|
36
|
+
setString(key: string, value: string): void;
|
|
37
|
+
getNumber(key: string): number | undefined;
|
|
38
|
+
setNumber(key: string, value: number): void;
|
|
39
|
+
getBuffer(key: string): Uint32Array | undefined;
|
|
40
|
+
setBuffer(key: string, value: Uint32Array): void;
|
|
41
|
+
delete(key: string): void;
|
|
42
|
+
}
|
|
43
|
+
export declare class MemoryPersistentStore implements SyncPersistentStore {
|
|
44
|
+
private readonly kv;
|
|
45
|
+
has(key: string): boolean;
|
|
46
|
+
getString(key: string): string | undefined;
|
|
47
|
+
setString(key: string, value: string): void;
|
|
48
|
+
getNumber(key: string): number | undefined;
|
|
49
|
+
setNumber(key: string, value: number): void;
|
|
50
|
+
getBuffer(key: string): Uint32Array | undefined;
|
|
51
|
+
setBuffer(key: string, value: Uint32Array): void;
|
|
52
|
+
delete(key: string): void;
|
|
53
|
+
}
|
|
54
|
+
export declare const valueKeyFor: (id: number) => string;
|
|
55
|
+
export declare const refCountKeyFor: (id: number) => string;
|
|
56
|
+
export declare const refIdsKeyFor: (id: number) => string;
|
|
57
|
+
export declare const updatedAtKeyFor: (id: number) => string;
|
|
58
|
+
export declare const queueKeyFor: (queryDefId: string) => string;
|
|
59
|
+
export declare class SyncQueryStore implements QueryStore {
|
|
60
|
+
private readonly kv;
|
|
61
|
+
queues: Map<string, Uint32Array>;
|
|
62
|
+
constructor(kv: SyncPersistentStore);
|
|
63
|
+
loadQuery(queryDef: QueryDefinition<any, any>, queryKey: number, entityMap: EntityStore): unknown | undefined;
|
|
64
|
+
private preloadEntities;
|
|
65
|
+
saveQuery(queryDef: QueryDefinition<any, any>, queryKey: number, value: unknown, refIds?: Set<number>): void;
|
|
66
|
+
saveEntity(entityKey: number, value: unknown, refIds?: Set<number>): void;
|
|
67
|
+
activateQuery(queryDef: QueryDefinition<any, any>, queryKey: number): void;
|
|
68
|
+
private setValue;
|
|
69
|
+
private deleteValue;
|
|
70
|
+
private incrementRefCount;
|
|
71
|
+
private decrementRefCount;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=QueryStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryStore.d.ts","sourceRoot":"","sources":["../../src/QueryStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QueryStore - Minimal interface for query persistence
|
|
3
|
+
*
|
|
4
|
+
* Provides a clean abstraction over document storage, reference counting,
|
|
5
|
+
* and LRU cache management. Supports both synchronous (in-memory) and
|
|
6
|
+
* asynchronous (writer-backed) implementations.
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_MAX_COUNT = 50;
|
|
9
|
+
const DEFAULT_MAX_AGE = 1000 * 60 * 60 * 24; // 24 hours
|
|
10
|
+
export class MemoryPersistentStore {
|
|
11
|
+
kv = Object.create(null);
|
|
12
|
+
has(key) {
|
|
13
|
+
return key in this.kv;
|
|
14
|
+
}
|
|
15
|
+
getString(key) {
|
|
16
|
+
return this.kv[key];
|
|
17
|
+
}
|
|
18
|
+
setString(key, value) {
|
|
19
|
+
this.kv[key] = value;
|
|
20
|
+
}
|
|
21
|
+
getNumber(key) {
|
|
22
|
+
return this.kv[key];
|
|
23
|
+
}
|
|
24
|
+
setNumber(key, value) {
|
|
25
|
+
this.kv[key] = value;
|
|
26
|
+
}
|
|
27
|
+
getBuffer(key) {
|
|
28
|
+
return this.kv[key];
|
|
29
|
+
}
|
|
30
|
+
setBuffer(key, value) {
|
|
31
|
+
this.kv[key] = value;
|
|
32
|
+
}
|
|
33
|
+
delete(key) {
|
|
34
|
+
delete this.kv[key];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Query Instance keys
|
|
38
|
+
export const valueKeyFor = (id) => `sq:doc:value:${id}`;
|
|
39
|
+
export const refCountKeyFor = (id) => `sq:doc:refCount:${id}`;
|
|
40
|
+
export const refIdsKeyFor = (id) => `sq:doc:refIds:${id}`;
|
|
41
|
+
export const updatedAtKeyFor = (id) => `sq:doc:updatedAt:${id}`;
|
|
42
|
+
// Query Type keys
|
|
43
|
+
export const queueKeyFor = (queryDefId) => `sq:doc:queue:${queryDefId}`;
|
|
44
|
+
export class SyncQueryStore {
|
|
45
|
+
kv;
|
|
46
|
+
queues = new Map();
|
|
47
|
+
constructor(kv) {
|
|
48
|
+
this.kv = kv;
|
|
49
|
+
}
|
|
50
|
+
loadQuery(queryDef, queryKey, entityMap) {
|
|
51
|
+
const updatedAt = this.kv.getNumber(updatedAtKeyFor(queryKey));
|
|
52
|
+
if (updatedAt === undefined || updatedAt < Date.now() - (queryDef.cache?.maxAge ?? DEFAULT_MAX_AGE)) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const value = this.kv.getString(valueKeyFor(queryKey));
|
|
56
|
+
if (value === undefined) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const entityIds = this.kv.getBuffer(refIdsKeyFor(queryKey));
|
|
60
|
+
if (entityIds !== undefined) {
|
|
61
|
+
this.preloadEntities(entityIds, entityMap);
|
|
62
|
+
}
|
|
63
|
+
this.activateQuery(queryDef, queryKey);
|
|
64
|
+
return JSON.parse(value);
|
|
65
|
+
}
|
|
66
|
+
preloadEntities(entityIds, entityMap) {
|
|
67
|
+
for (const entityId of entityIds) {
|
|
68
|
+
const entityValue = this.kv.getString(valueKeyFor(entityId));
|
|
69
|
+
if (entityValue === undefined) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
const entity = JSON.parse(entityValue);
|
|
73
|
+
entityMap.setPreloadedEntity(entityId, entity);
|
|
74
|
+
const childIds = this.kv.getBuffer(refIdsKeyFor(entityId));
|
|
75
|
+
if (childIds === undefined) {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
this.preloadEntities(childIds, entityMap);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
saveQuery(queryDef, queryKey, value, refIds) {
|
|
82
|
+
this.setValue(queryKey, value, refIds);
|
|
83
|
+
this.kv.setNumber(updatedAtKeyFor(queryKey), Date.now());
|
|
84
|
+
this.activateQuery(queryDef, queryKey);
|
|
85
|
+
}
|
|
86
|
+
saveEntity(entityKey, value, refIds) {
|
|
87
|
+
this.setValue(entityKey, value, refIds);
|
|
88
|
+
}
|
|
89
|
+
activateQuery(queryDef, queryKey) {
|
|
90
|
+
if (!this.kv.has(valueKeyFor(queryKey))) {
|
|
91
|
+
// Query not in store, nothing to do. This can happen if the query has
|
|
92
|
+
// been evicted from the cache, but is still active in memory.
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
let queue = this.queues.get(queryDef.id);
|
|
96
|
+
if (queue === undefined) {
|
|
97
|
+
const maxCount = queryDef.cache?.maxCount ?? DEFAULT_MAX_COUNT;
|
|
98
|
+
queue = this.kv.getBuffer(queueKeyFor(queryDef.id));
|
|
99
|
+
if (queue === undefined) {
|
|
100
|
+
queue = new Uint32Array(maxCount);
|
|
101
|
+
this.kv.setBuffer(queueKeyFor(queryDef.id), queue);
|
|
102
|
+
}
|
|
103
|
+
else if (queue.length !== maxCount) {
|
|
104
|
+
const newQueue = new Uint32Array(maxCount);
|
|
105
|
+
newQueue.set(queue);
|
|
106
|
+
queue = newQueue;
|
|
107
|
+
this.kv.setBuffer(queueKeyFor(queryDef.id), queue);
|
|
108
|
+
}
|
|
109
|
+
this.queues.set(queryDef.id, queue);
|
|
110
|
+
}
|
|
111
|
+
const indexOfKey = queue.indexOf(queryKey);
|
|
112
|
+
// Item already in queue, move to front
|
|
113
|
+
if (indexOfKey >= 0) {
|
|
114
|
+
if (indexOfKey === 0) {
|
|
115
|
+
// Already at front, nothing to do
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
// Shift items right to make space at front
|
|
119
|
+
queue.copyWithin(1, 0, indexOfKey);
|
|
120
|
+
queue[0] = queryKey;
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
// Item not in queue, add to front and evict tail
|
|
124
|
+
const evicted = queue[queue.length - 1];
|
|
125
|
+
queue.copyWithin(1, 0, queue.length - 1);
|
|
126
|
+
queue[0] = queryKey;
|
|
127
|
+
if (evicted !== 0) {
|
|
128
|
+
this.deleteValue(evicted);
|
|
129
|
+
this.kv.delete(updatedAtKeyFor(evicted));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
setValue(id, value, refIds) {
|
|
133
|
+
const kv = this.kv;
|
|
134
|
+
kv.setString(valueKeyFor(id), JSON.stringify(value));
|
|
135
|
+
const refIdsKey = refIdsKeyFor(id);
|
|
136
|
+
const prevRefIds = kv.getBuffer(refIdsKey);
|
|
137
|
+
if (refIds === undefined || refIds.size === 0) {
|
|
138
|
+
kv.delete(refIdsKey);
|
|
139
|
+
// Decrement all previous refs
|
|
140
|
+
if (prevRefIds !== undefined) {
|
|
141
|
+
for (let i = 0; i < prevRefIds.length; i++) {
|
|
142
|
+
const refId = prevRefIds[i];
|
|
143
|
+
this.decrementRefCount(refId);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
// Convert the set to a Uint32Array and capture all the refIds before we
|
|
149
|
+
// delete previous ones from the set
|
|
150
|
+
const newRefIds = new Uint32Array(refIds);
|
|
151
|
+
if (prevRefIds !== undefined) {
|
|
152
|
+
// Process new refs: increment if not in old
|
|
153
|
+
for (let i = 0; i < prevRefIds.length; i++) {
|
|
154
|
+
const refId = prevRefIds[i];
|
|
155
|
+
if (refIds.has(refId)) {
|
|
156
|
+
refIds.delete(refId);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
this.decrementRefCount(refId);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// No previous refs, increment all unique new refs
|
|
164
|
+
for (const refId of refIds) {
|
|
165
|
+
this.incrementRefCount(refId);
|
|
166
|
+
}
|
|
167
|
+
kv.setBuffer(refIdsKey, newRefIds);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
deleteValue(id) {
|
|
171
|
+
const kv = this.kv;
|
|
172
|
+
kv.delete(valueKeyFor(id));
|
|
173
|
+
kv.delete(refCountKeyFor(id));
|
|
174
|
+
const refIds = kv.getBuffer(refIdsKeyFor(id));
|
|
175
|
+
kv.delete(refIdsKeyFor(id)); // Clean up the refIds key
|
|
176
|
+
if (refIds === undefined) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
// Decrement ref counts for all referenced entities
|
|
180
|
+
for (const refId of refIds) {
|
|
181
|
+
if (refId !== 0) {
|
|
182
|
+
this.decrementRefCount(refId);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
incrementRefCount(refId) {
|
|
187
|
+
const refCountKey = refCountKeyFor(refId);
|
|
188
|
+
const currentCount = this.kv.getNumber(refCountKey) ?? 0;
|
|
189
|
+
const newCount = currentCount + 1;
|
|
190
|
+
this.kv.setNumber(refCountKey, newCount);
|
|
191
|
+
}
|
|
192
|
+
decrementRefCount(refId) {
|
|
193
|
+
const refCountKey = refCountKeyFor(refId);
|
|
194
|
+
const currentCount = this.kv.getNumber(refCountKey);
|
|
195
|
+
if (currentCount === undefined) {
|
|
196
|
+
// Already deleted or never existed
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
const newCount = currentCount - 1;
|
|
200
|
+
if (newCount === 0) {
|
|
201
|
+
// Entity exists, cascade delete it
|
|
202
|
+
this.deleteValue(refId);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
this.kv.setNumber(refCountKey, newCount);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=QueryStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"QueryStore.js","sourceRoot":"","sources":["../../src/QueryStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAQL,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAEpB,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAuG7D;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,GAAG,KAAK,CAM/F"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ARRAY_KEY, RECORD_KEY, } from './types.js';
|
|
2
|
+
export function typeToString(type) {
|
|
3
|
+
// Handle Set-based constants/enums
|
|
4
|
+
if (type instanceof Set) {
|
|
5
|
+
const values = Array.from(type).map(v => (typeof v === 'string' ? `"${v}"` : String(v)));
|
|
6
|
+
return values.join(' | ');
|
|
7
|
+
}
|
|
8
|
+
// Handle constants
|
|
9
|
+
if (typeof type === 'string') {
|
|
10
|
+
return `"${type}"`;
|
|
11
|
+
}
|
|
12
|
+
if (typeof type === 'boolean') {
|
|
13
|
+
return String(type);
|
|
14
|
+
}
|
|
15
|
+
// Handle primitive masks
|
|
16
|
+
if (typeof type === 'number') {
|
|
17
|
+
const types = [];
|
|
18
|
+
if (type & 1 /* Mask.UNDEFINED */)
|
|
19
|
+
types.push('undefined');
|
|
20
|
+
if (type & 2 /* Mask.NULL */)
|
|
21
|
+
types.push('null');
|
|
22
|
+
if (type & 4 /* Mask.NUMBER */)
|
|
23
|
+
types.push('number');
|
|
24
|
+
if (type & 8 /* Mask.STRING */)
|
|
25
|
+
types.push('string');
|
|
26
|
+
if (type & 16 /* Mask.BOOLEAN */)
|
|
27
|
+
types.push('boolean');
|
|
28
|
+
if (type & 32 /* Mask.OBJECT */)
|
|
29
|
+
types.push('object');
|
|
30
|
+
if (type & 64 /* Mask.ARRAY */)
|
|
31
|
+
types.push('array');
|
|
32
|
+
if (types.length === 0) {
|
|
33
|
+
return 'unknown';
|
|
34
|
+
}
|
|
35
|
+
return types.length === 1 ? types[0] : types.join(' | ');
|
|
36
|
+
}
|
|
37
|
+
// Handle complex types - CHECK UNION FIRST since it contains other types
|
|
38
|
+
const mask = type.mask;
|
|
39
|
+
if (mask & 512 /* Mask.UNION */) {
|
|
40
|
+
const unionType = type;
|
|
41
|
+
const parts = [];
|
|
42
|
+
// Add primitive types from the mask
|
|
43
|
+
if (mask & 1 /* Mask.UNDEFINED */)
|
|
44
|
+
parts.push('undefined');
|
|
45
|
+
if (mask & 2 /* Mask.NULL */)
|
|
46
|
+
parts.push('null');
|
|
47
|
+
if (mask & 4 /* Mask.NUMBER */)
|
|
48
|
+
parts.push('number');
|
|
49
|
+
if (mask & 8 /* Mask.STRING */)
|
|
50
|
+
parts.push('string');
|
|
51
|
+
if (mask & 16 /* Mask.BOOLEAN */)
|
|
52
|
+
parts.push('boolean');
|
|
53
|
+
// Add const/enum values from the values Set
|
|
54
|
+
if (unionType.values !== undefined && unionType.values.size > 0) {
|
|
55
|
+
for (const val of unionType.values) {
|
|
56
|
+
const valStr = typeof val === 'string' ? `"${val}"` : String(val);
|
|
57
|
+
parts.push(valStr);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
// Add complex types from the shape object
|
|
61
|
+
if (unionType.shape !== undefined) {
|
|
62
|
+
if (unionType.shape[ARRAY_KEY] !== undefined) {
|
|
63
|
+
parts.push(`Array<${typeToString(unionType.shape[ARRAY_KEY])}>`);
|
|
64
|
+
}
|
|
65
|
+
if (unionType.shape[RECORD_KEY] !== undefined) {
|
|
66
|
+
parts.push(`Record<string, ${typeToString(unionType.shape[RECORD_KEY])}>`);
|
|
67
|
+
}
|
|
68
|
+
// Add entity/object types by typename
|
|
69
|
+
for (const [key, value] of Object.entries(unionType.shape)) {
|
|
70
|
+
if (key !== ARRAY_KEY && key !== RECORD_KEY) {
|
|
71
|
+
// key is the typename value (e.g., "User", "Post")
|
|
72
|
+
parts.push(key);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
if (parts.length === 0) {
|
|
77
|
+
return 'union';
|
|
78
|
+
}
|
|
79
|
+
return parts.join(' | ');
|
|
80
|
+
}
|
|
81
|
+
if (mask & 1024 /* Mask.ENTITY */) {
|
|
82
|
+
return `Entity<${type.typenameValue}>`;
|
|
83
|
+
}
|
|
84
|
+
if (mask & 64 /* Mask.ARRAY */) {
|
|
85
|
+
const shape = type.shape;
|
|
86
|
+
return `Array<${typeToString(shape)}>`;
|
|
87
|
+
}
|
|
88
|
+
if (mask & 256 /* Mask.RECORD */) {
|
|
89
|
+
const shape = type.shape;
|
|
90
|
+
return `Record<string, ${typeToString(shape)}>`;
|
|
91
|
+
}
|
|
92
|
+
if (mask & 32 /* Mask.OBJECT */) {
|
|
93
|
+
const typename = type.typenameValue;
|
|
94
|
+
return typename ? `Object<${typename}>` : 'object';
|
|
95
|
+
}
|
|
96
|
+
return 'unknown';
|
|
97
|
+
}
|
|
98
|
+
export function typeError(path, expectedType, value) {
|
|
99
|
+
return new TypeError(`Validation error at ${path}: expected ${typeToString(expectedType)}, got ${typeof value === 'object' ? (value === null ? 'null' : Array.isArray(value) ? 'array' : 'object') : typeof value}`);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export { QueryClient, QueryResultImpl as QueryResult } from './QueryClient.js';
|
|
3
|
+
export type { QueryContext } from './QueryClient.js';
|
|
4
|
+
export type { QueryStore } from './QueryStore.js';
|
|
5
|
+
export { query } from './query.js';
|
|
6
|
+
export type { ExtractType } from './query.js';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAE,eAAe,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/E,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,WAAW,EAAE,eAAe,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/E,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { QueryClient } from './QueryClient.js';
|
|
2
|
+
import { ComplexTypeDef, EntityDef, ObjectDef, UnionDef } from './types.js';
|
|
3
|
+
export declare function parseUnionEntities(valueType: number, value: object | unknown[], unionDef: UnionDef, queryClient: QueryClient, entityRefs?: Set<number>): unknown;
|
|
4
|
+
export declare function parseArrayEntities(array: unknown[], arrayShape: ComplexTypeDef, queryClient: QueryClient, entityRefs?: Set<number>): unknown[];
|
|
5
|
+
export declare function parseRecordEntities(record: Record<string, unknown>, recordShape: ComplexTypeDef, queryClient: QueryClient, entityRefs?: Set<number>): Record<string, unknown>;
|
|
6
|
+
export declare function parseObjectEntities(obj: Record<string, unknown>, objectShape: ObjectDef | EntityDef, queryClient: QueryClient, entityRefs?: Set<number>): Record<string, unknown>;
|
|
7
|
+
export declare function parseEntities(value: unknown, def: ComplexTypeDef, queryClient: QueryClient, entityRefs?: Set<number>): unknown;
|
|
8
|
+
//# sourceMappingURL=parseEntities.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parseEntities.d.ts","sourceRoot":"","sources":["../../src/parseEntities.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAGL,cAAc,EACd,SAAS,EAET,SAAS,EAGT,QAAQ,EACT,MAAM,YAAY,CAAC;AAKpB,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,EACzB,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,OAAO,CA+CT;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,EAAE,EAChB,UAAU,EAAE,cAAc,EAC1B,WAAW,EAAE,WAAW,EACxB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,OAAO,EAAE,CAMX;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,WAAW,EAAE,cAAc,EAC3B,WAAW,EAAE,WAAW,EACxB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,WAAW,EAAE,SAAS,GAAG,SAAS,EAClC,WAAW,EAAE,WAAW,EACxB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkDzB;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,OAAO,EACd,GAAG,EAAE,cAAc,EACnB,WAAW,EAAE,WAAW,EACxB,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GACvB,OAAO,CA4CT"}
|