sliftutils 1.4.81 → 1.4.83

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.
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.namespaceDatabase = void 0;
4
+ function namespaceDatabase(database, into) {
5
+ return {
6
+ readData: (deref) => database.readData(root => deref(into(root))),
7
+ writeData: (deref, newValue) => database.writeData(root => deref(into(root)), newValue),
8
+ deleteData: (deref) => database.deleteData(root => deref(into(root))),
9
+ };
10
+ }
11
+ exports.namespaceDatabase = namespaceDatabase;
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGF0YWJhc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJEYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFPQSxTQUFnQixpQkFBaUIsQ0FDN0IsUUFBd0IsRUFDeEIsSUFBeUI7SUFFekIsT0FBTztRQUNILFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNqRSxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQztRQUN2RixVQUFVLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDeEUsQ0FBQztBQUNOLENBQUM7QUFURCw4Q0FTQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHVuZGVmaW5lZCBmcm9tIGEgcmVhZCBtZWFucyBcIm5vdCBzeW5jZWQgeWV0XCIsIE5PVCBcImFic2VudFwiIOKAlCBzdG9yYWdlIGluaXRpYWxpemVzIG9uIGl0cyBvd24uIFNvIHJlYWQgZXZlcnl0aGluZyBhIHN0YWdlIG5lZWRzIGluIG9uZSByZWFkRGF0YSBhbmQgYmFpbCBpZiB0aGUgd2hvbGUgcmVzdWx0IGlzIHVuZGVmaW5lZDsgdGhlIGRhdGFiYXNlIG5ldmVyIHJldHVybnMgYW4gaW5kaXZpZHVhbCB1bnN5bmNlZCB2YWx1ZSBpbnNpZGUgYW4gb3RoZXJ3aXNlLXN1Y2Nlc3NmdWwgcmVhZC5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJhc2U8Um9vdD4ge1xuICAgIHJlYWREYXRhOiA8VmFsdWU+KGRlcmVmOiAocm9vdDogUm9vdCkgPT4gVmFsdWUpID0+IFZhbHVlIHwgdW5kZWZpbmVkO1xuICAgIHdyaXRlRGF0YTogPFZhbHVlPihkZXJlZjogKHJvb3Q6IFJvb3QpID0+IFZhbHVlLCBuZXdWYWx1ZTogVmFsdWUpID0+IHZvaWQ7XG4gICAgZGVsZXRlRGF0YTogKGRlcmVmOiAocm9vdDogUm9vdCkgPT4gdW5rbm93bikgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5hbWVzcGFjZURhdGFiYXNlPFJvb3QsIFN1Yj4oXG4gICAgZGF0YWJhc2U6IERhdGFiYXNlPFJvb3Q+LFxuICAgIGludG86IChyb290OiBSb290KSA9PiBTdWIsXG4pOiBEYXRhYmFzZTxTdWI+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICByZWFkRGF0YTogKGRlcmVmKSA9PiBkYXRhYmFzZS5yZWFkRGF0YShyb290ID0+IGRlcmVmKGludG8ocm9vdCkpKSxcbiAgICAgICAgd3JpdGVEYXRhOiAoZGVyZWYsIG5ld1ZhbHVlKSA9PiBkYXRhYmFzZS53cml0ZURhdGEocm9vdCA9PiBkZXJlZihpbnRvKHJvb3QpKSwgbmV3VmFsdWUpLFxuICAgICAgICBkZWxldGVEYXRhOiAoZGVyZWYpID0+IGRhdGFiYXNlLmRlbGV0ZURhdGEocm9vdCA9PiBkZXJlZihpbnRvKHJvb3QpKSksXG4gICAgfTtcbn1cbiJdfQ==
13
+ /* _JS_SOURCE_HASH = "93a620d26b6a59665b5f7dab689d9739693a4990e1c4781abcddc6cda24bda11"; */
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
3
+ //exports.InMemoryDatabase = void 0;
4
+ // Rough byte size of a value, for the read/written-bytes metrics.
5
+ function sizeOf(value) {
6
+ if (value === undefined || value === null) {
7
+ return 0;
8
+ }
9
+ if (value instanceof Uint8Array) {
10
+ return value.byteLength;
11
+ }
12
+ if (typeof value === "string") {
13
+ return value.length;
14
+ }
15
+ if (typeof value === "number") {
16
+ return 8;
17
+ }
18
+ if (typeof value === "boolean") {
19
+ return 1;
20
+ }
21
+ if (Array.isArray(value)) {
22
+ let total = 0;
23
+ for (const entry of value) {
24
+ total += sizeOf(entry);
25
+ }
26
+ return total;
27
+ }
28
+ if (typeof value === "object") {
29
+ let total = 0;
30
+ const record = value;
31
+ for (const key of Object.keys(record)) {
32
+ total += sizeOf(record[key]);
33
+ }
34
+ return total;
35
+ }
36
+ return 0;
37
+ }
38
+ // Record the property path a dereference lambda walks, so a write/delete can be applied at it.
39
+ function capturePath(deref) {
40
+ const path = [];
41
+ const handler = {
42
+ get(_target, key) {
43
+ if (typeof key === "string") {
44
+ path.push(key);
45
+ }
46
+ return new Proxy({}, handler);
47
+ },
48
+ };
49
+ deref(new Proxy({}, handler));
50
+ return path;
51
+ }
52
+ function setPath(root, path, value) {
53
+ let node = root;
54
+ for (let index = 0; index < path.length - 1; index++) {
55
+ const key = path[index];
56
+ const next = node[key];
57
+ if (!next || typeof next !== "object") {
58
+ node[key] = {};
59
+ }
60
+ node = node[key];
61
+ }
62
+ node[path[path.length - 1]] = value;
63
+ }
64
+ function deletePath(root, path) {
65
+ let node = root;
66
+ for (let index = 0; index < path.length - 1; index++) {
67
+ const next = node[path[index]];
68
+ if (!next || typeof next !== "object") {
69
+ return;
70
+ }
71
+ node = next;
72
+ }
73
+ delete node[path[path.length - 1]];
74
+ }
75
+ // In-memory Database for tests/dev: holds the whole root as a plain object and counts every call plus the
76
+ // bytes flowing through. Synchronous and always "synced", so reads only return undefined for a genuinely
77
+ // missing scalar (a missing transaction set reads as empty inside the set helpers).
78
+ class InMemoryDatabase {
79
+ constructor(initial) {
80
+ this.readCalls = 0;
81
+ this.writeCalls = 0;
82
+ this.deleteCalls = 0;
83
+ this.bytesRead = 0;
84
+ this.bytesWritten = 0;
85
+ this.root = initial;
86
+ }
87
+ readData(deref) {
88
+ this.readCalls++;
89
+ const result = deref(this.root);
90
+ this.bytesRead += sizeOf(result);
91
+ return result;
92
+ }
93
+ writeData(deref, newValue) {
94
+ this.writeCalls++;
95
+ this.bytesWritten += sizeOf(newValue);
96
+ setPath(this.root, capturePath(deref), newValue);
97
+ }
98
+ deleteData(deref) {
99
+ this.deleteCalls++;
100
+ deletePath(this.root, capturePath(deref));
101
+ }
102
+ }
103
+ exports.InMemoryDatabase = InMemoryDatabase;
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5NZW1vcnlEYXRhYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImluTWVtb3J5RGF0YWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRUEsa0VBQWtFO0FBQ2xFLFNBQVMsTUFBTSxDQUFDLEtBQWM7SUFDMUIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN4QyxPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFDRCxJQUFJLEtBQUssWUFBWSxVQUFVLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQyxVQUFVLENBQUM7SUFDNUIsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDNUIsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3hCLENBQUM7SUFDRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzVCLE9BQU8sQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUNELElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1FBQ2QsS0FBSyxNQUFNLEtBQUssSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN4QixLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBQ0QsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM1QixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLE1BQU0sR0FBRyxLQUFnQyxDQUFDO1FBQ2hELEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFN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Q0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFDRCxTQUFTLENBQVEsS0FBNEIsRUFBRSxRQUFlO1FBQzFELElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsWUFBWSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsS0FBbUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFDRCxVQUFVLENBQUMsS0FBOEI7UUFDckMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxLQUFtQyxDQUFDLENBQUMsQ0FBQztJQUM1RSxDQUFDO0NBQ0o7QUEzQkQsNENBMkJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0YWJhc2UgfSBmcm9tIFwiLi9EYXRhYmFzZVwiO1xuXG4vLyBSb3VnaCBieXRlIHNpemUgb2YgYSB2YWx1ZSwgZm9yIHRoZSByZWFkL3dyaXR0ZW4tYnl0ZXMgbWV0cmljcy5cbmZ1bmN0aW9uIHNpemVPZih2YWx1ZTogdW5rbm93bik6IG51bWJlciB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gODtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCIpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHZhbHVlKSB7XG4gICAgICAgICAgICB0b3RhbCArPSBzaXplT2YoZW50cnkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0b3RhbDtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICBsZXQgdG90YWwgPSAwO1xuICAgICAgICBjb25zdCByZWNvcmQgPSB2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkKSkge1xuICAgICAgICAgICAgdG90YWwgKz0gc2l6ZU9mKHJlY29yZFtrZXldKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdG90YWw7XG4gICAgfVxuICAgIHJldHVybiAwO1xufVxuXG4vLyBSZWNvcmQgdGhlIHByb3BlcnR5IHBhdGggYSBkZXJlZmVyZW5jZSBsYW1iZGEgd2Fsa3MsIHNvIGEgd3JpdGUvZGVsZXRlIGNhbiBiZSBhcHBsaWVkIGF0IGl0LlxuZnVuY3Rpb24gY2FwdHVyZVBhdGgoZGVyZWY6IChyb290OiB1bmtub3duKSA9PiB1bmtub3duKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHBhdGg6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgaGFuZGxlcjogUHJveHlIYW5kbGVyPG9iamVjdD4gPSB7XG4gICAgICAgIGdldChfdGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgcGF0aC5wdXNoKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb3h5KHt9LCBoYW5kbGVyKTtcbiAgICAgICAgfSxcbiAgICB9O1xuICAgIGRlcmVmKG5ldyBQcm94eSh7fSwgaGFuZGxlcikpO1xuICAgIHJldHVybiBwYXRoO1xufVxuXG5mdW5jdGlvbiBzZXRQYXRoKHJvb3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBwYXRoOiBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBsZXQgbm9kZSA9IHJvb3Q7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhdGgubGVuZ3RoIC0gMTsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBrZXkgPSBwYXRoW2luZGV4XTtcbiAgICAgICAgY29uc3QgbmV4dCA9IG5vZGVba2V5XTtcbiAgICAgICAgaWYgKCFuZXh0IHx8IHR5cGVvZiBuZXh0ICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICAgICAgICBub2RlW2tleV0gPSB7fTtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZVtrZXldIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH1cbiAgICBub2RlW3BhdGhbcGF0aC5sZW5ndGggLSAxXV0gPSB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gZGVsZXRlUGF0aChyb290OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcGF0aDogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBsZXQgbm9kZSA9IHJvb3Q7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHBhdGgubGVuZ3RoIC0gMTsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBuZXh0ID0gbm9kZVtwYXRoW2luZGV4XV07XG4gICAgICAgIGlmICghbmV4dCB8fCB0eXBlb2YgbmV4dCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIG5vZGUgPSBuZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH1cbiAgICBkZWxldGUgbm9kZVtwYXRoW3BhdGgubGVuZ3RoIC0gMV1dO1xufVxuXG4vLyBJbi1tZW1vcnkgRGF0YWJhc2UgZm9yIHRlc3RzL2RldjogaG9sZHMgdGhlIHdob2xlIHJvb3QgYXMgYSBwbGFpbiBvYmplY3QgYW5kIGNvdW50cyBldmVyeSBjYWxsIHBsdXMgdGhlXG4vLyBieXRlcyBmbG93aW5nIHRocm91Z2guIFN5bmNocm9ub3VzIGFuZCBhbHdheXMgXCJzeW5jZWRcIiwgc28gcmVhZHMgb25seSByZXR1cm4gdW5kZWZpbmVkIGZvciBhIGdlbnVpbmVseVxuLy8gbWlzc2luZyBzY2FsYXIgKGEgbWlzc2luZyB0cmFuc2FjdGlvbiBzZXQgcmVhZHMgYXMgZW1wdHkgaW5zaWRlIHRoZSBzZXQgaGVscGVycykuXG5leHBvcnQgY2xhc3MgSW5NZW1vcnlEYXRhYmFzZTxSb290PiBpbXBsZW1lbnRzIERhdGFiYXNlPFJvb3Q+IHtcbiAgICBwdWJsaWMgcmVhZENhbGxzID0gMDtcbiAgICBwdWJsaWMgd3JpdGVDYWxscyA9IDA7XG4gICAgcHVibGljIGRlbGV0ZUNhbGxzID0gMDtcbiAgICBwdWJsaWMgYnl0ZXNSZWFkID0gMDtcbiAgICBwdWJsaWMgYnl0ZXNXcml0dGVuID0gMDtcbiAgICBwcml2YXRlIHJvb3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgY29uc3RydWN0b3IoaW5pdGlhbDogUm9vdCkge1xuICAgICAgICB0aGlzLnJvb3QgPSBpbml0aWFsIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIH1cblxuICAgIHJlYWREYXRhPFZhbHVlPihkZXJlZjogKHJvb3Q6IFJvb3QpID0+IFZhbHVlKTogVmFsdWUgfCB1bmRlZmluZWQge1xuICAgICAgICB0aGlzLnJlYWRDYWxscysrO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBkZXJlZih0aGlzLnJvb3QgYXMgUm9vdCk7XG4gICAgICAgIHRoaXMuYnl0ZXNSZWFkICs9IHNpemVPZihyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB3cml0ZURhdGE8VmFsdWU+KGRlcmVmOiAocm9vdDogUm9vdCkgPT4gVmFsdWUsIG5ld1ZhbHVlOiBWYWx1ZSk6IHZvaWQge1xuICAgICAgICB0aGlzLndyaXRlQ2FsbHMrKztcbiAgICAgICAgdGhpcy5ieXRlc1dyaXR0ZW4gKz0gc2l6ZU9mKG5ld1ZhbHVlKTtcbiAgICAgICAgc2V0UGF0aCh0aGlzLnJvb3QsIGNhcHR1cmVQYXRoKGRlcmVmIGFzIChyb290OiB1bmtub3duKSA9PiB1bmtub3duKSwgbmV3VmFsdWUpO1xuICAgIH1cbiAgICBkZWxldGVEYXRhKGRlcmVmOiAocm9vdDogUm9vdCkgPT4gdW5rbm93bik6IHZvaWQge1xuICAgICAgICB0aGlzLmRlbGV0ZUNhbGxzKys7XG4gICAgICAgIGRlbGV0ZVBhdGgodGhpcy5yb290LCBjYXB0dXJlUGF0aChkZXJlZiBhcyAocm9vdDogdW5rbm93bikgPT4gdW5rbm93bikpO1xuICAgIH1cbn1cbiJdfQ==
105
+ /* _JS_SOURCE_HASH = "aa6987f940c5d431dfd1c6d9989fec9aef7d35056bea35397ec8e94982f2c3ca"; */
@@ -0,0 +1,81 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule && mod.default) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const inMemoryDatabase_1 = require("./inMemoryDatabase");
8
+ const ivfEmbeddingDatabase_1 = require("./ivfEmbeddingDatabase");
9
+ const embeddingFormats_1 = require("../embeddingFormats");
10
+ const faceFramesData_1 = require("../faceFramesData");
11
+ // Exercises the tiered IVF embedding database through the in-memory Database wrapper, which counts every
12
+ // read/write/delete call and the bytes through each, across dataset sizes and load patterns, with timing.
13
+ const DIM = 512;
14
+ const FILE_NAME = "faceFrames2_full.f32";
15
+ const MODEL = "buffalo_l";
16
+ const FORMAT = "q8g8_2048";
17
+ async function loadFloats(count) {
18
+ const byteLength = count * DIM * 4;
19
+ const filePath = await (0, faceFramesData_1.ensureFaceData)(FILE_NAME, byteLength);
20
+ const buffer = Buffer.alloc(byteLength);
21
+ const handle = fs_1.default.openSync(filePath, "r");
22
+ fs_1.default.readSync(handle, buffer, 0, byteLength, 0);
23
+ fs_1.default.closeSync(handle);
24
+ return new Float32Array(buffer.buffer, buffer.byteOffset, count * DIM);
25
+ }
26
+ async function buildInputs(count) {
27
+ const floats = await loadFloats(count);
28
+ const inputs = [];
29
+ for (let index = 0; index < count; index++) {
30
+ const slice = floats.subarray(index * DIM, (index + 1) * DIM);
31
+ inputs.push({ ref: "e" + index, embedding: (0, embeddingFormats_1.encodeEmbedding)({ input: slice, format: FORMAT, model: MODEL }) });
32
+ }
33
+ return inputs;
34
+ }
35
+ function freshDatabase(config) {
36
+ const root = { config, count: 0, flat: {}, steps: {}, centroids: {}, cells: {} };
37
+ return new inMemoryDatabase_1.InMemoryDatabase(root);
38
+ }
39
+ function pad(value, width) {
40
+ return String(value).padStart(width);
41
+ }
42
+ async function main() {
43
+ const config = { model: MODEL, format: FORMAT, cellTargetSize: 128 };
44
+ const runs = [
45
+ { size: 10000, batch: 1 },
46
+ { size: 10000, batch: 100 },
47
+ { size: 100000, batch: 1000 },
48
+ ];
49
+ let maxSize = 0;
50
+ for (const run of runs) {
51
+ if (run.size > maxSize) {
52
+ maxSize = run.size;
53
+ }
54
+ }
55
+ const loadStart = Date.now();
56
+ const allInputs = await buildInputs(maxSize);
57
+ console.log(`loaded + encoded ${maxSize} embeddings in ${((Date.now() - loadStart) / 1000).toFixed(1)}s\n`);
58
+ console.log(`${pad("added", 7)} ${pad("batch", 5)} | ${pad("secs", 7)} ${pad("reads", 8)} ${pad("writes", 8)} ${pad("deletes", 8)} ${pad("readMB", 9)} ${pad("writeMB", 8)} | recall`);
59
+ for (const run of runs) {
60
+ const database = freshDatabase(config);
61
+ const start = Date.now();
62
+ for (let offset = 0; offset < run.size; offset += run.batch) {
63
+ (0, ivfEmbeddingDatabase_1.insertEmbeddings)(database, allInputs.slice(offset, offset + run.batch));
64
+ }
65
+ const seconds = (Date.now() - start) / 1000;
66
+ let found = 0;
67
+ const sampleCount = 100;
68
+ for (let index = 0; index < sampleCount; index++) {
69
+ const query = allInputs[Math.floor(index * run.size / sampleCount)];
70
+ const hits = (0, ivfEmbeddingDatabase_1.searchEmbeddings)(database, query.embedding, { probeBudget: 512, resultCount: 1 });
71
+ if (hits && hits.length && hits[0].ref === query.ref) {
72
+ found++;
73
+ }
74
+ }
75
+ const recall = (found / sampleCount).toFixed(2);
76
+ console.log(`${pad(run.size, 7)} ${pad(run.batch, 5)} | ${pad(seconds.toFixed(1), 7)} ${pad(database.readCalls, 8)} ${pad(database.writeCalls, 8)} ${pad(database.deleteCalls, 8)} ${pad((database.bytesRead / 1e6).toFixed(0), 9)} ${pad((database.bytesWritten / 1e6).toFixed(0), 8)} | ${recall}`);
77
+ }
78
+ }
79
+ main();
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXZmRGJDaGVjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIml2ZkRiQ2hlY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw0Q0FBb0I7QUFDcEIseURBQXNEO0FBQ3RELGlFQUF5SDtBQUN6SCwwREFBdUU7QUFDdkUsc0RBQW1EO0FBRW5ELHlHQUF5RztBQUN6RywwR0FBMEc7QUFFMUcsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDO0FBQ2hCLE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDO0FBQ3pDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQztBQUMxQixNQUFNLE1BQU0sR0FBb0IsV0FBVyxDQUFDO0FBRTVDLEtBQUssVUFBVSxVQUFVLENBQUMsS0FBYTtJQUNuQyxNQUFNLFVBQVUsR0FBRyxLQUFLLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNuQyxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUEsK0JBQWMsRUFBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDN0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN4QyxNQUFNLE1BQU0sR0FBRyxZQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUMxQyxZQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5QyxZQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JCLE9BQU8sSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsVUFBVSxFQUFFLEtBQUssR0FBRyxHQUFHLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsS0FBSyxVQUFVLFdBQVcsQ0FBQyxLQUFhO0lBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFD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QUNaLENBQUM7UUFDTCxDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzFTLENBQUM7QUFDTCxDQUFDO0FBRUQsSUFBSSxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBJbk1lbW9yeURhdGFiYXNlIH0gZnJvbSBcIi4vaW5NZW1vcnlEYXRhYmFzZVwiO1xuaW1wb3J0IHsgSXZmRW1iZWRkaW5nUm9vdCwgSXZmQ29uZmlnLCBFbWJlZGRpbmdJbnB1dCwgaW5zZXJ0RW1iZWRkaW5ncywgc2VhcmNoRW1iZWRkaW5ncyB9IGZyb20gXCIuL2l2ZkVtYmVkZGluZ0RhdGFiYXNlXCI7XG5pbXBvcnQgeyBlbmNvZGVFbWJlZGRpbmcsIEVtYmVkZGluZ0Zvcm1hdCB9IGZyb20gXCIuLi9lbWJlZGRpbmdGb3JtYXRzXCI7XG5pbXBvcnQgeyBlbnN1cmVGYWNlRGF0YSB9IGZyb20gXCIuLi9mYWNlRnJhbWVzRGF0YVwiO1xuXG4vLyBFeGVyY2lzZXMgdGhlIHRpZXJlZCBJVkYgZW1iZWRkaW5nIGRhdGFiYXNlIHRocm91Z2ggdGhlIGluLW1lbW9yeSBEYXRhYmFzZSB3cmFwcGVyLCB3aGljaCBjb3VudHMgZXZlcnlcbi8vIHJlYWQvd3JpdGUvZGVsZXRlIGNhbGwgYW5kIHRoZSBieXRlcyB0aHJvdWdoIGVhY2gsIGFjcm9zcyBkYXRhc2V0IHNpemVzIGFuZCBsb2FkIHBhdHRlcm5zLCB3aXRoIHRpbWluZy5cblxuY29uc3QgRElNID0gNTEyO1xuY29uc3QgRklMRV9OQU1FID0gXCJmYWNlRnJhbWVzMl9mdWxsLmYzMlwiO1xuY29uc3QgTU9ERUwgPSBcImJ1ZmZhbG9fbFwiO1xuY29uc3QgRk9STUFUOiBFbWJlZGRpbmdGb3JtYXQgPSBcInE4ZzhfMjA0OFwiO1xuXG5hc3luYyBmdW5jdGlvbiBsb2FkRmxvYXRzKGNvdW50OiBudW1iZXIpOiBQcm9taXNlPEZsb2F0MzJBcnJheT4ge1xuICAgIGNvbnN0IGJ5dGVMZW5ndGggPSBjb3VudCAqIERJTSAqIDQ7XG4gICAgY29uc3QgZmlsZVBhdGggPSBhd2FpdCBlbnN1cmVGYWNlRGF0YShGSUxFX05BTUUsIGJ5dGVMZW5ndGgpO1xuICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5hbGxvYyhieXRlTGVuZ3RoKTtcbiAgICBjb25zdCBoYW5kbGUgPSBmcy5vcGVuU3luYyhmaWxlUGF0aCwgXCJyXCIpO1xuICAgIGZzLnJlYWRTeW5jKGhhbmRsZSwgYnVmZmVyLCAwLCBieXRlTGVuZ3RoLCAwKTtcbiAgICBmcy5jbG9zZVN5bmMoaGFuZGxlKTtcbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWZmZXIuYnVmZmVyLCBidWZmZXIuYnl0ZU9mZnNldCwgY291bnQgKiBESU0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBidWlsZElucHV0cyhjb3VudDogbnVtYmVyKTogUHJvbWlzZTxFbWJlZGRpbmdJbnB1dFtdPiB7XG4gICAgY29uc3QgZmxvYXRzID0gYXdhaXQgbG9hZEZsb2F0cyhjb3VudCk7XG4gICAgY29uc3QgaW5wdXRzOiBFbWJlZGRpbmdJbnB1dFtdID0gW107XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7XG4gICAgICAgIGNvbnN0IHNsaWNlID0gZmxvYXRzLnN1YmFycmF5KGluZGV4ICogRElNLCAoaW5kZXggKyAxKSAqIERJTSk7XG4gICAgICAgIGlucHV0cy5wdXNoKHsgcmVmOiBcImVcIiArIGluZGV4LCBlbWJlZGRpbmc6IGVuY29kZUVtYmVkZGluZyh7IGlucHV0OiBzbGljZSwgZm9ybWF0OiBGT1JNQVQsIG1vZGVsOiBNT0RFTCB9KSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGlucHV0cztcbn1cblxuZnVuY3Rpb24gZnJlc2hEYXRhYmFzZShjb25maWc6IEl2ZkNvbmZpZyk6IEluTWVtb3J5RGF0YWJhc2U8SXZmRW1iZWRkaW5nUm9vdD4ge1xuICAgIGNvbnN0IHJvb3Q6IEl2ZkVtYmVkZGluZ1Jvb3QgPSB7IGNvbmZpZywgY291bnQ6IDAsIGZsYXQ6IHt9LCBzdGVwczoge30sIGNlbnRyb2lkczoge30sIGNlbGxzOiB7fSB9O1xuICAgIHJldHVybiBuZXcgSW5NZW1vcnlEYXRhYmFzZTxJdmZFbWJlZGRpbmdSb290Pihyb290KTtcbn1cblxuZnVuY3Rpb24gcGFkKHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsIHdpZHRoOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBTdHJpbmcodmFsdWUpLnBhZFN0YXJ0KHdpZHRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWFpbigpIHtcbiAgICBjb25zdCBjb25maWc6IEl2ZkNvbmZpZyA9IHsgbW9kZWw6IE1PREVMLCBmb3JtYXQ6IEZPUk1BVCwgY2VsbFRhcmdldFNpemU6IDEyOCB9O1xuICAgIGNvbnN0IHJ1bnM6IHsgc2l6ZTogbnVtYmVyOyBiYXRjaDogbnVtYmVyIH1bXSA9IFtcbiAgICAgICAgeyBzaXplOiAxMDAwMCwgYmF0Y2g6IDEgfSxcbiAgICAgICAgeyBzaXplOiAxMDAwMCwgYmF0Y2g6IDEwMCB9LFxuICAgICAgICB7IHNpemU6IDEwMDAwMCwgYmF0Y2g6IDEwMDAgfSxcbiAgICBdO1xuXG4gICAgbGV0IG1heFNpemUgPSAwO1xuICAgIGZvciAoY29uc3QgcnVuIG9mIHJ1bnMpIHtcbiAgICAgICAgaWYgKHJ1bi5zaXplID4gbWF4U2l6ZSkge1xuICAgICAgICAgICAgbWF4U2l6ZSA9IHJ1bi5zaXplO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGxvYWRTdGFydCA9IERhdGUubm93KCk7XG4gICAgY29uc3QgYWxsSW5wdXRzID0gYXdhaXQgYnVpbGRJbnB1dHMobWF4U2l6ZSk7XG4gICAgY29uc29sZS5sb2coYGxvYWRlZCArIGVuY29kZWQgJHttYXhTaXplfSBlbWJlZGRpbmdzIGluICR7KChEYXRlLm5vdygpIC0gbG9hZFN0YXJ0KSAvIDEwMDApLnRvRml4ZWQoMSl9c1xcbmApO1xuXG4gICAgY29uc29sZS5sb2coYCR7cGFkKFwiYWRkZWRcIiwgNyl9ICR7cGFkKFwiYmF0Y2hcIiwgNSl9IHwgJHtwYWQoXCJzZWNzXCIsIDcpfSAke3BhZChcInJlYWRzXCIsIDgpfSAke3BhZChcIndyaXRlc1wiLCA4KX0gJHtwYWQoXCJkZWxldGVzXCIsIDgpfSAke3BhZChcInJlYWRNQlwiLCA5KX0gJHtwYWQoXCJ3cml0ZU1CXCIsIDgpfSB8IHJlY2FsbGApO1xuICAgIGZvciAoY29uc3QgcnVuIG9mIHJ1bnMpIHtcbiAgICAgICAgY29uc3QgZGF0YWJhc2UgPSBmcmVzaERhdGFiYXNlKGNvbmZpZyk7XG4gICAgICAgIGNvbnN0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgcnVuLnNpemU7IG9mZnNldCArPSBydW4uYmF0Y2gpIHtcbiAgICAgICAgICAgIGluc2VydEVtYmVkZGluZ3MoZGF0YWJhc2UsIGFsbElucHV0cy5zbGljZShvZmZzZXQsIG9mZnNldCArIHJ1bi5iYXRjaCkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlY29uZHMgPSAoRGF0ZS5ub3coKSAtIHN0YXJ0KSAvIDEwMDA7XG5cbiAgICAgICAgbGV0IGZvdW5kID0gMDtcbiAgICAgICAgY29uc3Qgc2FtcGxlQ291bnQgPSAxMDA7XG4gICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBzYW1wbGVDb3VudDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSBhbGxJbnB1dHNbTWF0aC5mbG9vcihpbmRleCAqIHJ1bi5zaXplIC8gc2FtcGxlQ291bnQpXTtcbiAgICAgICAgICAgIGNvbnN0IGhpdHMgPSBzZWFyY2hFbWJlZGRpbmdzKGRhdGFiYXNlLCBxdWVyeS5lbWJlZGRpbmcsIHsgcHJvYmVCdWRnZXQ6IDUxMiwgcmVzdWx0Q291bnQ6IDEgfSk7XG4gICAgICAgICAgICBpZiAoaGl0cyAmJiBoaXRzLmxlbmd0aCAmJiBoaXRzWzBdLnJlZiA9PT0gcXVlcnkucmVmKSB7XG4gICAgICAgICAgICAgICAgZm91bmQrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZWNhbGwgPSAoZm91bmQgLyBzYW1wbGVDb3VudCkudG9GaXhlZCgyKTtcbiAgICAgICAgY29uc29sZS5sb2coYCR7cGFkKHJ1bi5zaXplLCA3KX0gJHtwYWQocnVuLmJhdGNoLCA1KX0gfCAke3BhZChzZWNvbmRzLnRvRml4ZWQoMSksIDcpfSAke3BhZChkYXRhYmFzZS5yZWFkQ2FsbHMsIDgpfSAke3BhZChkYXRhYmFzZS53cml0ZUNhbGxzLCA4KX0gJHtwYWQoZGF0YWJhc2UuZGVsZXRlQ2FsbHMsIDgpfSAke3BhZCgoZGF0YWJhc2UuYnl0ZXNSZWFkIC8gMWU2KS50b0ZpeGVkKDApLCA5KX0gJHtwYWQoKGRhdGFiYXNlLmJ5dGVzV3JpdHRlbiAvIDFlNikudG9GaXhlZCgwKSwgOCl9IHwgJHtyZWNhbGx9YCk7XG4gICAgfVxufVxuXG5tYWluKCk7XG4iXX0//=
81
+ /* _JS_SOURCE_HASH = "31db07ffef35ecca7578f435bb6db898fafcf77607d50d5ffd52abaf2d4a1490"; */