@feltdb/core 0.11.2 → 0.11.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -6
- package/dist/collection.d.ts +11 -1
- package/dist/collection.d.ts.map +1 -1
- package/dist/collection.js +34 -5
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/crates/feltdb/src/lib.rs +31 -30
- package/dist/create/server-source/crates/feltdb/src/semantic_decision.rs +1917 -0
- package/dist/create/server-source/crates/feltdb/tests/semantic_decision.rs +1165 -0
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +232 -95
- package/dist/create/server-source/crates/feltdb-wasm/src/lib.rs +73 -8
- package/dist/db.d.ts +10 -5
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +22 -6
- package/dist/embedded-query.d.ts +43 -0
- package/dist/embedded-query.d.ts.map +1 -0
- package/dist/embedded-query.js +327 -0
- package/dist/feltdb.d.ts +5 -1
- package/dist/feltdb.d.ts.map +1 -1
- package/dist/file-db.d.ts +8 -0
- package/dist/file-db.d.ts.map +1 -1
- package/dist/file-db.js +24 -0
- package/dist/http-db.d.ts +15 -0
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +3 -0
- package/dist/index-core.d.ts +2 -0
- package/dist/index-core.d.ts.map +1 -1
- package/dist/index-core.js +1 -0
- package/dist/index-types.d.ts +5 -1
- package/dist/index-types.d.ts.map +1 -1
- package/dist/indexeddb-db.d.ts +18 -0
- package/dist/indexeddb-db.d.ts.map +1 -1
- package/dist/indexeddb-db.js +28 -0
- package/dist/memory-db.d.ts +8 -0
- package/dist/memory-db.d.ts.map +1 -1
- package/dist/memory-db.js +19 -0
- package/dist/semantic-decision.d.ts +167 -0
- package/dist/semantic-decision.d.ts.map +1 -0
- package/dist/semantic-decision.js +1 -0
- package/dist/studio-app/assets/feltdb_wasm-BGgGSBOP.js +1 -0
- package/dist/studio-app/assets/feltdb_wasm_bg-ClM6Qpod.wasm +0 -0
- package/dist/studio-app/assets/index-ptUom553.js +30 -0
- package/dist/studio-app/index.html +1 -1
- package/dist/wasm/feltdb_wasm.d.ts +20 -0
- package/dist/wasm/feltdb_wasm.js +91 -0
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/wasm/feltdb_wasm_bg.wasm.d.ts +4 -0
- package/package.json +2 -2
- package/dist/studio-app/assets/feltdb_wasm-Dlr_kLlk.js +0 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-CkozAQKb.wasm +0 -0
- package/dist/studio-app/assets/index-H_L5pjur.js +0 -30
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
const now = () => typeof performance !== 'undefined' ? performance.now() : Date.now();
|
|
2
|
+
function compareValue(left, right) {
|
|
3
|
+
if (left === right)
|
|
4
|
+
return 0;
|
|
5
|
+
if ((left === undefined || left === null) && (right === undefined || right === null))
|
|
6
|
+
return 0;
|
|
7
|
+
if (left === undefined || left === null)
|
|
8
|
+
return -1;
|
|
9
|
+
if (right === undefined || right === null)
|
|
10
|
+
return 1;
|
|
11
|
+
if (typeof left === 'number' && typeof right === 'number')
|
|
12
|
+
return left < right ? -1 : 1;
|
|
13
|
+
return String(left).localeCompare(String(right));
|
|
14
|
+
}
|
|
15
|
+
function fields(config) {
|
|
16
|
+
if (config.fields?.length)
|
|
17
|
+
return config.fields.map((field, index) => ({ field, direction: config.directions?.[index] ?? 'asc' }));
|
|
18
|
+
if (config.field)
|
|
19
|
+
return [{ field: config.field, direction: config.direction ?? 'asc' }];
|
|
20
|
+
return [];
|
|
21
|
+
}
|
|
22
|
+
function recordId(collection, key, _record) {
|
|
23
|
+
return key.slice(collection.length + 1);
|
|
24
|
+
}
|
|
25
|
+
function bucketKey(value) {
|
|
26
|
+
return `${typeof value}:${JSON.stringify(value)}`;
|
|
27
|
+
}
|
|
28
|
+
function compareBySpecs(collection, specs, left, right) {
|
|
29
|
+
for (const spec of specs) {
|
|
30
|
+
const compared = compareValue(left.record[spec.field], right.record[spec.field]);
|
|
31
|
+
if (compared)
|
|
32
|
+
return spec.direction === 'asc' ? compared : -compared;
|
|
33
|
+
}
|
|
34
|
+
return recordId(collection, left.key, left.record).localeCompare(recordId(collection, right.key, right.record));
|
|
35
|
+
}
|
|
36
|
+
function conditionMatches(record, condition) {
|
|
37
|
+
const actual = record[condition.field];
|
|
38
|
+
if ('eq' in condition && actual !== condition.eq)
|
|
39
|
+
return false;
|
|
40
|
+
if ('neq' in condition && actual === condition.neq)
|
|
41
|
+
return false;
|
|
42
|
+
if ('lt' in condition && compareValue(actual, condition.lt) >= 0)
|
|
43
|
+
return false;
|
|
44
|
+
if ('lte' in condition && compareValue(actual, condition.lte) > 0)
|
|
45
|
+
return false;
|
|
46
|
+
if ('gt' in condition && compareValue(actual, condition.gt) <= 0)
|
|
47
|
+
return false;
|
|
48
|
+
if ('gte' in condition && compareValue(actual, condition.gte) < 0)
|
|
49
|
+
return false;
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
function binding(query) {
|
|
53
|
+
const shape = JSON.stringify({ collection: query.collection, where: query.where ?? [], orderBy: query.orderBy ?? [], limit: query.limit });
|
|
54
|
+
let hash = 0xcbf29ce484222325n;
|
|
55
|
+
for (let index = 0; index < shape.length; index += 1) {
|
|
56
|
+
hash ^= BigInt(shape.charCodeAt(index));
|
|
57
|
+
hash = BigInt.asUintN(64, hash * 0x100000001b3n);
|
|
58
|
+
}
|
|
59
|
+
return hash.toString(16).padStart(16, '0');
|
|
60
|
+
}
|
|
61
|
+
function encode(value) {
|
|
62
|
+
const json = JSON.stringify(value);
|
|
63
|
+
if (typeof Buffer !== 'undefined')
|
|
64
|
+
return Buffer.from(json).toString('base64url');
|
|
65
|
+
return btoa(unescape(encodeURIComponent(json))).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
66
|
+
}
|
|
67
|
+
function decode(cursor, expectedBinding) {
|
|
68
|
+
try {
|
|
69
|
+
const json = typeof Buffer !== 'undefined'
|
|
70
|
+
? Buffer.from(cursor, 'base64url').toString('utf8')
|
|
71
|
+
: (() => {
|
|
72
|
+
const base64 = cursor.replace(/-/g, '+').replace(/_/g, '/');
|
|
73
|
+
return decodeURIComponent(escape(atob(base64.padEnd(Math.ceil(base64.length / 4) * 4, '='))));
|
|
74
|
+
})();
|
|
75
|
+
const value = JSON.parse(json);
|
|
76
|
+
if (value.v !== 1 || value.binding !== expectedBinding || !Array.isArray(value.values) || typeof value.key !== 'string')
|
|
77
|
+
throw new Error();
|
|
78
|
+
return value;
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
throw new Error('INVALID_CURSOR: cursor is malformed or does not match this query');
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** Small deterministic planner/executor owned by an embedded storage boundary. */
|
|
85
|
+
export class EmbeddedQueryEngine {
|
|
86
|
+
allRows;
|
|
87
|
+
indexes = new Map();
|
|
88
|
+
constructor(allRows) {
|
|
89
|
+
this.allRows = allRows;
|
|
90
|
+
this.rebuild();
|
|
91
|
+
}
|
|
92
|
+
rebuild() {
|
|
93
|
+
this.indexes.clear();
|
|
94
|
+
const rows = [...this.allRows()];
|
|
95
|
+
for (const [key, value] of rows)
|
|
96
|
+
this.installDefinition(key, value, rows);
|
|
97
|
+
}
|
|
98
|
+
apply(key, value) {
|
|
99
|
+
if (key.startsWith('__indexes__:')) {
|
|
100
|
+
if (value === undefined)
|
|
101
|
+
this.indexes.delete(key);
|
|
102
|
+
else
|
|
103
|
+
this.installDefinition(key, value, [...this.allRows()]);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const separator = key.indexOf(':');
|
|
107
|
+
if (separator < 1)
|
|
108
|
+
return;
|
|
109
|
+
const collection = key.slice(0, separator);
|
|
110
|
+
for (const index of this.indexes.values()) {
|
|
111
|
+
if (index.collection !== collection)
|
|
112
|
+
continue;
|
|
113
|
+
const old = index.byKey.get(key);
|
|
114
|
+
if (old) {
|
|
115
|
+
const oldBucket = index.buckets.get(bucketKey(old.record[index.fields[0].field]));
|
|
116
|
+
const position = oldBucket?.findIndex(entry => entry.key === key) ?? -1;
|
|
117
|
+
if (position >= 0)
|
|
118
|
+
oldBucket.splice(position, 1);
|
|
119
|
+
index.byKey.delete(key);
|
|
120
|
+
}
|
|
121
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
122
|
+
const entry = { key, record: value };
|
|
123
|
+
const keyForBucket = bucketKey(entry.record[index.fields[0].field]);
|
|
124
|
+
let bucket = index.buckets.get(keyForBucket);
|
|
125
|
+
if (!bucket) {
|
|
126
|
+
bucket = [];
|
|
127
|
+
index.buckets.set(keyForBucket, bucket);
|
|
128
|
+
}
|
|
129
|
+
let low = 0, high = bucket.length;
|
|
130
|
+
while (low < high) {
|
|
131
|
+
const middle = (low + high) >>> 1;
|
|
132
|
+
if (compareBySpecs(collection, index.fields, bucket[middle], entry) <= 0)
|
|
133
|
+
low = middle + 1;
|
|
134
|
+
else
|
|
135
|
+
high = middle;
|
|
136
|
+
}
|
|
137
|
+
bucket.splice(low, 0, entry);
|
|
138
|
+
index.byKey.set(key, entry);
|
|
139
|
+
}
|
|
140
|
+
index.globalDirty = true;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
installDefinition(key, value, rows) {
|
|
144
|
+
const parts = key.split(':');
|
|
145
|
+
if (parts.length < 3 || parts[0] !== '__indexes__' || !value || typeof value !== 'object')
|
|
146
|
+
return;
|
|
147
|
+
const config = value.config;
|
|
148
|
+
if (!config?.name)
|
|
149
|
+
return;
|
|
150
|
+
const collection = parts[1];
|
|
151
|
+
const indexFields = fields(config);
|
|
152
|
+
if (!indexFields.length || config.type === 'text')
|
|
153
|
+
return;
|
|
154
|
+
const prefix = `${collection}:`;
|
|
155
|
+
const entries = rows
|
|
156
|
+
.filter(([rowKey, row]) => rowKey.startsWith(prefix) && row && typeof row === 'object' && !Array.isArray(row))
|
|
157
|
+
.map(([rowKey, row]) => ({ key: rowKey, record: row }));
|
|
158
|
+
entries.sort((left, right) => compareBySpecs(collection, indexFields, left, right));
|
|
159
|
+
const buckets = new Map();
|
|
160
|
+
for (const entry of entries) {
|
|
161
|
+
const keyForBucket = bucketKey(entry.record[indexFields[0].field]);
|
|
162
|
+
const bucket = buckets.get(keyForBucket) ?? [];
|
|
163
|
+
bucket.push(entry);
|
|
164
|
+
buckets.set(keyForBucket, bucket);
|
|
165
|
+
}
|
|
166
|
+
this.indexes.set(key, { collection, config, fields: indexFields, entries, byKey: new Map(entries.map(entry => [entry.key, entry])), buckets, globalDirty: false });
|
|
167
|
+
}
|
|
168
|
+
plan(query) {
|
|
169
|
+
const equality = new Map((query.where ?? []).filter(value => 'eq' in value).map(value => [value.field, value.eq]));
|
|
170
|
+
const requested = query.orderBy ?? [];
|
|
171
|
+
for (const index of this.indexes.values()) {
|
|
172
|
+
if (index.collection !== query.collection)
|
|
173
|
+
continue;
|
|
174
|
+
let prefix = 0;
|
|
175
|
+
while (prefix < index.fields.length && equality.has(index.fields[prefix].field))
|
|
176
|
+
prefix += 1;
|
|
177
|
+
if (prefix === 0 && (query.where?.length ?? 0) > 0)
|
|
178
|
+
continue;
|
|
179
|
+
const remaining = index.fields.slice(prefix);
|
|
180
|
+
const exact = requested.every((order, offset) => remaining[offset]?.field === order.field && remaining[offset]?.direction === order.direction);
|
|
181
|
+
const automaticIdTie = remaining.length === requested.length;
|
|
182
|
+
const declaredIdTie = remaining.length === requested.length + 1 && remaining.at(-1)?.field === 'id' && remaining.at(-1)?.direction === 'asc';
|
|
183
|
+
if (requested.length && (!exact || (!automaticIdTie && !declaredIdTie)))
|
|
184
|
+
continue;
|
|
185
|
+
return {
|
|
186
|
+
index,
|
|
187
|
+
explanation: { plan: requested.length ? 'index-range' : 'index-filter', index: index.config.name, order: this.orderDescription(query), limit: query.limit, cursor: Boolean(query.cursor) },
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return { explanation: { plan: 'full-scan', reason: 'no compatible index', order: this.orderDescription(query), limit: query.limit, cursor: Boolean(query.cursor) } };
|
|
191
|
+
}
|
|
192
|
+
explain(query) {
|
|
193
|
+
this.validate(query);
|
|
194
|
+
return this.plan(query).explanation;
|
|
195
|
+
}
|
|
196
|
+
execute(query) {
|
|
197
|
+
this.validate(query);
|
|
198
|
+
const started = now();
|
|
199
|
+
const planned = this.plan(query);
|
|
200
|
+
const stats = { scanned: 0, decoded: 0, matched: 0, sorted: 0, materialized: 0, returned: 0, usedIndex: Boolean(planned.index), indexName: planned.index?.config.name, indexLookupMs: 0, executionMs: 0 };
|
|
201
|
+
const conditions = query.where ?? [];
|
|
202
|
+
const order = query.orderBy ?? [];
|
|
203
|
+
const outputSpecs = order.map(value => ({ field: value.field, direction: value.direction }));
|
|
204
|
+
const cursor = query.cursor ? decode(query.cursor, binding(query)) : undefined;
|
|
205
|
+
const range = planned.index
|
|
206
|
+
? this.indexRange(planned.index, conditions)
|
|
207
|
+
: (() => {
|
|
208
|
+
const entries = [...this.allRows()].filter(([key]) => key.startsWith(`${query.collection}:`)).map(([key, value]) => ({ key, record: value }));
|
|
209
|
+
return { entries, start: 0, end: entries.length };
|
|
210
|
+
})();
|
|
211
|
+
const candidates = range.entries;
|
|
212
|
+
let candidateStart = range.start;
|
|
213
|
+
if (planned.index && cursor) {
|
|
214
|
+
let low = range.start;
|
|
215
|
+
let high = range.end;
|
|
216
|
+
while (low < high) {
|
|
217
|
+
const middle = (low + high) >>> 1;
|
|
218
|
+
if (this.compareEntryCursor(query.collection, outputSpecs, candidates[middle], cursor) <= 0)
|
|
219
|
+
low = middle + 1;
|
|
220
|
+
else
|
|
221
|
+
high = middle;
|
|
222
|
+
}
|
|
223
|
+
candidateStart = low;
|
|
224
|
+
}
|
|
225
|
+
let matching = [];
|
|
226
|
+
const lookupStarted = now();
|
|
227
|
+
for (let candidateIndex = candidateStart; candidateIndex < range.end; candidateIndex += 1) {
|
|
228
|
+
const entry = candidates[candidateIndex];
|
|
229
|
+
stats.scanned += 1;
|
|
230
|
+
if (!entry.record || typeof entry.record !== 'object' || !conditions.every(condition => conditionMatches(entry.record, condition)))
|
|
231
|
+
continue;
|
|
232
|
+
stats.matched += 1;
|
|
233
|
+
matching.push(entry);
|
|
234
|
+
if (planned.index && matching.length > query.limit)
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
stats.indexLookupMs = planned.index ? now() - lookupStarted : 0;
|
|
238
|
+
const fullScanMaterialized = matching.length;
|
|
239
|
+
if (!planned.index) {
|
|
240
|
+
matching.sort((left, right) => compareBySpecs(query.collection, outputSpecs, left, right));
|
|
241
|
+
stats.sorted = matching.length;
|
|
242
|
+
if (cursor)
|
|
243
|
+
matching = matching.filter(entry => this.afterCursor(query.collection, outputSpecs, entry, cursor));
|
|
244
|
+
}
|
|
245
|
+
const hasMore = matching.length > query.limit;
|
|
246
|
+
const pageEntries = matching.slice(0, query.limit);
|
|
247
|
+
const records = pageEntries.map(entry => entry.record);
|
|
248
|
+
stats.materialized = planned.index ? records.length : fullScanMaterialized;
|
|
249
|
+
stats.returned = records.length;
|
|
250
|
+
stats.executionMs = now() - started;
|
|
251
|
+
const last = pageEntries.at(-1);
|
|
252
|
+
const nextCursor = hasMore && last ? encode({ v: 1, binding: binding(query), values: order.map(value => last.record[value.field]), key: recordId(query.collection, last.key, last.record) }) : undefined;
|
|
253
|
+
return {
|
|
254
|
+
records,
|
|
255
|
+
...(nextCursor ? { nextCursor } : {}),
|
|
256
|
+
exhausted: !nextCursor,
|
|
257
|
+
stats,
|
|
258
|
+
plan: { access_method: planned.explanation.plan, actual_rows_scanned: stats.scanned, actual_rows_returned: stats.returned, matching_records: stats.matched, index: stats.indexName, scan_fallback: !stats.usedIndex },
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
afterCursor(collection, order, entry, cursor) {
|
|
262
|
+
return this.compareEntryCursor(collection, order, entry, cursor) > 0;
|
|
263
|
+
}
|
|
264
|
+
compareEntryCursor(collection, order, entry, cursor) {
|
|
265
|
+
for (let index = 0; index < order.length; index += 1) {
|
|
266
|
+
const compared = compareValue(entry.record[order[index].field], cursor.values[index]);
|
|
267
|
+
if (compared)
|
|
268
|
+
return order[index].direction === 'asc' ? compared : -compared;
|
|
269
|
+
}
|
|
270
|
+
return recordId(collection, entry.key, entry.record).localeCompare(cursor.key);
|
|
271
|
+
}
|
|
272
|
+
indexRange(index, conditions) {
|
|
273
|
+
const equality = new Map(conditions.filter(value => 'eq' in value).map(value => [value.field, value.eq]));
|
|
274
|
+
let count = 0;
|
|
275
|
+
while (count < index.fields.length && equality.has(index.fields[count].field))
|
|
276
|
+
count += 1;
|
|
277
|
+
if (count === 0) {
|
|
278
|
+
if (index.globalDirty) {
|
|
279
|
+
index.entries = [...index.byKey.values()].sort((left, right) => compareBySpecs(index.collection, index.fields, left, right));
|
|
280
|
+
index.globalDirty = false;
|
|
281
|
+
}
|
|
282
|
+
return { entries: index.entries, start: 0, end: index.entries.length };
|
|
283
|
+
}
|
|
284
|
+
const entries = index.buckets.get(bucketKey(equality.get(index.fields[0].field))) ?? [];
|
|
285
|
+
if (count === 1)
|
|
286
|
+
return { entries, start: 0, end: entries.length };
|
|
287
|
+
const comparePrefix = (entry) => {
|
|
288
|
+
for (let position = 0; position < count; position += 1) {
|
|
289
|
+
const spec = index.fields[position];
|
|
290
|
+
const compared = compareValue(entry.record[spec.field], equality.get(spec.field));
|
|
291
|
+
if (compared)
|
|
292
|
+
return spec.direction === 'asc' ? compared : -compared;
|
|
293
|
+
}
|
|
294
|
+
return 0;
|
|
295
|
+
};
|
|
296
|
+
let low = 0, high = entries.length;
|
|
297
|
+
while (low < high) {
|
|
298
|
+
const middle = (low + high) >>> 1;
|
|
299
|
+
if (comparePrefix(entries[middle]) < 0)
|
|
300
|
+
low = middle + 1;
|
|
301
|
+
else
|
|
302
|
+
high = middle;
|
|
303
|
+
}
|
|
304
|
+
const start = low;
|
|
305
|
+
high = entries.length;
|
|
306
|
+
while (low < high) {
|
|
307
|
+
const middle = (low + high) >>> 1;
|
|
308
|
+
if (comparePrefix(entries[middle]) <= 0)
|
|
309
|
+
low = middle + 1;
|
|
310
|
+
else
|
|
311
|
+
high = middle;
|
|
312
|
+
}
|
|
313
|
+
return { entries, start, end: low };
|
|
314
|
+
}
|
|
315
|
+
orderDescription(query) {
|
|
316
|
+
return [...(query.orderBy ?? []).map(value => `${value.field} ${value.direction.toUpperCase()}`), 'id ASC'].join(', ');
|
|
317
|
+
}
|
|
318
|
+
validate(query) {
|
|
319
|
+
if (!query.collection?.trim() || !Number.isInteger(query.limit) || query.limit < 1 || query.limit > 1_000)
|
|
320
|
+
throw new Error('INVALID_QUERY: collection and a limit between 1 and 1000 are required');
|
|
321
|
+
for (const condition of query.where ?? []) {
|
|
322
|
+
const operators = ['eq', 'neq', 'lt', 'lte', 'gt', 'gte'].filter(operator => operator in condition);
|
|
323
|
+
if (!condition.field || operators.length !== 1)
|
|
324
|
+
throw new Error('INVALID_QUERY: each condition requires one operator');
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
package/dist/feltdb.d.ts
CHANGED
|
@@ -40,8 +40,12 @@ export interface JsDb {
|
|
|
40
40
|
* Query data
|
|
41
41
|
*/
|
|
42
42
|
query(query: string): any | Promise<any>;
|
|
43
|
-
/** Execute a bounded query
|
|
43
|
+
/** Execute a bounded query at the runtime's storage boundary. */
|
|
44
44
|
authority_query?(query: unknown): Promise<unknown>;
|
|
45
|
+
/** Explain a bounded query without executing it. */
|
|
46
|
+
explain_query?(query: unknown): unknown | Promise<unknown>;
|
|
47
|
+
/** Rebuild derived embedded indexes from authoritative records. */
|
|
48
|
+
rebuild_indexes?(): void | Promise<void>;
|
|
45
49
|
/**
|
|
46
50
|
* Get a record
|
|
47
51
|
*/
|
package/dist/feltdb.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feltdb.d.ts","sourceRoot":"","sources":["../src/feltdb.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEpE;;GAEG;AACH,MAAM,WAAW,IAAI;IACnB;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,GAAG,GAAG,GAAG,CAAC;IAEhC;;OAEG;IACH,SAAS,IAAI,GAAG,CAAC;IAEjB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;IAE/B;;OAEG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;IAEpC;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,CAAC;IAEvC;;OAEG;IACH,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,GAAG,CAAC;IAEnE;;OAEG;IACH,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;IAEpE;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAEzC,
|
|
1
|
+
{"version":3,"file":"feltdb.d.ts","sourceRoot":"","sources":["../src/feltdb.ts"],"names":[],"mappings":"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"}
|
package/dist/file-db.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { JsDb } from './feltdb.js';
|
|
|
2
2
|
import type { FreshnessCapability } from './freshness.js';
|
|
3
3
|
import type { OperationAdmissionInput, OperationAdmissionResult, OperationTransitionInput, OperationTransitionResult } from './operation-admission.js';
|
|
4
4
|
import type { AtomicTransactionRequest, AtomicTransactionResult } from './transaction.js';
|
|
5
|
+
import type { AuthorityQueryRequest } from './http-db.js';
|
|
5
6
|
interface JsResult {
|
|
6
7
|
success: boolean;
|
|
7
8
|
data?: string;
|
|
@@ -27,6 +28,8 @@ export declare class FileJsDb implements JsDb {
|
|
|
27
28
|
private lockFd;
|
|
28
29
|
private lockToken;
|
|
29
30
|
private readonly applied;
|
|
31
|
+
private readonly queryEngine;
|
|
32
|
+
private indexedSequence;
|
|
30
33
|
constructor(path: string);
|
|
31
34
|
private loadState;
|
|
32
35
|
private loadStateFromBackup;
|
|
@@ -59,6 +62,11 @@ export declare class FileJsDb implements JsDb {
|
|
|
59
62
|
get(key: string): JsResult;
|
|
60
63
|
delete(key: string): JsResult;
|
|
61
64
|
query(capability: string): JsResult;
|
|
65
|
+
authority_query<T = Record<string, unknown>>(query: AuthorityQueryRequest): Promise<import("./http-db.js").AuthorityQueryPage<T> & {
|
|
66
|
+
stats: import("./embedded-query.js").EmbeddedQueryStats;
|
|
67
|
+
}>;
|
|
68
|
+
explain_query(query: AuthorityQueryRequest): import("./embedded-query.js").EmbeddedQueryExplanation;
|
|
69
|
+
rebuild_indexes(): void;
|
|
62
70
|
get_capability_records(capability: string): JsResult;
|
|
63
71
|
execute_op(): JsResult;
|
|
64
72
|
sync_info(): JsResult;
|
package/dist/file-db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file-db.d.ts","sourceRoot":"","sources":["../src/file-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EACV,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,yBAAyB,EAG1B,MAAM,0BAA0B,CAAC;AAalC,OAAO,KAAK,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"file-db.d.ts","sourceRoot":"","sources":["../src/file-db.ts"],"names":[],"mappings":"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"}
|
package/dist/file-db.js
CHANGED
|
@@ -3,6 +3,7 @@ import { FeltDBErrorCode, FeltDBServiceError } from './error-codes.js';
|
|
|
3
3
|
import * as nodeFs from 'fs';
|
|
4
4
|
import * as nodePath from 'path';
|
|
5
5
|
import { decideTransaction, embeddedResult, EmbeddedTransactionRejected, } from './embedded-transaction.js';
|
|
6
|
+
import { EmbeddedQueryEngine } from './embedded-query.js';
|
|
6
7
|
// Synchronous versions for sync API (will throw if called in browser)
|
|
7
8
|
function getFsSync() {
|
|
8
9
|
if (typeof nodeFs.existsSync === 'function')
|
|
@@ -24,6 +25,8 @@ export class FileJsDb {
|
|
|
24
25
|
lockFd = null;
|
|
25
26
|
lockToken = null;
|
|
26
27
|
applied = new Set();
|
|
28
|
+
queryEngine;
|
|
29
|
+
indexedSequence = -1;
|
|
27
30
|
constructor(path) {
|
|
28
31
|
const nodePath = getPathSync();
|
|
29
32
|
const nodeFs = getFsSync();
|
|
@@ -50,6 +53,8 @@ export class FileJsDb {
|
|
|
50
53
|
for (const transactionId of this.state.applied_transactions ?? []) {
|
|
51
54
|
this.applied.add(transactionId);
|
|
52
55
|
}
|
|
56
|
+
this.queryEngine = new EmbeddedQueryEngine(() => Object.entries(this.state.rows));
|
|
57
|
+
this.indexedSequence = this.state.sequence;
|
|
53
58
|
}
|
|
54
59
|
loadState() {
|
|
55
60
|
const nodeFs = getFsSync();
|
|
@@ -274,6 +279,10 @@ export class FileJsDb {
|
|
|
274
279
|
this.applied.clear();
|
|
275
280
|
for (const transactionId of this.state.applied_transactions ?? [])
|
|
276
281
|
this.applied.add(transactionId);
|
|
282
|
+
if (this.queryEngine && this.indexedSequence !== this.state.sequence) {
|
|
283
|
+
this.queryEngine.rebuild();
|
|
284
|
+
this.indexedSequence = this.state.sequence;
|
|
285
|
+
}
|
|
277
286
|
}
|
|
278
287
|
saveState() {
|
|
279
288
|
const nodeFs = getFsSync();
|
|
@@ -343,6 +352,8 @@ export class FileJsDb {
|
|
|
343
352
|
origin: this.origin,
|
|
344
353
|
id: `${this.origin}:${timestamp}:${this.state.sequence}`
|
|
345
354
|
});
|
|
355
|
+
this.queryEngine?.apply(key, type === 'put' ? this.state.rows[key] : undefined);
|
|
356
|
+
this.indexedSequence = this.state.sequence;
|
|
346
357
|
}
|
|
347
358
|
/**
|
|
348
359
|
* Commit several operations atomically and durably.
|
|
@@ -480,6 +491,19 @@ export class FileJsDb {
|
|
|
480
491
|
.map(([, value]) => value);
|
|
481
492
|
return { success: true, data: JSON.stringify(values) };
|
|
482
493
|
}
|
|
494
|
+
async authority_query(query) {
|
|
495
|
+
this.refresh();
|
|
496
|
+
return this.queryEngine.execute(query);
|
|
497
|
+
}
|
|
498
|
+
explain_query(query) {
|
|
499
|
+
this.refresh();
|
|
500
|
+
return this.queryEngine.explain(query);
|
|
501
|
+
}
|
|
502
|
+
rebuild_indexes() {
|
|
503
|
+
this.refresh();
|
|
504
|
+
this.queryEngine.rebuild();
|
|
505
|
+
this.indexedSequence = this.state.sequence;
|
|
506
|
+
}
|
|
483
507
|
get_capability_records(capability) {
|
|
484
508
|
return this.query(capability);
|
|
485
509
|
}
|
package/dist/http-db.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { JsDb } from './feltdb.js';
|
|
2
2
|
import type { FreshnessCapability, Revision } from './freshness.js';
|
|
3
3
|
import type { AuthorityScope } from './authority-scope.js';
|
|
4
|
+
import type { DecisionTransportExecutionRequest, DecisionTransportExecutionResponse } from './semantic-decision.js';
|
|
4
5
|
import { type ManagedClientHealth } from './managed-recovery.js';
|
|
5
6
|
interface JsResult {
|
|
6
7
|
success: boolean;
|
|
@@ -56,6 +57,19 @@ export interface AuthorityQueryPage<T = Record<string, unknown>> {
|
|
|
56
57
|
records: T[];
|
|
57
58
|
nextCursor?: string;
|
|
58
59
|
exhausted: boolean;
|
|
60
|
+
/** Embedded execution diagnostics; omitted by runtimes that cannot report them. */
|
|
61
|
+
stats?: {
|
|
62
|
+
scanned: number;
|
|
63
|
+
decoded: number;
|
|
64
|
+
matched: number;
|
|
65
|
+
sorted: number;
|
|
66
|
+
materialized: number;
|
|
67
|
+
returned: number;
|
|
68
|
+
usedIndex: boolean;
|
|
69
|
+
indexName?: string;
|
|
70
|
+
indexLookupMs: number;
|
|
71
|
+
executionMs: number;
|
|
72
|
+
};
|
|
59
73
|
/** Server execution evidence; present on canonical managed queries. */
|
|
60
74
|
plan?: {
|
|
61
75
|
access_method?: string;
|
|
@@ -248,6 +262,7 @@ export declare class HttpJsDb implements JsDb {
|
|
|
248
262
|
application_request<T>(path: string, init?: RequestInit): Promise<T>;
|
|
249
263
|
/** Canonical HTTP adapter used by the typed public substrate contract. */
|
|
250
264
|
public_request<T>(path: string, init?: RequestInit): Promise<T>;
|
|
265
|
+
execute_semantic_decision(request: DecisionTransportExecutionRequest): Promise<DecisionTransportExecutionResponse>;
|
|
251
266
|
/**
|
|
252
267
|
* Subscribe to change notifications.
|
|
253
268
|
*
|
package/dist/http-db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http-db.d.ts","sourceRoot":"","sources":["../src/http-db.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAEpE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"http-db.d.ts","sourceRoot":"","sources":["../src/http-db.ts"],"names":[],"mappings":"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"}
|
package/dist/http-db.js
CHANGED
|
@@ -697,6 +697,9 @@ export class HttpJsDb {
|
|
|
697
697
|
this.recordSuccess();
|
|
698
698
|
return body;
|
|
699
699
|
}
|
|
700
|
+
async execute_semantic_decision(request) {
|
|
701
|
+
return this.application_request('/experimental/semantic-decisions', { method: 'POST', body: JSON.stringify(request) });
|
|
702
|
+
}
|
|
700
703
|
/**
|
|
701
704
|
* Subscribe to change notifications.
|
|
702
705
|
*
|
package/dist/index-core.d.ts
CHANGED
|
@@ -21,6 +21,7 @@ export * from './index-store.js';
|
|
|
21
21
|
export * from './index-recovery.js';
|
|
22
22
|
export * from './query-planner.js';
|
|
23
23
|
export type { AuthorityQueryPage, AuthorityQueryRequest } from './http-db.js';
|
|
24
|
+
export type { EmbeddedQueryExplanation, EmbeddedQueryStats } from './embedded-query.js';
|
|
24
25
|
export * from './index-analytics.js';
|
|
25
26
|
export * from './analytics-backend.js';
|
|
26
27
|
export * from './index-dashboard.js';
|
|
@@ -45,6 +46,7 @@ export * from './authority-scope.js';
|
|
|
45
46
|
export * from './managed-recovery.js';
|
|
46
47
|
export * from './public-contract.js';
|
|
47
48
|
export * from './authorization.js';
|
|
49
|
+
export * from './semantic-decision.js';
|
|
48
50
|
export * from './sync-contract.js';
|
|
49
51
|
export * from './workload.js';
|
|
50
52
|
export * from './worker.js';
|
package/dist/index-core.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-core.d.ts","sourceRoot":"","sources":["../src/index-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC9E,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,KAAK,OAAO,EACZ,KAAK,SAAS,IAAI,iBAAiB,EACnC,KAAK,QAAQ,IAAI,gBAAgB,GAClC,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AAEnC;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACnE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzE;;GAEG;AACH,YAAY,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index-core.d.ts","sourceRoot":"","sources":["../src/index-core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,qBAAqB,CAAC;AACpC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AACnC,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACxF,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,2BAA2B,CAAC;AAC1C,cAAc,qBAAqB,CAAC;AACpC,cAAc,wBAAwB,CAAC;AACvC,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,kBAAkB,CAAC;AACjC,cAAc,aAAa,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,KAAK,OAAO,EACZ,KAAK,SAAS,IAAI,iBAAiB,EACnC,KAAK,QAAQ,IAAI,gBAAgB,GAClC,MAAM,eAAe,CAAC;AAEvB;;GAEG;AACH,cAAc,YAAY,CAAC;AAC3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AAEnC;;GAEG;AACH,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACnE,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzE;;GAEG;AACH,YAAY,EACV,eAAe,EACf,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,SAAS,CAAC;AAEjB;;;;GAIG;AACH,cAAc,wBAAwB,CAAC;AACvC,cAAc,iCAAiC,CAAC"}
|
package/dist/index-core.js
CHANGED
|
@@ -44,6 +44,7 @@ export * from './authority-scope.js';
|
|
|
44
44
|
export * from './managed-recovery.js';
|
|
45
45
|
export * from './public-contract.js';
|
|
46
46
|
export * from './authorization.js';
|
|
47
|
+
export * from './semantic-decision.js';
|
|
47
48
|
export * from './sync-contract.js';
|
|
48
49
|
export * from './workload.js';
|
|
49
50
|
export * from './worker.js';
|
package/dist/index-types.d.ts
CHANGED
|
@@ -11,8 +11,12 @@ export interface IndexConfig {
|
|
|
11
11
|
type: IndexType;
|
|
12
12
|
/** For single-field indexes: the field name */
|
|
13
13
|
field?: string;
|
|
14
|
-
/**
|
|
14
|
+
/** Sort direction for a single-field sorted index. Defaults to ascending. */
|
|
15
|
+
direction?: 'asc' | 'desc';
|
|
16
|
+
/** For compound indexes: ordered field names. */
|
|
15
17
|
fields?: string[];
|
|
18
|
+
/** Back-compatible directions for string-valued compound `fields`. */
|
|
19
|
+
directions?: Array<'asc' | 'desc'>;
|
|
16
20
|
/** For text indexes: fields to search */
|
|
17
21
|
textFields?: string[];
|
|
18
22
|
/** Whether to maintain the index in-memory */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-types.d.ts","sourceRoot":"","sources":["../src/index-types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAEhE,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IAEb,mDAAmD;IACnD,IAAI,EAAE,SAAS,CAAC;IAEhB,+CAA+C;IAC/C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAElB,yCAAyC;IACzC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAEtB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,+CAA+C;IAC/C,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG;IAC1C,GAAG,EAAE,CAAC,CAAC;IACP,MAAM,EAAE,CAAC,EAAE,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,IAAI,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,CAAC;IAC1F,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,GAAG,CAAC,EAAE,GAAG,CAAC;IACV,GAAG,CAAC,EAAE,GAAG,CAAC;CACX;AAED;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,OAAO,GAAG,MAAM,CAAC;IAC3B,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4CAA4C;IAC5C,kBAAkB,EAAE,MAAM,CAAC;IAC3B,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,WAAW,GAAG,YAAY,GAAG,aAAa,GAAG,YAAY,CAAC;IACpE,OAAO,EAAE,aAAa,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd"}
|
|
1
|
+
{"version":3,"file":"index-types.d.ts","sourceRoot":"","sources":["../src/index-types.ts"],"names":[],"mappings":"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"}
|
package/dist/indexeddb-db.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { JsDb } from './feltdb.js';
|
|
2
2
|
import { type FreshnessCapability, type Revision } from './freshness.js';
|
|
3
3
|
import type { AtomicTransactionRequest, AtomicTransactionResult } from './transaction.js';
|
|
4
|
+
import type { AuthorityQueryRequest } from './http-db.js';
|
|
4
5
|
interface JsResult {
|
|
5
6
|
success: boolean;
|
|
6
7
|
data?: string;
|
|
@@ -59,6 +60,23 @@ export declare class IndexedDbJsDb implements JsDb {
|
|
|
59
60
|
}>;
|
|
60
61
|
get(key: string): Promise<JsResult>;
|
|
61
62
|
query(collection: string): Promise<JsResult>;
|
|
63
|
+
/**
|
|
64
|
+
* Browser bounded-query fallback. IndexedDB schema indexes are static, so a
|
|
65
|
+
* dynamically declared FeltDB index is not claimed here until it has a
|
|
66
|
+
* durable object-store representation. The fallback stays correct and its
|
|
67
|
+
* plan truthfully reports a full scan.
|
|
68
|
+
*/
|
|
69
|
+
authority_query<T = Record<string, unknown>>(query: AuthorityQueryRequest): Promise<import("./http-db.js").AuthorityQueryPage<T> & {
|
|
70
|
+
stats: import("./embedded-query.js").EmbeddedQueryStats;
|
|
71
|
+
}>;
|
|
72
|
+
explain_query(query: AuthorityQueryRequest): {
|
|
73
|
+
plan: string;
|
|
74
|
+
reason: string;
|
|
75
|
+
order: string;
|
|
76
|
+
limit: number;
|
|
77
|
+
cursor: boolean;
|
|
78
|
+
};
|
|
79
|
+
rebuild_indexes(): void;
|
|
62
80
|
private request;
|
|
63
81
|
subscribe_changes(callback: ChangeListener, collection?: string): () => void;
|
|
64
82
|
private readonly receiveChangeMessage;
|