From 8dcfda6b54cd53a08115734b9bb19c0b95231256 Mon Sep 17 00:00:00 2001 From: erhant Date: Thu, 11 Jan 2024 15:15:18 +0300 Subject: [PATCH] added Dria compatiblity SDK (#6) --- .eslintrc.json | 67 ++++ .github/workflows/tests.yml | 12 +- .prettierignore | 14 + README.md | 15 +- lib/index.cjs | 63 ++-- lib/index.cjs.map | 2 +- lib/index.d.ts | 23 +- lib/index.d.ts.map | 2 +- lib/index.mjs | 63 ++-- lib/index.mjs.map | 2 +- package.json | 11 +- pnpm-lock.yaml | 615 +++++++++++++++++++++++++++++++++++- src/db/common/index.ts | 2 +- src/db/hollowdb.ts | 2 +- src/db/interfaces/index.ts | 2 +- src/hnsw.ts | 11 +- src/index.ts | 27 +- src/types/index.ts | 2 +- test/db/kvMemory.ts | 2 +- test/db/memory.ts | 4 +- test/db/redis.ts | 2 +- test/hnsw.test.ts | 2 + test/hollow.test.ts | 4 +- 23 files changed, 880 insertions(+), 69 deletions(-) create mode 100644 .eslintrc.json create mode 100644 .prettierignore diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..a44e7ce --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,67 @@ +{ + "extends": ["eslint:recommended", "plugin:node/recommended", "prettier"], + "plugins": ["node", "prettier"], + "rules": { + "prettier/prettier": "error", + "block-scoped-var": "error", + "eqeqeq": "error", + "no-var": "error", + "prefer-const": "error", + "eol-last": "error", + "prefer-arrow-callback": "error", + "no-trailing-spaces": "error", + "no-restricted-properties": [ + "error", + { + "object": "describe", + "property": "only" + }, + { + "object": "it", + "property": "only" + } + ] + }, + "ignorePatterns": [ + // js output + "build", + "dist", + "lib", + // modules + "node_modules", + // dot files + ".parcel-cache", + ".github", + // protobufs + "proto" + ], + "overrides": [ + { + "files": ["**/*.ts", "**/*.tsx"], + "parser": "@typescript-eslint/parser", + "extends": ["plugin:@typescript-eslint/recommended"], + "rules": { + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-warning-comments": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-var-requires": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/camelcase": "off", + "node/no-missing-import": "off", + "node/no-empty-function": "off", + "node/no-unsupported-features/es-syntax": "off", + "node/no-missing-require": "off", + "node/shebang": "off", + "no-dupe-class-members": "off", + "require-atomic-updates": "off" + } + } + ], + "parserOptions": { + "ecmaVersion": "latest", + "sourceType": "module" + } +} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 68c1b7c..b4a3062 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -40,14 +40,20 @@ jobs: - name: Install dependencies run: pnpm install --no-frozen-lockfile + - name: Lint everything + run: pnpm lint + + - name: Check formatting + run: pnpm format + + - name: Build + run: pnpm build + - name: Start Redis uses: supercharge/redis-github-action@1.5.0 with: redis-version: 7 redis-port: 6379 - - name: Build - run: pnpm build - - name: Run tests run: pnpm test diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..8c40132 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,14 @@ +# js output +build +dist +lib + +# modules +node_modules + +# dot files +.parcel-cache +.github + +# protobufs +proto diff --git a/README.md b/README.md index 297bd79..bc8edb8 100644 --- a/README.md +++ b/README.md @@ -64,7 +64,6 @@ const vectordb = new HollowDBVector(hollowdb); With this, you can insert a new point: ```ts -// an array of floats const point = [-0.28571999073028564 /* and many more... */, 0.13964000344276428]; // any object @@ -167,6 +166,18 @@ pnpm test Check the formatting with: +```sh +pnpm format +``` + +Lint everything with: + +```sh +pnpm lint +``` + +You can also check types with: + ```sh pnpm check ``` @@ -177,4 +188,4 @@ HollowDB Vector replaces DANNY, for the legacy code please [refer to this branch ## License -Dria Docker is licensed under [Apache 2.0](./LICENSE). +HollowDB Vector is licensed under [Apache 2.0](./LICENSE). diff --git a/lib/index.cjs b/lib/index.cjs index b76c951..06e37d9 100644 --- a/lib/index.cjs +++ b/lib/index.cjs @@ -142,12 +142,38 @@ this[globalName] = mainExports; } } -})({"hkute":[function(require,module,exports) { +})({"eeAz1":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); +/** + * Backwards compatibility with [Dria](https://dria.co/) contracts that make use + * of a custom contract function called `upsertVectorMulti`, which is actually + * equivalent to `setMany`. + * + * This class overrides the `set` and `setMany` functions of `SetSDK` from HollowDB. + */ parcelHelpers.export(exports, "DriaCompatSDK", ()=>DriaCompatSDK); +var _hollowdb = require("hollowdb"); var _hnsw = require("./hnsw"); -var _hollowdb = require("./db/hollowdb"); +var _hollowdb1 = require("./db/hollowdb"); var _warpContractsPluginDeploy = require("warp-contracts-plugin-deploy"); +class DriaCompatSDK extends (0, _hollowdb.SetSDK) { + async setMany(keys, values) { + await this.base.dryWriteInteraction({ + function: "upsertVectorMulti", + value: { + keys, + values + } + }); + } + async set(key, value) { + await this.setMany([ + key + ], [ + value + ]); + } +} class HollowDBVector extends (0, _hnsw.HNSW) { /** * A VectorDB over HollowDB using HNSW index. @@ -155,6 +181,8 @@ class HollowDBVector extends (0, _hnsw.HNSW) { * @param hollowdb a hollowdb instance with `set` and `setMany` operations, where values are `string` typed. * - Vectors are encoded & decoded with protobuffers, and the base64 of encodings are stored in HollowDB * - Metadatas are stored as JSON-stringified values. + * - Some of the HollowDB contracts (especially those in [Dria](https://dria.co/)) may use a function called + * `upsertVectorMulti`, which is incompatible with `SetSDK`. For these, you may use `DriaCompatSDK`. * * @param options Optional HNSW parameters: * @@ -171,10 +199,10 @@ class HollowDBVector extends (0, _hnsw.HNSW) { * * @template M type of the metadata */ constructor(hollowdb, options){ - const m = options?.m || 5; - const ef_construction = options?.efConstruction || 128; - const ef_search = options?.efSearch || 20; - super(new (0, _hollowdb.HollowMemory)(hollowdb), m, ef_construction, ef_search); + const m = (options === null || options === void 0 ? void 0 : options.m) || 5; + const ef_construction = (options === null || options === void 0 ? void 0 : options.efConstruction) || 128; + const ef_search = (options === null || options === void 0 ? void 0 : options.efSearch) || 20; + super(new (0, _hollowdb1.HollowMemory)(hollowdb), m, ef_construction, ef_search); this.sdk = hollowdb; } /** Deploy a new HollowDB Vector contract, @@ -245,7 +273,7 @@ class HollowDBVector extends (0, _hnsw.HNSW) { } exports.default = HollowDBVector; -},{"./hnsw":"l0hgH","./db/hollowdb":"bSXvs","warp-contracts-plugin-deploy":"warp-contracts-plugin-deploy","@parcel/transformer-js/src/esmodule-helpers.js":"gvrW8"}],"l0hgH":[function(require,module,exports) { +},{"hollowdb":"hollowdb","./hnsw":"5eElZ","./db/hollowdb":"ehBDe","warp-contracts-plugin-deploy":"warp-contracts-plugin-deploy","@parcel/transformer-js/src/esmodule-helpers.js":"buN8f"}],"5eElZ":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); /** @@ -316,7 +344,7 @@ class HNSW { e[1] ]); // copy W to ep const neighbors = this.select_neighbors(q, W, l_c); - const indices = neighbors.map(([_, idx])=>idx); + const indices = neighbors.map(([, idx])=>idx); const nodes = await this.db.get_neighbors(l_c, indices); // add bidirectional connections from neighbors to q at layer l_c const M = l_c === 0 ? this.m_max0 : this.m; @@ -333,7 +361,7 @@ class HNSW { // shrink connections const eNewConn = this.select_neighbors(await this.db.get_point(e[1]), eConn, l_c); // loop below equivalent to: self.graphs[l_c][e[1]] = {ind: dist for dist, ind in eNewConn} - let dict = {}; + const dict = {}; for (const eNew of eNewConn)dict[eNew[1]] = eNew[0]; nodes[e[1]] = dict; // equiv: this.graphs[l_c][e[1]] = dict; } @@ -352,7 +380,7 @@ class HNSW { * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 2 */ async search_layer(q, ep, ef, l_c) { // set of visited elements | v = set(p for _, p in ep) - const V = new Set(ep.map(([_, id])=>id)); + const V = new Set(ep.map(([, id])=>id)); // set of candidates, min-heapified const C = new (0, _utils.NodeHeap)(ep); // dynamic list of found neighbors, max-heapified | W = [(-mdist, p) for mdist, p in ep] @@ -430,7 +458,6 @@ class HNSW { return R.heapArray; } /** K-nearest Neighbor search. */ async knn_search(q, K) { - let W = []; const ep_index = await this.db.get_ep(); // edge case: no points were added at all if (ep_index === null) return []; @@ -458,7 +485,7 @@ class HNSW { } } -},{"./utils":"aYpFp","@parcel/transformer-js/src/esmodule-helpers.js":"gvrW8"}],"aYpFp":[function(require,module,exports) { +},{"./utils":"jrFMG","@parcel/transformer-js/src/esmodule-helpers.js":"buN8f"}],"jrFMG":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); /** A min-heap of {@link Node} types with custom comparator. */ parcelHelpers.export(exports, "NodeHeap", ()=>NodeHeap); @@ -494,7 +521,7 @@ function l2_distance(a, b) { return Math.sqrt(a.reduce((sum, val, idx)=>sum + Math.pow(val - b[idx], 2), 0)); } -},{"heap-js":"heap-js","@parcel/transformer-js/src/esmodule-helpers.js":"gvrW8"}],"gvrW8":[function(require,module,exports) { +},{"heap-js":"heap-js","@parcel/transformer-js/src/esmodule-helpers.js":"buN8f"}],"buN8f":[function(require,module,exports) { exports.interopDefault = function(a) { return a && a.__esModule ? a : { default: a @@ -524,7 +551,7 @@ exports.export = function(dest, destName, get) { }); }; -},{}],"bSXvs":[function(require,module,exports) { +},{}],"ehBDe":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); parcelHelpers.export(exports, "HollowMemory", ()=>HollowMemory); @@ -687,7 +714,7 @@ class HollowMemory { } } -},{"../proto":"lv5sw","./common":"28FZD","@parcel/transformer-js/src/esmodule-helpers.js":"gvrW8"}],"lv5sw":[function(require,module,exports) { +},{"../proto":"bD6Dt","./common":"eDQmc","@parcel/transformer-js/src/esmodule-helpers.js":"buN8f"}],"bD6Dt":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); /** Encodes a point to protobuf & base64's it. */ parcelHelpers.export(exports, "encodePoint", ()=>encodePoint); @@ -715,7 +742,7 @@ function decodeLayerNode(data) { return (0, _hnswComm.index_buffer).LayerNode.decode(dec); } -},{"../../proto/hnsw_comm":"iCwgb","@parcel/transformer-js/src/esmodule-helpers.js":"gvrW8"}],"iCwgb":[function(require,module,exports) { +},{"../../proto/hnsw_comm":"4BxVd","@parcel/transformer-js/src/esmodule-helpers.js":"buN8f"}],"4BxVd":[function(require,module,exports) { /*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/ "use strict"; var $protobuf = require("d3d6c5f7facd1bba"); // Common aliases @@ -1368,7 +1395,7 @@ $root.index_buffer = function() { }(); module.exports = $root; -},{"d3d6c5f7facd1bba":"protobufjs/minimal"}],"28FZD":[function(require,module,exports) { +},{"d3d6c5f7facd1bba":"protobufjs/minimal"}],"eDQmc":[function(require,module,exports) { /** Utilities to get the key in KVdb for a value. */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); parcelHelpers.export(exports, "keys", ()=>keys); @@ -1385,6 +1412,6 @@ function safeParse(data) { return data ? JSON.parse(data) : null; } -},{"@parcel/transformer-js/src/esmodule-helpers.js":"gvrW8"}]},["hkute"], "hkute", "parcelRequire0406") +},{"@parcel/transformer-js/src/esmodule-helpers.js":"buN8f"}]},["eeAz1"], "eeAz1", "parcelRequire0406") //# sourceMappingURL=index.cjs.map diff --git a/lib/index.cjs.map b/lib/index.cjs.map index 29738a0..eec6b2e 100644 --- a/lib/index.cjs.map +++ b/lib/index.cjs.map @@ -1 +1 @@ -{"mappings":"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","sources":["src/index.ts","src/hnsw.ts","src/utils/index.ts","node_modules/.pnpm/@parcel+transformer-js@2.10.3_@parcel+core@2.10.3/node_modules/@parcel/transformer-js/src/esmodule-helpers.js","src/db/hollowdb.ts","src/proto/index.ts","proto/hnsw_comm.js","src/db/common/index.ts"],"sourcesContent":["import { ContractState, SetSDK } from \"hollowdb\";\nimport { HNSW } from \"./hnsw\";\nimport { HollowMemory } from \"./db/hollowdb\";\nimport type { JWKInterface, Warp } from \"warp-contracts\";\nimport { ArweaveSigner } from \"warp-contracts-plugin-deploy\";\n\nexport default class HollowDBVector extends HNSW {\n /** HollowDB SDK instance as passed in the `constructor`. */\n sdk: SetSDK;\n\n /**\n * A VectorDB over HollowDB using HNSW index.\n *\n * @param hollowdb a hollowdb instance with `set` and `setMany` operations, where values are `string` typed.\n * - Vectors are encoded & decoded with protobuffers, and the base64 of encodings are stored in HollowDB\n * - Metadatas are stored as JSON-stringified values.\n *\n * @param options Optional HNSW parameters:\n *\n * - `m`: **Number of established connections.**\n * With higher dimension size, this should also be larger.\n * Defaults to 5.\n *\n * - `efConstruction`: **Size of the dynamic candidate list.**\n * Affects build times, for instance: 400 is slow but powerful, 40 is\n * fast but not that performant.\n * Defaults to 128.\n *\n * - `efSearch`: **Factor for quality of search.** Defaults to 20.\n *\n * @template M type of the metadata\n */\n constructor(\n hollowdb: SetSDK,\n options?: {\n m?: number;\n efConstruction?: number;\n efSearch?: number;\n },\n ) {\n const m = options?.m || 5;\n const ef_construction = options?.efConstruction || 128;\n const ef_search = options?.efSearch || 20;\n\n super(new HollowMemory(hollowdb), m, ef_construction, ef_search);\n\n this.sdk = hollowdb;\n }\n\n /** Deploy a new HollowDB Vector contract,\n * which is a HollowDB contract with `set` and `setMany` functions in particular.\n *\n * @param wallet your Arweave wallet\n * @param warp a Warp instance on mainnet\n * @returns deployed contract transaction id and source transaction id\n */\n static async deploy(wallet: JWKInterface, warp: Warp): Promise<{ contractTxId: string; srcTxId: string }> {\n // source transaction id, for the contract to be deployed\n const srcTxId = \"lSRrPRiiMYeJsGgT9BdV9OTZTw3hZw_UkGVpEXjD5sY\";\n\n // our source txid is on mainnet, so we must make sure of that\n if (warp.environment !== \"mainnet\") {\n throw new Error(\"Warp must be connected to mainnet.\");\n }\n\n // initailly the wallet is whitelisted on everything, and all\n // whitelists are required for the contract\n const addr = await warp.arweave.wallets.jwkToAddress(wallet);\n const initialState: ContractState = {\n version: \"hollowdb-vector@^0.1.0\",\n owner: addr,\n verificationKeys: { auth: null },\n isProofRequired: { auth: false },\n canEvolve: true,\n whitelists: {\n put: { [addr]: true },\n update: { [addr]: true },\n set: { [addr]: true },\n },\n isWhitelistRequired: { put: true, update: true, set: true },\n };\n\n const { srcTxId: deploymentSrcTxId, contractTxId } = await warp.deployFromSourceTx({\n wallet: new ArweaveSigner(wallet),\n initState: JSON.stringify(initialState),\n srcTxId: srcTxId,\n evaluationManifest: {\n evaluationOptions: {\n allowBigInt: true,\n useKVStorage: true,\n },\n },\n });\n\n // impossible case, but still we should check for it\n if (deploymentSrcTxId !== srcTxId) {\n console.error(\"Deployed srcTxId is different than the given source!\");\n console.error({ expected: srcTxId, received: deploymentSrcTxId });\n }\n\n return { contractTxId, srcTxId };\n }\n}\n","import { NodeHeap, compareNode, cosine_distance } from \"./utils\";\nimport type { Point, Node, LayerNode, KNNResult } from \"./types\";\nimport type { DBInterface } from \"./db/interfaces\";\n\n/**\n * An implementation of Hierarchical Navigable Small Worlds\n * that works over a key-value database.\n *\n * In particular, we provide a HollowDB interface that allows you to\n * store data on Arweave.\n *\n * @template M type of the metadata, which is extra information\n * stored along with each point, a common practice in vectorDBs.\n */\nexport class HNSW {\n /** A database that supports `DBInterface`. */\n db: DBInterface;\n\n /** Number of established connections; should increase as dimension size increases. */\n m: number;\n /** Maximum number of connections for each element per layer. */\n m_max0: number;\n /** Normalization factor for level generation. */\n ml: number;\n\n /** Size of the dynamic candidate list. Affects build times, 400 is very powerful, 40 is fast. */\n ef_construction: number;\n /** Factor for quality of search. */\n ef: number;\n\n constructor(db: DBInterface, M: number, ef_construction: number, ef_search: number) {\n this.db = db;\n\n this.m = M; // paper proposes [5,48] is a good range for m (Weavite uses 64)\n this.m_max0 = M * 2; // paper proposes max0 is 2 times m\n this.ml = 1 / Math.log(M); // papers heuristic to select ml, maximum layers\n\n this.ef_construction = ef_construction;\n this.ef = ef_search;\n }\n\n /** Returns the vector & its metadata at given index. */\n async get_vector(idx: number): Promise<{\n point: Point;\n metadata: M | null;\n }> {\n const point = await this.db.get_point(idx);\n const metadata = await this.db.get_metadata(idx);\n return { point, metadata };\n }\n\n /** Paper proposes this heuristic for layer selection for insertion of `q`. */\n select_layer() {\n return Math.floor(-Math.log(Math.random()) * this.ml);\n }\n\n /** Insert a query point.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 1\n */\n async insert(q: Point, metadata?: M) {\n const ep_index = await this.db.get_ep();\n const L = (await this.db.get_num_layers()) - 1;\n const l = this.select_layer();\n\n // a point is added and we get its index\n const idx = await this.db.new_point(q);\n if (metadata) {\n await this.db.set_metadata(idx, metadata);\n }\n\n if (ep_index !== null) {\n const dist = cosine_distance(q, await this.db.get_point(ep_index));\n // iterate for each layer from L to l+1 and find entry point\n let ep = [[dist, ep_index] as Node];\n for (let i = L; i > l; i--) {\n const ep_copy: Node[] = ep.map((e) => [e[0], e[1]]);\n\n // search with ef = 1, returning only one neighbor\n const W = await this.search_layer(q, ep_copy, 1, i);\n\n // if nearest neighbor found in layer i is closer than ep, then ep = nearest neighbor\n if (W.length > 0 && ep[0][0] > W[0][0]) {\n ep = W;\n }\n }\n\n // search all layers\n for (let l_c = Math.min(L, l); l_c >= 0; l_c--) {\n const W = await this.search_layer(q, ep, this.ef_construction, l_c);\n const newNode: LayerNode = {}; // this is for `this.graphs[l_c][idx] = {}`\n\n ep = W.map((e) => [e[0], e[1]] as Node); // copy W to ep\n const neighbors = this.select_neighbors(q, W, l_c);\n const indices = neighbors.map(([_, idx]) => idx);\n const nodes = await this.db.get_neighbors(l_c, indices);\n\n // add bidirectional connections from neighbors to q at layer l_c\n const M = l_c === 0 ? this.m_max0 : this.m;\n\n for (const e of neighbors) {\n newNode[e[1]] = e[0];\n nodes[e[1]][idx] = e[0];\n }\n\n for (const e of neighbors) {\n const eConn = Object.entries(nodes[e[1]]).map(([k, v]) => [v, parseInt(k)] as Node);\n if (eConn.length > M) {\n // shrink connections\n const eNewConn = this.select_neighbors(await this.db.get_point(e[1]), eConn, l_c);\n // loop below equivalent to: self.graphs[l_c][e[1]] = {ind: dist for dist, ind in eNewConn}\n let dict: Record = {};\n for (const eNew of eNewConn) {\n dict[eNew[1]] = eNew[0];\n }\n\n nodes[e[1]] = dict; // equiv: this.graphs[l_c][e[1]] = dict;\n }\n }\n\n await this.db.upsert_neighbor(l_c, idx, newNode);\n await this.db.upsert_neighbors(l_c, nodes);\n }\n }\n\n // add a new small world for each new layer\n const LL = await this.db.get_num_layers();\n if (LL < l + 1) {\n await this.db.set_ep(idx);\n }\n\n // TODO: can make this in parallel via a new function that adds N to num_layers\n for (let i = LL; i < l + 1; i++) {\n await this.db.new_neighbor(idx);\n }\n }\n\n /** Search a query point.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 2\n */\n async search_layer(q: Point, ep: Node[], ef: number, l_c: number) {\n // set of visited elements | v = set(p for _, p in ep)\n const V = new Set(ep.map(([_, id]) => id));\n\n // set of candidates, min-heapified\n const C = new NodeHeap(ep);\n\n // dynamic list of found neighbors, max-heapified | W = [(-mdist, p) for mdist, p in ep]\n // due to negation of `dist` value, this actually becomes a max-heap\n const W = new NodeHeap(ep.map(([mdist, p]) => [-mdist, p]));\n\n while (!C.isEmpty()) {\n const c = C.pop()!; // extract nearest element from C\n const c_v: number = c[0]; // get distance of c\n const f_dist = -W.top(1)[0][0]; // get furthest distance from q, multiply by -1 to make get real distance\n\n if (c_v > f_dist) {\n break;\n }\n\n // un-visited nodes\n const neighbors = Object.keys(await this.db.get_neighbor(l_c, c[1]))\n .map((k) => parseInt(k))\n .filter((k) => !V.has(k));\n\n // distances to `q`\n const points = await this.db.get_points(neighbors);\n const dists = points.map((p) => cosine_distance(p, q));\n\n // visit neighbors w.r.t distances\n dists.forEach((dist, i) => {\n const e = neighbors[i];\n V.add(e); // mark `e` as visited\n\n if (dist < f_dist || W.length < ef) {\n C.push([dist, e]);\n W.push([-dist, e]);\n\n // possible if `dist < f_dist`\n if (W.length > ef) {\n W.pop();\n }\n }\n });\n }\n\n if (ef === 1) {\n if (W.length !== 0) {\n // TODO: is there a faster way to do this code block?\n const dd = new NodeHeap(W.heapArray.map((W_i) => [-W_i[0], W_i[1]]));\n return [dd.pop()!];\n } else {\n return [];\n }\n }\n\n return W.heapArray.map((W_i) => [-W_i[0], W_i[1]]) as Node[];\n }\n\n /** Selects and adds neighbors to the graph.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 4\n */\n select_neighbors(q: Point, C: Node[], l_c: number, keepPrunedConnections: boolean = true) {\n const R = new NodeHeap();\n const W = new NodeHeap(C);\n const M = l_c > 0 ? this.m : this.m_max0; // number of neighbors to return\n\n const W_d = new NodeHeap(); // queue for discarded candidates\n while (W.length > 0 && R.length < M) {\n const e = W.pop()!; // extract nearest element from W to q\n const r_top = R.top(1)[0] as Node | undefined; // point with minimum distance to q in all R\n\n // it is possible that `r_top` is undefined, that is okay & is handled below\n if (R.length === 0 || (r_top && e[0] < r_top[0])) {\n R.push([e[0], e[1]]);\n } else {\n W_d.push([e[0], e[1]]);\n }\n }\n\n if (keepPrunedConnections) {\n while (W_d.length > 0 && R.length < M) {\n R.push(W_d.pop()!);\n }\n }\n\n return R.heapArray;\n }\n\n /** K-nearest Neighbor search. */\n async knn_search(q: Point, K: number): Promise[]> {\n let W: Node[] = [];\n const ep_index = await this.db.get_ep();\n\n // edge case: no points were added at all\n if (ep_index === null) return [];\n\n const L = (await this.db.get_num_layers()) - 1;\n const dist = cosine_distance(q, await this.db.get_point(ep_index));\n\n // search from top layer to layer 1\n let ep: Node[] = [[dist, ep_index]];\n for (let l_c = L; l_c > 0; l_c--) {\n ep = await this.search_layer(q, ep, 1, l_c);\n }\n ep = await this.search_layer(q, ep, this.ef, 0);\n\n // sort the results & get top K\n ep.sort(compareNode);\n const ep_topk = ep.slice(0, K);\n\n // retrieve metadatas\n const metadatas = await this.db.get_metadatas(ep_topk.map((ep) => ep[1]));\n\n return ep_topk.map((ep, i) => ({\n id: ep[1],\n distance: ep[0],\n metadata: metadatas[i],\n }));\n }\n}\n","import { Heap } from \"heap-js\";\nimport type { Node, Point } from \"../types\";\n\n/** A min-heap of {@link Node} types with custom comparator. */\nexport class NodeHeap extends Heap {\n constructor(elems: Node[] = []) {\n super(compareNode);\n if (elems.length !== 0) {\n super.addAll(elems);\n }\n }\n}\n\n/** Comparator for {@link Node} type, compares their distances. */\nexport function compareNode(a: Node, b: Node) {\n return a[0] - b[0];\n}\n\n/** Dot-product of two vectors. */\nexport function dot_product(a: Point, b: Point): number {\n return a.reduce((sum, val, idx) => sum + val * b[idx], 0);\n}\n\n/** Norm a vector. */\nexport function norm(a: Point): number {\n return Math.sqrt(a.reduce((sum, val) => sum + val * val, 0));\n}\n\n/** Cosine distance between two vectors, as 1 - cosine similarity. */\nexport function cosine_distance(a: Point, b: Point): number {\n return 1 - dot_product(a, b) / (norm(a) * norm(b));\n}\n\n/** Inner product (alias dot product) of two vectors. */\nexport function inner_product(a: Point, b: Point): number {\n return dot_product(a, b);\n}\n\n/** Euclidean distance between two vectors. */\nexport function l2_distance(a: Point, b: Point): number {\n return Math.sqrt(a.reduce((sum, val, idx) => sum + Math.pow(val - b[idx], 2), 0));\n}\n","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","import type { DBInterface } from \"./interfaces\";\nimport type { Graph, LayerNode, Point } from \"../types\";\nimport { decodeLayerNode, decodePoint, encodeLayerNode, encodePoint } from \"../proto\";\nimport { SetSDK } from \"hollowdb\";\nimport { keys, safeParse } from \"./common\";\n\nexport class HollowMemory implements DBInterface {\n client: SetSDK;\n\n /**\n * Deploy a HollowDB contract.\n * @param initialState initial state of the contract\n * @param source (optional) source transaction id\n * @returns deployed contract transaction id\n */\n async deploy(initialState: Awaited>, source: string = \"\") {\n const { contractTxId } = await this.client.warp.deployFromSourceTx({\n wallet: this.client.signer,\n srcTxId: source,\n initState: JSON.stringify(initialState),\n });\n\n return contractTxId;\n }\n\n constructor(client: SetSDK) {\n this.client = client;\n }\n\n async get_ep(): Promise {\n const ep = await this.client.get(keys.ep);\n return ep === null ? null : parseInt(ep);\n }\n\n async set_ep(ep: number): Promise {\n await this.client.set(keys.ep, ep.toString());\n }\n\n async get_point(idx: number): Promise {\n const data = await this.client.get(keys.point(idx));\n if (!data) {\n throw new Error(`No point with index ${idx}`);\n }\n const point = decodePoint(data);\n return point.v!;\n }\n\n async get_points(idxs: number[]): Promise {\n if (idxs.length === 0) return [];\n const datas = await this.safe_get_many(idxs.map((idx) => keys.point(idx)));\n\n // see if there is a null value in there\n const nullPos = datas.indexOf(null);\n if (nullPos !== -1) {\n throw new Error(`No point with index ${idxs[nullPos]}`);\n }\n\n const points = datas.map((data) => decodePoint(data!));\n return points.map((point) => point.v!);\n }\n\n async new_point(q: Point): Promise {\n const idx = await this.get_datasize();\n\n const point = encodePoint({ v: q, idx });\n await this.client.set(keys.point(idx), point);\n await this.client.set(keys.points, (idx + 1).toString());\n\n return idx;\n }\n\n async get_num_layers(): Promise {\n const numLayers = await this.client.get(keys.layers);\n return numLayers ? parseInt(numLayers) : 0;\n }\n\n async get_datasize(): Promise {\n const datasize = await this.client.get(keys.points);\n return datasize ? parseInt(datasize) : 0;\n }\n\n async get_neighbor(layer: number, idx: number): Promise {\n const data = await this.client.get(keys.neighbor(layer, idx));\n if (!data) {\n throw new Error(`No neighbors at layer ${layer}, index ${idx}\"`);\n }\n const node = decodeLayerNode(data);\n return node.neighbors!;\n }\n\n async get_neighbors(layer: number, idxs: number[]): Promise {\n const datas = await this.safe_get_many(idxs.map((idx) => keys.neighbor(layer, idx)));\n\n // see if there is a null value in there\n const nullPos = datas.indexOf(null);\n if (nullPos !== -1) {\n throw new Error(`No neighbors at layer ${layer}, index ${idxs[nullPos]}\"`);\n }\n\n const nodes = datas.map((data) => decodeLayerNode(data!));\n const neighbors = nodes.map((node) => node.neighbors!);\n return Object.fromEntries(idxs.map((idx, i) => [idx, neighbors[i]]));\n }\n\n async upsert_neighbor(layer: number, idx: number, node: LayerNode): Promise {\n const data = encodeLayerNode({\n idx,\n level: layer,\n neighbors: node,\n });\n await this.client.set(keys.neighbor(layer, idx), data);\n }\n\n async upsert_neighbors(layer: number, nodes: Graph): Promise {\n await this.safe_set_many(\n Object.keys(nodes).map((idx) => {\n const i = parseInt(idx);\n const key = keys.neighbor(layer, i);\n const value = encodeLayerNode({\n idx: i,\n level: layer,\n neighbors: nodes[i],\n });\n\n return [key, value];\n }),\n );\n }\n\n async new_neighbor(idx: number): Promise {\n const l = await this.get_num_layers();\n await this.upsert_neighbor(l, idx, {});\n\n // NOTE: if `new_neighbor` is run in parallel,\n // this might cause a race-condition\n await this.client.set(keys.layers, (l + 1).toString());\n }\n\n async get_metadata(idx: number): Promise {\n const data = await this.client.get(keys.metadata(idx));\n return safeParse(data);\n }\n\n async get_metadatas(idxs: number[]): Promise<(M | null)[]> {\n // const datas =\n return Promise.all(idxs.map((idx) => this.get_metadata(idx)));\n }\n\n async set_metadata(idx: number, data: M): Promise {\n await this.client.set(keys.metadata(idx), JSON.stringify(data));\n }\n\n /**\n * A `getMany` interaction that automatically splits the request into several\n * transactions so that the transaction body-limit is not exceeded for any of them.\n *\n * For every error, the input is split into two transactions of half the size.\n */\n private async safe_get_many(keys: string[]): Promise<(string | null)[]> {\n try {\n return await this.client.getMany(keys);\n } catch (err) {\n // TODO: check error type\n const half = Math.floor(keys.length >> 1);\n\n // prettier-ignore\n return await Promise.all([\n this.safe_get_many(keys.slice(0, half)),\n this.safe_get_many(keys.slice(half))]\n ).then((results) => results.flat());\n }\n }\n\n /**\n * A `setMany` interaction that automatically splits the request into several\n * transactions so that the transaction body-limit is not exceeded for any of them.\n *\n * For every error, the input is split into two transactions of half the size.\n */\n private async safe_set_many(entries: [key: string, value: string][]): Promise {\n try {\n await this.client.setMany(\n entries.map((e) => e[0]),\n entries.map((e) => e[1]),\n );\n } catch (err) {\n // TODO: check error type\n const half = Math.floor(entries.length >> 1);\n\n // prettier-ignore\n await Promise.all([\n this.safe_set_many(entries.slice(0, half)),\n this.safe_set_many(entries.slice(half))]\n ).then((results) => results.flat());\n }\n }\n\n toString() {\n return \"HollowDB Set with Protobufs\";\n }\n}\n","import { index_buffer } from \"../../proto/hnsw_comm\";\n\n/** Encodes a point to protobuf & base64's it. */\nexport function encodePoint(q: index_buffer.IPoint): string {\n const qe = index_buffer.Point.encode(q).finish();\n return Buffer.from(qe).toString(\"base64\");\n}\n\n/** Decodes a point from base64 encoded protobuf. */\nexport function decodePoint(data: string): index_buffer.IPoint {\n const dec = Buffer.from(data, \"base64\");\n return index_buffer.Point.decode(dec);\n}\n\n/** Encodes a point to protobuf & base64's it. */\nexport function encodeLayerNode(n: index_buffer.ILayerNode): string {\n const ne = index_buffer.LayerNode.encode({\n ...n,\n visible: n.visible || true, // is visible unless otherwise specified\n }).finish();\n return Buffer.from(ne).toString(\"base64\");\n}\n\n/** Decodes a point from base64 encoded protobuf. */\nexport function decodeLayerNode(data: string): index_buffer.ILayerNode {\n const dec = Buffer.from(data, \"base64\");\n return index_buffer.LayerNode.decode(dec);\n}\n","/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\n\"use strict\";\n\nvar $protobuf = require(\"protobufjs/minimal\");\n\n// Common aliases\nvar $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n\n// Exported root namespace\nvar $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\n$root.index_buffer = (function() {\n\n /**\n * Namespace index_buffer.\n * @exports index_buffer\n * @namespace\n */\n var index_buffer = {};\n\n index_buffer.LayerNode = (function() {\n\n /**\n * Properties of a LayerNode.\n * @memberof index_buffer\n * @interface ILayerNode\n * @property {number|null} [level] LayerNode level\n * @property {number|null} [idx] LayerNode idx\n * @property {boolean|null} [visible] LayerNode visible\n * @property {Object.|null} [neighbors] LayerNode neighbors\n */\n\n /**\n * Constructs a new LayerNode.\n * @memberof index_buffer\n * @classdesc Represents a LayerNode.\n * @implements ILayerNode\n * @constructor\n * @param {index_buffer.ILayerNode=} [properties] Properties to set\n */\n function LayerNode(properties) {\n this.neighbors = {};\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * LayerNode level.\n * @member {number} level\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.level = 0;\n\n /**\n * LayerNode idx.\n * @member {number} idx\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.idx = 0;\n\n /**\n * LayerNode visible.\n * @member {boolean} visible\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.visible = false;\n\n /**\n * LayerNode neighbors.\n * @member {Object.} neighbors\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.neighbors = $util.emptyObject;\n\n /**\n * Creates a new LayerNode instance using the specified properties.\n * @function create\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode=} [properties] Properties to set\n * @returns {index_buffer.LayerNode} LayerNode instance\n */\n LayerNode.create = function create(properties) {\n return new LayerNode(properties);\n };\n\n /**\n * Encodes the specified LayerNode message. Does not implicitly {@link index_buffer.LayerNode.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode} message LayerNode message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n LayerNode.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.level != null && Object.hasOwnProperty.call(message, \"level\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.level);\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.idx);\n if (message.visible != null && Object.hasOwnProperty.call(message, \"visible\"))\n writer.uint32(/* id 3, wireType 0 =*/24).bool(message.visible);\n if (message.neighbors != null && Object.hasOwnProperty.call(message, \"neighbors\"))\n for (var keys = Object.keys(message.neighbors), i = 0; i < keys.length; ++i)\n writer.uint32(/* id 4, wireType 2 =*/34).fork().uint32(/* id 1, wireType 0 =*/8).uint32(keys[i]).uint32(/* id 2, wireType 5 =*/21).float(message.neighbors[keys[i]]).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified LayerNode message, length delimited. Does not implicitly {@link index_buffer.LayerNode.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode} message LayerNode message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n LayerNode.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a LayerNode message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.LayerNode\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.LayerNode} LayerNode\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n LayerNode.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.LayerNode(), key, value;\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.level = reader.uint32();\n break;\n }\n case 2: {\n message.idx = reader.uint32();\n break;\n }\n case 3: {\n message.visible = reader.bool();\n break;\n }\n case 4: {\n if (message.neighbors === $util.emptyObject)\n message.neighbors = {};\n var end2 = reader.uint32() + reader.pos;\n key = 0;\n value = 0;\n while (reader.pos < end2) {\n var tag2 = reader.uint32();\n switch (tag2 >>> 3) {\n case 1:\n key = reader.uint32();\n break;\n case 2:\n value = reader.float();\n break;\n default:\n reader.skipType(tag2 & 7);\n break;\n }\n }\n message.neighbors[key] = value;\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a LayerNode message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.LayerNode\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.LayerNode} LayerNode\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n LayerNode.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a LayerNode message.\n * @function verify\n * @memberof index_buffer.LayerNode\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n LayerNode.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.level != null && message.hasOwnProperty(\"level\"))\n if (!$util.isInteger(message.level))\n return \"level: integer expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.visible != null && message.hasOwnProperty(\"visible\"))\n if (typeof message.visible !== \"boolean\")\n return \"visible: boolean expected\";\n if (message.neighbors != null && message.hasOwnProperty(\"neighbors\")) {\n if (!$util.isObject(message.neighbors))\n return \"neighbors: object expected\";\n var key = Object.keys(message.neighbors);\n for (var i = 0; i < key.length; ++i) {\n if (!$util.key32Re.test(key[i]))\n return \"neighbors: integer key{k:uint32} expected\";\n if (typeof message.neighbors[key[i]] !== \"number\")\n return \"neighbors: number{k:uint32} expected\";\n }\n }\n return null;\n };\n\n /**\n * Creates a LayerNode message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.LayerNode\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.LayerNode} LayerNode\n */\n LayerNode.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.LayerNode)\n return object;\n var message = new $root.index_buffer.LayerNode();\n if (object.level != null)\n message.level = object.level >>> 0;\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.visible != null)\n message.visible = Boolean(object.visible);\n if (object.neighbors) {\n if (typeof object.neighbors !== \"object\")\n throw TypeError(\".index_buffer.LayerNode.neighbors: object expected\");\n message.neighbors = {};\n for (var keys = Object.keys(object.neighbors), i = 0; i < keys.length; ++i)\n message.neighbors[keys[i]] = Number(object.neighbors[keys[i]]);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a LayerNode message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.LayerNode} message LayerNode\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n LayerNode.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.objects || options.defaults)\n object.neighbors = {};\n if (options.defaults) {\n object.level = 0;\n object.idx = 0;\n object.visible = false;\n }\n if (message.level != null && message.hasOwnProperty(\"level\"))\n object.level = message.level;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.visible != null && message.hasOwnProperty(\"visible\"))\n object.visible = message.visible;\n var keys2;\n if (message.neighbors && (keys2 = Object.keys(message.neighbors)).length) {\n object.neighbors = {};\n for (var j = 0; j < keys2.length; ++j)\n object.neighbors[keys2[j]] = options.json && !isFinite(message.neighbors[keys2[j]]) ? String(message.neighbors[keys2[j]]) : message.neighbors[keys2[j]];\n }\n return object;\n };\n\n /**\n * Converts this LayerNode to JSON.\n * @function toJSON\n * @memberof index_buffer.LayerNode\n * @instance\n * @returns {Object.} JSON object\n */\n LayerNode.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for LayerNode\n * @function getTypeUrl\n * @memberof index_buffer.LayerNode\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n LayerNode.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.LayerNode\";\n };\n\n return LayerNode;\n })();\n\n index_buffer.Point = (function() {\n\n /**\n * Properties of a Point.\n * @memberof index_buffer\n * @interface IPoint\n * @property {number|null} [idx] Point idx\n * @property {Array.|null} [v] Point v\n */\n\n /**\n * Constructs a new Point.\n * @memberof index_buffer\n * @classdesc Represents a Point.\n * @implements IPoint\n * @constructor\n * @param {index_buffer.IPoint=} [properties] Properties to set\n */\n function Point(properties) {\n this.v = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Point idx.\n * @member {number} idx\n * @memberof index_buffer.Point\n * @instance\n */\n Point.prototype.idx = 0;\n\n /**\n * Point v.\n * @member {Array.} v\n * @memberof index_buffer.Point\n * @instance\n */\n Point.prototype.v = $util.emptyArray;\n\n /**\n * Creates a new Point instance using the specified properties.\n * @function create\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint=} [properties] Properties to set\n * @returns {index_buffer.Point} Point instance\n */\n Point.create = function create(properties) {\n return new Point(properties);\n };\n\n /**\n * Encodes the specified Point message. Does not implicitly {@link index_buffer.Point.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint} message Point message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Point.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.idx);\n if (message.v != null && message.v.length) {\n writer.uint32(/* id 2, wireType 2 =*/18).fork();\n for (var i = 0; i < message.v.length; ++i)\n writer.float(message.v[i]);\n writer.ldelim();\n }\n return writer;\n };\n\n /**\n * Encodes the specified Point message, length delimited. Does not implicitly {@link index_buffer.Point.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint} message Point message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Point.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Point message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.Point\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.Point} Point\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Point.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.Point();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.idx = reader.uint32();\n break;\n }\n case 2: {\n if (!(message.v && message.v.length))\n message.v = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.v.push(reader.float());\n } else\n message.v.push(reader.float());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Point message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.Point\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.Point} Point\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Point.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Point message.\n * @function verify\n * @memberof index_buffer.Point\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Point.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.v != null && message.hasOwnProperty(\"v\")) {\n if (!Array.isArray(message.v))\n return \"v: array expected\";\n for (var i = 0; i < message.v.length; ++i)\n if (typeof message.v[i] !== \"number\")\n return \"v: number[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a Point message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.Point\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.Point} Point\n */\n Point.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.Point)\n return object;\n var message = new $root.index_buffer.Point();\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.v) {\n if (!Array.isArray(object.v))\n throw TypeError(\".index_buffer.Point.v: array expected\");\n message.v = [];\n for (var i = 0; i < object.v.length; ++i)\n message.v[i] = Number(object.v[i]);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Point message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.Point} message Point\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Point.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.v = [];\n if (options.defaults)\n object.idx = 0;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.v && message.v.length) {\n object.v = [];\n for (var j = 0; j < message.v.length; ++j)\n object.v[j] = options.json && !isFinite(message.v[j]) ? String(message.v[j]) : message.v[j];\n }\n return object;\n };\n\n /**\n * Converts this Point to JSON.\n * @function toJSON\n * @memberof index_buffer.Point\n * @instance\n * @returns {Object.} JSON object\n */\n Point.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Point\n * @function getTypeUrl\n * @memberof index_buffer.Point\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Point.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.Point\";\n };\n\n return Point;\n })();\n\n index_buffer.PointQuant = (function() {\n\n /**\n * Properties of a PointQuant.\n * @memberof index_buffer\n * @interface IPointQuant\n * @property {number|null} [idx] PointQuant idx\n * @property {Array.|null} [v] PointQuant v\n */\n\n /**\n * Constructs a new PointQuant.\n * @memberof index_buffer\n * @classdesc Represents a PointQuant.\n * @implements IPointQuant\n * @constructor\n * @param {index_buffer.IPointQuant=} [properties] Properties to set\n */\n function PointQuant(properties) {\n this.v = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * PointQuant idx.\n * @member {number} idx\n * @memberof index_buffer.PointQuant\n * @instance\n */\n PointQuant.prototype.idx = 0;\n\n /**\n * PointQuant v.\n * @member {Array.} v\n * @memberof index_buffer.PointQuant\n * @instance\n */\n PointQuant.prototype.v = $util.emptyArray;\n\n /**\n * Creates a new PointQuant instance using the specified properties.\n * @function create\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant=} [properties] Properties to set\n * @returns {index_buffer.PointQuant} PointQuant instance\n */\n PointQuant.create = function create(properties) {\n return new PointQuant(properties);\n };\n\n /**\n * Encodes the specified PointQuant message. Does not implicitly {@link index_buffer.PointQuant.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant} message PointQuant message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n PointQuant.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.idx);\n if (message.v != null && message.v.length) {\n writer.uint32(/* id 2, wireType 2 =*/18).fork();\n for (var i = 0; i < message.v.length; ++i)\n writer.uint32(message.v[i]);\n writer.ldelim();\n }\n return writer;\n };\n\n /**\n * Encodes the specified PointQuant message, length delimited. Does not implicitly {@link index_buffer.PointQuant.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant} message PointQuant message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n PointQuant.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a PointQuant message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.PointQuant\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.PointQuant} PointQuant\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n PointQuant.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.PointQuant();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.idx = reader.uint32();\n break;\n }\n case 2: {\n if (!(message.v && message.v.length))\n message.v = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.v.push(reader.uint32());\n } else\n message.v.push(reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a PointQuant message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.PointQuant\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.PointQuant} PointQuant\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n PointQuant.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a PointQuant message.\n * @function verify\n * @memberof index_buffer.PointQuant\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n PointQuant.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.v != null && message.hasOwnProperty(\"v\")) {\n if (!Array.isArray(message.v))\n return \"v: array expected\";\n for (var i = 0; i < message.v.length; ++i)\n if (!$util.isInteger(message.v[i]))\n return \"v: integer[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a PointQuant message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.PointQuant\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.PointQuant} PointQuant\n */\n PointQuant.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.PointQuant)\n return object;\n var message = new $root.index_buffer.PointQuant();\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.v) {\n if (!Array.isArray(object.v))\n throw TypeError(\".index_buffer.PointQuant.v: array expected\");\n message.v = [];\n for (var i = 0; i < object.v.length; ++i)\n message.v[i] = object.v[i] >>> 0;\n }\n return message;\n };\n\n /**\n * Creates a plain object from a PointQuant message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.PointQuant} message PointQuant\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n PointQuant.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.v = [];\n if (options.defaults)\n object.idx = 0;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.v && message.v.length) {\n object.v = [];\n for (var j = 0; j < message.v.length; ++j)\n object.v[j] = message.v[j];\n }\n return object;\n };\n\n /**\n * Converts this PointQuant to JSON.\n * @function toJSON\n * @memberof index_buffer.PointQuant\n * @instance\n * @returns {Object.} JSON object\n */\n PointQuant.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for PointQuant\n * @function getTypeUrl\n * @memberof index_buffer.PointQuant\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n PointQuant.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.PointQuant\";\n };\n\n return PointQuant;\n })();\n\n return index_buffer;\n})();\n\nmodule.exports = $root;\n","/** Utilities to get the key in KVdb for a value. */\nexport const keys = {\n layers: \"layers\",\n ep: \"ep\",\n points: \"points\",\n metadata: (idx: number) => `m:${idx}` as const,\n /** Maps a point index to its key in the KVdb. */\n point: (idx: number) => `${idx}` as const,\n /** Maps a neighbor (layer & index) to its key in the KVdb. */\n neighbor: (layer: number, idx: number) => `${layer}__${idx}` as const,\n} as const;\n\n/** Safely parses a data, returning `null` if its falsy. */\nexport function safeParse(data: string | null | undefined): V | null {\n return data ? JSON.parse(data) : null;\n}\n"],"names":[],"version":3,"file":"index.cjs.map","sourceRoot":"../"} \ No newline at end of file +{"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA;;;;;;CAMG,GACH,mDAAa;AAbb;AACA;AACA;AAEA;AASM,MAAO,sBAAsB,CAAA,GAAA,gBAAc,AAAd;IACxB,MAAM,QAAQ,IAAc,EAAE,MAAgB,EAA9C;QACP,MAAM,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC;YAClC,UAAU;YACV,OAAO;gBACL;gBACA;YACD;QACF;IACH;IAES,MAAM,IAAI,GAAW,EAAE,KAAa,EAApC;QACP,MAAM,IAAI,CAAC,OAAO,CAAC;YAAC;SAAI,EAAE;YAAC;SAAM;IACnC;AACD;AAEa,MAAO,uBAAoC,CAAA,GAAA,UAAO,AAAP;IAIvD;;;;;;;;;;;;;;;;;;;;;;;KAuBG,GACH,YACE,QAAwB,EACxB,OAIC,CANH;QAQE,MAAM,IAAI,CAAA,oBAAA,8BAAA,QAAS,CAAC,KAAI;QACxB,MAAM,kBAAkB,CAAA,oBAAA,8BAAA,QAAS,cAAc,KAAI;QACnD,MAAM,YAAY,CAAA,oBAAA,8BAAA,QAAS,QAAQ,KAAI;QAEvC,KAAK,CAAC,IAAI,CAAA,GAAA,uBAAY,AAAZ,EAAgB,WAAW,GAAG,iBAAiB;QAEzD,IAAI,CAAC,GAAG,GAAG;IACb;IAEA;;;;;;KAMG,GACH,aAAa,OAAO,MAAoB,EAAE,IAAU,EAApD;QACE,yDAAyD;QACzD,MAAM,UAAU;QAEhB,8DAA8D;QAC9D,IAAI,KAAK,WAAW,KAAK,WACvB,MAAM,IAAI,MAAM;QAGlB,6DAA6D;QAC7D,2CAA2C;QAC3C,MAAM,OAAO,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC;QACrD,MAAM,eAA8B;YAClC,SAAS;YACT,OAAO;YACP,kBAAkB;gBAAE,MAAM;YAAI;YAC9B,iBAAiB;gBAAE,MAAM;YAAK;YAC9B,WAAW;YACX,YAAY;gBACV,KAAK;oBAAE,CAAC,KAAK,EAAE;gBAAI;gBACnB,QAAQ;oBAAE,CAAC,KAAK,EAAE;gBAAI;gBACtB,KAAK;oBAAE,CAAC,KAAK,EAAE;gBAAI;YACpB;YACD,qBAAqB;gBAAE,KAAK;gBAAM,QAAQ;gBAAM,KAAK;YAAI;QAC1D;QAED,MAAM,EAAE,SAAS,iBAAiB,EAAE,YAAY,EAAE,GAAG,MAAM,KAAK,kBAAkB,CAAC;YACjF,QAAQ,IAAI,CAAA,GAAA,wCAAa,AAAb,EAAc;YAC1B,WAAW,KAAK,SAAS,CAAC;YAC1B,SAAS;YACT,oBAAoB;gBAClB,mBAAmB;oBACjB,aAAa;oBACb,cAAc;gBACf;YACF;QACF;QAED,oDAAoD;QACpD,IAAI,sBAAsB,SAAS;YACjC,QAAQ,KAAK,CAAC;YACd,QAAQ,KAAK,CAAC;gBAAE,UAAU;gBAAS,UAAU;YAAiB;QAChE;QAEA,OAAO;YAAE;YAAc;QAAO;IAChC;AACD;kBAlGoB;;;;;ACzBrB;;;;;;;;;CASG,GACH,0CAAa;AAdb;AAcM,MAAO;IAgBX,YAAY,EAAkB,EAAE,CAAS,EAAE,eAAuB,EAAE,SAAiB,CAArF;QACE,IAAI,CAAC,EAAE,GAAG;QAEV,IAAI,CAAC,CAAC,GAAG,GAAG,gEAAgE;QAC5E,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,mCAAmC;QACxD,IAAI,CAAC,EAAE,GAAG,IAAI,KAAK,GAAG,CAAC,IAAI,gDAAgD;QAE3E,IAAI,CAAC,eAAe,GAAG;QACvB,IAAI,CAAC,EAAE,GAAG;IACZ;IAEA,sDAAA,GACA,MAAM,WAAW,GAAW,EAA5B;QAIE,MAAM,QAAQ,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;QACtC,MAAM,WAAW,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;QAC5C,OAAO;YAAE;YAAO;QAAQ;IAC1B;IAEA,4EAAA,GACA,eAAA;QACE,OAAO,KAAK,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE;IACtD;IAEA;;KAEG,GACH,MAAM,OAAO,CAAQ,EAAE,QAAY,EAAnC;QACE,MAAM,WAAW,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM;QACrC,MAAM,IAAI,AAAC,MAAM,IAAI,CAAC,EAAE,CAAC,cAAc,KAAM;QAC7C,MAAM,IAAI,IAAI,CAAC,YAAY;QAE3B,wCAAwC;QACxC,MAAM,MAAM,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;QACpC,IAAI,UACF,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK;QAGlC,IAAI,aAAa,MAAM;YACrB,MAAM,OAAO,CAAA,GAAA,sBAAe,AAAf,EAAgB,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;YACxD,4DAA4D;YAC5D,IAAI,KAAK;gBAAC;oBAAC;oBAAM;iBAAiB;aAAC;YACnC,IAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK;gBAC1B,MAAM,UAAkB,GAAG,GAAG,CAAC,CAAC,IAAM;wBAAC,CAAC,CAAC,EAAE;wBAAE,CAAC,CAAC,EAAE;qBAAC;gBAElD,kDAAkD;gBAClD,MAAM,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,SAAS,GAAG;gBAEjD,qFAAqF;gBACrF,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EACpC,KAAK;YAET;YAEA,oBAAoB;YACpB,IAAK,IAAI,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,OAAO,GAAG,MAAO;gBAC9C,MAAM,IAAI,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,IAAI,CAAC,eAAe,EAAE;gBAC/D,MAAM,UAAqB,CAAA,GAAI,2CAA2C;gBAE1E,KAAK,EAAE,GAAG,CAAC,CAAC,IAAM;wBAAC,CAAC,CAAC,EAAE;wBAAE,CAAC,CAAC,EAAE;qBAAS,GAAG,eAAe;gBACxD,MAAM,YAAY,IAAI,CAAC,gBAAgB,CAAC,GAAG,GAAG;gBAC9C,MAAM,UAAU,UAAU,GAAG,CAAC,CAAC,GAAG,IAAI,GAAK;gBAC3C,MAAM,QAAQ,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,KAAK;gBAE/C,iEAAiE;gBACjE,MAAM,IAAI,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;gBAE1C,KAAK,MAAM,KAAK,UAAW;oBACzB,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;oBACpB,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE;gBACzB;gBAEA,KAAK,MAAM,KAAK,UAAW;oBACzB,MAAM,QAAQ,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAK;4BAAC;4BAAG,SAAS;yBAAW;oBAClF,IAAI,MAAM,MAAM,GAAG,GAAG;wBACpB,qBAAqB;wBACrB,MAAM,WAAW,IAAI,CAAC,gBAAgB,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO;wBAC7E,2FAA2F;wBAC3F,MAAM,OAA+B,CAAA;wBACrC,KAAK,MAAM,QAAQ,SACjB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;wBAGzB,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,MAAM,wCAAwC;oBAC9D;gBACF;gBAEA,MAAM,IAAI,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,KAAK;gBACxC,MAAM,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK;YACtC;QACF;QAEA,2CAA2C;QAC3C,MAAM,KAAK,MAAM,IAAI,CAAC,EAAE,CAAC,cAAc;QACvC,IAAI,KAAK,IAAI,GACX,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC;QAGvB,+EAA+E;QAC/E,IAAK,IAAI,IAAI,IAAI,IAAI,IAAI,GAAG,IAC1B,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;IAE/B;IAEA;;KAEG,GACH,MAAM,aAAa,CAAQ,EAAE,EAAU,EAAE,EAAU,EAAE,GAAW,EAAhE;QACE,sDAAsD;QACtD,MAAM,IAAI,IAAI,IAAY,GAAG,GAAG,CAAC,CAAC,GAAG,GAAG,GAAK;QAE7C,mCAAmC;QACnC,MAAM,IAAI,IAAI,CAAA,GAAA,eAAQ,AAAR,EAAS;QAEvB,wFAAwF;QACxF,oEAAoE;QACpE,MAAM,IAAI,IAAI,CAAA,GAAA,eAAQ,AAAR,EAAS,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAK;gBAAC,CAAC;gBAAO;aAAE;QAEzD,MAAO,CAAC,EAAE,OAAO,GAAI;YACnB,MAAM,IAAI,EAAE,GAAG,IAAK,iCAAiC;YACrD,MAAM,MAAc,CAAC,CAAC,EAAE,EAAE,oBAAoB;YAC9C,MAAM,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,yEAAyE;YAEzG,IAAI,MAAM,QACR;YAGF,mBAAmB;YACnB,MAAM,YAAY,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,GAC/D,GAAG,CAAC,CAAC,IAAM,SAAS,IACpB,MAAM,CAAC,CAAC,IAAM,CAAC,EAAE,GAAG,CAAC;YAExB,mBAAmB;YACnB,MAAM,SAAS,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC;YACxC,MAAM,QAAQ,OAAO,GAAG,CAAC,CAAC,IAAM,CAAA,GAAA,sBAAe,AAAf,EAAgB,GAAG;YAEnD,kCAAkC;YAClC,MAAM,OAAO,CAAC,CAAC,MAAM;gBACnB,MAAM,IAAI,SAAS,CAAC,EAAE;gBACtB,EAAE,GAAG,CAAC,IAAI,sBAAsB;gBAEhC,IAAI,OAAO,UAAU,EAAE,MAAM,GAAG,IAAI;oBAClC,EAAE,IAAI,CAAC;wBAAC;wBAAM;qBAAE;oBAChB,EAAE,IAAI,CAAC;wBAAC,CAAC;wBAAM;qBAAE;oBAEjB,8BAA8B;oBAC9B,IAAI,EAAE,MAAM,GAAG,IACb,EAAE,GAAG;gBAET;YACF;QACF;QAEA,IAAI,OAAO,GAAG;YACZ,IAAI,EAAE,MAAM,KAAK,GAAG;gBAClB,qDAAqD;gBACrD,MAAM,KAAK,IAAI,CAAA,GAAA,eAAQ,AAAR,EAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,MAAQ;wBAAC,CAAC,GAAG,CAAC,EAAE;wBAAE,GAAG,CAAC,EAAE;qBAAC;gBAClE,OAAO;oBAAC,GAAG,GAAG;iBAAI;YACpB,OACE,OAAO,EAAE;QAEb;QAEA,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,MAAQ;gBAAC,CAAC,GAAG,CAAC,EAAE;gBAAE,GAAG,CAAC,EAAE;aAAC;IACnD;IAEA;;KAEG,GACH,iBAAiB,CAAQ,EAAE,CAAS,EAAE,GAAW,EAAE,wBAAiC,IAAI,EAAxF;QACE,MAAM,IAAI,IAAI,CAAA,GAAA,eAAQ,AAAR;QACd,MAAM,IAAI,IAAI,CAAA,GAAA,eAAQ,AAAR,EAAS;QACvB,MAAM,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,gCAAgC;QAE1E,MAAM,MAAM,IAAI,CAAA,GAAA,eAAQ,AAAR,KAAY,iCAAiC;QAC7D,MAAO,EAAE,MAAM,GAAG,KAAK,EAAE,MAAM,GAAG,EAAG;YACnC,MAAM,IAAI,EAAE,GAAG,IAAK,sCAAsC;YAC1D,MAAM,QAAQ,EAAE,GAAG,CAAC,EAAE,CAAC,EAAsB,EAAE,4CAA4C;YAE3F,4EAA4E;YAC5E,IAAI,EAAE,MAAM,KAAK,KAAM,SAAS,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,EAAE,EAC7C,EAAE,IAAI,CAAC;gBAAC,CAAC,CAAC,EAAE;gBAAE,CAAC,CAAC,EAAE;aAAC;iBAEnB,IAAI,IAAI,CAAC;gBAAC,CAAC,CAAC,EAAE;gBAAE,CAAC,CAAC,EAAE;aAAC;QAEzB;QAEA,IAAI,uBACF,MAAO,IAAI,MAAM,GAAG,KAAK,EAAE,MAAM,GAAG,EAClC,EAAE,IAAI,CAAC,IAAI,GAAG;QAIlB,OAAO,EAAE,SAAS;IACpB;IAEA,+BAAA,GACA,MAAM,WAAW,CAAQ,EAAE,CAAS,EAApC;QACE,MAAM,WAAW,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM;QAErC,yCAAyC;QACzC,IAAI,aAAa,MAAM,OAAO,EAAE;QAEhC,MAAM,IAAI,AAAC,MAAM,IAAI,CAAC,EAAE,CAAC,cAAc,KAAM;QAC7C,MAAM,OAAO,CAAA,GAAA,sBAAe,AAAf,EAAgB,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC;QAExD,mCAAmC;QACnC,IAAI,KAAa;YAAC;gBAAC;gBAAM;aAAS;SAAC;QACnC,IAAK,IAAI,MAAM,GAAG,MAAM,GAAG,MACzB,KAAK,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,GAAG;QAEzC,KAAK,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,IAAI,CAAC,EAAE,EAAE;QAE7C,+BAA+B;QAC/B,GAAG,IAAI,CAAC,CAAA,GAAA,kBAAW,AAAX;QACR,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG;QAE5B,qBAAqB;QACrB,MAAM,YAAY,MAAM,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,GAAG,CAAC,CAAC,KAAO,EAAE,CAAC,EAAE;QAEvE,OAAO,QAAQ,GAAG,CAAC,CAAC,IAAI,IAAO,CAAA;gBAC7B,IAAI,EAAE,CAAC,EAAE;gBACT,UAAU,EAAE,CAAC,EAAE;gBACf,UAAU,SAAS,CAAC,EAAE;YACvB,CAAA;IACH;AACD;;;;;AC/PD,6DAAA,GACA,8CAAa;AASb,gEAAA,GACA,iDAAgB;AAIhB,gCAAA,GACA,iDAAgB;AAIhB,mBAAA,GACA,0CAAgB;AAIhB,mEAAA,GACA,qDAAgB;AAIhB,sDAAA,GACA,mDAAgB;AAIhB,4CAAA,GACA,iDAAgB;AAvChB;AAIM,MAAO,iBAAiB,CAAA,GAAA,YAAU,AAAV;IAC5B,YAAY,QAAgB,EAAE,CAA9B;QACE,KAAK,CAAC;QACN,IAAI,MAAM,MAAM,KAAK,GACnB,KAAK,CAAC,OAAO;IAEjB;AACD;AAGK,SAAU,YAAY,CAAO,EAAE,CAAO;IAC1C,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE;AACpB;AAGM,SAAU,YAAY,CAAQ,EAAE,CAAQ;IAC5C,OAAO,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK,MAAQ,MAAM,MAAM,CAAC,CAAC,IAAI,EAAE;AACzD;AAGM,SAAU,KAAK,CAAQ;IAC3B,OAAO,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,MAAQ,MAAM,MAAM,KAAK;AAC3D;AAGM,SAAU,gBAAgB,CAAQ,EAAE,CAAQ;IAChD,OAAO,IAAI,YAAY,GAAG,KAAM,CAAA,KAAK,KAAK,KAAK,EAAC;AAClD;AAGM,SAAU,cAAc,CAAQ,EAAE,CAAQ;IAC9C,OAAO,YAAY,GAAG;AACxB;AAGM,SAAU,YAAY,CAAQ,EAAE,CAAQ;IAC5C,OAAO,KAAK,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,KAAK,MAAQ,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI;AAChF;;;ACzCA,QAAQ,cAAc,GAAG,SAAU,CAAC;IAClC,OAAO,KAAK,EAAE,UAAU,GAAG,IAAI;QAAC,SAAS;IAAC;AAC5C;AAEA,QAAQ,iBAAiB,GAAG,SAAU,CAAC;IACrC,OAAO,cAAc,CAAC,GAAG,cAAc;QAAC,OAAO;IAAI;AACrD;AAEA,QAAQ,SAAS,GAAG,SAAU,MAAM,EAAE,IAAI;IACxC,OAAO,IAAI,CAAC,QAAQ,OAAO,CAAC,SAAU,GAAG;QACvC,IACE,QAAQ,aACR,QAAQ,gBACR,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,MAE3C;QAGF,OAAO,cAAc,CAAC,MAAM,KAAK;YAC/B,YAAY;YACZ,KAAK;gBACH,OAAO,MAAM,CAAC,IAAI;YACpB;QACF;IACF;IAEA,OAAO;AACT;AAEA,QAAQ,MAAM,GAAG,SAAU,IAAI,EAAE,QAAQ,EAAE,GAAG;IAC5C,OAAO,cAAc,CAAC,MAAM,UAAU;QACpC,YAAY;QACZ,KAAK;IACP;AACF;;;;;AC5BA,kDAAa;AAJb;AAEA;AAEM,MAAO;IAGX;;;;;KAKG,GACH,MAAM,OAAO,YAA8D,EAAE,SAAiB,EAAE,EAAhG;QACE,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC;YACjE,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM;YAC1B,SAAS;YACT,WAAW,KAAK,SAAS,CAAC;QAC3B;QAED,OAAO;IACT;IAEA,YAAY,MAAsB,CAAlC;QACE,IAAI,CAAC,MAAM,GAAG;IAChB;IAEA,MAAM,SAAN;QACE,MAAM,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,EAAE;QACxC,OAAO,OAAO,OAAO,OAAO,SAAS;IACvC;IAEA,MAAM,OAAO,EAAU,EAAvB;QACE,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,EAAE,EAAE,GAAG,QAAQ;IAC5C;IAEA,MAAM,UAAU,GAAW,EAA3B;QACE,MAAM,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,KAAK,CAAC;QAC9C,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,CAAA,oBAAA,EAAuB,IAAG,CAAE;QAE9C,MAAM,QAAQ,CAAA,GAAA,kBAAW,AAAX,EAAY;QAC1B,OAAO,MAAM,CAAE;IACjB;IAEA,MAAM,WAAW,IAAc,EAA/B;QACE,IAAI,KAAK,MAAM,KAAK,GAAG,OAAO,EAAE;QAChC,MAAM,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,MAAQ,CAAA,GAAA,YAAI,AAAJ,EAAK,KAAK,CAAC;QAEpE,wCAAwC;QACxC,MAAM,UAAU,MAAM,OAAO,CAAC;QAC9B,IAAI,YAAY,IACd,MAAM,IAAI,MAAM,CAAA,oBAAA,EAAuB,IAAI,CAAC,QAAQ,CAAA,CAAE;QAGxD,MAAM,SAAS,MAAM,GAAG,CAAC,CAAC,OAAS,CAAA,GAAA,kBAAW,AAAX,EAAY;QAC/C,OAAO,OAAO,GAAG,CAAC,CAAC,QAAU,MAAM,CAAE;IACvC;IAEA,MAAM,UAAU,CAAQ,EAAxB;QACE,MAAM,MAAM,MAAM,IAAI,CAAC,YAAY;QAEnC,MAAM,QAAQ,CAAA,GAAA,kBAAW,AAAX,EAAY;YAAE,GAAG;YAAG;QAAG;QACrC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,KAAK,CAAC,MAAM;QACvC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,MAAM,EAAE,AAAC,CAAA,MAAM,CAAA,EAAG,QAAQ;QAErD,OAAO;IACT;IAEA,MAAM,iBAAN;QACE,MAAM,YAAY,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,MAAM;QACnD,OAAO,YAAY,SAAS,aAAa;IAC3C;IAEA,MAAM,eAAN;QACE,MAAM,WAAW,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,MAAM;QAClD,OAAO,WAAW,SAAS,YAAY;IACzC;IAEA,MAAM,aAAa,KAAa,EAAE,GAAW,EAA7C;QACE,MAAM,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,QAAQ,CAAC,OAAO;QACxD,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,MAAK,QAAA,EAAW,IAAG,CAAA,CAAG;QAEjE,MAAM,OAAO,CAAA,GAAA,sBAAe,AAAf,EAAgB;QAC7B,OAAO,KAAK,SAAU;IACxB;IAEA,MAAM,cAAc,KAAa,EAAE,IAAc,EAAjD;QACE,MAAM,QAAQ,MAAM,IAAI,CAAC,aAAa,CAAC,KAAK,GAAG,CAAC,CAAC,MAAQ,CAAA,GAAA,YAAI,AAAJ,EAAK,QAAQ,CAAC,OAAO;QAE9E,wCAAwC;QACxC,MAAM,UAAU,MAAM,OAAO,CAAC;QAC9B,IAAI,YAAY,IACd,MAAM,IAAI,MAAM,CAAA,sBAAA,EAAyB,MAAK,QAAA,EAAW,IAAI,CAAC,QAAQ,CAAA,CAAA,CAAG;QAG3E,MAAM,QAAQ,MAAM,GAAG,CAAC,CAAC,OAAS,CAAA,GAAA,sBAAe,AAAf,EAAgB;QAClD,MAAM,YAAY,MAAM,GAAG,CAAC,CAAC,OAAS,KAAK,SAAU;QACrD,OAAO,OAAO,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAM;gBAAC;gBAAK,SAAS,CAAC,EAAE;aAAC;IACpE;IAEA,MAAM,gBAAgB,KAAa,EAAE,GAAW,EAAE,IAAe,EAAjE;QACE,MAAM,OAAO,CAAA,GAAA,sBAAe,AAAf,EAAgB;YAC3B;YACA,OAAO;YACP,WAAW;QACZ;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,QAAQ,CAAC,OAAO,MAAM;IACnD;IAEA,MAAM,iBAAiB,KAAa,EAAE,KAAY,EAAlD;QACE,MAAM,IAAI,CAAC,aAAa,CACtB,OAAO,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACtB,MAAM,IAAI,SAAS;YACnB,MAAM,MAAM,CAAA,GAAA,YAAI,AAAJ,EAAK,QAAQ,CAAC,OAAO;YACjC,MAAM,QAAQ,CAAA,GAAA,sBAAe,AAAf,EAAgB;gBAC5B,KAAK;gBACL,OAAO;gBACP,WAAW,KAAK,CAAC,EAAE;YACpB;YAED,OAAO;gBAAC;gBAAK;aAAM;QACrB;IAEJ;IAEA,MAAM,aAAa,GAAW,EAA9B;QACE,MAAM,IAAI,MAAM,IAAI,CAAC,cAAc;QACnC,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,KAAK,CAAA;QAEnC,8CAA8C;QAC9C,oCAAoC;QACpC,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,MAAM,EAAE,AAAC,CAAA,IAAI,CAAA,EAAG,QAAQ;IACrD;IAEA,MAAM,aAAa,GAAW,EAA9B;QACE,MAAM,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,QAAQ,CAAC;QACjD,OAAO,CAAA,GAAA,iBAAS,AAAT,EAAa;IACtB;IAEA,MAAM,cAAc,IAAc,EAAlC;QACE,gBAAgB;QAChB,OAAO,QAAQ,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,MAAQ,IAAI,CAAC,YAAY,CAAC;IACzD;IAEA,MAAM,aAAa,GAAW,EAAE,IAAO,EAAvC;QACE,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA,GAAA,YAAI,AAAJ,EAAK,QAAQ,CAAC,MAAM,KAAK,SAAS,CAAC;IAC3D;IAEA;;;;;KAKG,GACK,MAAM,cAAc,IAAc,EAAlC;QACN,IAAI;YACF,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QACnC,EAAE,OAAO,KAAK;YACZ,yBAAyB;YACzB,MAAM,OAAO,KAAK,KAAK,CAAC,KAAK,MAAM,IAAI;YAEvC,kBAAkB;YAClB,OAAO,MAAM,QAAQ,GAAG,CAAC;gBACvB,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,CAAC,GAAG;gBACjC,IAAI,CAAC,aAAa,CAAC,KAAK,KAAK,CAAC;aAAO,EACrC,IAAI,CAAC,CAAC,UAAY,QAAQ,IAAI;QAClC;IACF;IAEA;;;;;KAKG,GACK,MAAM,cAAc,OAAuC,EAA3D;QACN,IAAI;YACF,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACvB,QAAQ,GAAG,CAAC,CAAC,IAAM,CAAC,CAAC,EAAE,GACvB,QAAQ,GAAG,CAAC,CAAC,IAAM,CAAC,CAAC,EAAE;QAE3B,EAAE,OAAO,KAAK;YACZ,yBAAyB;YACzB,MAAM,OAAO,KAAK,KAAK,CAAC,QAAQ,MAAM,IAAI;YAE1C,kBAAkB;YAClB,MAAM,QAAQ,GAAG,CAAC;gBAChB,IAAI,CAAC,aAAa,CAAC,QAAQ,KAAK,CAAC,GAAG;gBACpC,IAAI,CAAC,aAAa,CAAC,QAAQ,KAAK,CAAC;aAAO,EACxC,IAAI,CAAC,CAAC,UAAY,QAAQ,IAAI;QAClC;IACF;IAEA,WAAA;QACE,OAAO;IACT;AACD;;;;;ACtMD,+CAAA,GACA,iDAAgB;AAKhB,kDAAA,GACA,iDAAgB;AAKhB,+CAAA,GACA,qDAAgB;AAQhB,kDAAA,GACA,qDAAgB;AAxBhB;AAGM,SAAU,YAAY,CAAsB;IAChD,MAAM,KAAK,CAAA,GAAA,sBAAY,AAAZ,EAAa,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM;IAC9C,OAAO,OAAO,IAAI,CAAC,IAAI,QAAQ,CAAC;AAClC;AAGM,SAAU,YAAY,IAAY;IACtC,MAAM,MAAM,OAAO,IAAI,CAAC,MAAM;IAC9B,OAAO,CAAA,GAAA,sBAAY,AAAZ,EAAa,KAAK,CAAC,MAAM,CAAC;AACnC;AAGM,SAAU,gBAAgB,CAA0B;IACxD,MAAM,KAAK,CAAA,GAAA,sBAAY,AAAZ,EAAa,SAAS,CAAC,MAAM,CAAC;QACvC,GAAG,CAAC;QACJ,SAAS,EAAE,OAAO,IAAI;IACvB,GAAE,MAAM;IACT,OAAO,OAAO,IAAI,CAAC,IAAI,QAAQ,CAAC;AAClC;AAGM,SAAU,gBAAgB,IAAY;IAC1C,MAAM,MAAM,OAAO,IAAI,CAAC,MAAM;IAC9B,OAAO,CAAA,GAAA,sBAAY,AAAZ,EAAa,SAAS,CAAC,MAAM,CAAC;AACvC;;;AC3BA,mJAAmJ,GACnJ;AAEA,IAAI,YAAY,QAAQ;AAExB,iBAAiB;AACjB,IAAI,UAAU,UAAU,MAAM,EAAE,UAAU,UAAU,MAAM,EAAE,QAAQ,UAAU,IAAI;AAElF,0BAA0B;AAC1B,IAAI,QAAQ,UAAU,KAAK,CAAC,UAAU,IAAK,CAAA,UAAU,KAAK,CAAC,UAAU,GAAG,CAAC,CAAA;AAEzE,MAAM,YAAY,GAAG,AAAC;IAElB;;;;KAIC,GACD,IAAI,eAAe,CAAC;IAEpB,aAAa,SAAS,GAAG,AAAC;QAEtB;;;;;;;;SAQC,GAED;;;;;;;SAOC,GACD,SAAS,UAAU,UAAU;YACzB,IAAI,CAAC,SAAS,GAAG,CAAC;YAClB,IAAI,YACA;gBAAA,IAAK,IAAI,OAAO,OAAO,IAAI,CAAC,aAAa,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,EAAE,EAC/D,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MACvB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAAA;QACnD;QAEA;;;;;SAKC,GACD,UAAU,SAAS,CAAC,KAAK,GAAG;QAE5B;;;;;SAKC,GACD,UAAU,SAAS,CAAC,GAAG,GAAG;QAE1B;;;;;SAKC,GACD,UAAU,SAAS,CAAC,OAAO,GAAG;QAE9B;;;;;SAKC,GACD,UAAU,SAAS,CAAC,SAAS,GAAG,MAAM,WAAW;QAEjD;;;;;;;SAOC,GACD,UAAU,MAAM,GAAG,SAAS,OAAO,UAAU;YACzC,OAAO,IAAI,UAAU;QACzB;QAEA;;;;;;;;SAQC,GACD,UAAU,MAAM,GAAG,SAAS,OAAO,OAAO,EAAE,MAAM;YAC9C,IAAI,CAAC,QACD,SAAS,QAAQ,MAAM;YAC3B,IAAI,QAAQ,KAAK,IAAI,QAAQ,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,UAC7D,OAAO,MAAM,CAAC,qBAAqB,GAAE,GAAG,MAAM,CAAC,QAAQ,KAAK;YAChE,IAAI,QAAQ,GAAG,IAAI,QAAQ,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,QAC3D,OAAO,MAAM,CAAC,qBAAqB,GAAE,IAAI,MAAM,CAAC,QAAQ,GAAG;YAC/D,IAAI,QAAQ,OAAO,IAAI,QAAQ,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,YAC/D,OAAO,MAAM,CAAC,qBAAqB,GAAE,IAAI,IAAI,CAAC,QAAQ,OAAO;YACjE,IAAI,QAAQ,SAAS,IAAI,QAAQ,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,cACjE,IAAK,IAAI,OAAO,OAAO,IAAI,CAAC,QAAQ,SAAS,GAAG,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,EAAE,EACtE,OAAO,MAAM,CAAC,qBAAqB,GAAE,IAAI,IAAI,GAAG,MAAM,CAAC,qBAAqB,GAAE,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,qBAAqB,GAAE,IAAI,KAAK,CAAC,QAAQ,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,MAAM;YACnL,OAAO;QACX;QAEA;;;;;;;;SAQC,GACD,UAAU,eAAe,GAAG,SAAS,gBAAgB,OAAO,EAAE,MAAM;YAChE,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,QAAQ,MAAM;QAC9C;QAEA;;;;;;;;;;SAUC,GACD,UAAU,MAAM,GAAG,SAAS,OAAO,MAAM,EAAE,MAAM;YAC7C,IAAI,CAAE,CAAA,kBAAkB,OAAM,GAC1B,SAAS,QAAQ,MAAM,CAAC;YAC5B,IAAI,MAAM,WAAW,YAAY,OAAO,GAAG,GAAG,OAAO,GAAG,GAAG,QAAQ,UAAU,IAAI,MAAM,YAAY,CAAC,SAAS,IAAI,KAAK;YACtH,MAAO,OAAO,GAAG,GAAG,IAAK;gBACrB,IAAI,MAAM,OAAO,MAAM;gBACvB,OAAQ,QAAQ;oBAChB,KAAK;wBACG,QAAQ,KAAK,GAAG,OAAO,MAAM;wBAC7B;oBAER,KAAK;wBACG,QAAQ,GAAG,GAAG,OAAO,MAAM;wBAC3B;oBAER,KAAK;wBACG,QAAQ,OAAO,GAAG,OAAO,IAAI;wBAC7B;oBAER,KAAK;wBACG,IAAI,QAAQ,SAAS,KAAK,MAAM,WAAW,EACvC,QAAQ,SAAS,GAAG,CAAC;wBACzB,IAAI,OAAO,OAAO,MAAM,KAAK,OAAO,GAAG;wBACvC,MAAM;wBACN,QAAQ;wBACR,MAAO,OAAO,GAAG,GAAG,KAAM;4BACtB,IAAI,OAAO,OAAO,MAAM;4BACxB,OAAQ,SAAS;gCACjB,KAAK;oCACD,MAAM,OAAO,MAAM;oCACnB;gCACJ,KAAK;oCACD,QAAQ,OAAO,KAAK;oCACpB;gCACJ;oCACI,OAAO,QAAQ,CAAC,OAAO;oCACvB;4BACJ;wBACJ;wBACA,QAAQ,SAAS,CAAC,IAAI,GAAG;wBACzB;oBAER;wBACI,OAAO,QAAQ,CAAC,MAAM;wBACtB;gBACJ;YACJ;YACA,OAAO;QACX;QAEA;;;;;;;;;SASC,GACD,UAAU,eAAe,GAAG,SAAS,gBAAgB,MAAM;YACvD,IAAI,CAAE,CAAA,kBAAkB,OAAM,GAC1B,SAAS,IAAI,QAAQ;YACzB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,OAAO,MAAM;QAC5C;QAEA;;;;;;;SAOC,GACD,UAAU,MAAM,GAAG,SAAS,OAAO,OAAO;YACtC,IAAI,OAAO,YAAY,YAAY,YAAY,MAC3C,OAAO;YACX,IAAI,QAAQ,KAAK,IAAI,QAAQ,QAAQ,cAAc,CAAC,UAChD;gBAAA,IAAI,CAAC,MAAM,SAAS,CAAC,QAAQ,KAAK,GAC9B,OAAO;YAAyB;YACxC,IAAI,QAAQ,GAAG,IAAI,QAAQ,QAAQ,cAAc,CAAC,QAC9C;gBAAA,IAAI,CAAC,MAAM,SAAS,CAAC,QAAQ,GAAG,GAC5B,OAAO;YAAuB;YACtC,IAAI,QAAQ,OAAO,IAAI,QAAQ,QAAQ,cAAc,CAAC,YAClD;gBAAA,IAAI,OAAO,QAAQ,OAAO,KAAK,WAC3B,OAAO;YAA2B;YAC1C,IAAI,QAAQ,SAAS,IAAI,QAAQ,QAAQ,cAAc,CAAC,cAAc;gBAClE,IAAI,CAAC,MAAM,QAAQ,CAAC,QAAQ,SAAS,GACjC,OAAO;gBACX,IAAI,MAAM,OAAO,IAAI,CAAC,QAAQ,SAAS;gBACvC,IAAK,IAAI,IAAI,GAAG,IAAI,IAAI,MAAM,EAAE,EAAE,EAAG;oBACjC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,GAC1B,OAAO;oBACX,IAAI,OAAO,QAAQ,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,UACrC,OAAO;gBACf;YACJ;YACA,OAAO;QACX;QAEA;;;;;;;SAOC,GACD,UAAU,UAAU,GAAG,SAAS,WAAW,MAAM;YAC7C,IAAI,kBAAkB,MAAM,YAAY,CAAC,SAAS,EAC9C,OAAO;YACX,IAAI,UAAU,IAAI,MAAM,YAAY,CAAC,SAAS;YAC9C,IAAI,OAAO,KAAK,IAAI,MAChB,QAAQ,KAAK,GAAG,OAAO,KAAK,KAAK;YACrC,IAAI,OAAO,GAAG,IAAI,MACd,QAAQ,GAAG,GAAG,OAAO,GAAG,KAAK;YACjC,IAAI,OAAO,OAAO,IAAI,MAClB,QAAQ,OAAO,GAAG,QAAQ,OAAO,OAAO;YAC5C,IAAI,OAAO,SAAS,EAAE;gBAClB,IAAI,OAAO,OAAO,SAAS,KAAK,UAC5B,MAAM,UAAU;gBACpB,QAAQ,SAAS,GAAG,CAAC;gBACrB,IAAK,IAAI,OAAO,OAAO,IAAI,CAAC,OAAO,SAAS,GAAG,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,EAAE,EACrE,QAAQ,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,OAAO,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YACrE;YACA,OAAO;QACX;QAEA;;;;;;;;SAQC,GACD,UAAU,QAAQ,GAAG,SAAS,SAAS,OAAO,EAAE,OAAO;YACnD,IAAI,CAAC,SACD,UAAU,CAAC;YACf,IAAI,SAAS,CAAC;YACd,IAAI,QAAQ,OAAO,IAAI,QAAQ,QAAQ,EACnC,OAAO,SAAS,GAAG,CAAC;YACxB,IAAI,QAAQ,QAAQ,EAAE;gBAClB,OAAO,KAAK,GAAG;gBACf,OAAO,GAAG,GAAG;gBACb,OAAO,OAAO,GAAG;YACrB;YACA,IAAI,QAAQ,KAAK,IAAI,QAAQ,QAAQ,cAAc,CAAC,UAChD,OAAO,KAAK,GAAG,QAAQ,KAAK;YAChC,IAAI,QAAQ,GAAG,IAAI,QAAQ,QAAQ,cAAc,CAAC,QAC9C,OAAO,GAAG,GAAG,QAAQ,GAAG;YAC5B,IAAI,QAAQ,OAAO,IAAI,QAAQ,QAAQ,cAAc,CAAC,YAClD,OAAO,OAAO,GAAG,QAAQ,OAAO;YACpC,IAAI;YACJ,IAAI,QAAQ,SAAS,IAAI,AAAC,CAAA,QAAQ,OAAO,IAAI,CAAC,QAAQ,SAAS,CAAA,EAAG,MAAM,EAAE;gBACtE,OAAO,SAAS,GAAG,CAAC;gBACpB,IAAK,IAAI,IAAI,GAAG,IAAI,MAAM,MAAM,EAAE,EAAE,EAChC,OAAO,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,QAAQ,IAAI,IAAI,CAAC,SAAS,QAAQ,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,OAAO,QAAQ,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,QAAQ,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/J;YACA,OAAO;QACX;QAEA;;;;;;SAMC,GACD,UAAU,SAAS,CAAC,MAAM,GAAG,SAAS;YAClC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC,aAAa;QACvE;QAEA;;;;;;;SAOC,GACD,UAAU,UAAU,GAAG,SAAS,WAAW,aAAa;YACpD,IAAI,kBAAkB,WAClB,gBAAgB;YAEpB,OAAO,gBAAgB;QAC3B;QAEA,OAAO;IACX;IAEA,aAAa,KAAK,GAAG,AAAC;QAElB;;;;;;SAMC,GAED;;;;;;;SAOC,GACD,SAAS,MAAM,UAAU;YACrB,IAAI,CAAC,CAAC,GAAG,EAAE;YACX,IAAI,YACA;gBAAA,IAAK,IAAI,OAAO,OAAO,IAAI,CAAC,aAAa,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,EAAE,EAC/D,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MACvB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAAA;QACnD;QAEA;;;;;SAKC,GACD,MAAM,SAAS,CAAC,GAAG,GAAG;QAEtB;;;;;SAKC,GACD,MAAM,SAAS,CAAC,CAAC,GAAG,MAAM,UAAU;QAEpC;;;;;;;SAOC,GACD,MAAM,MAAM,GAAG,SAAS,OAAO,UAAU;YACrC,OAAO,IAAI,MAAM;QACrB;QAEA;;;;;;;;SAQC,GACD,MAAM,MAAM,GAAG,SAAS,OAAO,OAAO,EAAE,MAAM;YAC1C,IAAI,CAAC,QACD,SAAS,QAAQ,MAAM;YAC3B,IAAI,QAAQ,GAAG,IAAI,QAAQ,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,QAC3D,OAAO,MAAM,CAAC,qBAAqB,GAAE,GAAG,MAAM,CAAC,QAAQ,GAAG;YAC9D,IAAI,QAAQ,CAAC,IAAI,QAAQ,QAAQ,CAAC,CAAC,MAAM,EAAE;gBACvC,OAAO,MAAM,CAAC,qBAAqB,GAAE,IAAI,IAAI;gBAC7C,IAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,EACpC,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE;gBAC7B,OAAO,MAAM;YACjB;YACA,OAAO;QACX;QAEA;;;;;;;;SAQC,GACD,MAAM,eAAe,GAAG,SAAS,gBAAgB,OAAO,EAAE,MAAM;YAC5D,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,QAAQ,MAAM;QAC9C;QAEA;;;;;;;;;;SAUC,GACD,MAAM,MAAM,GAAG,SAAS,OAAO,MAAM,EAAE,MAAM;YACzC,IAAI,CAAE,CAAA,kBAAkB,OAAM,GAC1B,SAAS,QAAQ,MAAM,CAAC;YAC5B,IAAI,MAAM,WAAW,YAAY,OAAO,GAAG,GAAG,OAAO,GAAG,GAAG,QAAQ,UAAU,IAAI,MAAM,YAAY,CAAC,KAAK;YACzG,MAAO,OAAO,GAAG,GAAG,IAAK;gBACrB,IAAI,MAAM,OAAO,MAAM;gBACvB,OAAQ,QAAQ;oBAChB,KAAK;wBACG,QAAQ,GAAG,GAAG,OAAO,MAAM;wBAC3B;oBAER,KAAK;wBACG,IAAI,CAAE,CAAA,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,MAAM,AAAD,GAC9B,QAAQ,CAAC,GAAG,EAAE;wBAClB,IAAI,AAAC,CAAA,MAAM,CAAA,MAAO,GAAG;4BACjB,IAAI,OAAO,OAAO,MAAM,KAAK,OAAO,GAAG;4BACvC,MAAO,OAAO,GAAG,GAAG,KAChB,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK;wBACnC,OACI,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,KAAK;wBAC/B;oBAER;wBACI,OAAO,QAAQ,CAAC,MAAM;wBACtB;gBACJ;YACJ;YACA,OAAO;QACX;QAEA;;;;;;;;;SASC,GACD,MAAM,eAAe,GAAG,SAAS,gBAAgB,MAAM;YACnD,IAAI,CAAE,CAAA,kBAAkB,OAAM,GAC1B,SAAS,IAAI,QAAQ;YACzB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,OAAO,MAAM;QAC5C;QAEA;;;;;;;SAOC,GACD,MAAM,MAAM,GAAG,SAAS,OAAO,OAAO;YAClC,IAAI,OAAO,YAAY,YAAY,YAAY,MAC3C,OAAO;YACX,IAAI,QAAQ,GAAG,IAAI,QAAQ,QAAQ,cAAc,CAAC,QAC9C;gBAAA,IAAI,CAAC,MAAM,SAAS,CAAC,QAAQ,GAAG,GAC5B,OAAO;YAAuB;YACtC,IAAI,QAAQ,CAAC,IAAI,QAAQ,QAAQ,cAAc,CAAC,MAAM;gBAClD,IAAI,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,GACxB,OAAO;gBACX,IAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,EACpC,IAAI,OAAO,QAAQ,CAAC,CAAC,EAAE,KAAK,UACxB,OAAO;YACnB;YACA,OAAO;QACX;QAEA;;;;;;;SAOC,GACD,MAAM,UAAU,GAAG,SAAS,WAAW,MAAM;YACzC,IAAI,kBAAkB,MAAM,YAAY,CAAC,KAAK,EAC1C,OAAO;YACX,IAAI,UAAU,IAAI,MAAM,YAAY,CAAC,KAAK;YAC1C,IAAI,OAAO,GAAG,IAAI,MACd,QAAQ,GAAG,GAAG,OAAO,GAAG,KAAK;YACjC,IAAI,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,GACvB,MAAM,UAAU;gBACpB,QAAQ,CAAC,GAAG,EAAE;gBACd,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,EACnC,QAAQ,CAAC,CAAC,EAAE,GAAG,OAAO,OAAO,CAAC,CAAC,EAAE;YACzC;YACA,OAAO;QACX;QAEA;;;;;;;;SAQC,GACD,MAAM,QAAQ,GAAG,SAAS,SAAS,OAAO,EAAE,OAAO;YAC/C,IAAI,CAAC,SACD,UAAU,CAAC;YACf,IAAI,SAAS,CAAC;YACd,IAAI,QAAQ,MAAM,IAAI,QAAQ,QAAQ,EAClC,OAAO,CAAC,GAAG,EAAE;YACjB,IAAI,QAAQ,QAAQ,EAChB,OAAO,GAAG,GAAG;YACjB,IAAI,QAAQ,GAAG,IAAI,QAAQ,QAAQ,cAAc,CAAC,QAC9C,OAAO,GAAG,GAAG,QAAQ,GAAG;YAC5B,IAAI,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,MAAM,EAAE;gBAC/B,OAAO,CAAC,GAAG,EAAE;gBACb,IAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,EACpC,OAAO,CAAC,CAAC,EAAE,GAAG,QAAQ,IAAI,IAAI,CAAC,SAAS,QAAQ,CAAC,CAAC,EAAE,IAAI,OAAO,QAAQ,CAAC,CAAC,EAAE,IAAI,QAAQ,CAAC,CAAC,EAAE;YACnG;YACA,OAAO;QACX;QAEA;;;;;;SAMC,GACD,MAAM,SAAS,CAAC,MAAM,GAAG,SAAS;YAC9B,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC,aAAa;QACvE;QAEA;;;;;;;SAOC,GACD,MAAM,UAAU,GAAG,SAAS,WAAW,aAAa;YAChD,IAAI,kBAAkB,WAClB,gBAAgB;YAEpB,OAAO,gBAAgB;QAC3B;QAEA,OAAO;IACX;IAEA,aAAa,UAAU,GAAG,AAAC;QAEvB;;;;;;SAMC,GAED;;;;;;;SAOC,GACD,SAAS,WAAW,UAAU;YAC1B,IAAI,CAAC,CAAC,GAAG,EAAE;YACX,IAAI,YACA;gBAAA,IAAK,IAAI,OAAO,OAAO,IAAI,CAAC,aAAa,IAAI,GAAG,IAAI,KAAK,MAAM,EAAE,EAAE,EAC/D,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,MACvB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAAA;QACnD;QAEA;;;;;SAKC,GACD,WAAW,SAAS,CAAC,GAAG,GAAG;QAE3B;;;;;SAKC,GACD,WAAW,SAAS,CAAC,CAAC,GAAG,MAAM,UAAU;QAEzC;;;;;;;SAOC,GACD,WAAW,MAAM,GAAG,SAAS,OAAO,UAAU;YAC1C,OAAO,IAAI,WAAW;QAC1B;QAEA;;;;;;;;SAQC,GACD,WAAW,MAAM,GAAG,SAAS,OAAO,OAAO,EAAE,MAAM;YAC/C,IAAI,CAAC,QACD,SAAS,QAAQ,MAAM;YAC3B,IAAI,QAAQ,GAAG,IAAI,QAAQ,OAAO,cAAc,CAAC,IAAI,CAAC,SAAS,QAC3D,OAAO,MAAM,CAAC,qBAAqB,GAAE,GAAG,MAAM,CAAC,QAAQ,GAAG;YAC9D,IAAI,QAAQ,CAAC,IAAI,QAAQ,QAAQ,CAAC,CAAC,MAAM,EAAE;gBACvC,OAAO,MAAM,CAAC,qBAAqB,GAAE,IAAI,IAAI;gBAC7C,IAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,EACpC,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE;gBAC9B,OAAO,MAAM;YACjB;YACA,OAAO;QACX;QAEA;;;;;;;;SAQC,GACD,WAAW,eAAe,GAAG,SAAS,gBAAgB,OAAO,EAAE,MAAM;YACjE,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,QAAQ,MAAM;QAC9C;QAEA;;;;;;;;;;SAUC,GACD,WAAW,MAAM,GAAG,SAAS,OAAO,MAAM,EAAE,MAAM;YAC9C,IAAI,CAAE,CAAA,kBAAkB,OAAM,GAC1B,SAAS,QAAQ,MAAM,CAAC;YAC5B,IAAI,MAAM,WAAW,YAAY,OAAO,GAAG,GAAG,OAAO,GAAG,GAAG,QAAQ,UAAU,IAAI,MAAM,YAAY,CAAC,UAAU;YAC9G,MAAO,OAAO,GAAG,GAAG,IAAK;gBACrB,IAAI,MAAM,OAAO,MAAM;gBACvB,OAAQ,QAAQ;oBAChB,KAAK;wBACG,QAAQ,GAAG,GAAG,OAAO,MAAM;wBAC3B;oBAER,KAAK;wBACG,IAAI,CAAE,CAAA,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,MAAM,AAAD,GAC9B,QAAQ,CAAC,GAAG,EAAE;wBAClB,IAAI,AAAC,CAAA,MAAM,CAAA,MAAO,GAAG;4BACjB,IAAI,OAAO,OAAO,MAAM,KAAK,OAAO,GAAG;4BACvC,MAAO,OAAO,GAAG,GAAG,KAChB,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,MAAM;wBACpC,OACI,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,MAAM;wBAChC;oBAER;wBACI,OAAO,QAAQ,CAAC,MAAM;wBACtB;gBACJ;YACJ;YACA,OAAO;QACX;QAEA;;;;;;;;;SASC,GACD,WAAW,eAAe,GAAG,SAAS,gBAAgB,MAAM;YACxD,IAAI,CAAE,CAAA,kBAAkB,OAAM,GAC1B,SAAS,IAAI,QAAQ;YACzB,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,OAAO,MAAM;QAC5C;QAEA;;;;;;;SAOC,GACD,WAAW,MAAM,GAAG,SAAS,OAAO,OAAO;YACvC,IAAI,OAAO,YAAY,YAAY,YAAY,MAC3C,OAAO;YACX,IAAI,QAAQ,GAAG,IAAI,QAAQ,QAAQ,cAAc,CAAC,QAC9C;gBAAA,IAAI,CAAC,MAAM,SAAS,CAAC,QAAQ,GAAG,GAC5B,OAAO;YAAuB;YACtC,IAAI,QAAQ,CAAC,IAAI,QAAQ,QAAQ,cAAc,CAAC,MAAM;gBAClD,IAAI,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,GACxB,OAAO;gBACX,IAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,EACpC,IAAI,CAAC,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,GAC7B,OAAO;YACnB;YACA,OAAO;QACX;QAEA;;;;;;;SAOC,GACD,WAAW,UAAU,GAAG,SAAS,WAAW,MAAM;YAC9C,IAAI,kBAAkB,MAAM,YAAY,CAAC,UAAU,EAC/C,OAAO;YACX,IAAI,UAAU,IAAI,MAAM,YAAY,CAAC,UAAU;YAC/C,IAAI,OAAO,GAAG,IAAI,MACd,QAAQ,GAAG,GAAG,OAAO,GAAG,KAAK;YACjC,IAAI,OAAO,CAAC,EAAE;gBACV,IAAI,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,GACvB,MAAM,UAAU;gBACpB,QAAQ,CAAC,GAAG,EAAE;gBACd,IAAK,IAAI,IAAI,GAAG,IAAI,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,EACnC,QAAQ,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,KAAK;YACvC;YACA,OAAO;QACX;QAEA;;;;;;;;SAQC,GACD,WAAW,QAAQ,GAAG,SAAS,SAAS,OAAO,EAAE,OAAO;YACpD,IAAI,CAAC,SACD,UAAU,CAAC;YACf,IAAI,SAAS,CAAC;YACd,IAAI,QAAQ,MAAM,IAAI,QAAQ,QAAQ,EAClC,OAAO,CAAC,GAAG,EAAE;YACjB,IAAI,QAAQ,QAAQ,EAChB,OAAO,GAAG,GAAG;YACjB,IAAI,QAAQ,GAAG,IAAI,QAAQ,QAAQ,cAAc,CAAC,QAC9C,OAAO,GAAG,GAAG,QAAQ,GAAG;YAC5B,IAAI,QAAQ,CAAC,IAAI,QAAQ,CAAC,CAAC,MAAM,EAAE;gBAC/B,OAAO,CAAC,GAAG,EAAE;gBACb,IAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,EACpC,OAAO,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,CAAC,EAAE;YAClC;YACA,OAAO;QACX;QAEA;;;;;;SAMC,GACD,WAAW,SAAS,CAAC,MAAM,GAAG,SAAS;YACnC,OAAO,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,IAAI,CAAC,aAAa;QACvE;QAEA;;;;;;;SAOC,GACD,WAAW,UAAU,GAAG,SAAS,WAAW,aAAa;YACrD,IAAI,kBAAkB,WAClB,gBAAgB;YAEpB,OAAO,gBAAgB;QAC3B;QAEA,OAAO;IACX;IAEA,OAAO;AACX;AAEA,OAAO,OAAO,GAAG;;;ACr0BjB,kDAAA;;0CACa;AAWb,yDAAA,GACA,+CAAgB;AAZT,MAAM,OAAO;IAClB,QAAQ;IACR,IAAI;IACJ,QAAQ;IACR,UAAU,CAAC,MAAgB,CAAA,EAAA,EAAK,IAAG,CAAW;IAC9C,+CAAA,GACA,OAAO,CAAC,MAAgB,CAAA,EAAG,IAAG,CAAW;IACzC,4DAAA,GACA,UAAU,CAAC,OAAe,MAAgB,CAAA,EAAG,MAAK,EAAA,EAAK,IAAG,CAAW;AAC7D;AAGJ,SAAU,UAAuB,IAA+B;IACpE,OAAO,OAAO,KAAK,KAAK,CAAC,QAAQ;AACnC","sources":["src/index.ts","src/hnsw.ts","src/utils/index.ts","node_modules/.pnpm/@parcel+transformer-js@2.10.3_@parcel+core@2.10.3/node_modules/@parcel/transformer-js/src/esmodule-helpers.js","src/db/hollowdb.ts","src/proto/index.ts","proto/hnsw_comm.js","src/db/common/index.ts"],"sourcesContent":["import { ContractState, SetSDK } from \"hollowdb\";\nimport { HNSW } from \"./hnsw\";\nimport { HollowMemory } from \"./db/hollowdb\";\nimport type { JWKInterface, Warp } from \"warp-contracts\";\nimport { ArweaveSigner } from \"warp-contracts-plugin-deploy\";\n\n/**\n * Backwards compatibility with [Dria](https://dria.co/) contracts that make use\n * of a custom contract function called `upsertVectorMulti`, which is actually\n * equivalent to `setMany`.\n *\n * This class overrides the `set` and `setMany` functions of `SetSDK` from HollowDB.\n */\nexport class DriaCompatSDK extends SetSDK {\n override async setMany(keys: string[], values: string[]): Promise {\n await this.base.dryWriteInteraction({\n function: \"upsertVectorMulti\",\n value: {\n keys,\n values,\n },\n });\n }\n\n override async set(key: string, value: string): Promise {\n await this.setMany([key], [value]);\n }\n}\n\nexport default class HollowDBVector extends HNSW {\n /** HollowDB SDK instance as passed in the `constructor`. */\n sdk: SetSDK;\n\n /**\n * A VectorDB over HollowDB using HNSW index.\n *\n * @param hollowdb a hollowdb instance with `set` and `setMany` operations, where values are `string` typed.\n * - Vectors are encoded & decoded with protobuffers, and the base64 of encodings are stored in HollowDB\n * - Metadatas are stored as JSON-stringified values.\n * - Some of the HollowDB contracts (especially those in [Dria](https://dria.co/)) may use a function called\n * `upsertVectorMulti`, which is incompatible with `SetSDK`. For these, you may use `DriaCompatSDK`.\n *\n * @param options Optional HNSW parameters:\n *\n * - `m`: **Number of established connections.**\n * With higher dimension size, this should also be larger.\n * Defaults to 5.\n *\n * - `efConstruction`: **Size of the dynamic candidate list.**\n * Affects build times, for instance: 400 is slow but powerful, 40 is\n * fast but not that performant.\n * Defaults to 128.\n *\n * - `efSearch`: **Factor for quality of search.** Defaults to 20.\n *\n * @template M type of the metadata\n */\n constructor(\n hollowdb: SetSDK,\n options?: {\n m?: number;\n efConstruction?: number;\n efSearch?: number;\n },\n ) {\n const m = options?.m || 5;\n const ef_construction = options?.efConstruction || 128;\n const ef_search = options?.efSearch || 20;\n\n super(new HollowMemory(hollowdb), m, ef_construction, ef_search);\n\n this.sdk = hollowdb;\n }\n\n /** Deploy a new HollowDB Vector contract,\n * which is a HollowDB contract with `set` and `setMany` functions in particular.\n *\n * @param wallet your Arweave wallet\n * @param warp a Warp instance on mainnet\n * @returns deployed contract transaction id and source transaction id\n */\n static async deploy(wallet: JWKInterface, warp: Warp): Promise<{ contractTxId: string; srcTxId: string }> {\n // source transaction id, for the contract to be deployed\n const srcTxId = \"lSRrPRiiMYeJsGgT9BdV9OTZTw3hZw_UkGVpEXjD5sY\";\n\n // our source txid is on mainnet, so we must make sure of that\n if (warp.environment !== \"mainnet\") {\n throw new Error(\"Warp must be connected to mainnet.\");\n }\n\n // initailly the wallet is whitelisted on everything, and all\n // whitelists are required for the contract\n const addr = await warp.arweave.wallets.jwkToAddress(wallet);\n const initialState: ContractState = {\n version: \"hollowdb-vector@^0.1.0\",\n owner: addr,\n verificationKeys: { auth: null },\n isProofRequired: { auth: false },\n canEvolve: true,\n whitelists: {\n put: { [addr]: true },\n update: { [addr]: true },\n set: { [addr]: true },\n },\n isWhitelistRequired: { put: true, update: true, set: true },\n };\n\n const { srcTxId: deploymentSrcTxId, contractTxId } = await warp.deployFromSourceTx({\n wallet: new ArweaveSigner(wallet),\n initState: JSON.stringify(initialState),\n srcTxId: srcTxId,\n evaluationManifest: {\n evaluationOptions: {\n allowBigInt: true,\n useKVStorage: true,\n },\n },\n });\n\n // impossible case, but still we should check for it\n if (deploymentSrcTxId !== srcTxId) {\n console.error(\"Deployed srcTxId is different than the given source!\");\n console.error({ expected: srcTxId, received: deploymentSrcTxId });\n }\n\n return { contractTxId, srcTxId };\n }\n}\n","import { NodeHeap, compareNode, cosine_distance } from \"./utils\";\nimport type { Point, Node, LayerNode, KNNResult } from \"./types\";\nimport type { DBInterface } from \"./db/interfaces\";\n\n/**\n * An implementation of Hierarchical Navigable Small Worlds\n * that works over a key-value database.\n *\n * In particular, we provide a HollowDB interface that allows you to\n * store data on Arweave.\n *\n * @template M type of the metadata, which is extra information\n * stored along with each point, a common practice in vectorDBs.\n */\nexport class HNSW {\n /** A database that supports `DBInterface`. */\n db: DBInterface;\n\n /** Number of established connections; should increase as dimension size increases. */\n m: number;\n /** Maximum number of connections for each element per layer. */\n m_max0: number;\n /** Normalization factor for level generation. */\n ml: number;\n\n /** Size of the dynamic candidate list. Affects build times, 400 is very powerful, 40 is fast. */\n ef_construction: number;\n /** Factor for quality of search. */\n ef: number;\n\n constructor(db: DBInterface, M: number, ef_construction: number, ef_search: number) {\n this.db = db;\n\n this.m = M; // paper proposes [5,48] is a good range for m (Weavite uses 64)\n this.m_max0 = M * 2; // paper proposes max0 is 2 times m\n this.ml = 1 / Math.log(M); // papers heuristic to select ml, maximum layers\n\n this.ef_construction = ef_construction;\n this.ef = ef_search;\n }\n\n /** Returns the vector & its metadata at given index. */\n async get_vector(idx: number): Promise<{\n point: Point;\n metadata: M | null;\n }> {\n const point = await this.db.get_point(idx);\n const metadata = await this.db.get_metadata(idx);\n return { point, metadata };\n }\n\n /** Paper proposes this heuristic for layer selection for insertion of `q`. */\n select_layer() {\n return Math.floor(-Math.log(Math.random()) * this.ml);\n }\n\n /** Insert a query point.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 1\n */\n async insert(q: Point, metadata?: M) {\n const ep_index = await this.db.get_ep();\n const L = (await this.db.get_num_layers()) - 1;\n const l = this.select_layer();\n\n // a point is added and we get its index\n const idx = await this.db.new_point(q);\n if (metadata) {\n await this.db.set_metadata(idx, metadata);\n }\n\n if (ep_index !== null) {\n const dist = cosine_distance(q, await this.db.get_point(ep_index));\n // iterate for each layer from L to l+1 and find entry point\n let ep = [[dist, ep_index] as Node];\n for (let i = L; i > l; i--) {\n const ep_copy: Node[] = ep.map((e) => [e[0], e[1]]);\n\n // search with ef = 1, returning only one neighbor\n const W = await this.search_layer(q, ep_copy, 1, i);\n\n // if nearest neighbor found in layer i is closer than ep, then ep = nearest neighbor\n if (W.length > 0 && ep[0][0] > W[0][0]) {\n ep = W;\n }\n }\n\n // search all layers\n for (let l_c = Math.min(L, l); l_c >= 0; l_c--) {\n const W = await this.search_layer(q, ep, this.ef_construction, l_c);\n const newNode: LayerNode = {}; // this is for `this.graphs[l_c][idx] = {}`\n\n ep = W.map((e) => [e[0], e[1]] as Node); // copy W to ep\n const neighbors = this.select_neighbors(q, W, l_c);\n const indices = neighbors.map(([, idx]) => idx);\n const nodes = await this.db.get_neighbors(l_c, indices);\n\n // add bidirectional connections from neighbors to q at layer l_c\n const M = l_c === 0 ? this.m_max0 : this.m;\n\n for (const e of neighbors) {\n newNode[e[1]] = e[0];\n nodes[e[1]][idx] = e[0];\n }\n\n for (const e of neighbors) {\n const eConn = Object.entries(nodes[e[1]]).map(([k, v]) => [v, parseInt(k)] as Node);\n if (eConn.length > M) {\n // shrink connections\n const eNewConn = this.select_neighbors(await this.db.get_point(e[1]), eConn, l_c);\n // loop below equivalent to: self.graphs[l_c][e[1]] = {ind: dist for dist, ind in eNewConn}\n const dict: Record = {};\n for (const eNew of eNewConn) {\n dict[eNew[1]] = eNew[0];\n }\n\n nodes[e[1]] = dict; // equiv: this.graphs[l_c][e[1]] = dict;\n }\n }\n\n await this.db.upsert_neighbor(l_c, idx, newNode);\n await this.db.upsert_neighbors(l_c, nodes);\n }\n }\n\n // add a new small world for each new layer\n const LL = await this.db.get_num_layers();\n if (LL < l + 1) {\n await this.db.set_ep(idx);\n }\n\n // TODO: can make this in parallel via a new function that adds N to num_layers\n for (let i = LL; i < l + 1; i++) {\n await this.db.new_neighbor(idx);\n }\n }\n\n /** Search a query point.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 2\n */\n async search_layer(q: Point, ep: Node[], ef: number, l_c: number) {\n // set of visited elements | v = set(p for _, p in ep)\n const V = new Set(ep.map(([, id]) => id));\n\n // set of candidates, min-heapified\n const C = new NodeHeap(ep);\n\n // dynamic list of found neighbors, max-heapified | W = [(-mdist, p) for mdist, p in ep]\n // due to negation of `dist` value, this actually becomes a max-heap\n const W = new NodeHeap(ep.map(([mdist, p]) => [-mdist, p]));\n\n while (!C.isEmpty()) {\n const c = C.pop()!; // extract nearest element from C\n const c_v: number = c[0]; // get distance of c\n const f_dist = -W.top(1)[0][0]; // get furthest distance from q, multiply by -1 to make get real distance\n\n if (c_v > f_dist) {\n break;\n }\n\n // un-visited nodes\n const neighbors = Object.keys(await this.db.get_neighbor(l_c, c[1]))\n .map((k) => parseInt(k))\n .filter((k) => !V.has(k));\n\n // distances to `q`\n const points = await this.db.get_points(neighbors);\n const dists = points.map((p) => cosine_distance(p, q));\n\n // visit neighbors w.r.t distances\n dists.forEach((dist, i) => {\n const e = neighbors[i];\n V.add(e); // mark `e` as visited\n\n if (dist < f_dist || W.length < ef) {\n C.push([dist, e]);\n W.push([-dist, e]);\n\n // possible if `dist < f_dist`\n if (W.length > ef) {\n W.pop();\n }\n }\n });\n }\n\n if (ef === 1) {\n if (W.length !== 0) {\n // TODO: is there a faster way to do this code block?\n const dd = new NodeHeap(W.heapArray.map((W_i) => [-W_i[0], W_i[1]]));\n return [dd.pop()!];\n } else {\n return [];\n }\n }\n\n return W.heapArray.map((W_i) => [-W_i[0], W_i[1]]) as Node[];\n }\n\n /** Selects and adds neighbors to the graph.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 4\n */\n select_neighbors(q: Point, C: Node[], l_c: number, keepPrunedConnections: boolean = true) {\n const R = new NodeHeap();\n const W = new NodeHeap(C);\n const M = l_c > 0 ? this.m : this.m_max0; // number of neighbors to return\n\n const W_d = new NodeHeap(); // queue for discarded candidates\n while (W.length > 0 && R.length < M) {\n const e = W.pop()!; // extract nearest element from W to q\n const r_top = R.top(1)[0] as Node | undefined; // point with minimum distance to q in all R\n\n // it is possible that `r_top` is undefined, that is okay & is handled below\n if (R.length === 0 || (r_top && e[0] < r_top[0])) {\n R.push([e[0], e[1]]);\n } else {\n W_d.push([e[0], e[1]]);\n }\n }\n\n if (keepPrunedConnections) {\n while (W_d.length > 0 && R.length < M) {\n R.push(W_d.pop()!);\n }\n }\n\n return R.heapArray;\n }\n\n /** K-nearest Neighbor search. */\n async knn_search(q: Point, K: number): Promise[]> {\n const ep_index = await this.db.get_ep();\n\n // edge case: no points were added at all\n if (ep_index === null) return [];\n\n const L = (await this.db.get_num_layers()) - 1;\n const dist = cosine_distance(q, await this.db.get_point(ep_index));\n\n // search from top layer to layer 1\n let ep: Node[] = [[dist, ep_index]];\n for (let l_c = L; l_c > 0; l_c--) {\n ep = await this.search_layer(q, ep, 1, l_c);\n }\n ep = await this.search_layer(q, ep, this.ef, 0);\n\n // sort the results & get top K\n ep.sort(compareNode);\n const ep_topk = ep.slice(0, K);\n\n // retrieve metadatas\n const metadatas = await this.db.get_metadatas(ep_topk.map((ep) => ep[1]));\n\n return ep_topk.map((ep, i) => ({\n id: ep[1],\n distance: ep[0],\n metadata: metadatas[i],\n }));\n }\n}\n","import { Heap } from \"heap-js\";\nimport type { Node, Point } from \"../types\";\n\n/** A min-heap of {@link Node} types with custom comparator. */\nexport class NodeHeap extends Heap {\n constructor(elems: Node[] = []) {\n super(compareNode);\n if (elems.length !== 0) {\n super.addAll(elems);\n }\n }\n}\n\n/** Comparator for {@link Node} type, compares their distances. */\nexport function compareNode(a: Node, b: Node) {\n return a[0] - b[0];\n}\n\n/** Dot-product of two vectors. */\nexport function dot_product(a: Point, b: Point): number {\n return a.reduce((sum, val, idx) => sum + val * b[idx], 0);\n}\n\n/** Norm a vector. */\nexport function norm(a: Point): number {\n return Math.sqrt(a.reduce((sum, val) => sum + val * val, 0));\n}\n\n/** Cosine distance between two vectors, as 1 - cosine similarity. */\nexport function cosine_distance(a: Point, b: Point): number {\n return 1 - dot_product(a, b) / (norm(a) * norm(b));\n}\n\n/** Inner product (alias dot product) of two vectors. */\nexport function inner_product(a: Point, b: Point): number {\n return dot_product(a, b);\n}\n\n/** Euclidean distance between two vectors. */\nexport function l2_distance(a: Point, b: Point): number {\n return Math.sqrt(a.reduce((sum, val, idx) => sum + Math.pow(val - b[idx], 2), 0));\n}\n","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","import type { DBInterface } from \"./interfaces\";\nimport type { Graph, LayerNode, Point } from \"../types\";\nimport { decodeLayerNode, decodePoint, encodeLayerNode, encodePoint } from \"../proto\";\nimport { SetSDK } from \"hollowdb\";\nimport { keys, safeParse } from \"./common\";\n\nexport class HollowMemory implements DBInterface {\n client: SetSDK;\n\n /**\n * Deploy a HollowDB contract.\n * @param initialState initial state of the contract\n * @param source (optional) source transaction id\n * @returns deployed contract transaction id\n */\n async deploy(initialState: Awaited>, source: string = \"\") {\n const { contractTxId } = await this.client.warp.deployFromSourceTx({\n wallet: this.client.signer,\n srcTxId: source,\n initState: JSON.stringify(initialState),\n });\n\n return contractTxId;\n }\n\n constructor(client: SetSDK) {\n this.client = client;\n }\n\n async get_ep(): Promise {\n const ep = await this.client.get(keys.ep);\n return ep === null ? null : parseInt(ep);\n }\n\n async set_ep(ep: number): Promise {\n await this.client.set(keys.ep, ep.toString());\n }\n\n async get_point(idx: number): Promise {\n const data = await this.client.get(keys.point(idx));\n if (!data) {\n throw new Error(`No point with index ${idx}`);\n }\n const point = decodePoint(data);\n return point.v!;\n }\n\n async get_points(idxs: number[]): Promise {\n if (idxs.length === 0) return [];\n const datas = await this.safe_get_many(idxs.map((idx) => keys.point(idx)));\n\n // see if there is a null value in there\n const nullPos = datas.indexOf(null);\n if (nullPos !== -1) {\n throw new Error(`No point with index ${idxs[nullPos]}`);\n }\n\n const points = datas.map((data) => decodePoint(data!));\n return points.map((point) => point.v!);\n }\n\n async new_point(q: Point): Promise {\n const idx = await this.get_datasize();\n\n const point = encodePoint({ v: q, idx });\n await this.client.set(keys.point(idx), point);\n await this.client.set(keys.points, (idx + 1).toString());\n\n return idx;\n }\n\n async get_num_layers(): Promise {\n const numLayers = await this.client.get(keys.layers);\n return numLayers ? parseInt(numLayers) : 0;\n }\n\n async get_datasize(): Promise {\n const datasize = await this.client.get(keys.points);\n return datasize ? parseInt(datasize) : 0;\n }\n\n async get_neighbor(layer: number, idx: number): Promise {\n const data = await this.client.get(keys.neighbor(layer, idx));\n if (!data) {\n throw new Error(`No neighbors at layer ${layer}, index ${idx}\"`);\n }\n const node = decodeLayerNode(data);\n return node.neighbors!;\n }\n\n async get_neighbors(layer: number, idxs: number[]): Promise {\n const datas = await this.safe_get_many(idxs.map((idx) => keys.neighbor(layer, idx)));\n\n // see if there is a null value in there\n const nullPos = datas.indexOf(null);\n if (nullPos !== -1) {\n throw new Error(`No neighbors at layer ${layer}, index ${idxs[nullPos]}\"`);\n }\n\n const nodes = datas.map((data) => decodeLayerNode(data!));\n const neighbors = nodes.map((node) => node.neighbors!);\n return Object.fromEntries(idxs.map((idx, i) => [idx, neighbors[i]]));\n }\n\n async upsert_neighbor(layer: number, idx: number, node: LayerNode): Promise {\n const data = encodeLayerNode({\n idx,\n level: layer,\n neighbors: node,\n });\n await this.client.set(keys.neighbor(layer, idx), data);\n }\n\n async upsert_neighbors(layer: number, nodes: Graph): Promise {\n await this.safe_set_many(\n Object.keys(nodes).map((idx) => {\n const i = parseInt(idx);\n const key = keys.neighbor(layer, i);\n const value = encodeLayerNode({\n idx: i,\n level: layer,\n neighbors: nodes[i],\n });\n\n return [key, value];\n }),\n );\n }\n\n async new_neighbor(idx: number): Promise {\n const l = await this.get_num_layers();\n await this.upsert_neighbor(l, idx, {});\n\n // NOTE: if `new_neighbor` is run in parallel,\n // this might cause a race-condition\n await this.client.set(keys.layers, (l + 1).toString());\n }\n\n async get_metadata(idx: number): Promise {\n const data = await this.client.get(keys.metadata(idx));\n return safeParse(data);\n }\n\n async get_metadatas(idxs: number[]): Promise<(M | null)[]> {\n // const datas =\n return Promise.all(idxs.map((idx) => this.get_metadata(idx)));\n }\n\n async set_metadata(idx: number, data: M): Promise {\n await this.client.set(keys.metadata(idx), JSON.stringify(data));\n }\n\n /**\n * A `getMany` interaction that automatically splits the request into several\n * transactions so that the transaction body-limit is not exceeded for any of them.\n *\n * For every error, the input is split into two transactions of half the size.\n */\n private async safe_get_many(keys: string[]): Promise<(string | null)[]> {\n try {\n return await this.client.getMany(keys);\n } catch (err) {\n // TODO: check error type\n const half = Math.floor(keys.length >> 1);\n\n // prettier-ignore\n return await Promise.all([\n this.safe_get_many(keys.slice(0, half)),\n this.safe_get_many(keys.slice(half))]\n ).then((results) => results.flat());\n }\n }\n\n /**\n * A `setMany` interaction that automatically splits the request into several\n * transactions so that the transaction body-limit is not exceeded for any of them.\n *\n * For every error, the input is split into two transactions of half the size.\n */\n private async safe_set_many(entries: [key: string, value: string][]): Promise {\n try {\n await this.client.setMany(\n entries.map((e) => e[0]),\n entries.map((e) => e[1]),\n );\n } catch (err) {\n // TODO: check error type\n const half = Math.floor(entries.length >> 1);\n\n // prettier-ignore\n await Promise.all([\n this.safe_set_many(entries.slice(0, half)),\n this.safe_set_many(entries.slice(half))]\n ).then((results) => results.flat());\n }\n }\n\n toString() {\n return \"HollowDB Set with Protobufs\";\n }\n}\n","import { index_buffer } from \"../../proto/hnsw_comm\";\n\n/** Encodes a point to protobuf & base64's it. */\nexport function encodePoint(q: index_buffer.IPoint): string {\n const qe = index_buffer.Point.encode(q).finish();\n return Buffer.from(qe).toString(\"base64\");\n}\n\n/** Decodes a point from base64 encoded protobuf. */\nexport function decodePoint(data: string): index_buffer.IPoint {\n const dec = Buffer.from(data, \"base64\");\n return index_buffer.Point.decode(dec);\n}\n\n/** Encodes a point to protobuf & base64's it. */\nexport function encodeLayerNode(n: index_buffer.ILayerNode): string {\n const ne = index_buffer.LayerNode.encode({\n ...n,\n visible: n.visible || true, // is visible unless otherwise specified\n }).finish();\n return Buffer.from(ne).toString(\"base64\");\n}\n\n/** Decodes a point from base64 encoded protobuf. */\nexport function decodeLayerNode(data: string): index_buffer.ILayerNode {\n const dec = Buffer.from(data, \"base64\");\n return index_buffer.LayerNode.decode(dec);\n}\n","/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\n\"use strict\";\n\nvar $protobuf = require(\"protobufjs/minimal\");\n\n// Common aliases\nvar $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n\n// Exported root namespace\nvar $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\n$root.index_buffer = (function() {\n\n /**\n * Namespace index_buffer.\n * @exports index_buffer\n * @namespace\n */\n var index_buffer = {};\n\n index_buffer.LayerNode = (function() {\n\n /**\n * Properties of a LayerNode.\n * @memberof index_buffer\n * @interface ILayerNode\n * @property {number|null} [level] LayerNode level\n * @property {number|null} [idx] LayerNode idx\n * @property {boolean|null} [visible] LayerNode visible\n * @property {Object.|null} [neighbors] LayerNode neighbors\n */\n\n /**\n * Constructs a new LayerNode.\n * @memberof index_buffer\n * @classdesc Represents a LayerNode.\n * @implements ILayerNode\n * @constructor\n * @param {index_buffer.ILayerNode=} [properties] Properties to set\n */\n function LayerNode(properties) {\n this.neighbors = {};\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * LayerNode level.\n * @member {number} level\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.level = 0;\n\n /**\n * LayerNode idx.\n * @member {number} idx\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.idx = 0;\n\n /**\n * LayerNode visible.\n * @member {boolean} visible\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.visible = false;\n\n /**\n * LayerNode neighbors.\n * @member {Object.} neighbors\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.neighbors = $util.emptyObject;\n\n /**\n * Creates a new LayerNode instance using the specified properties.\n * @function create\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode=} [properties] Properties to set\n * @returns {index_buffer.LayerNode} LayerNode instance\n */\n LayerNode.create = function create(properties) {\n return new LayerNode(properties);\n };\n\n /**\n * Encodes the specified LayerNode message. Does not implicitly {@link index_buffer.LayerNode.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode} message LayerNode message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n LayerNode.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.level != null && Object.hasOwnProperty.call(message, \"level\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.level);\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.idx);\n if (message.visible != null && Object.hasOwnProperty.call(message, \"visible\"))\n writer.uint32(/* id 3, wireType 0 =*/24).bool(message.visible);\n if (message.neighbors != null && Object.hasOwnProperty.call(message, \"neighbors\"))\n for (var keys = Object.keys(message.neighbors), i = 0; i < keys.length; ++i)\n writer.uint32(/* id 4, wireType 2 =*/34).fork().uint32(/* id 1, wireType 0 =*/8).uint32(keys[i]).uint32(/* id 2, wireType 5 =*/21).float(message.neighbors[keys[i]]).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified LayerNode message, length delimited. Does not implicitly {@link index_buffer.LayerNode.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode} message LayerNode message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n LayerNode.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a LayerNode message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.LayerNode\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.LayerNode} LayerNode\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n LayerNode.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.LayerNode(), key, value;\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.level = reader.uint32();\n break;\n }\n case 2: {\n message.idx = reader.uint32();\n break;\n }\n case 3: {\n message.visible = reader.bool();\n break;\n }\n case 4: {\n if (message.neighbors === $util.emptyObject)\n message.neighbors = {};\n var end2 = reader.uint32() + reader.pos;\n key = 0;\n value = 0;\n while (reader.pos < end2) {\n var tag2 = reader.uint32();\n switch (tag2 >>> 3) {\n case 1:\n key = reader.uint32();\n break;\n case 2:\n value = reader.float();\n break;\n default:\n reader.skipType(tag2 & 7);\n break;\n }\n }\n message.neighbors[key] = value;\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a LayerNode message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.LayerNode\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.LayerNode} LayerNode\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n LayerNode.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a LayerNode message.\n * @function verify\n * @memberof index_buffer.LayerNode\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n LayerNode.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.level != null && message.hasOwnProperty(\"level\"))\n if (!$util.isInteger(message.level))\n return \"level: integer expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.visible != null && message.hasOwnProperty(\"visible\"))\n if (typeof message.visible !== \"boolean\")\n return \"visible: boolean expected\";\n if (message.neighbors != null && message.hasOwnProperty(\"neighbors\")) {\n if (!$util.isObject(message.neighbors))\n return \"neighbors: object expected\";\n var key = Object.keys(message.neighbors);\n for (var i = 0; i < key.length; ++i) {\n if (!$util.key32Re.test(key[i]))\n return \"neighbors: integer key{k:uint32} expected\";\n if (typeof message.neighbors[key[i]] !== \"number\")\n return \"neighbors: number{k:uint32} expected\";\n }\n }\n return null;\n };\n\n /**\n * Creates a LayerNode message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.LayerNode\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.LayerNode} LayerNode\n */\n LayerNode.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.LayerNode)\n return object;\n var message = new $root.index_buffer.LayerNode();\n if (object.level != null)\n message.level = object.level >>> 0;\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.visible != null)\n message.visible = Boolean(object.visible);\n if (object.neighbors) {\n if (typeof object.neighbors !== \"object\")\n throw TypeError(\".index_buffer.LayerNode.neighbors: object expected\");\n message.neighbors = {};\n for (var keys = Object.keys(object.neighbors), i = 0; i < keys.length; ++i)\n message.neighbors[keys[i]] = Number(object.neighbors[keys[i]]);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a LayerNode message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.LayerNode} message LayerNode\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n LayerNode.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.objects || options.defaults)\n object.neighbors = {};\n if (options.defaults) {\n object.level = 0;\n object.idx = 0;\n object.visible = false;\n }\n if (message.level != null && message.hasOwnProperty(\"level\"))\n object.level = message.level;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.visible != null && message.hasOwnProperty(\"visible\"))\n object.visible = message.visible;\n var keys2;\n if (message.neighbors && (keys2 = Object.keys(message.neighbors)).length) {\n object.neighbors = {};\n for (var j = 0; j < keys2.length; ++j)\n object.neighbors[keys2[j]] = options.json && !isFinite(message.neighbors[keys2[j]]) ? String(message.neighbors[keys2[j]]) : message.neighbors[keys2[j]];\n }\n return object;\n };\n\n /**\n * Converts this LayerNode to JSON.\n * @function toJSON\n * @memberof index_buffer.LayerNode\n * @instance\n * @returns {Object.} JSON object\n */\n LayerNode.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for LayerNode\n * @function getTypeUrl\n * @memberof index_buffer.LayerNode\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n LayerNode.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.LayerNode\";\n };\n\n return LayerNode;\n })();\n\n index_buffer.Point = (function() {\n\n /**\n * Properties of a Point.\n * @memberof index_buffer\n * @interface IPoint\n * @property {number|null} [idx] Point idx\n * @property {Array.|null} [v] Point v\n */\n\n /**\n * Constructs a new Point.\n * @memberof index_buffer\n * @classdesc Represents a Point.\n * @implements IPoint\n * @constructor\n * @param {index_buffer.IPoint=} [properties] Properties to set\n */\n function Point(properties) {\n this.v = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Point idx.\n * @member {number} idx\n * @memberof index_buffer.Point\n * @instance\n */\n Point.prototype.idx = 0;\n\n /**\n * Point v.\n * @member {Array.} v\n * @memberof index_buffer.Point\n * @instance\n */\n Point.prototype.v = $util.emptyArray;\n\n /**\n * Creates a new Point instance using the specified properties.\n * @function create\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint=} [properties] Properties to set\n * @returns {index_buffer.Point} Point instance\n */\n Point.create = function create(properties) {\n return new Point(properties);\n };\n\n /**\n * Encodes the specified Point message. Does not implicitly {@link index_buffer.Point.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint} message Point message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Point.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.idx);\n if (message.v != null && message.v.length) {\n writer.uint32(/* id 2, wireType 2 =*/18).fork();\n for (var i = 0; i < message.v.length; ++i)\n writer.float(message.v[i]);\n writer.ldelim();\n }\n return writer;\n };\n\n /**\n * Encodes the specified Point message, length delimited. Does not implicitly {@link index_buffer.Point.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint} message Point message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Point.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Point message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.Point\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.Point} Point\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Point.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.Point();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.idx = reader.uint32();\n break;\n }\n case 2: {\n if (!(message.v && message.v.length))\n message.v = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.v.push(reader.float());\n } else\n message.v.push(reader.float());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Point message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.Point\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.Point} Point\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Point.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Point message.\n * @function verify\n * @memberof index_buffer.Point\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Point.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.v != null && message.hasOwnProperty(\"v\")) {\n if (!Array.isArray(message.v))\n return \"v: array expected\";\n for (var i = 0; i < message.v.length; ++i)\n if (typeof message.v[i] !== \"number\")\n return \"v: number[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a Point message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.Point\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.Point} Point\n */\n Point.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.Point)\n return object;\n var message = new $root.index_buffer.Point();\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.v) {\n if (!Array.isArray(object.v))\n throw TypeError(\".index_buffer.Point.v: array expected\");\n message.v = [];\n for (var i = 0; i < object.v.length; ++i)\n message.v[i] = Number(object.v[i]);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Point message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.Point} message Point\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Point.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.v = [];\n if (options.defaults)\n object.idx = 0;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.v && message.v.length) {\n object.v = [];\n for (var j = 0; j < message.v.length; ++j)\n object.v[j] = options.json && !isFinite(message.v[j]) ? String(message.v[j]) : message.v[j];\n }\n return object;\n };\n\n /**\n * Converts this Point to JSON.\n * @function toJSON\n * @memberof index_buffer.Point\n * @instance\n * @returns {Object.} JSON object\n */\n Point.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Point\n * @function getTypeUrl\n * @memberof index_buffer.Point\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Point.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.Point\";\n };\n\n return Point;\n })();\n\n index_buffer.PointQuant = (function() {\n\n /**\n * Properties of a PointQuant.\n * @memberof index_buffer\n * @interface IPointQuant\n * @property {number|null} [idx] PointQuant idx\n * @property {Array.|null} [v] PointQuant v\n */\n\n /**\n * Constructs a new PointQuant.\n * @memberof index_buffer\n * @classdesc Represents a PointQuant.\n * @implements IPointQuant\n * @constructor\n * @param {index_buffer.IPointQuant=} [properties] Properties to set\n */\n function PointQuant(properties) {\n this.v = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * PointQuant idx.\n * @member {number} idx\n * @memberof index_buffer.PointQuant\n * @instance\n */\n PointQuant.prototype.idx = 0;\n\n /**\n * PointQuant v.\n * @member {Array.} v\n * @memberof index_buffer.PointQuant\n * @instance\n */\n PointQuant.prototype.v = $util.emptyArray;\n\n /**\n * Creates a new PointQuant instance using the specified properties.\n * @function create\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant=} [properties] Properties to set\n * @returns {index_buffer.PointQuant} PointQuant instance\n */\n PointQuant.create = function create(properties) {\n return new PointQuant(properties);\n };\n\n /**\n * Encodes the specified PointQuant message. Does not implicitly {@link index_buffer.PointQuant.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant} message PointQuant message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n PointQuant.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.idx);\n if (message.v != null && message.v.length) {\n writer.uint32(/* id 2, wireType 2 =*/18).fork();\n for (var i = 0; i < message.v.length; ++i)\n writer.uint32(message.v[i]);\n writer.ldelim();\n }\n return writer;\n };\n\n /**\n * Encodes the specified PointQuant message, length delimited. Does not implicitly {@link index_buffer.PointQuant.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant} message PointQuant message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n PointQuant.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a PointQuant message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.PointQuant\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.PointQuant} PointQuant\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n PointQuant.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.PointQuant();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.idx = reader.uint32();\n break;\n }\n case 2: {\n if (!(message.v && message.v.length))\n message.v = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.v.push(reader.uint32());\n } else\n message.v.push(reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a PointQuant message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.PointQuant\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.PointQuant} PointQuant\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n PointQuant.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a PointQuant message.\n * @function verify\n * @memberof index_buffer.PointQuant\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n PointQuant.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.v != null && message.hasOwnProperty(\"v\")) {\n if (!Array.isArray(message.v))\n return \"v: array expected\";\n for (var i = 0; i < message.v.length; ++i)\n if (!$util.isInteger(message.v[i]))\n return \"v: integer[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a PointQuant message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.PointQuant\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.PointQuant} PointQuant\n */\n PointQuant.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.PointQuant)\n return object;\n var message = new $root.index_buffer.PointQuant();\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.v) {\n if (!Array.isArray(object.v))\n throw TypeError(\".index_buffer.PointQuant.v: array expected\");\n message.v = [];\n for (var i = 0; i < object.v.length; ++i)\n message.v[i] = object.v[i] >>> 0;\n }\n return message;\n };\n\n /**\n * Creates a plain object from a PointQuant message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.PointQuant} message PointQuant\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n PointQuant.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.v = [];\n if (options.defaults)\n object.idx = 0;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.v && message.v.length) {\n object.v = [];\n for (var j = 0; j < message.v.length; ++j)\n object.v[j] = message.v[j];\n }\n return object;\n };\n\n /**\n * Converts this PointQuant to JSON.\n * @function toJSON\n * @memberof index_buffer.PointQuant\n * @instance\n * @returns {Object.} JSON object\n */\n PointQuant.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for PointQuant\n * @function getTypeUrl\n * @memberof index_buffer.PointQuant\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n PointQuant.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.PointQuant\";\n };\n\n return PointQuant;\n })();\n\n return index_buffer;\n})();\n\nmodule.exports = $root;\n","/** Utilities to get the key in KVdb for a value. */\nexport const keys = {\n layers: \"layers\",\n ep: \"ep\",\n points: \"points\",\n metadata: (idx: number) => `m:${idx}` as const,\n /** Maps a point index to its key in the KVdb. */\n point: (idx: number) => `${idx}` as const,\n /** Maps a neighbor (layer & index) to its key in the KVdb. */\n neighbor: (layer: number, idx: number) => `${layer}__${idx}` as const,\n} as const;\n\n/** Safely parses a data, returning `null` if its falsy. */\nexport function safeParse(data: string | null | undefined): V | null {\n return data ? JSON.parse(data) : null;\n}\n"],"names":[],"version":3,"file":"index.cjs.map","sourceRoot":"../"} \ No newline at end of file diff --git a/lib/index.d.ts b/lib/index.d.ts index c0bded8..882906e 100644 --- a/lib/index.d.ts +++ b/lib/index.d.ts @@ -9,7 +9,7 @@ type LayerNode = Record; /** A distance and id of a point with respect to another node. */ type Node = [distance: number, id: number]; /** Result of a KNN query for one vector. */ -type KNNResult = { +type KNNResult = { id: number; distance: number; metadata: M | null; @@ -17,7 +17,7 @@ type KNNResult = { /** * The `graphs` and `points` of HNSW can be stored in any interface supported by this interface. */ -interface DBInterface { +interface DBInterface { /** Adds a new empty layer. * @param idx index of the point, which will allow us to * initalize the new later as `{[idx]: {}}` @@ -91,7 +91,7 @@ interface DBInterface { * @template M type of the metadata, which is extra information * stored along with each point, a common practice in vectorDBs. */ -declare class HNSW { +declare class HNSW { /** A database that supports `DBInterface`. */ db: DBInterface; /** Number of established connections; should increase as dimension size increases. */ @@ -104,7 +104,7 @@ declare class HNSW { ef_construction: number; /** Factor for quality of search. */ ef: number; - constructor(db: DBInterface, M: number, ef_construction: number, ef_search: number); + constructor(db: DBInterface, M: number, ef_construction: number, ef_search: number); /** Returns the vector & its metadata at given index. */ get_vector(idx: number): Promise<{ point: Point; @@ -127,7 +127,18 @@ declare class HNSW { /** K-nearest Neighbor search. */ knn_search(q: Point, K: number): Promise[]>; } -export default class HollowDBVector extends HNSW { +/** + * Backwards compatibility with [Dria](https://dria.co/) contracts that make use + * of a custom contract function called `upsertVectorMulti`, which is actually + * equivalent to `setMany`. + * + * This class overrides the `set` and `setMany` functions of `SetSDK` from HollowDB. + */ +export class DriaCompatSDK extends SetSDK { + setMany(keys: string[], values: string[]): Promise; + set(key: string, value: string): Promise; +} +export default class HollowDBVector extends HNSW { /** HollowDB SDK instance as passed in the `constructor`. */ sdk: SetSDK; /** @@ -136,6 +147,8 @@ export default class HollowDBVector extends HNSW { * @param hollowdb a hollowdb instance with `set` and `setMany` operations, where values are `string` typed. * - Vectors are encoded & decoded with protobuffers, and the base64 of encodings are stored in HollowDB * - Metadatas are stored as JSON-stringified values. + * - Some of the HollowDB contracts (especially those in [Dria](https://dria.co/)) may use a function called + * `upsertVectorMulti`, which is incompatible with `SetSDK`. For these, you may use `DriaCompatSDK`. * * @param options Optional HNSW parameters: * diff --git a/lib/index.d.ts.map b/lib/index.d.ts.map index f3d8f23..6b70fe1 100644 --- a/lib/index.d.ts.map +++ b/lib/index.d.ts.map @@ -1 +1 @@ -{"mappings":"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","sources":["src/src/types/index.ts","src/src/utils/index.ts","src/src/db/interfaces/index.ts","src/src/hnsw.ts","src/src/proto/index.ts","src/src/db/common/index.ts","src/src/db/hollowdb.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,"import { ContractState, SetSDK } from \"hollowdb\";\nimport { HNSW } from \"./hnsw\";\nimport { HollowMemory } from \"./db/hollowdb\";\nimport type { JWKInterface, Warp } from \"warp-contracts\";\nimport { ArweaveSigner } from \"warp-contracts-plugin-deploy\";\n\nexport default class HollowDBVector extends HNSW {\n /** HollowDB SDK instance as passed in the `constructor`. */\n sdk: SetSDK;\n\n /**\n * A VectorDB over HollowDB using HNSW index.\n *\n * @param hollowdb a hollowdb instance with `set` and `setMany` operations, where values are `string` typed.\n * - Vectors are encoded & decoded with protobuffers, and the base64 of encodings are stored in HollowDB\n * - Metadatas are stored as JSON-stringified values.\n *\n * @param options Optional HNSW parameters:\n *\n * - `m`: **Number of established connections.**\n * With higher dimension size, this should also be larger.\n * Defaults to 5.\n *\n * - `efConstruction`: **Size of the dynamic candidate list.**\n * Affects build times, for instance: 400 is slow but powerful, 40 is\n * fast but not that performant.\n * Defaults to 128.\n *\n * - `efSearch`: **Factor for quality of search.** Defaults to 20.\n *\n * @template M type of the metadata\n */\n constructor(\n hollowdb: SetSDK,\n options?: {\n m?: number;\n efConstruction?: number;\n efSearch?: number;\n },\n ) {\n const m = options?.m || 5;\n const ef_construction = options?.efConstruction || 128;\n const ef_search = options?.efSearch || 20;\n\n super(new HollowMemory(hollowdb), m, ef_construction, ef_search);\n\n this.sdk = hollowdb;\n }\n\n /** Deploy a new HollowDB Vector contract,\n * which is a HollowDB contract with `set` and `setMany` functions in particular.\n *\n * @param wallet your Arweave wallet\n * @param warp a Warp instance on mainnet\n * @returns deployed contract transaction id and source transaction id\n */\n static async deploy(wallet: JWKInterface, warp: Warp): Promise<{ contractTxId: string; srcTxId: string }> {\n // source transaction id, for the contract to be deployed\n const srcTxId = \"lSRrPRiiMYeJsGgT9BdV9OTZTw3hZw_UkGVpEXjD5sY\";\n\n // our source txid is on mainnet, so we must make sure of that\n if (warp.environment !== \"mainnet\") {\n throw new Error(\"Warp must be connected to mainnet.\");\n }\n\n // initailly the wallet is whitelisted on everything, and all\n // whitelists are required for the contract\n const addr = await warp.arweave.wallets.jwkToAddress(wallet);\n const initialState: ContractState = {\n version: \"hollowdb-vector@^0.1.0\",\n owner: addr,\n verificationKeys: { auth: null },\n isProofRequired: { auth: false },\n canEvolve: true,\n whitelists: {\n put: { [addr]: true },\n update: { [addr]: true },\n set: { [addr]: true },\n },\n isWhitelistRequired: { put: true, update: true, set: true },\n };\n\n const { srcTxId: deploymentSrcTxId, contractTxId } = await warp.deployFromSourceTx({\n wallet: new ArweaveSigner(wallet),\n initState: JSON.stringify(initialState),\n srcTxId: srcTxId,\n evaluationManifest: {\n evaluationOptions: {\n allowBigInt: true,\n useKVStorage: true,\n },\n },\n });\n\n // impossible case, but still we should check for it\n if (deploymentSrcTxId !== srcTxId) {\n console.error(\"Deployed srcTxId is different than the given source!\");\n console.error({ expected: srcTxId, received: deploymentSrcTxId });\n }\n\n return { contractTxId, srcTxId };\n }\n}\n"],"names":[],"version":3,"file":"index.d.ts.map"} \ No newline at end of file +{"mappings":";;AAAA,0CAA0C;AAC1C,aAAoB,MAAM,EAAE,CAAC;AAE7B,yBAAyB;AACzB,aAAoB,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAE9C,8BAA8B;AAC9B,iBAAwB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/C,iEAAiE;AACjE,YAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;AAElD,4CAA4C;AAC5C,eAAsB,CAAC,GAAG,OAAO,IAAI;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;CACpB,CAAC;AEfF;;GAEG;AACH,sBAA6B,CAAC,GAAG,OAAO;IAGtC;;;OAGG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzC,qEAAqE;IACrE,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7D,sEAAsE;IACtE,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7D,kEAAkE;IAClE,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5E,mEAAmE;IACnE,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7D;;OAEG;IACH,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAIlC;;;;OAIG;IACH,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAErC;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAEvC;;;;OAIG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAE7C;;;;OAIG;IACH,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAIhC;;OAEG;IACH,MAAM,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAEjC;;OAEG;IACH,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAIlC;;;OAGG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAE7C;;;OAGG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IAErD;;;OAGG;IACH,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AClFD;;;;;;;;;GASG;AACH,mBAAkB,CAAC,GAAG,OAAO;IAC3B,8CAA8C;IAC9C,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IAEnB,sFAAsF;IACtF,CAAC,EAAE,MAAM,CAAC;IACV,gEAAgE;IAChE,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,EAAE,EAAE,MAAM,CAAC;IAEX,iGAAiG;IACjG,eAAe,EAAE,MAAM,CAAC;IACxB,oCAAoC;IACpC,EAAE,EAAE,MAAM,CAAC;gBAEC,EAAE,EAAE,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAWrF,wDAAwD;IAClD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;QACrC,KAAK,EAAE,KAAK,CAAC;QACb,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC;KACpB,CAAC;IAMF,8EAA8E;IAC9E,YAAY;IAIZ;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,CAAC,EAAE,CAAC;IA6EnC;;OAEG;IACG,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM;IA2DhE;;OAEG;IACH,gBAAgB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,qBAAqB,GAAE,OAAc;IA2BxF,iCAAiC;IAC3B,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;CA6B/D;AI5PD;;;;;;GAMG;AACH,0BAA2B,SAAQ,OAAO,MAAM,CAAC;IAChC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAUxD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAG9D;AAED,oCAAoC,CAAC,GAAG,OAAO,CAAE,SAAQ,KAAK,CAAC,CAAC;IAC9D,4DAA4D;IAC5D,GAAG,EAAE,OAAO,MAAM,CAAC,CAAC;IAEpB;;;;;;;;;;;;;;;;;;;;;;;OAuBG;gBAED,QAAQ,EAAE,OAAO,MAAM,CAAC,EACxB,OAAO,CAAC,EAAE;QACR,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB;IAWH;;;;;;OAMG;WACU,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CA8C1G","sources":["src/src/types/index.ts","src/src/utils/index.ts","src/src/db/interfaces/index.ts","src/src/hnsw.ts","src/src/proto/index.ts","src/src/db/common/index.ts","src/src/db/hollowdb.ts","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,"import { ContractState, SetSDK } from \"hollowdb\";\nimport { HNSW } from \"./hnsw\";\nimport { HollowMemory } from \"./db/hollowdb\";\nimport type { JWKInterface, Warp } from \"warp-contracts\";\nimport { ArweaveSigner } from \"warp-contracts-plugin-deploy\";\n\n/**\n * Backwards compatibility with [Dria](https://dria.co/) contracts that make use\n * of a custom contract function called `upsertVectorMulti`, which is actually\n * equivalent to `setMany`.\n *\n * This class overrides the `set` and `setMany` functions of `SetSDK` from HollowDB.\n */\nexport class DriaCompatSDK extends SetSDK {\n override async setMany(keys: string[], values: string[]): Promise {\n await this.base.dryWriteInteraction({\n function: \"upsertVectorMulti\",\n value: {\n keys,\n values,\n },\n });\n }\n\n override async set(key: string, value: string): Promise {\n await this.setMany([key], [value]);\n }\n}\n\nexport default class HollowDBVector extends HNSW {\n /** HollowDB SDK instance as passed in the `constructor`. */\n sdk: SetSDK;\n\n /**\n * A VectorDB over HollowDB using HNSW index.\n *\n * @param hollowdb a hollowdb instance with `set` and `setMany` operations, where values are `string` typed.\n * - Vectors are encoded & decoded with protobuffers, and the base64 of encodings are stored in HollowDB\n * - Metadatas are stored as JSON-stringified values.\n * - Some of the HollowDB contracts (especially those in [Dria](https://dria.co/)) may use a function called\n * `upsertVectorMulti`, which is incompatible with `SetSDK`. For these, you may use `DriaCompatSDK`.\n *\n * @param options Optional HNSW parameters:\n *\n * - `m`: **Number of established connections.**\n * With higher dimension size, this should also be larger.\n * Defaults to 5.\n *\n * - `efConstruction`: **Size of the dynamic candidate list.**\n * Affects build times, for instance: 400 is slow but powerful, 40 is\n * fast but not that performant.\n * Defaults to 128.\n *\n * - `efSearch`: **Factor for quality of search.** Defaults to 20.\n *\n * @template M type of the metadata\n */\n constructor(\n hollowdb: SetSDK,\n options?: {\n m?: number;\n efConstruction?: number;\n efSearch?: number;\n },\n ) {\n const m = options?.m || 5;\n const ef_construction = options?.efConstruction || 128;\n const ef_search = options?.efSearch || 20;\n\n super(new HollowMemory(hollowdb), m, ef_construction, ef_search);\n\n this.sdk = hollowdb;\n }\n\n /** Deploy a new HollowDB Vector contract,\n * which is a HollowDB contract with `set` and `setMany` functions in particular.\n *\n * @param wallet your Arweave wallet\n * @param warp a Warp instance on mainnet\n * @returns deployed contract transaction id and source transaction id\n */\n static async deploy(wallet: JWKInterface, warp: Warp): Promise<{ contractTxId: string; srcTxId: string }> {\n // source transaction id, for the contract to be deployed\n const srcTxId = \"lSRrPRiiMYeJsGgT9BdV9OTZTw3hZw_UkGVpEXjD5sY\";\n\n // our source txid is on mainnet, so we must make sure of that\n if (warp.environment !== \"mainnet\") {\n throw new Error(\"Warp must be connected to mainnet.\");\n }\n\n // initailly the wallet is whitelisted on everything, and all\n // whitelists are required for the contract\n const addr = await warp.arweave.wallets.jwkToAddress(wallet);\n const initialState: ContractState = {\n version: \"hollowdb-vector@^0.1.0\",\n owner: addr,\n verificationKeys: { auth: null },\n isProofRequired: { auth: false },\n canEvolve: true,\n whitelists: {\n put: { [addr]: true },\n update: { [addr]: true },\n set: { [addr]: true },\n },\n isWhitelistRequired: { put: true, update: true, set: true },\n };\n\n const { srcTxId: deploymentSrcTxId, contractTxId } = await warp.deployFromSourceTx({\n wallet: new ArweaveSigner(wallet),\n initState: JSON.stringify(initialState),\n srcTxId: srcTxId,\n evaluationManifest: {\n evaluationOptions: {\n allowBigInt: true,\n useKVStorage: true,\n },\n },\n });\n\n // impossible case, but still we should check for it\n if (deploymentSrcTxId !== srcTxId) {\n console.error(\"Deployed srcTxId is different than the given source!\");\n console.error({ expected: srcTxId, received: deploymentSrcTxId });\n }\n\n return { contractTxId, srcTxId };\n }\n}\n"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../"} \ No newline at end of file diff --git a/lib/index.mjs b/lib/index.mjs index ab8891a..2993818 100644 --- a/lib/index.mjs +++ b/lib/index.mjs @@ -142,12 +142,38 @@ this[globalName] = mainExports; } } -})({"kdrGj":[function(require,module,exports) { +})({"keFvs":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); +/** + * Backwards compatibility with [Dria](https://dria.co/) contracts that make use + * of a custom contract function called `upsertVectorMulti`, which is actually + * equivalent to `setMany`. + * + * This class overrides the `set` and `setMany` functions of `SetSDK` from HollowDB. + */ parcelHelpers.export(exports, "DriaCompatSDK", ()=>DriaCompatSDK); +var _hollowdb = require("hollowdb"); var _hnsw = require("./hnsw"); -var _hollowdb = require("./db/hollowdb"); +var _hollowdb1 = require("./db/hollowdb"); var _warpContractsPluginDeploy = require("warp-contracts-plugin-deploy"); +class DriaCompatSDK extends (0, _hollowdb.SetSDK) { + async setMany(keys, values) { + await this.base.dryWriteInteraction({ + function: "upsertVectorMulti", + value: { + keys, + values + } + }); + } + async set(key, value) { + await this.setMany([ + key + ], [ + value + ]); + } +} class HollowDBVector extends (0, _hnsw.HNSW) { /** * A VectorDB over HollowDB using HNSW index. @@ -155,6 +181,8 @@ class HollowDBVector extends (0, _hnsw.HNSW) { * @param hollowdb a hollowdb instance with `set` and `setMany` operations, where values are `string` typed. * - Vectors are encoded & decoded with protobuffers, and the base64 of encodings are stored in HollowDB * - Metadatas are stored as JSON-stringified values. + * - Some of the HollowDB contracts (especially those in [Dria](https://dria.co/)) may use a function called + * `upsertVectorMulti`, which is incompatible with `SetSDK`. For these, you may use `DriaCompatSDK`. * * @param options Optional HNSW parameters: * @@ -171,10 +199,10 @@ class HollowDBVector extends (0, _hnsw.HNSW) { * * @template M type of the metadata */ constructor(hollowdb, options){ - const m = options?.m || 5; - const ef_construction = options?.efConstruction || 128; - const ef_search = options?.efSearch || 20; - super(new (0, _hollowdb.HollowMemory)(hollowdb), m, ef_construction, ef_search); + const m = (options === null || options === void 0 ? void 0 : options.m) || 5; + const ef_construction = (options === null || options === void 0 ? void 0 : options.efConstruction) || 128; + const ef_search = (options === null || options === void 0 ? void 0 : options.efSearch) || 20; + super(new (0, _hollowdb1.HollowMemory)(hollowdb), m, ef_construction, ef_search); this.sdk = hollowdb; } /** Deploy a new HollowDB Vector contract, @@ -245,7 +273,7 @@ class HollowDBVector extends (0, _hnsw.HNSW) { } exports.default = HollowDBVector; -},{"./hnsw":"7sHuS","./db/hollowdb":"kPqtL","warp-contracts-plugin-deploy":"warp-contracts-plugin-deploy","@parcel/transformer-js/src/esmodule-helpers.js":"k8vWW"}],"7sHuS":[function(require,module,exports) { +},{"hollowdb":"hollowdb","./hnsw":"fAXc2","./db/hollowdb":"gOkWn","warp-contracts-plugin-deploy":"warp-contracts-plugin-deploy","@parcel/transformer-js/src/esmodule-helpers.js":"2gnRB"}],"fAXc2":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); /** @@ -316,7 +344,7 @@ class HNSW { e[1] ]); // copy W to ep const neighbors = this.select_neighbors(q, W, l_c); - const indices = neighbors.map(([_, idx])=>idx); + const indices = neighbors.map(([, idx])=>idx); const nodes = await this.db.get_neighbors(l_c, indices); // add bidirectional connections from neighbors to q at layer l_c const M = l_c === 0 ? this.m_max0 : this.m; @@ -333,7 +361,7 @@ class HNSW { // shrink connections const eNewConn = this.select_neighbors(await this.db.get_point(e[1]), eConn, l_c); // loop below equivalent to: self.graphs[l_c][e[1]] = {ind: dist for dist, ind in eNewConn} - let dict = {}; + const dict = {}; for (const eNew of eNewConn)dict[eNew[1]] = eNew[0]; nodes[e[1]] = dict; // equiv: this.graphs[l_c][e[1]] = dict; } @@ -352,7 +380,7 @@ class HNSW { * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 2 */ async search_layer(q, ep, ef, l_c) { // set of visited elements | v = set(p for _, p in ep) - const V = new Set(ep.map(([_, id])=>id)); + const V = new Set(ep.map(([, id])=>id)); // set of candidates, min-heapified const C = new (0, _utils.NodeHeap)(ep); // dynamic list of found neighbors, max-heapified | W = [(-mdist, p) for mdist, p in ep] @@ -430,7 +458,6 @@ class HNSW { return R.heapArray; } /** K-nearest Neighbor search. */ async knn_search(q, K) { - let W = []; const ep_index = await this.db.get_ep(); // edge case: no points were added at all if (ep_index === null) return []; @@ -458,7 +485,7 @@ class HNSW { } } -},{"./utils":"kMZcP","@parcel/transformer-js/src/esmodule-helpers.js":"k8vWW"}],"kMZcP":[function(require,module,exports) { +},{"./utils":"3vdkL","@parcel/transformer-js/src/esmodule-helpers.js":"2gnRB"}],"3vdkL":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); /** A min-heap of {@link Node} types with custom comparator. */ parcelHelpers.export(exports, "NodeHeap", ()=>NodeHeap); @@ -494,7 +521,7 @@ function l2_distance(a, b) { return Math.sqrt(a.reduce((sum, val, idx)=>sum + Math.pow(val - b[idx], 2), 0)); } -},{"heap-js":"heap-js","@parcel/transformer-js/src/esmodule-helpers.js":"k8vWW"}],"k8vWW":[function(require,module,exports) { +},{"heap-js":"heap-js","@parcel/transformer-js/src/esmodule-helpers.js":"2gnRB"}],"2gnRB":[function(require,module,exports) { exports.interopDefault = function(a) { return a && a.__esModule ? a : { default: a @@ -524,7 +551,7 @@ exports.export = function(dest, destName, get) { }); }; -},{}],"kPqtL":[function(require,module,exports) { +},{}],"gOkWn":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); parcelHelpers.export(exports, "HollowMemory", ()=>HollowMemory); @@ -687,7 +714,7 @@ class HollowMemory { } } -},{"../proto":"3mgIA","./common":"3uiDG","@parcel/transformer-js/src/esmodule-helpers.js":"k8vWW"}],"3mgIA":[function(require,module,exports) { +},{"../proto":"043TZ","./common":"9eZCo","@parcel/transformer-js/src/esmodule-helpers.js":"2gnRB"}],"043TZ":[function(require,module,exports) { var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); /** Encodes a point to protobuf & base64's it. */ parcelHelpers.export(exports, "encodePoint", ()=>encodePoint); @@ -715,7 +742,7 @@ function decodeLayerNode(data) { return (0, _hnswComm.index_buffer).LayerNode.decode(dec); } -},{"../../proto/hnsw_comm":"c7EWc","@parcel/transformer-js/src/esmodule-helpers.js":"k8vWW"}],"c7EWc":[function(require,module,exports) { +},{"../../proto/hnsw_comm":"kOCCP","@parcel/transformer-js/src/esmodule-helpers.js":"2gnRB"}],"kOCCP":[function(require,module,exports) { /*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/ "use strict"; var $protobuf = require("d3d6c5f7facd1bba"); // Common aliases @@ -1368,7 +1395,7 @@ $root.index_buffer = function() { }(); module.exports = $root; -},{"d3d6c5f7facd1bba":"protobufjs/minimal"}],"3uiDG":[function(require,module,exports) { +},{"d3d6c5f7facd1bba":"protobufjs/minimal"}],"9eZCo":[function(require,module,exports) { /** Utilities to get the key in KVdb for a value. */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); parcelHelpers.defineInteropFlag(exports); parcelHelpers.export(exports, "keys", ()=>keys); @@ -1385,6 +1412,6 @@ function safeParse(data) { return data ? JSON.parse(data) : null; } -},{"@parcel/transformer-js/src/esmodule-helpers.js":"k8vWW"}]},["kdrGj"], "kdrGj", "parcelRequire0406") +},{"@parcel/transformer-js/src/esmodule-helpers.js":"2gnRB"}]},["keFvs"], "keFvs", "parcelRequire0406") //# sourceMappingURL=index.mjs.map diff --git a/lib/index.mjs.map b/lib/index.mjs.map index 43b820b..5c4ba1c 100644 --- a/lib/index.mjs.map +++ b/lib/index.mjs.map @@ -1 +1 @@ -{"mappings":"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","sources":["src/index.ts","src/hnsw.ts","src/utils/index.ts","node_modules/.pnpm/@parcel+transformer-js@2.10.3_@parcel+core@2.10.3/node_modules/@parcel/transformer-js/src/esmodule-helpers.js","src/db/hollowdb.ts","src/proto/index.ts","proto/hnsw_comm.js","src/db/common/index.ts"],"sourcesContent":["import { ContractState, SetSDK } from \"hollowdb\";\nimport { HNSW } from \"./hnsw\";\nimport { HollowMemory } from \"./db/hollowdb\";\nimport type { JWKInterface, Warp } from \"warp-contracts\";\nimport { ArweaveSigner } from \"warp-contracts-plugin-deploy\";\n\nexport default class HollowDBVector extends HNSW {\n /** HollowDB SDK instance as passed in the `constructor`. */\n sdk: SetSDK;\n\n /**\n * A VectorDB over HollowDB using HNSW index.\n *\n * @param hollowdb a hollowdb instance with `set` and `setMany` operations, where values are `string` typed.\n * - Vectors are encoded & decoded with protobuffers, and the base64 of encodings are stored in HollowDB\n * - Metadatas are stored as JSON-stringified values.\n *\n * @param options Optional HNSW parameters:\n *\n * - `m`: **Number of established connections.**\n * With higher dimension size, this should also be larger.\n * Defaults to 5.\n *\n * - `efConstruction`: **Size of the dynamic candidate list.**\n * Affects build times, for instance: 400 is slow but powerful, 40 is\n * fast but not that performant.\n * Defaults to 128.\n *\n * - `efSearch`: **Factor for quality of search.** Defaults to 20.\n *\n * @template M type of the metadata\n */\n constructor(\n hollowdb: SetSDK,\n options?: {\n m?: number;\n efConstruction?: number;\n efSearch?: number;\n },\n ) {\n const m = options?.m || 5;\n const ef_construction = options?.efConstruction || 128;\n const ef_search = options?.efSearch || 20;\n\n super(new HollowMemory(hollowdb), m, ef_construction, ef_search);\n\n this.sdk = hollowdb;\n }\n\n /** Deploy a new HollowDB Vector contract,\n * which is a HollowDB contract with `set` and `setMany` functions in particular.\n *\n * @param wallet your Arweave wallet\n * @param warp a Warp instance on mainnet\n * @returns deployed contract transaction id and source transaction id\n */\n static async deploy(wallet: JWKInterface, warp: Warp): Promise<{ contractTxId: string; srcTxId: string }> {\n // source transaction id, for the contract to be deployed\n const srcTxId = \"lSRrPRiiMYeJsGgT9BdV9OTZTw3hZw_UkGVpEXjD5sY\";\n\n // our source txid is on mainnet, so we must make sure of that\n if (warp.environment !== \"mainnet\") {\n throw new Error(\"Warp must be connected to mainnet.\");\n }\n\n // initailly the wallet is whitelisted on everything, and all\n // whitelists are required for the contract\n const addr = await warp.arweave.wallets.jwkToAddress(wallet);\n const initialState: ContractState = {\n version: \"hollowdb-vector@^0.1.0\",\n owner: addr,\n verificationKeys: { auth: null },\n isProofRequired: { auth: false },\n canEvolve: true,\n whitelists: {\n put: { [addr]: true },\n update: { [addr]: true },\n set: { [addr]: true },\n },\n isWhitelistRequired: { put: true, update: true, set: true },\n };\n\n const { srcTxId: deploymentSrcTxId, contractTxId } = await warp.deployFromSourceTx({\n wallet: new ArweaveSigner(wallet),\n initState: JSON.stringify(initialState),\n srcTxId: srcTxId,\n evaluationManifest: {\n evaluationOptions: {\n allowBigInt: true,\n useKVStorage: true,\n },\n },\n });\n\n // impossible case, but still we should check for it\n if (deploymentSrcTxId !== srcTxId) {\n console.error(\"Deployed srcTxId is different than the given source!\");\n console.error({ expected: srcTxId, received: deploymentSrcTxId });\n }\n\n return { contractTxId, srcTxId };\n }\n}\n","import { NodeHeap, compareNode, cosine_distance } from \"./utils\";\nimport type { Point, Node, LayerNode, KNNResult } from \"./types\";\nimport type { DBInterface } from \"./db/interfaces\";\n\n/**\n * An implementation of Hierarchical Navigable Small Worlds\n * that works over a key-value database.\n *\n * In particular, we provide a HollowDB interface that allows you to\n * store data on Arweave.\n *\n * @template M type of the metadata, which is extra information\n * stored along with each point, a common practice in vectorDBs.\n */\nexport class HNSW {\n /** A database that supports `DBInterface`. */\n db: DBInterface;\n\n /** Number of established connections; should increase as dimension size increases. */\n m: number;\n /** Maximum number of connections for each element per layer. */\n m_max0: number;\n /** Normalization factor for level generation. */\n ml: number;\n\n /** Size of the dynamic candidate list. Affects build times, 400 is very powerful, 40 is fast. */\n ef_construction: number;\n /** Factor for quality of search. */\n ef: number;\n\n constructor(db: DBInterface, M: number, ef_construction: number, ef_search: number) {\n this.db = db;\n\n this.m = M; // paper proposes [5,48] is a good range for m (Weavite uses 64)\n this.m_max0 = M * 2; // paper proposes max0 is 2 times m\n this.ml = 1 / Math.log(M); // papers heuristic to select ml, maximum layers\n\n this.ef_construction = ef_construction;\n this.ef = ef_search;\n }\n\n /** Returns the vector & its metadata at given index. */\n async get_vector(idx: number): Promise<{\n point: Point;\n metadata: M | null;\n }> {\n const point = await this.db.get_point(idx);\n const metadata = await this.db.get_metadata(idx);\n return { point, metadata };\n }\n\n /** Paper proposes this heuristic for layer selection for insertion of `q`. */\n select_layer() {\n return Math.floor(-Math.log(Math.random()) * this.ml);\n }\n\n /** Insert a query point.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 1\n */\n async insert(q: Point, metadata?: M) {\n const ep_index = await this.db.get_ep();\n const L = (await this.db.get_num_layers()) - 1;\n const l = this.select_layer();\n\n // a point is added and we get its index\n const idx = await this.db.new_point(q);\n if (metadata) {\n await this.db.set_metadata(idx, metadata);\n }\n\n if (ep_index !== null) {\n const dist = cosine_distance(q, await this.db.get_point(ep_index));\n // iterate for each layer from L to l+1 and find entry point\n let ep = [[dist, ep_index] as Node];\n for (let i = L; i > l; i--) {\n const ep_copy: Node[] = ep.map((e) => [e[0], e[1]]);\n\n // search with ef = 1, returning only one neighbor\n const W = await this.search_layer(q, ep_copy, 1, i);\n\n // if nearest neighbor found in layer i is closer than ep, then ep = nearest neighbor\n if (W.length > 0 && ep[0][0] > W[0][0]) {\n ep = W;\n }\n }\n\n // search all layers\n for (let l_c = Math.min(L, l); l_c >= 0; l_c--) {\n const W = await this.search_layer(q, ep, this.ef_construction, l_c);\n const newNode: LayerNode = {}; // this is for `this.graphs[l_c][idx] = {}`\n\n ep = W.map((e) => [e[0], e[1]] as Node); // copy W to ep\n const neighbors = this.select_neighbors(q, W, l_c);\n const indices = neighbors.map(([_, idx]) => idx);\n const nodes = await this.db.get_neighbors(l_c, indices);\n\n // add bidirectional connections from neighbors to q at layer l_c\n const M = l_c === 0 ? this.m_max0 : this.m;\n\n for (const e of neighbors) {\n newNode[e[1]] = e[0];\n nodes[e[1]][idx] = e[0];\n }\n\n for (const e of neighbors) {\n const eConn = Object.entries(nodes[e[1]]).map(([k, v]) => [v, parseInt(k)] as Node);\n if (eConn.length > M) {\n // shrink connections\n const eNewConn = this.select_neighbors(await this.db.get_point(e[1]), eConn, l_c);\n // loop below equivalent to: self.graphs[l_c][e[1]] = {ind: dist for dist, ind in eNewConn}\n let dict: Record = {};\n for (const eNew of eNewConn) {\n dict[eNew[1]] = eNew[0];\n }\n\n nodes[e[1]] = dict; // equiv: this.graphs[l_c][e[1]] = dict;\n }\n }\n\n await this.db.upsert_neighbor(l_c, idx, newNode);\n await this.db.upsert_neighbors(l_c, nodes);\n }\n }\n\n // add a new small world for each new layer\n const LL = await this.db.get_num_layers();\n if (LL < l + 1) {\n await this.db.set_ep(idx);\n }\n\n // TODO: can make this in parallel via a new function that adds N to num_layers\n for (let i = LL; i < l + 1; i++) {\n await this.db.new_neighbor(idx);\n }\n }\n\n /** Search a query point.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 2\n */\n async search_layer(q: Point, ep: Node[], ef: number, l_c: number) {\n // set of visited elements | v = set(p for _, p in ep)\n const V = new Set(ep.map(([_, id]) => id));\n\n // set of candidates, min-heapified\n const C = new NodeHeap(ep);\n\n // dynamic list of found neighbors, max-heapified | W = [(-mdist, p) for mdist, p in ep]\n // due to negation of `dist` value, this actually becomes a max-heap\n const W = new NodeHeap(ep.map(([mdist, p]) => [-mdist, p]));\n\n while (!C.isEmpty()) {\n const c = C.pop()!; // extract nearest element from C\n const c_v: number = c[0]; // get distance of c\n const f_dist = -W.top(1)[0][0]; // get furthest distance from q, multiply by -1 to make get real distance\n\n if (c_v > f_dist) {\n break;\n }\n\n // un-visited nodes\n const neighbors = Object.keys(await this.db.get_neighbor(l_c, c[1]))\n .map((k) => parseInt(k))\n .filter((k) => !V.has(k));\n\n // distances to `q`\n const points = await this.db.get_points(neighbors);\n const dists = points.map((p) => cosine_distance(p, q));\n\n // visit neighbors w.r.t distances\n dists.forEach((dist, i) => {\n const e = neighbors[i];\n V.add(e); // mark `e` as visited\n\n if (dist < f_dist || W.length < ef) {\n C.push([dist, e]);\n W.push([-dist, e]);\n\n // possible if `dist < f_dist`\n if (W.length > ef) {\n W.pop();\n }\n }\n });\n }\n\n if (ef === 1) {\n if (W.length !== 0) {\n // TODO: is there a faster way to do this code block?\n const dd = new NodeHeap(W.heapArray.map((W_i) => [-W_i[0], W_i[1]]));\n return [dd.pop()!];\n } else {\n return [];\n }\n }\n\n return W.heapArray.map((W_i) => [-W_i[0], W_i[1]]) as Node[];\n }\n\n /** Selects and adds neighbors to the graph.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 4\n */\n select_neighbors(q: Point, C: Node[], l_c: number, keepPrunedConnections: boolean = true) {\n const R = new NodeHeap();\n const W = new NodeHeap(C);\n const M = l_c > 0 ? this.m : this.m_max0; // number of neighbors to return\n\n const W_d = new NodeHeap(); // queue for discarded candidates\n while (W.length > 0 && R.length < M) {\n const e = W.pop()!; // extract nearest element from W to q\n const r_top = R.top(1)[0] as Node | undefined; // point with minimum distance to q in all R\n\n // it is possible that `r_top` is undefined, that is okay & is handled below\n if (R.length === 0 || (r_top && e[0] < r_top[0])) {\n R.push([e[0], e[1]]);\n } else {\n W_d.push([e[0], e[1]]);\n }\n }\n\n if (keepPrunedConnections) {\n while (W_d.length > 0 && R.length < M) {\n R.push(W_d.pop()!);\n }\n }\n\n return R.heapArray;\n }\n\n /** K-nearest Neighbor search. */\n async knn_search(q: Point, K: number): Promise[]> {\n let W: Node[] = [];\n const ep_index = await this.db.get_ep();\n\n // edge case: no points were added at all\n if (ep_index === null) return [];\n\n const L = (await this.db.get_num_layers()) - 1;\n const dist = cosine_distance(q, await this.db.get_point(ep_index));\n\n // search from top layer to layer 1\n let ep: Node[] = [[dist, ep_index]];\n for (let l_c = L; l_c > 0; l_c--) {\n ep = await this.search_layer(q, ep, 1, l_c);\n }\n ep = await this.search_layer(q, ep, this.ef, 0);\n\n // sort the results & get top K\n ep.sort(compareNode);\n const ep_topk = ep.slice(0, K);\n\n // retrieve metadatas\n const metadatas = await this.db.get_metadatas(ep_topk.map((ep) => ep[1]));\n\n return ep_topk.map((ep, i) => ({\n id: ep[1],\n distance: ep[0],\n metadata: metadatas[i],\n }));\n }\n}\n","import { Heap } from \"heap-js\";\nimport type { Node, Point } from \"../types\";\n\n/** A min-heap of {@link Node} types with custom comparator. */\nexport class NodeHeap extends Heap {\n constructor(elems: Node[] = []) {\n super(compareNode);\n if (elems.length !== 0) {\n super.addAll(elems);\n }\n }\n}\n\n/** Comparator for {@link Node} type, compares their distances. */\nexport function compareNode(a: Node, b: Node) {\n return a[0] - b[0];\n}\n\n/** Dot-product of two vectors. */\nexport function dot_product(a: Point, b: Point): number {\n return a.reduce((sum, val, idx) => sum + val * b[idx], 0);\n}\n\n/** Norm a vector. */\nexport function norm(a: Point): number {\n return Math.sqrt(a.reduce((sum, val) => sum + val * val, 0));\n}\n\n/** Cosine distance between two vectors, as 1 - cosine similarity. */\nexport function cosine_distance(a: Point, b: Point): number {\n return 1 - dot_product(a, b) / (norm(a) * norm(b));\n}\n\n/** Inner product (alias dot product) of two vectors. */\nexport function inner_product(a: Point, b: Point): number {\n return dot_product(a, b);\n}\n\n/** Euclidean distance between two vectors. */\nexport function l2_distance(a: Point, b: Point): number {\n return Math.sqrt(a.reduce((sum, val, idx) => sum + Math.pow(val - b[idx], 2), 0));\n}\n","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","import type { DBInterface } from \"./interfaces\";\nimport type { Graph, LayerNode, Point } from \"../types\";\nimport { decodeLayerNode, decodePoint, encodeLayerNode, encodePoint } from \"../proto\";\nimport { SetSDK } from \"hollowdb\";\nimport { keys, safeParse } from \"./common\";\n\nexport class HollowMemory implements DBInterface {\n client: SetSDK;\n\n /**\n * Deploy a HollowDB contract.\n * @param initialState initial state of the contract\n * @param source (optional) source transaction id\n * @returns deployed contract transaction id\n */\n async deploy(initialState: Awaited>, source: string = \"\") {\n const { contractTxId } = await this.client.warp.deployFromSourceTx({\n wallet: this.client.signer,\n srcTxId: source,\n initState: JSON.stringify(initialState),\n });\n\n return contractTxId;\n }\n\n constructor(client: SetSDK) {\n this.client = client;\n }\n\n async get_ep(): Promise {\n const ep = await this.client.get(keys.ep);\n return ep === null ? null : parseInt(ep);\n }\n\n async set_ep(ep: number): Promise {\n await this.client.set(keys.ep, ep.toString());\n }\n\n async get_point(idx: number): Promise {\n const data = await this.client.get(keys.point(idx));\n if (!data) {\n throw new Error(`No point with index ${idx}`);\n }\n const point = decodePoint(data);\n return point.v!;\n }\n\n async get_points(idxs: number[]): Promise {\n if (idxs.length === 0) return [];\n const datas = await this.safe_get_many(idxs.map((idx) => keys.point(idx)));\n\n // see if there is a null value in there\n const nullPos = datas.indexOf(null);\n if (nullPos !== -1) {\n throw new Error(`No point with index ${idxs[nullPos]}`);\n }\n\n const points = datas.map((data) => decodePoint(data!));\n return points.map((point) => point.v!);\n }\n\n async new_point(q: Point): Promise {\n const idx = await this.get_datasize();\n\n const point = encodePoint({ v: q, idx });\n await this.client.set(keys.point(idx), point);\n await this.client.set(keys.points, (idx + 1).toString());\n\n return idx;\n }\n\n async get_num_layers(): Promise {\n const numLayers = await this.client.get(keys.layers);\n return numLayers ? parseInt(numLayers) : 0;\n }\n\n async get_datasize(): Promise {\n const datasize = await this.client.get(keys.points);\n return datasize ? parseInt(datasize) : 0;\n }\n\n async get_neighbor(layer: number, idx: number): Promise {\n const data = await this.client.get(keys.neighbor(layer, idx));\n if (!data) {\n throw new Error(`No neighbors at layer ${layer}, index ${idx}\"`);\n }\n const node = decodeLayerNode(data);\n return node.neighbors!;\n }\n\n async get_neighbors(layer: number, idxs: number[]): Promise {\n const datas = await this.safe_get_many(idxs.map((idx) => keys.neighbor(layer, idx)));\n\n // see if there is a null value in there\n const nullPos = datas.indexOf(null);\n if (nullPos !== -1) {\n throw new Error(`No neighbors at layer ${layer}, index ${idxs[nullPos]}\"`);\n }\n\n const nodes = datas.map((data) => decodeLayerNode(data!));\n const neighbors = nodes.map((node) => node.neighbors!);\n return Object.fromEntries(idxs.map((idx, i) => [idx, neighbors[i]]));\n }\n\n async upsert_neighbor(layer: number, idx: number, node: LayerNode): Promise {\n const data = encodeLayerNode({\n idx,\n level: layer,\n neighbors: node,\n });\n await this.client.set(keys.neighbor(layer, idx), data);\n }\n\n async upsert_neighbors(layer: number, nodes: Graph): Promise {\n await this.safe_set_many(\n Object.keys(nodes).map((idx) => {\n const i = parseInt(idx);\n const key = keys.neighbor(layer, i);\n const value = encodeLayerNode({\n idx: i,\n level: layer,\n neighbors: nodes[i],\n });\n\n return [key, value];\n }),\n );\n }\n\n async new_neighbor(idx: number): Promise {\n const l = await this.get_num_layers();\n await this.upsert_neighbor(l, idx, {});\n\n // NOTE: if `new_neighbor` is run in parallel,\n // this might cause a race-condition\n await this.client.set(keys.layers, (l + 1).toString());\n }\n\n async get_metadata(idx: number): Promise {\n const data = await this.client.get(keys.metadata(idx));\n return safeParse(data);\n }\n\n async get_metadatas(idxs: number[]): Promise<(M | null)[]> {\n // const datas =\n return Promise.all(idxs.map((idx) => this.get_metadata(idx)));\n }\n\n async set_metadata(idx: number, data: M): Promise {\n await this.client.set(keys.metadata(idx), JSON.stringify(data));\n }\n\n /**\n * A `getMany` interaction that automatically splits the request into several\n * transactions so that the transaction body-limit is not exceeded for any of them.\n *\n * For every error, the input is split into two transactions of half the size.\n */\n private async safe_get_many(keys: string[]): Promise<(string | null)[]> {\n try {\n return await this.client.getMany(keys);\n } catch (err) {\n // TODO: check error type\n const half = Math.floor(keys.length >> 1);\n\n // prettier-ignore\n return await Promise.all([\n this.safe_get_many(keys.slice(0, half)),\n this.safe_get_many(keys.slice(half))]\n ).then((results) => results.flat());\n }\n }\n\n /**\n * A `setMany` interaction that automatically splits the request into several\n * transactions so that the transaction body-limit is not exceeded for any of them.\n *\n * For every error, the input is split into two transactions of half the size.\n */\n private async safe_set_many(entries: [key: string, value: string][]): Promise {\n try {\n await this.client.setMany(\n entries.map((e) => e[0]),\n entries.map((e) => e[1]),\n );\n } catch (err) {\n // TODO: check error type\n const half = Math.floor(entries.length >> 1);\n\n // prettier-ignore\n await Promise.all([\n this.safe_set_many(entries.slice(0, half)),\n this.safe_set_many(entries.slice(half))]\n ).then((results) => results.flat());\n }\n }\n\n toString() {\n return \"HollowDB Set with Protobufs\";\n }\n}\n","import { index_buffer } from \"../../proto/hnsw_comm\";\n\n/** Encodes a point to protobuf & base64's it. */\nexport function encodePoint(q: index_buffer.IPoint): string {\n const qe = index_buffer.Point.encode(q).finish();\n return Buffer.from(qe).toString(\"base64\");\n}\n\n/** Decodes a point from base64 encoded protobuf. */\nexport function decodePoint(data: string): index_buffer.IPoint {\n const dec = Buffer.from(data, \"base64\");\n return index_buffer.Point.decode(dec);\n}\n\n/** Encodes a point to protobuf & base64's it. */\nexport function encodeLayerNode(n: index_buffer.ILayerNode): string {\n const ne = index_buffer.LayerNode.encode({\n ...n,\n visible: n.visible || true, // is visible unless otherwise specified\n }).finish();\n return Buffer.from(ne).toString(\"base64\");\n}\n\n/** Decodes a point from base64 encoded protobuf. */\nexport function decodeLayerNode(data: string): index_buffer.ILayerNode {\n const dec = Buffer.from(data, \"base64\");\n return index_buffer.LayerNode.decode(dec);\n}\n","/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\n\"use strict\";\n\nvar $protobuf = require(\"protobufjs/minimal\");\n\n// Common aliases\nvar $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n\n// Exported root namespace\nvar $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\n$root.index_buffer = (function() {\n\n /**\n * Namespace index_buffer.\n * @exports index_buffer\n * @namespace\n */\n var index_buffer = {};\n\n index_buffer.LayerNode = (function() {\n\n /**\n * Properties of a LayerNode.\n * @memberof index_buffer\n * @interface ILayerNode\n * @property {number|null} [level] LayerNode level\n * @property {number|null} [idx] LayerNode idx\n * @property {boolean|null} [visible] LayerNode visible\n * @property {Object.|null} [neighbors] LayerNode neighbors\n */\n\n /**\n * Constructs a new LayerNode.\n * @memberof index_buffer\n * @classdesc Represents a LayerNode.\n * @implements ILayerNode\n * @constructor\n * @param {index_buffer.ILayerNode=} [properties] Properties to set\n */\n function LayerNode(properties) {\n this.neighbors = {};\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * LayerNode level.\n * @member {number} level\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.level = 0;\n\n /**\n * LayerNode idx.\n * @member {number} idx\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.idx = 0;\n\n /**\n * LayerNode visible.\n * @member {boolean} visible\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.visible = false;\n\n /**\n * LayerNode neighbors.\n * @member {Object.} neighbors\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.neighbors = $util.emptyObject;\n\n /**\n * Creates a new LayerNode instance using the specified properties.\n * @function create\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode=} [properties] Properties to set\n * @returns {index_buffer.LayerNode} LayerNode instance\n */\n LayerNode.create = function create(properties) {\n return new LayerNode(properties);\n };\n\n /**\n * Encodes the specified LayerNode message. Does not implicitly {@link index_buffer.LayerNode.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode} message LayerNode message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n LayerNode.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.level != null && Object.hasOwnProperty.call(message, \"level\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.level);\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.idx);\n if (message.visible != null && Object.hasOwnProperty.call(message, \"visible\"))\n writer.uint32(/* id 3, wireType 0 =*/24).bool(message.visible);\n if (message.neighbors != null && Object.hasOwnProperty.call(message, \"neighbors\"))\n for (var keys = Object.keys(message.neighbors), i = 0; i < keys.length; ++i)\n writer.uint32(/* id 4, wireType 2 =*/34).fork().uint32(/* id 1, wireType 0 =*/8).uint32(keys[i]).uint32(/* id 2, wireType 5 =*/21).float(message.neighbors[keys[i]]).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified LayerNode message, length delimited. Does not implicitly {@link index_buffer.LayerNode.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode} message LayerNode message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n LayerNode.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a LayerNode message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.LayerNode\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.LayerNode} LayerNode\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n LayerNode.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.LayerNode(), key, value;\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.level = reader.uint32();\n break;\n }\n case 2: {\n message.idx = reader.uint32();\n break;\n }\n case 3: {\n message.visible = reader.bool();\n break;\n }\n case 4: {\n if (message.neighbors === $util.emptyObject)\n message.neighbors = {};\n var end2 = reader.uint32() + reader.pos;\n key = 0;\n value = 0;\n while (reader.pos < end2) {\n var tag2 = reader.uint32();\n switch (tag2 >>> 3) {\n case 1:\n key = reader.uint32();\n break;\n case 2:\n value = reader.float();\n break;\n default:\n reader.skipType(tag2 & 7);\n break;\n }\n }\n message.neighbors[key] = value;\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a LayerNode message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.LayerNode\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.LayerNode} LayerNode\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n LayerNode.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a LayerNode message.\n * @function verify\n * @memberof index_buffer.LayerNode\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n LayerNode.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.level != null && message.hasOwnProperty(\"level\"))\n if (!$util.isInteger(message.level))\n return \"level: integer expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.visible != null && message.hasOwnProperty(\"visible\"))\n if (typeof message.visible !== \"boolean\")\n return \"visible: boolean expected\";\n if (message.neighbors != null && message.hasOwnProperty(\"neighbors\")) {\n if (!$util.isObject(message.neighbors))\n return \"neighbors: object expected\";\n var key = Object.keys(message.neighbors);\n for (var i = 0; i < key.length; ++i) {\n if (!$util.key32Re.test(key[i]))\n return \"neighbors: integer key{k:uint32} expected\";\n if (typeof message.neighbors[key[i]] !== \"number\")\n return \"neighbors: number{k:uint32} expected\";\n }\n }\n return null;\n };\n\n /**\n * Creates a LayerNode message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.LayerNode\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.LayerNode} LayerNode\n */\n LayerNode.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.LayerNode)\n return object;\n var message = new $root.index_buffer.LayerNode();\n if (object.level != null)\n message.level = object.level >>> 0;\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.visible != null)\n message.visible = Boolean(object.visible);\n if (object.neighbors) {\n if (typeof object.neighbors !== \"object\")\n throw TypeError(\".index_buffer.LayerNode.neighbors: object expected\");\n message.neighbors = {};\n for (var keys = Object.keys(object.neighbors), i = 0; i < keys.length; ++i)\n message.neighbors[keys[i]] = Number(object.neighbors[keys[i]]);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a LayerNode message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.LayerNode} message LayerNode\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n LayerNode.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.objects || options.defaults)\n object.neighbors = {};\n if (options.defaults) {\n object.level = 0;\n object.idx = 0;\n object.visible = false;\n }\n if (message.level != null && message.hasOwnProperty(\"level\"))\n object.level = message.level;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.visible != null && message.hasOwnProperty(\"visible\"))\n object.visible = message.visible;\n var keys2;\n if (message.neighbors && (keys2 = Object.keys(message.neighbors)).length) {\n object.neighbors = {};\n for (var j = 0; j < keys2.length; ++j)\n object.neighbors[keys2[j]] = options.json && !isFinite(message.neighbors[keys2[j]]) ? String(message.neighbors[keys2[j]]) : message.neighbors[keys2[j]];\n }\n return object;\n };\n\n /**\n * Converts this LayerNode to JSON.\n * @function toJSON\n * @memberof index_buffer.LayerNode\n * @instance\n * @returns {Object.} JSON object\n */\n LayerNode.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for LayerNode\n * @function getTypeUrl\n * @memberof index_buffer.LayerNode\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n LayerNode.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.LayerNode\";\n };\n\n return LayerNode;\n })();\n\n index_buffer.Point = (function() {\n\n /**\n * Properties of a Point.\n * @memberof index_buffer\n * @interface IPoint\n * @property {number|null} [idx] Point idx\n * @property {Array.|null} [v] Point v\n */\n\n /**\n * Constructs a new Point.\n * @memberof index_buffer\n * @classdesc Represents a Point.\n * @implements IPoint\n * @constructor\n * @param {index_buffer.IPoint=} [properties] Properties to set\n */\n function Point(properties) {\n this.v = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Point idx.\n * @member {number} idx\n * @memberof index_buffer.Point\n * @instance\n */\n Point.prototype.idx = 0;\n\n /**\n * Point v.\n * @member {Array.} v\n * @memberof index_buffer.Point\n * @instance\n */\n Point.prototype.v = $util.emptyArray;\n\n /**\n * Creates a new Point instance using the specified properties.\n * @function create\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint=} [properties] Properties to set\n * @returns {index_buffer.Point} Point instance\n */\n Point.create = function create(properties) {\n return new Point(properties);\n };\n\n /**\n * Encodes the specified Point message. Does not implicitly {@link index_buffer.Point.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint} message Point message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Point.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.idx);\n if (message.v != null && message.v.length) {\n writer.uint32(/* id 2, wireType 2 =*/18).fork();\n for (var i = 0; i < message.v.length; ++i)\n writer.float(message.v[i]);\n writer.ldelim();\n }\n return writer;\n };\n\n /**\n * Encodes the specified Point message, length delimited. Does not implicitly {@link index_buffer.Point.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint} message Point message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Point.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Point message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.Point\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.Point} Point\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Point.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.Point();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.idx = reader.uint32();\n break;\n }\n case 2: {\n if (!(message.v && message.v.length))\n message.v = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.v.push(reader.float());\n } else\n message.v.push(reader.float());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Point message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.Point\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.Point} Point\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Point.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Point message.\n * @function verify\n * @memberof index_buffer.Point\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Point.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.v != null && message.hasOwnProperty(\"v\")) {\n if (!Array.isArray(message.v))\n return \"v: array expected\";\n for (var i = 0; i < message.v.length; ++i)\n if (typeof message.v[i] !== \"number\")\n return \"v: number[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a Point message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.Point\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.Point} Point\n */\n Point.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.Point)\n return object;\n var message = new $root.index_buffer.Point();\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.v) {\n if (!Array.isArray(object.v))\n throw TypeError(\".index_buffer.Point.v: array expected\");\n message.v = [];\n for (var i = 0; i < object.v.length; ++i)\n message.v[i] = Number(object.v[i]);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Point message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.Point} message Point\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Point.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.v = [];\n if (options.defaults)\n object.idx = 0;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.v && message.v.length) {\n object.v = [];\n for (var j = 0; j < message.v.length; ++j)\n object.v[j] = options.json && !isFinite(message.v[j]) ? String(message.v[j]) : message.v[j];\n }\n return object;\n };\n\n /**\n * Converts this Point to JSON.\n * @function toJSON\n * @memberof index_buffer.Point\n * @instance\n * @returns {Object.} JSON object\n */\n Point.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Point\n * @function getTypeUrl\n * @memberof index_buffer.Point\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Point.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.Point\";\n };\n\n return Point;\n })();\n\n index_buffer.PointQuant = (function() {\n\n /**\n * Properties of a PointQuant.\n * @memberof index_buffer\n * @interface IPointQuant\n * @property {number|null} [idx] PointQuant idx\n * @property {Array.|null} [v] PointQuant v\n */\n\n /**\n * Constructs a new PointQuant.\n * @memberof index_buffer\n * @classdesc Represents a PointQuant.\n * @implements IPointQuant\n * @constructor\n * @param {index_buffer.IPointQuant=} [properties] Properties to set\n */\n function PointQuant(properties) {\n this.v = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * PointQuant idx.\n * @member {number} idx\n * @memberof index_buffer.PointQuant\n * @instance\n */\n PointQuant.prototype.idx = 0;\n\n /**\n * PointQuant v.\n * @member {Array.} v\n * @memberof index_buffer.PointQuant\n * @instance\n */\n PointQuant.prototype.v = $util.emptyArray;\n\n /**\n * Creates a new PointQuant instance using the specified properties.\n * @function create\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant=} [properties] Properties to set\n * @returns {index_buffer.PointQuant} PointQuant instance\n */\n PointQuant.create = function create(properties) {\n return new PointQuant(properties);\n };\n\n /**\n * Encodes the specified PointQuant message. Does not implicitly {@link index_buffer.PointQuant.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant} message PointQuant message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n PointQuant.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.idx);\n if (message.v != null && message.v.length) {\n writer.uint32(/* id 2, wireType 2 =*/18).fork();\n for (var i = 0; i < message.v.length; ++i)\n writer.uint32(message.v[i]);\n writer.ldelim();\n }\n return writer;\n };\n\n /**\n * Encodes the specified PointQuant message, length delimited. Does not implicitly {@link index_buffer.PointQuant.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant} message PointQuant message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n PointQuant.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a PointQuant message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.PointQuant\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.PointQuant} PointQuant\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n PointQuant.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.PointQuant();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.idx = reader.uint32();\n break;\n }\n case 2: {\n if (!(message.v && message.v.length))\n message.v = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.v.push(reader.uint32());\n } else\n message.v.push(reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a PointQuant message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.PointQuant\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.PointQuant} PointQuant\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n PointQuant.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a PointQuant message.\n * @function verify\n * @memberof index_buffer.PointQuant\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n PointQuant.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.v != null && message.hasOwnProperty(\"v\")) {\n if (!Array.isArray(message.v))\n return \"v: array expected\";\n for (var i = 0; i < message.v.length; ++i)\n if (!$util.isInteger(message.v[i]))\n return \"v: integer[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a PointQuant message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.PointQuant\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.PointQuant} PointQuant\n */\n PointQuant.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.PointQuant)\n return object;\n var message = new $root.index_buffer.PointQuant();\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.v) {\n if (!Array.isArray(object.v))\n throw TypeError(\".index_buffer.PointQuant.v: array expected\");\n message.v = [];\n for (var i = 0; i < object.v.length; ++i)\n message.v[i] = object.v[i] >>> 0;\n }\n return message;\n };\n\n /**\n * Creates a plain object from a PointQuant message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.PointQuant} message PointQuant\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n PointQuant.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.v = [];\n if (options.defaults)\n object.idx = 0;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.v && message.v.length) {\n object.v = [];\n for (var j = 0; j < message.v.length; ++j)\n object.v[j] = message.v[j];\n }\n return object;\n };\n\n /**\n * Converts this PointQuant to JSON.\n * @function toJSON\n * @memberof index_buffer.PointQuant\n * @instance\n * @returns {Object.} JSON object\n */\n PointQuant.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for PointQuant\n * @function getTypeUrl\n * @memberof index_buffer.PointQuant\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n PointQuant.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.PointQuant\";\n };\n\n return PointQuant;\n })();\n\n return index_buffer;\n})();\n\nmodule.exports = $root;\n","/** Utilities to get the key in KVdb for a value. */\nexport const keys = {\n layers: \"layers\",\n ep: \"ep\",\n points: \"points\",\n metadata: (idx: number) => `m:${idx}` as const,\n /** Maps a point index to its key in the KVdb. */\n point: (idx: number) => `${idx}` as const,\n /** Maps a neighbor (layer & index) to its key in the KVdb. */\n neighbor: (layer: number, idx: number) => `${layer}__${idx}` as const,\n} as const;\n\n/** Safely parses a data, returning `null` if its falsy. */\nexport function safeParse(data: string | null | undefined): V | null {\n return data ? JSON.parse(data) : null;\n}\n"],"names":[],"version":3,"file":"index.mjs.map","sourceRoot":"../"} \ No newline at end of file +{"mappings":"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","sources":["src/index.ts","src/hnsw.ts","src/utils/index.ts","node_modules/.pnpm/@parcel+transformer-js@2.10.3_@parcel+core@2.10.3/node_modules/@parcel/transformer-js/src/esmodule-helpers.js","src/db/hollowdb.ts","src/proto/index.ts","proto/hnsw_comm.js","src/db/common/index.ts"],"sourcesContent":["import { ContractState, SetSDK } from \"hollowdb\";\nimport { HNSW } from \"./hnsw\";\nimport { HollowMemory } from \"./db/hollowdb\";\nimport type { JWKInterface, Warp } from \"warp-contracts\";\nimport { ArweaveSigner } from \"warp-contracts-plugin-deploy\";\n\n/**\n * Backwards compatibility with [Dria](https://dria.co/) contracts that make use\n * of a custom contract function called `upsertVectorMulti`, which is actually\n * equivalent to `setMany`.\n *\n * This class overrides the `set` and `setMany` functions of `SetSDK` from HollowDB.\n */\nexport class DriaCompatSDK extends SetSDK {\n override async setMany(keys: string[], values: string[]): Promise {\n await this.base.dryWriteInteraction({\n function: \"upsertVectorMulti\",\n value: {\n keys,\n values,\n },\n });\n }\n\n override async set(key: string, value: string): Promise {\n await this.setMany([key], [value]);\n }\n}\n\nexport default class HollowDBVector extends HNSW {\n /** HollowDB SDK instance as passed in the `constructor`. */\n sdk: SetSDK;\n\n /**\n * A VectorDB over HollowDB using HNSW index.\n *\n * @param hollowdb a hollowdb instance with `set` and `setMany` operations, where values are `string` typed.\n * - Vectors are encoded & decoded with protobuffers, and the base64 of encodings are stored in HollowDB\n * - Metadatas are stored as JSON-stringified values.\n * - Some of the HollowDB contracts (especially those in [Dria](https://dria.co/)) may use a function called\n * `upsertVectorMulti`, which is incompatible with `SetSDK`. For these, you may use `DriaCompatSDK`.\n *\n * @param options Optional HNSW parameters:\n *\n * - `m`: **Number of established connections.**\n * With higher dimension size, this should also be larger.\n * Defaults to 5.\n *\n * - `efConstruction`: **Size of the dynamic candidate list.**\n * Affects build times, for instance: 400 is slow but powerful, 40 is\n * fast but not that performant.\n * Defaults to 128.\n *\n * - `efSearch`: **Factor for quality of search.** Defaults to 20.\n *\n * @template M type of the metadata\n */\n constructor(\n hollowdb: SetSDK,\n options?: {\n m?: number;\n efConstruction?: number;\n efSearch?: number;\n },\n ) {\n const m = options?.m || 5;\n const ef_construction = options?.efConstruction || 128;\n const ef_search = options?.efSearch || 20;\n\n super(new HollowMemory(hollowdb), m, ef_construction, ef_search);\n\n this.sdk = hollowdb;\n }\n\n /** Deploy a new HollowDB Vector contract,\n * which is a HollowDB contract with `set` and `setMany` functions in particular.\n *\n * @param wallet your Arweave wallet\n * @param warp a Warp instance on mainnet\n * @returns deployed contract transaction id and source transaction id\n */\n static async deploy(wallet: JWKInterface, warp: Warp): Promise<{ contractTxId: string; srcTxId: string }> {\n // source transaction id, for the contract to be deployed\n const srcTxId = \"lSRrPRiiMYeJsGgT9BdV9OTZTw3hZw_UkGVpEXjD5sY\";\n\n // our source txid is on mainnet, so we must make sure of that\n if (warp.environment !== \"mainnet\") {\n throw new Error(\"Warp must be connected to mainnet.\");\n }\n\n // initailly the wallet is whitelisted on everything, and all\n // whitelists are required for the contract\n const addr = await warp.arweave.wallets.jwkToAddress(wallet);\n const initialState: ContractState = {\n version: \"hollowdb-vector@^0.1.0\",\n owner: addr,\n verificationKeys: { auth: null },\n isProofRequired: { auth: false },\n canEvolve: true,\n whitelists: {\n put: { [addr]: true },\n update: { [addr]: true },\n set: { [addr]: true },\n },\n isWhitelistRequired: { put: true, update: true, set: true },\n };\n\n const { srcTxId: deploymentSrcTxId, contractTxId } = await warp.deployFromSourceTx({\n wallet: new ArweaveSigner(wallet),\n initState: JSON.stringify(initialState),\n srcTxId: srcTxId,\n evaluationManifest: {\n evaluationOptions: {\n allowBigInt: true,\n useKVStorage: true,\n },\n },\n });\n\n // impossible case, but still we should check for it\n if (deploymentSrcTxId !== srcTxId) {\n console.error(\"Deployed srcTxId is different than the given source!\");\n console.error({ expected: srcTxId, received: deploymentSrcTxId });\n }\n\n return { contractTxId, srcTxId };\n }\n}\n","import { NodeHeap, compareNode, cosine_distance } from \"./utils\";\nimport type { Point, Node, LayerNode, KNNResult } from \"./types\";\nimport type { DBInterface } from \"./db/interfaces\";\n\n/**\n * An implementation of Hierarchical Navigable Small Worlds\n * that works over a key-value database.\n *\n * In particular, we provide a HollowDB interface that allows you to\n * store data on Arweave.\n *\n * @template M type of the metadata, which is extra information\n * stored along with each point, a common practice in vectorDBs.\n */\nexport class HNSW {\n /** A database that supports `DBInterface`. */\n db: DBInterface;\n\n /** Number of established connections; should increase as dimension size increases. */\n m: number;\n /** Maximum number of connections for each element per layer. */\n m_max0: number;\n /** Normalization factor for level generation. */\n ml: number;\n\n /** Size of the dynamic candidate list. Affects build times, 400 is very powerful, 40 is fast. */\n ef_construction: number;\n /** Factor for quality of search. */\n ef: number;\n\n constructor(db: DBInterface, M: number, ef_construction: number, ef_search: number) {\n this.db = db;\n\n this.m = M; // paper proposes [5,48] is a good range for m (Weavite uses 64)\n this.m_max0 = M * 2; // paper proposes max0 is 2 times m\n this.ml = 1 / Math.log(M); // papers heuristic to select ml, maximum layers\n\n this.ef_construction = ef_construction;\n this.ef = ef_search;\n }\n\n /** Returns the vector & its metadata at given index. */\n async get_vector(idx: number): Promise<{\n point: Point;\n metadata: M | null;\n }> {\n const point = await this.db.get_point(idx);\n const metadata = await this.db.get_metadata(idx);\n return { point, metadata };\n }\n\n /** Paper proposes this heuristic for layer selection for insertion of `q`. */\n select_layer() {\n return Math.floor(-Math.log(Math.random()) * this.ml);\n }\n\n /** Insert a query point.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 1\n */\n async insert(q: Point, metadata?: M) {\n const ep_index = await this.db.get_ep();\n const L = (await this.db.get_num_layers()) - 1;\n const l = this.select_layer();\n\n // a point is added and we get its index\n const idx = await this.db.new_point(q);\n if (metadata) {\n await this.db.set_metadata(idx, metadata);\n }\n\n if (ep_index !== null) {\n const dist = cosine_distance(q, await this.db.get_point(ep_index));\n // iterate for each layer from L to l+1 and find entry point\n let ep = [[dist, ep_index] as Node];\n for (let i = L; i > l; i--) {\n const ep_copy: Node[] = ep.map((e) => [e[0], e[1]]);\n\n // search with ef = 1, returning only one neighbor\n const W = await this.search_layer(q, ep_copy, 1, i);\n\n // if nearest neighbor found in layer i is closer than ep, then ep = nearest neighbor\n if (W.length > 0 && ep[0][0] > W[0][0]) {\n ep = W;\n }\n }\n\n // search all layers\n for (let l_c = Math.min(L, l); l_c >= 0; l_c--) {\n const W = await this.search_layer(q, ep, this.ef_construction, l_c);\n const newNode: LayerNode = {}; // this is for `this.graphs[l_c][idx] = {}`\n\n ep = W.map((e) => [e[0], e[1]] as Node); // copy W to ep\n const neighbors = this.select_neighbors(q, W, l_c);\n const indices = neighbors.map(([, idx]) => idx);\n const nodes = await this.db.get_neighbors(l_c, indices);\n\n // add bidirectional connections from neighbors to q at layer l_c\n const M = l_c === 0 ? this.m_max0 : this.m;\n\n for (const e of neighbors) {\n newNode[e[1]] = e[0];\n nodes[e[1]][idx] = e[0];\n }\n\n for (const e of neighbors) {\n const eConn = Object.entries(nodes[e[1]]).map(([k, v]) => [v, parseInt(k)] as Node);\n if (eConn.length > M) {\n // shrink connections\n const eNewConn = this.select_neighbors(await this.db.get_point(e[1]), eConn, l_c);\n // loop below equivalent to: self.graphs[l_c][e[1]] = {ind: dist for dist, ind in eNewConn}\n const dict: Record = {};\n for (const eNew of eNewConn) {\n dict[eNew[1]] = eNew[0];\n }\n\n nodes[e[1]] = dict; // equiv: this.graphs[l_c][e[1]] = dict;\n }\n }\n\n await this.db.upsert_neighbor(l_c, idx, newNode);\n await this.db.upsert_neighbors(l_c, nodes);\n }\n }\n\n // add a new small world for each new layer\n const LL = await this.db.get_num_layers();\n if (LL < l + 1) {\n await this.db.set_ep(idx);\n }\n\n // TODO: can make this in parallel via a new function that adds N to num_layers\n for (let i = LL; i < l + 1; i++) {\n await this.db.new_neighbor(idx);\n }\n }\n\n /** Search a query point.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 2\n */\n async search_layer(q: Point, ep: Node[], ef: number, l_c: number) {\n // set of visited elements | v = set(p for _, p in ep)\n const V = new Set(ep.map(([, id]) => id));\n\n // set of candidates, min-heapified\n const C = new NodeHeap(ep);\n\n // dynamic list of found neighbors, max-heapified | W = [(-mdist, p) for mdist, p in ep]\n // due to negation of `dist` value, this actually becomes a max-heap\n const W = new NodeHeap(ep.map(([mdist, p]) => [-mdist, p]));\n\n while (!C.isEmpty()) {\n const c = C.pop()!; // extract nearest element from C\n const c_v: number = c[0]; // get distance of c\n const f_dist = -W.top(1)[0][0]; // get furthest distance from q, multiply by -1 to make get real distance\n\n if (c_v > f_dist) {\n break;\n }\n\n // un-visited nodes\n const neighbors = Object.keys(await this.db.get_neighbor(l_c, c[1]))\n .map((k) => parseInt(k))\n .filter((k) => !V.has(k));\n\n // distances to `q`\n const points = await this.db.get_points(neighbors);\n const dists = points.map((p) => cosine_distance(p, q));\n\n // visit neighbors w.r.t distances\n dists.forEach((dist, i) => {\n const e = neighbors[i];\n V.add(e); // mark `e` as visited\n\n if (dist < f_dist || W.length < ef) {\n C.push([dist, e]);\n W.push([-dist, e]);\n\n // possible if `dist < f_dist`\n if (W.length > ef) {\n W.pop();\n }\n }\n });\n }\n\n if (ef === 1) {\n if (W.length !== 0) {\n // TODO: is there a faster way to do this code block?\n const dd = new NodeHeap(W.heapArray.map((W_i) => [-W_i[0], W_i[1]]));\n return [dd.pop()!];\n } else {\n return [];\n }\n }\n\n return W.heapArray.map((W_i) => [-W_i[0], W_i[1]]) as Node[];\n }\n\n /** Selects and adds neighbors to the graph.\n * @see https://arxiv.org/pdf/1603.09320.pdf Algorithm 4\n */\n select_neighbors(q: Point, C: Node[], l_c: number, keepPrunedConnections: boolean = true) {\n const R = new NodeHeap();\n const W = new NodeHeap(C);\n const M = l_c > 0 ? this.m : this.m_max0; // number of neighbors to return\n\n const W_d = new NodeHeap(); // queue for discarded candidates\n while (W.length > 0 && R.length < M) {\n const e = W.pop()!; // extract nearest element from W to q\n const r_top = R.top(1)[0] as Node | undefined; // point with minimum distance to q in all R\n\n // it is possible that `r_top` is undefined, that is okay & is handled below\n if (R.length === 0 || (r_top && e[0] < r_top[0])) {\n R.push([e[0], e[1]]);\n } else {\n W_d.push([e[0], e[1]]);\n }\n }\n\n if (keepPrunedConnections) {\n while (W_d.length > 0 && R.length < M) {\n R.push(W_d.pop()!);\n }\n }\n\n return R.heapArray;\n }\n\n /** K-nearest Neighbor search. */\n async knn_search(q: Point, K: number): Promise[]> {\n const ep_index = await this.db.get_ep();\n\n // edge case: no points were added at all\n if (ep_index === null) return [];\n\n const L = (await this.db.get_num_layers()) - 1;\n const dist = cosine_distance(q, await this.db.get_point(ep_index));\n\n // search from top layer to layer 1\n let ep: Node[] = [[dist, ep_index]];\n for (let l_c = L; l_c > 0; l_c--) {\n ep = await this.search_layer(q, ep, 1, l_c);\n }\n ep = await this.search_layer(q, ep, this.ef, 0);\n\n // sort the results & get top K\n ep.sort(compareNode);\n const ep_topk = ep.slice(0, K);\n\n // retrieve metadatas\n const metadatas = await this.db.get_metadatas(ep_topk.map((ep) => ep[1]));\n\n return ep_topk.map((ep, i) => ({\n id: ep[1],\n distance: ep[0],\n metadata: metadatas[i],\n }));\n }\n}\n","import { Heap } from \"heap-js\";\nimport type { Node, Point } from \"../types\";\n\n/** A min-heap of {@link Node} types with custom comparator. */\nexport class NodeHeap extends Heap {\n constructor(elems: Node[] = []) {\n super(compareNode);\n if (elems.length !== 0) {\n super.addAll(elems);\n }\n }\n}\n\n/** Comparator for {@link Node} type, compares their distances. */\nexport function compareNode(a: Node, b: Node) {\n return a[0] - b[0];\n}\n\n/** Dot-product of two vectors. */\nexport function dot_product(a: Point, b: Point): number {\n return a.reduce((sum, val, idx) => sum + val * b[idx], 0);\n}\n\n/** Norm a vector. */\nexport function norm(a: Point): number {\n return Math.sqrt(a.reduce((sum, val) => sum + val * val, 0));\n}\n\n/** Cosine distance between two vectors, as 1 - cosine similarity. */\nexport function cosine_distance(a: Point, b: Point): number {\n return 1 - dot_product(a, b) / (norm(a) * norm(b));\n}\n\n/** Inner product (alias dot product) of two vectors. */\nexport function inner_product(a: Point, b: Point): number {\n return dot_product(a, b);\n}\n\n/** Euclidean distance between two vectors. */\nexport function l2_distance(a: Point, b: Point): number {\n return Math.sqrt(a.reduce((sum, val, idx) => sum + Math.pow(val - b[idx], 2), 0));\n}\n","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","import type { DBInterface } from \"./interfaces\";\nimport type { Graph, LayerNode, Point } from \"../types\";\nimport { decodeLayerNode, decodePoint, encodeLayerNode, encodePoint } from \"../proto\";\nimport { SetSDK } from \"hollowdb\";\nimport { keys, safeParse } from \"./common\";\n\nexport class HollowMemory implements DBInterface {\n client: SetSDK;\n\n /**\n * Deploy a HollowDB contract.\n * @param initialState initial state of the contract\n * @param source (optional) source transaction id\n * @returns deployed contract transaction id\n */\n async deploy(initialState: Awaited>, source: string = \"\") {\n const { contractTxId } = await this.client.warp.deployFromSourceTx({\n wallet: this.client.signer,\n srcTxId: source,\n initState: JSON.stringify(initialState),\n });\n\n return contractTxId;\n }\n\n constructor(client: SetSDK) {\n this.client = client;\n }\n\n async get_ep(): Promise {\n const ep = await this.client.get(keys.ep);\n return ep === null ? null : parseInt(ep);\n }\n\n async set_ep(ep: number): Promise {\n await this.client.set(keys.ep, ep.toString());\n }\n\n async get_point(idx: number): Promise {\n const data = await this.client.get(keys.point(idx));\n if (!data) {\n throw new Error(`No point with index ${idx}`);\n }\n const point = decodePoint(data);\n return point.v!;\n }\n\n async get_points(idxs: number[]): Promise {\n if (idxs.length === 0) return [];\n const datas = await this.safe_get_many(idxs.map((idx) => keys.point(idx)));\n\n // see if there is a null value in there\n const nullPos = datas.indexOf(null);\n if (nullPos !== -1) {\n throw new Error(`No point with index ${idxs[nullPos]}`);\n }\n\n const points = datas.map((data) => decodePoint(data!));\n return points.map((point) => point.v!);\n }\n\n async new_point(q: Point): Promise {\n const idx = await this.get_datasize();\n\n const point = encodePoint({ v: q, idx });\n await this.client.set(keys.point(idx), point);\n await this.client.set(keys.points, (idx + 1).toString());\n\n return idx;\n }\n\n async get_num_layers(): Promise {\n const numLayers = await this.client.get(keys.layers);\n return numLayers ? parseInt(numLayers) : 0;\n }\n\n async get_datasize(): Promise {\n const datasize = await this.client.get(keys.points);\n return datasize ? parseInt(datasize) : 0;\n }\n\n async get_neighbor(layer: number, idx: number): Promise {\n const data = await this.client.get(keys.neighbor(layer, idx));\n if (!data) {\n throw new Error(`No neighbors at layer ${layer}, index ${idx}\"`);\n }\n const node = decodeLayerNode(data);\n return node.neighbors!;\n }\n\n async get_neighbors(layer: number, idxs: number[]): Promise {\n const datas = await this.safe_get_many(idxs.map((idx) => keys.neighbor(layer, idx)));\n\n // see if there is a null value in there\n const nullPos = datas.indexOf(null);\n if (nullPos !== -1) {\n throw new Error(`No neighbors at layer ${layer}, index ${idxs[nullPos]}\"`);\n }\n\n const nodes = datas.map((data) => decodeLayerNode(data!));\n const neighbors = nodes.map((node) => node.neighbors!);\n return Object.fromEntries(idxs.map((idx, i) => [idx, neighbors[i]]));\n }\n\n async upsert_neighbor(layer: number, idx: number, node: LayerNode): Promise {\n const data = encodeLayerNode({\n idx,\n level: layer,\n neighbors: node,\n });\n await this.client.set(keys.neighbor(layer, idx), data);\n }\n\n async upsert_neighbors(layer: number, nodes: Graph): Promise {\n await this.safe_set_many(\n Object.keys(nodes).map((idx) => {\n const i = parseInt(idx);\n const key = keys.neighbor(layer, i);\n const value = encodeLayerNode({\n idx: i,\n level: layer,\n neighbors: nodes[i],\n });\n\n return [key, value];\n }),\n );\n }\n\n async new_neighbor(idx: number): Promise {\n const l = await this.get_num_layers();\n await this.upsert_neighbor(l, idx, {});\n\n // NOTE: if `new_neighbor` is run in parallel,\n // this might cause a race-condition\n await this.client.set(keys.layers, (l + 1).toString());\n }\n\n async get_metadata(idx: number): Promise {\n const data = await this.client.get(keys.metadata(idx));\n return safeParse(data);\n }\n\n async get_metadatas(idxs: number[]): Promise<(M | null)[]> {\n // const datas =\n return Promise.all(idxs.map((idx) => this.get_metadata(idx)));\n }\n\n async set_metadata(idx: number, data: M): Promise {\n await this.client.set(keys.metadata(idx), JSON.stringify(data));\n }\n\n /**\n * A `getMany` interaction that automatically splits the request into several\n * transactions so that the transaction body-limit is not exceeded for any of them.\n *\n * For every error, the input is split into two transactions of half the size.\n */\n private async safe_get_many(keys: string[]): Promise<(string | null)[]> {\n try {\n return await this.client.getMany(keys);\n } catch (err) {\n // TODO: check error type\n const half = Math.floor(keys.length >> 1);\n\n // prettier-ignore\n return await Promise.all([\n this.safe_get_many(keys.slice(0, half)),\n this.safe_get_many(keys.slice(half))]\n ).then((results) => results.flat());\n }\n }\n\n /**\n * A `setMany` interaction that automatically splits the request into several\n * transactions so that the transaction body-limit is not exceeded for any of them.\n *\n * For every error, the input is split into two transactions of half the size.\n */\n private async safe_set_many(entries: [key: string, value: string][]): Promise {\n try {\n await this.client.setMany(\n entries.map((e) => e[0]),\n entries.map((e) => e[1]),\n );\n } catch (err) {\n // TODO: check error type\n const half = Math.floor(entries.length >> 1);\n\n // prettier-ignore\n await Promise.all([\n this.safe_set_many(entries.slice(0, half)),\n this.safe_set_many(entries.slice(half))]\n ).then((results) => results.flat());\n }\n }\n\n toString() {\n return \"HollowDB Set with Protobufs\";\n }\n}\n","import { index_buffer } from \"../../proto/hnsw_comm\";\n\n/** Encodes a point to protobuf & base64's it. */\nexport function encodePoint(q: index_buffer.IPoint): string {\n const qe = index_buffer.Point.encode(q).finish();\n return Buffer.from(qe).toString(\"base64\");\n}\n\n/** Decodes a point from base64 encoded protobuf. */\nexport function decodePoint(data: string): index_buffer.IPoint {\n const dec = Buffer.from(data, \"base64\");\n return index_buffer.Point.decode(dec);\n}\n\n/** Encodes a point to protobuf & base64's it. */\nexport function encodeLayerNode(n: index_buffer.ILayerNode): string {\n const ne = index_buffer.LayerNode.encode({\n ...n,\n visible: n.visible || true, // is visible unless otherwise specified\n }).finish();\n return Buffer.from(ne).toString(\"base64\");\n}\n\n/** Decodes a point from base64 encoded protobuf. */\nexport function decodeLayerNode(data: string): index_buffer.ILayerNode {\n const dec = Buffer.from(data, \"base64\");\n return index_buffer.LayerNode.decode(dec);\n}\n","/*eslint-disable block-scoped-var, id-length, no-control-regex, no-magic-numbers, no-prototype-builtins, no-redeclare, no-shadow, no-var, sort-vars*/\n\"use strict\";\n\nvar $protobuf = require(\"protobufjs/minimal\");\n\n// Common aliases\nvar $Reader = $protobuf.Reader, $Writer = $protobuf.Writer, $util = $protobuf.util;\n\n// Exported root namespace\nvar $root = $protobuf.roots[\"default\"] || ($protobuf.roots[\"default\"] = {});\n\n$root.index_buffer = (function() {\n\n /**\n * Namespace index_buffer.\n * @exports index_buffer\n * @namespace\n */\n var index_buffer = {};\n\n index_buffer.LayerNode = (function() {\n\n /**\n * Properties of a LayerNode.\n * @memberof index_buffer\n * @interface ILayerNode\n * @property {number|null} [level] LayerNode level\n * @property {number|null} [idx] LayerNode idx\n * @property {boolean|null} [visible] LayerNode visible\n * @property {Object.|null} [neighbors] LayerNode neighbors\n */\n\n /**\n * Constructs a new LayerNode.\n * @memberof index_buffer\n * @classdesc Represents a LayerNode.\n * @implements ILayerNode\n * @constructor\n * @param {index_buffer.ILayerNode=} [properties] Properties to set\n */\n function LayerNode(properties) {\n this.neighbors = {};\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * LayerNode level.\n * @member {number} level\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.level = 0;\n\n /**\n * LayerNode idx.\n * @member {number} idx\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.idx = 0;\n\n /**\n * LayerNode visible.\n * @member {boolean} visible\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.visible = false;\n\n /**\n * LayerNode neighbors.\n * @member {Object.} neighbors\n * @memberof index_buffer.LayerNode\n * @instance\n */\n LayerNode.prototype.neighbors = $util.emptyObject;\n\n /**\n * Creates a new LayerNode instance using the specified properties.\n * @function create\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode=} [properties] Properties to set\n * @returns {index_buffer.LayerNode} LayerNode instance\n */\n LayerNode.create = function create(properties) {\n return new LayerNode(properties);\n };\n\n /**\n * Encodes the specified LayerNode message. Does not implicitly {@link index_buffer.LayerNode.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode} message LayerNode message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n LayerNode.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.level != null && Object.hasOwnProperty.call(message, \"level\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.level);\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 2, wireType 0 =*/16).uint32(message.idx);\n if (message.visible != null && Object.hasOwnProperty.call(message, \"visible\"))\n writer.uint32(/* id 3, wireType 0 =*/24).bool(message.visible);\n if (message.neighbors != null && Object.hasOwnProperty.call(message, \"neighbors\"))\n for (var keys = Object.keys(message.neighbors), i = 0; i < keys.length; ++i)\n writer.uint32(/* id 4, wireType 2 =*/34).fork().uint32(/* id 1, wireType 0 =*/8).uint32(keys[i]).uint32(/* id 2, wireType 5 =*/21).float(message.neighbors[keys[i]]).ldelim();\n return writer;\n };\n\n /**\n * Encodes the specified LayerNode message, length delimited. Does not implicitly {@link index_buffer.LayerNode.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.ILayerNode} message LayerNode message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n LayerNode.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a LayerNode message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.LayerNode\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.LayerNode} LayerNode\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n LayerNode.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.LayerNode(), key, value;\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.level = reader.uint32();\n break;\n }\n case 2: {\n message.idx = reader.uint32();\n break;\n }\n case 3: {\n message.visible = reader.bool();\n break;\n }\n case 4: {\n if (message.neighbors === $util.emptyObject)\n message.neighbors = {};\n var end2 = reader.uint32() + reader.pos;\n key = 0;\n value = 0;\n while (reader.pos < end2) {\n var tag2 = reader.uint32();\n switch (tag2 >>> 3) {\n case 1:\n key = reader.uint32();\n break;\n case 2:\n value = reader.float();\n break;\n default:\n reader.skipType(tag2 & 7);\n break;\n }\n }\n message.neighbors[key] = value;\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a LayerNode message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.LayerNode\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.LayerNode} LayerNode\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n LayerNode.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a LayerNode message.\n * @function verify\n * @memberof index_buffer.LayerNode\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n LayerNode.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.level != null && message.hasOwnProperty(\"level\"))\n if (!$util.isInteger(message.level))\n return \"level: integer expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.visible != null && message.hasOwnProperty(\"visible\"))\n if (typeof message.visible !== \"boolean\")\n return \"visible: boolean expected\";\n if (message.neighbors != null && message.hasOwnProperty(\"neighbors\")) {\n if (!$util.isObject(message.neighbors))\n return \"neighbors: object expected\";\n var key = Object.keys(message.neighbors);\n for (var i = 0; i < key.length; ++i) {\n if (!$util.key32Re.test(key[i]))\n return \"neighbors: integer key{k:uint32} expected\";\n if (typeof message.neighbors[key[i]] !== \"number\")\n return \"neighbors: number{k:uint32} expected\";\n }\n }\n return null;\n };\n\n /**\n * Creates a LayerNode message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.LayerNode\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.LayerNode} LayerNode\n */\n LayerNode.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.LayerNode)\n return object;\n var message = new $root.index_buffer.LayerNode();\n if (object.level != null)\n message.level = object.level >>> 0;\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.visible != null)\n message.visible = Boolean(object.visible);\n if (object.neighbors) {\n if (typeof object.neighbors !== \"object\")\n throw TypeError(\".index_buffer.LayerNode.neighbors: object expected\");\n message.neighbors = {};\n for (var keys = Object.keys(object.neighbors), i = 0; i < keys.length; ++i)\n message.neighbors[keys[i]] = Number(object.neighbors[keys[i]]);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a LayerNode message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.LayerNode\n * @static\n * @param {index_buffer.LayerNode} message LayerNode\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n LayerNode.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.objects || options.defaults)\n object.neighbors = {};\n if (options.defaults) {\n object.level = 0;\n object.idx = 0;\n object.visible = false;\n }\n if (message.level != null && message.hasOwnProperty(\"level\"))\n object.level = message.level;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.visible != null && message.hasOwnProperty(\"visible\"))\n object.visible = message.visible;\n var keys2;\n if (message.neighbors && (keys2 = Object.keys(message.neighbors)).length) {\n object.neighbors = {};\n for (var j = 0; j < keys2.length; ++j)\n object.neighbors[keys2[j]] = options.json && !isFinite(message.neighbors[keys2[j]]) ? String(message.neighbors[keys2[j]]) : message.neighbors[keys2[j]];\n }\n return object;\n };\n\n /**\n * Converts this LayerNode to JSON.\n * @function toJSON\n * @memberof index_buffer.LayerNode\n * @instance\n * @returns {Object.} JSON object\n */\n LayerNode.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for LayerNode\n * @function getTypeUrl\n * @memberof index_buffer.LayerNode\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n LayerNode.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.LayerNode\";\n };\n\n return LayerNode;\n })();\n\n index_buffer.Point = (function() {\n\n /**\n * Properties of a Point.\n * @memberof index_buffer\n * @interface IPoint\n * @property {number|null} [idx] Point idx\n * @property {Array.|null} [v] Point v\n */\n\n /**\n * Constructs a new Point.\n * @memberof index_buffer\n * @classdesc Represents a Point.\n * @implements IPoint\n * @constructor\n * @param {index_buffer.IPoint=} [properties] Properties to set\n */\n function Point(properties) {\n this.v = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * Point idx.\n * @member {number} idx\n * @memberof index_buffer.Point\n * @instance\n */\n Point.prototype.idx = 0;\n\n /**\n * Point v.\n * @member {Array.} v\n * @memberof index_buffer.Point\n * @instance\n */\n Point.prototype.v = $util.emptyArray;\n\n /**\n * Creates a new Point instance using the specified properties.\n * @function create\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint=} [properties] Properties to set\n * @returns {index_buffer.Point} Point instance\n */\n Point.create = function create(properties) {\n return new Point(properties);\n };\n\n /**\n * Encodes the specified Point message. Does not implicitly {@link index_buffer.Point.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint} message Point message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Point.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.idx);\n if (message.v != null && message.v.length) {\n writer.uint32(/* id 2, wireType 2 =*/18).fork();\n for (var i = 0; i < message.v.length; ++i)\n writer.float(message.v[i]);\n writer.ldelim();\n }\n return writer;\n };\n\n /**\n * Encodes the specified Point message, length delimited. Does not implicitly {@link index_buffer.Point.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.IPoint} message Point message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n Point.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a Point message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.Point\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.Point} Point\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Point.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.Point();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.idx = reader.uint32();\n break;\n }\n case 2: {\n if (!(message.v && message.v.length))\n message.v = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.v.push(reader.float());\n } else\n message.v.push(reader.float());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a Point message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.Point\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.Point} Point\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n Point.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a Point message.\n * @function verify\n * @memberof index_buffer.Point\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n Point.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.v != null && message.hasOwnProperty(\"v\")) {\n if (!Array.isArray(message.v))\n return \"v: array expected\";\n for (var i = 0; i < message.v.length; ++i)\n if (typeof message.v[i] !== \"number\")\n return \"v: number[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a Point message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.Point\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.Point} Point\n */\n Point.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.Point)\n return object;\n var message = new $root.index_buffer.Point();\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.v) {\n if (!Array.isArray(object.v))\n throw TypeError(\".index_buffer.Point.v: array expected\");\n message.v = [];\n for (var i = 0; i < object.v.length; ++i)\n message.v[i] = Number(object.v[i]);\n }\n return message;\n };\n\n /**\n * Creates a plain object from a Point message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.Point\n * @static\n * @param {index_buffer.Point} message Point\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n Point.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.v = [];\n if (options.defaults)\n object.idx = 0;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.v && message.v.length) {\n object.v = [];\n for (var j = 0; j < message.v.length; ++j)\n object.v[j] = options.json && !isFinite(message.v[j]) ? String(message.v[j]) : message.v[j];\n }\n return object;\n };\n\n /**\n * Converts this Point to JSON.\n * @function toJSON\n * @memberof index_buffer.Point\n * @instance\n * @returns {Object.} JSON object\n */\n Point.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for Point\n * @function getTypeUrl\n * @memberof index_buffer.Point\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n Point.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.Point\";\n };\n\n return Point;\n })();\n\n index_buffer.PointQuant = (function() {\n\n /**\n * Properties of a PointQuant.\n * @memberof index_buffer\n * @interface IPointQuant\n * @property {number|null} [idx] PointQuant idx\n * @property {Array.|null} [v] PointQuant v\n */\n\n /**\n * Constructs a new PointQuant.\n * @memberof index_buffer\n * @classdesc Represents a PointQuant.\n * @implements IPointQuant\n * @constructor\n * @param {index_buffer.IPointQuant=} [properties] Properties to set\n */\n function PointQuant(properties) {\n this.v = [];\n if (properties)\n for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i)\n if (properties[keys[i]] != null)\n this[keys[i]] = properties[keys[i]];\n }\n\n /**\n * PointQuant idx.\n * @member {number} idx\n * @memberof index_buffer.PointQuant\n * @instance\n */\n PointQuant.prototype.idx = 0;\n\n /**\n * PointQuant v.\n * @member {Array.} v\n * @memberof index_buffer.PointQuant\n * @instance\n */\n PointQuant.prototype.v = $util.emptyArray;\n\n /**\n * Creates a new PointQuant instance using the specified properties.\n * @function create\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant=} [properties] Properties to set\n * @returns {index_buffer.PointQuant} PointQuant instance\n */\n PointQuant.create = function create(properties) {\n return new PointQuant(properties);\n };\n\n /**\n * Encodes the specified PointQuant message. Does not implicitly {@link index_buffer.PointQuant.verify|verify} messages.\n * @function encode\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant} message PointQuant message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n PointQuant.encode = function encode(message, writer) {\n if (!writer)\n writer = $Writer.create();\n if (message.idx != null && Object.hasOwnProperty.call(message, \"idx\"))\n writer.uint32(/* id 1, wireType 0 =*/8).uint32(message.idx);\n if (message.v != null && message.v.length) {\n writer.uint32(/* id 2, wireType 2 =*/18).fork();\n for (var i = 0; i < message.v.length; ++i)\n writer.uint32(message.v[i]);\n writer.ldelim();\n }\n return writer;\n };\n\n /**\n * Encodes the specified PointQuant message, length delimited. Does not implicitly {@link index_buffer.PointQuant.verify|verify} messages.\n * @function encodeDelimited\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.IPointQuant} message PointQuant message or plain object to encode\n * @param {$protobuf.Writer} [writer] Writer to encode to\n * @returns {$protobuf.Writer} Writer\n */\n PointQuant.encodeDelimited = function encodeDelimited(message, writer) {\n return this.encode(message, writer).ldelim();\n };\n\n /**\n * Decodes a PointQuant message from the specified reader or buffer.\n * @function decode\n * @memberof index_buffer.PointQuant\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @param {number} [length] Message length if known beforehand\n * @returns {index_buffer.PointQuant} PointQuant\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n PointQuant.decode = function decode(reader, length) {\n if (!(reader instanceof $Reader))\n reader = $Reader.create(reader);\n var end = length === undefined ? reader.len : reader.pos + length, message = new $root.index_buffer.PointQuant();\n while (reader.pos < end) {\n var tag = reader.uint32();\n switch (tag >>> 3) {\n case 1: {\n message.idx = reader.uint32();\n break;\n }\n case 2: {\n if (!(message.v && message.v.length))\n message.v = [];\n if ((tag & 7) === 2) {\n var end2 = reader.uint32() + reader.pos;\n while (reader.pos < end2)\n message.v.push(reader.uint32());\n } else\n message.v.push(reader.uint32());\n break;\n }\n default:\n reader.skipType(tag & 7);\n break;\n }\n }\n return message;\n };\n\n /**\n * Decodes a PointQuant message from the specified reader or buffer, length delimited.\n * @function decodeDelimited\n * @memberof index_buffer.PointQuant\n * @static\n * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from\n * @returns {index_buffer.PointQuant} PointQuant\n * @throws {Error} If the payload is not a reader or valid buffer\n * @throws {$protobuf.util.ProtocolError} If required fields are missing\n */\n PointQuant.decodeDelimited = function decodeDelimited(reader) {\n if (!(reader instanceof $Reader))\n reader = new $Reader(reader);\n return this.decode(reader, reader.uint32());\n };\n\n /**\n * Verifies a PointQuant message.\n * @function verify\n * @memberof index_buffer.PointQuant\n * @static\n * @param {Object.} message Plain object to verify\n * @returns {string|null} `null` if valid, otherwise the reason why it is not\n */\n PointQuant.verify = function verify(message) {\n if (typeof message !== \"object\" || message === null)\n return \"object expected\";\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n if (!$util.isInteger(message.idx))\n return \"idx: integer expected\";\n if (message.v != null && message.hasOwnProperty(\"v\")) {\n if (!Array.isArray(message.v))\n return \"v: array expected\";\n for (var i = 0; i < message.v.length; ++i)\n if (!$util.isInteger(message.v[i]))\n return \"v: integer[] expected\";\n }\n return null;\n };\n\n /**\n * Creates a PointQuant message from a plain object. Also converts values to their respective internal types.\n * @function fromObject\n * @memberof index_buffer.PointQuant\n * @static\n * @param {Object.} object Plain object\n * @returns {index_buffer.PointQuant} PointQuant\n */\n PointQuant.fromObject = function fromObject(object) {\n if (object instanceof $root.index_buffer.PointQuant)\n return object;\n var message = new $root.index_buffer.PointQuant();\n if (object.idx != null)\n message.idx = object.idx >>> 0;\n if (object.v) {\n if (!Array.isArray(object.v))\n throw TypeError(\".index_buffer.PointQuant.v: array expected\");\n message.v = [];\n for (var i = 0; i < object.v.length; ++i)\n message.v[i] = object.v[i] >>> 0;\n }\n return message;\n };\n\n /**\n * Creates a plain object from a PointQuant message. Also converts values to other types if specified.\n * @function toObject\n * @memberof index_buffer.PointQuant\n * @static\n * @param {index_buffer.PointQuant} message PointQuant\n * @param {$protobuf.IConversionOptions} [options] Conversion options\n * @returns {Object.} Plain object\n */\n PointQuant.toObject = function toObject(message, options) {\n if (!options)\n options = {};\n var object = {};\n if (options.arrays || options.defaults)\n object.v = [];\n if (options.defaults)\n object.idx = 0;\n if (message.idx != null && message.hasOwnProperty(\"idx\"))\n object.idx = message.idx;\n if (message.v && message.v.length) {\n object.v = [];\n for (var j = 0; j < message.v.length; ++j)\n object.v[j] = message.v[j];\n }\n return object;\n };\n\n /**\n * Converts this PointQuant to JSON.\n * @function toJSON\n * @memberof index_buffer.PointQuant\n * @instance\n * @returns {Object.} JSON object\n */\n PointQuant.prototype.toJSON = function toJSON() {\n return this.constructor.toObject(this, $protobuf.util.toJSONOptions);\n };\n\n /**\n * Gets the default type url for PointQuant\n * @function getTypeUrl\n * @memberof index_buffer.PointQuant\n * @static\n * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default \"type.googleapis.com\")\n * @returns {string} The default type url\n */\n PointQuant.getTypeUrl = function getTypeUrl(typeUrlPrefix) {\n if (typeUrlPrefix === undefined) {\n typeUrlPrefix = \"type.googleapis.com\";\n }\n return typeUrlPrefix + \"/index_buffer.PointQuant\";\n };\n\n return PointQuant;\n })();\n\n return index_buffer;\n})();\n\nmodule.exports = $root;\n","/** Utilities to get the key in KVdb for a value. */\nexport const keys = {\n layers: \"layers\",\n ep: \"ep\",\n points: \"points\",\n metadata: (idx: number) => `m:${idx}` as const,\n /** Maps a point index to its key in the KVdb. */\n point: (idx: number) => `${idx}` as const,\n /** Maps a neighbor (layer & index) to its key in the KVdb. */\n neighbor: (layer: number, idx: number) => `${layer}__${idx}` as const,\n} as const;\n\n/** Safely parses a data, returning `null` if its falsy. */\nexport function safeParse(data: string | null | undefined): V | null {\n return data ? JSON.parse(data) : null;\n}\n"],"names":[],"version":3,"file":"index.mjs.map","sourceRoot":"../"} \ No newline at end of file diff --git a/package.json b/package.json index d673ece..d20c7ef 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,8 @@ "test:hnsw": "jest ./test/hnsw.test.ts --bail", "build": "parcel build", "check": "npx tsc --noEmit && echo \"All good.\"", - "format": "prettier --check '**/*.ts'" + "format": "prettier --check '**/*.ts'", + "lint": "eslint '**/*.ts' && echo 'All good.'" }, "type": "module", "source": "src/index.ts", @@ -58,8 +59,13 @@ "@parcel/transformer-typescript-types": "^2.10.3", "@types/jest": "^29.5.11", "@types/node": "^20.10.5", + "@typescript-eslint/eslint-plugin": "^6.18.1", "arlocal": "1.1.62", "arweave": "^1.14.4", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-node": "^11.1.0", + "eslint-plugin-prettier": "^5.1.3", "jest": "^29.7.0", "parcel": "^2.10.3", "prettier": "^3.1.1", @@ -84,6 +90,9 @@ "prettier": { "printWidth": 120 }, + "engines": { + "node": ">=12" + }, "keywords": [ "key-value", "storage", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8bc9af7..720635c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -43,12 +43,27 @@ devDependencies: '@types/node': specifier: ^20.10.5 version: 20.10.5 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) arlocal: specifier: 1.1.62 version: 1.1.62(@solana/web3.js@1.87.6)(typescript@5.3.3) arweave: specifier: ^1.14.4 version: 1.14.4 + eslint: + specifier: ^8.56.0 + version: 8.56.0 + eslint-config-prettier: + specifier: ^9.1.0 + version: 9.1.0(eslint@8.56.0) + eslint-plugin-node: + specifier: ^11.1.0 + version: 11.1.0(eslint@8.56.0) + eslint-plugin-prettier: + specifier: ^5.1.3 + version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.1.1) jest: specifier: ^29.7.0 version: 29.7.0(@types/node@20.10.5)(ts-node@10.9.2) @@ -82,6 +97,11 @@ devDependencies: packages: + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} engines: {node: '>=6.0.0'} @@ -561,6 +581,43 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.56.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@ethersproject/abi@5.7.0: resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} dependencies: @@ -930,6 +987,26 @@ packages: dependencies: graphql: 16.8.1 + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.2 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.2: + resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} + dev: true + /@iden3/bigarray@0.0.2: resolution: {integrity: sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==} @@ -1835,6 +1912,27 @@ packages: resolution: {integrity: sha512-V7/fPHgl+jsVPXqqeOzT8egNj2iBIVt+ECeMMG8TdcnTikP3oaBtUVqpT/gYCR68aEBJSF+XbYUxStjbFMqIIA==} engines: {node: '>= 16'} + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.16.0 + dev: true + /@npmcli/fs@1.1.1: resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} requiresBuild: true @@ -2719,6 +2817,11 @@ packages: nullthrows: 1.1.1 dev: true + /@pkgr/core@0.1.0: + resolution: {integrity: sha512-Zwq5OCzuwJC2jwqmpEQt7Ds1DTi6BWSwoGkbb1n9pO3hzb35BoJELx7c0T23iDkBGkh2e7tvOtjF3tr3OaQHDQ==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + dev: true + /@protobufjs/aspromise@1.1.2: resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -3147,6 +3250,10 @@ packages: pretty-format: 29.7.0 dev: true + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + /@types/keygrip@1.0.6: resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} @@ -3230,6 +3337,10 @@ packages: '@types/node': 20.10.5 dev: false + /@types/semver@7.5.6: + resolution: {integrity: sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==} + dev: true + /@types/send@0.17.4: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: @@ -3267,6 +3378,142 @@ packages: '@types/yargs-parser': 21.0.3 dev: true + /@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.18.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/scope-manager': 6.18.1 + '@typescript-eslint/type-utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.18.1 + debug: 4.3.4 + eslint: 8.56.0 + graphemer: 1.4.0 + ignore: 5.3.0 + natural-compare: 1.4.0 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.18.1 + '@typescript-eslint/types': 6.18.1 + '@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3) + '@typescript-eslint/visitor-keys': 6.18.1 + debug: 4.3.4 + eslint: 8.56.0 + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@6.18.1: + resolution: {integrity: sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.18.1 + '@typescript-eslint/visitor-keys': 6.18.1 + dev: true + + /@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3) + '@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) + debug: 4.3.4 + eslint: 8.56.0 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@6.18.1: + resolution: {integrity: sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@6.18.1(typescript@5.3.3): + resolution: {integrity: sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.18.1 + '@typescript-eslint/visitor-keys': 6.18.1 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.5.4 + ts-api-utils: 1.0.3(typescript@5.3.3) + typescript: 5.3.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.3.3): + resolution: {integrity: sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.6 + '@typescript-eslint/scope-manager': 6.18.1 + '@typescript-eslint/types': 6.18.1 + '@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3) + eslint: 8.56.0 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.18.1: + resolution: {integrity: sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.18.1 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + /@wallet-standard/base@1.0.1: resolution: {integrity: sha512-1To3ekMfzhYxe0Yhkpri+Fedq0SYcfrOfJi3vbLjMwF2qiKPjTGLwZkf2C9ftdQmxES+hmxhBzTwF4KgcOwf8w==} engines: {node: '>=16'} @@ -3363,6 +3610,15 @@ packages: indent-string: 4.0.0 optional: true + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + /algo-msgpack-with-bigint@2.1.1: resolution: {integrity: sha512-F1tGh056XczEaEAqu7s+hlZUDWwOBT70Eq0lfMpBP2YguSQVyxRbprLq5rELXKQOyOaixTWYhMeMQMzP0U5FoQ==} engines: {node: '>= 10'} @@ -3807,6 +4063,11 @@ packages: - utf-8-validate dev: true + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + /articles@0.2.2: resolution: {integrity: sha512-S3Y4MPp+LD/l0HHm/4yrr6MoXhUkKT98ZdsV2tkTuBNywqUXEtvJT+NBO3KTSQEttc5EOwEJe2Xw8cZ9TI5Hrw==} @@ -4843,6 +5104,20 @@ packages: miller-rabin: 4.0.1 randombytes: 2.1.0 + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + /dom-serializer@1.4.1: resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} dependencies: @@ -5031,6 +5306,11 @@ packages: engines: {node: '>=8'} dev: true + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + /escodegen@1.14.3: resolution: {integrity: sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw==} engines: {node: '>=4.0'} @@ -5054,11 +5334,134 @@ packages: optionalDependencies: source-map: 0.6.1 + /eslint-config-prettier@9.1.0(eslint@8.56.0): + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.56.0 + dev: true + + /eslint-plugin-es@3.0.1(eslint@8.56.0): + resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 8.56.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-node@11.1.0(eslint@8.56.0): + resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=5.16.0' + dependencies: + eslint: 8.56.0 + eslint-plugin-es: 3.0.1(eslint@8.56.0) + eslint-utils: 2.1.0 + ignore: 5.3.0 + minimatch: 3.1.2 + resolve: 1.22.8 + semver: 6.3.1 + dev: true + + /eslint-plugin-prettier@5.1.3(eslint-config-prettier@9.1.0)(eslint@8.56.0)(prettier@3.1.1): + resolution: {integrity: sha512-C9GCVAs4Eq7ZC/XFQHITLiHJxQngdtraXaM+LoUFoFp/lHNl2Zn8f3WQbe9HvTBBQ9YnKFB0/2Ajdqwo5D1EAw==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.56.0 + eslint-config-prettier: 9.1.0(eslint@8.56.0) + prettier: 3.1.1 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + dev: true + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-utils@2.1.0: + resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} + engines: {node: '>=6'} + dependencies: + eslint-visitor-keys: 1.3.0 + dev: true + + /eslint-visitor-keys@1.3.0: + resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} + engines: {node: '>=4'} + dev: true + /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.56.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} @@ -5082,6 +5485,20 @@ packages: engines: {node: '>=4'} hasBin: true + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} @@ -5220,6 +5637,25 @@ packages: /fast-copy@3.0.1: resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} @@ -5232,6 +5668,12 @@ packages: /fastfile@0.0.20: resolution: {integrity: sha512-r5ZDbgImvVWCP0lA/cGNgQcZqR+aYdFx3u+CtJqUE510pBUVGMn4ulL/iRTI4tACTYsNJ736uzFxEBXesPAktA==} + /fastq@1.16.0: + resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} + dependencies: + reusify: 1.0.4 + dev: true + /fb-watchman@2.0.2: resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} dependencies: @@ -5263,6 +5705,13 @@ packages: dependencies: escape-string-regexp: 1.0.5 + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -5293,6 +5742,19 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.2.9 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + /follow-redirects@1.15.3: resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} engines: {node: '>=4.0'} @@ -5427,6 +5889,20 @@ packages: /getopts@2.2.5: resolution: {integrity: sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA==} + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} dependencies: @@ -5460,6 +5936,18 @@ packages: type-fest: 0.20.2 dev: true + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + /gopd@1.0.1: resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} dependencies: @@ -5488,6 +5976,10 @@ packages: /grapheme-splitter@1.0.4: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + /graphql-tag@2.12.6(graphql@16.8.1): resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} @@ -5765,6 +6257,11 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + /ignore@5.3.0: + resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} + engines: {node: '>= 4'} + dev: true + /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} @@ -5932,6 +6429,11 @@ packages: engines: {node: '>=0.12.0'} dev: true + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -6542,12 +7044,19 @@ packages: /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - dev: false /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} dev: true + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -6587,7 +7096,6 @@ packages: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 - dev: false /klaw@3.0.0: resolution: {integrity: sha512-0Fo5oir+O9jnXu5EefYbVK+mHMBeEVEy2cmctR1O1NECcCkPRreJKrS6Qt/j3KC2C148Dfo9i3pCmCMsdqGr0g==} @@ -6777,6 +7285,14 @@ packages: prelude-ls: 1.1.2 type-check: 0.3.2 + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + /lightningcss-darwin-arm64@1.22.1: resolution: {integrity: sha512-ldvElu+R0QimNTjsKpaZkUv3zf+uefzLy/R1R19jtgOfSRM+zjUCUgDhfEDRmVqJtMwYsdhMI2aJtJChPC6Osg==} engines: {node: '>= 12.0.0'} @@ -6957,6 +7473,10 @@ packages: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + /lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} @@ -7133,6 +7653,11 @@ packages: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} dev: true + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + /methods@1.1.2: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} @@ -7198,6 +7723,13 @@ packages: dependencies: brace-expansion: 2.0.1 + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -7598,6 +8130,18 @@ packages: type-check: 0.3.2 word-wrap: 1.2.5 + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} @@ -7851,6 +8395,18 @@ packages: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + /prettier@3.1.1: resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} engines: {node: '>=14'} @@ -7971,6 +8527,11 @@ packages: /punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: true + /pure-rand@6.0.4: resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} dev: true @@ -8088,6 +8649,11 @@ packages: /regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + /regexpp@3.2.0: + resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} + engines: {node: '>=8'} + dev: true + /require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -8154,6 +8720,11 @@ packages: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + /rfc4648@1.5.3: resolution: {integrity: sha512-MjOWxM065+WswwnmNONOT+bD1nXzY9Km6u3kzvnx8F8/HXGZdz3T6e6vZJ8Q/RIMUSp/nxqjH3GwvJDy8ijeQQ==} @@ -8189,6 +8760,12 @@ packages: dependencies: queue-microtask: 1.2.3 + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + /rxjs@7.8.1: resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} dependencies: @@ -8576,6 +9153,14 @@ packages: resolution: {integrity: sha512-yUT0ukFkFEt4nb+NY+n2ag51aS/u9UHXoZw+A4jgD77/jzZsBoSDHuqysrVCBC4CYR4TYvUJq54ONpXgDBH8tA==} engines: {node: '>=0.2.6'} + /synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + dependencies: + '@pkgr/core': 0.1.0 + tslib: 2.6.2 + dev: true + /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} engines: {node: '>=6'} @@ -8618,6 +9203,10 @@ packages: /text-encoding-utf-8@1.0.2: resolution: {integrity: sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==} + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + /through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -8685,6 +9274,15 @@ packages: /tryer@1.0.1: resolution: {integrity: sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==} + /ts-api-utils@1.0.3(typescript@5.3.3): + resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} + engines: {node: '>=16.13.0'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.3.3 + dev: true + /ts-jest@29.1.1(@babel/core@7.23.6)(jest@29.7.0)(typescript@5.3.3): resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -8784,6 +9382,13 @@ packages: dependencies: prelude-ls: 1.1.2 + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} @@ -8876,6 +9481,12 @@ packages: picocolors: 1.0.0 dev: true + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: true + /url@0.11.3: resolution: {integrity: sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==} dependencies: diff --git a/src/db/common/index.ts b/src/db/common/index.ts index 689f97f..891ed11 100644 --- a/src/db/common/index.ts +++ b/src/db/common/index.ts @@ -11,6 +11,6 @@ export const keys = { } as const; /** Safely parses a data, returning `null` if its falsy. */ -export function safeParse(data: string | null | undefined): V | null { +export function safeParse(data: string | null | undefined): V | null { return data ? JSON.parse(data) : null; } diff --git a/src/db/hollowdb.ts b/src/db/hollowdb.ts index f60c948..07be42c 100644 --- a/src/db/hollowdb.ts +++ b/src/db/hollowdb.ts @@ -4,7 +4,7 @@ import { decodeLayerNode, decodePoint, encodeLayerNode, encodePoint } from "../p import { SetSDK } from "hollowdb"; import { keys, safeParse } from "./common"; -export class HollowMemory implements DBInterface { +export class HollowMemory implements DBInterface { client: SetSDK; /** diff --git a/src/db/interfaces/index.ts b/src/db/interfaces/index.ts index f62c5b3..76c9972 100644 --- a/src/db/interfaces/index.ts +++ b/src/db/interfaces/index.ts @@ -3,7 +3,7 @@ import type { Graph, LayerNode, Point } from "../../types"; /** * The `graphs` and `points` of HNSW can be stored in any interface supported by this interface. */ -export interface DBInterface { +export interface DBInterface { /////////////// NEIGHBORS /////////////// /** Adds a new empty layer. diff --git a/src/hnsw.ts b/src/hnsw.ts index af3ee5e..ad14820 100644 --- a/src/hnsw.ts +++ b/src/hnsw.ts @@ -12,7 +12,7 @@ import type { DBInterface } from "./db/interfaces"; * @template M type of the metadata, which is extra information * stored along with each point, a common practice in vectorDBs. */ -export class HNSW { +export class HNSW { /** A database that supports `DBInterface`. */ db: DBInterface; @@ -28,7 +28,7 @@ export class HNSW { /** Factor for quality of search. */ ef: number; - constructor(db: DBInterface, M: number, ef_construction: number, ef_search: number) { + constructor(db: DBInterface, M: number, ef_construction: number, ef_search: number) { this.db = db; this.m = M; // paper proposes [5,48] is a good range for m (Weavite uses 64) @@ -91,7 +91,7 @@ export class HNSW { ep = W.map((e) => [e[0], e[1]] as Node); // copy W to ep const neighbors = this.select_neighbors(q, W, l_c); - const indices = neighbors.map(([_, idx]) => idx); + const indices = neighbors.map(([, idx]) => idx); const nodes = await this.db.get_neighbors(l_c, indices); // add bidirectional connections from neighbors to q at layer l_c @@ -108,7 +108,7 @@ export class HNSW { // shrink connections const eNewConn = this.select_neighbors(await this.db.get_point(e[1]), eConn, l_c); // loop below equivalent to: self.graphs[l_c][e[1]] = {ind: dist for dist, ind in eNewConn} - let dict: Record = {}; + const dict: Record = {}; for (const eNew of eNewConn) { dict[eNew[1]] = eNew[0]; } @@ -139,7 +139,7 @@ export class HNSW { */ async search_layer(q: Point, ep: Node[], ef: number, l_c: number) { // set of visited elements | v = set(p for _, p in ep) - const V = new Set(ep.map(([_, id]) => id)); + const V = new Set(ep.map(([, id]) => id)); // set of candidates, min-heapified const C = new NodeHeap(ep); @@ -228,7 +228,6 @@ export class HNSW { /** K-nearest Neighbor search. */ async knn_search(q: Point, K: number): Promise[]> { - let W: Node[] = []; const ep_index = await this.db.get_ep(); // edge case: no points were added at all diff --git a/src/index.ts b/src/index.ts index 9dcc89f..1f09966 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,7 +4,30 @@ import { HollowMemory } from "./db/hollowdb"; import type { JWKInterface, Warp } from "warp-contracts"; import { ArweaveSigner } from "warp-contracts-plugin-deploy"; -export default class HollowDBVector extends HNSW { +/** + * Backwards compatibility with [Dria](https://dria.co/) contracts that make use + * of a custom contract function called `upsertVectorMulti`, which is actually + * equivalent to `setMany`. + * + * This class overrides the `set` and `setMany` functions of `SetSDK` from HollowDB. + */ +export class DriaCompatSDK extends SetSDK { + override async setMany(keys: string[], values: string[]): Promise { + await this.base.dryWriteInteraction({ + function: "upsertVectorMulti", + value: { + keys, + values, + }, + }); + } + + override async set(key: string, value: string): Promise { + await this.setMany([key], [value]); + } +} + +export default class HollowDBVector extends HNSW { /** HollowDB SDK instance as passed in the `constructor`. */ sdk: SetSDK; @@ -14,6 +37,8 @@ export default class HollowDBVector extends HNSW { * @param hollowdb a hollowdb instance with `set` and `setMany` operations, where values are `string` typed. * - Vectors are encoded & decoded with protobuffers, and the base64 of encodings are stored in HollowDB * - Metadatas are stored as JSON-stringified values. + * - Some of the HollowDB contracts (especially those in [Dria](https://dria.co/)) may use a function called + * `upsertVectorMulti`, which is incompatible with `SetSDK`. For these, you may use `DriaCompatSDK`. * * @param options Optional HNSW parameters: * diff --git a/src/types/index.ts b/src/types/index.ts index 060d4a0..9c8cf76 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -11,7 +11,7 @@ export type LayerNode = Record; export type Node = [distance: number, id: number]; /** Result of a KNN query for one vector. */ -export type KNNResult = { +export type KNNResult = { id: number; distance: number; metadata: M | null; diff --git a/test/db/kvMemory.ts b/test/db/kvMemory.ts index c349afa..9dd0a7a 100644 --- a/test/db/kvMemory.ts +++ b/test/db/kvMemory.ts @@ -6,7 +6,7 @@ import { keys, safeParse } from "../../src/db/common"; /** A mock DB that stores everything in JS memory; but, * - uses a KV interface * - uses protobufs to store values as serialized & base64-encoded values */ -export class KVMemory implements DBInterface { +export class KVMemory implements DBInterface { private kvdb: Record = {}; async get_ep(): Promise { diff --git a/test/db/memory.ts b/test/db/memory.ts index 48f03ec..47e43ed 100644 --- a/test/db/memory.ts +++ b/test/db/memory.ts @@ -1,11 +1,11 @@ -import type { Graph, LayerNode, Node, Point } from "../../src/types"; +import type { Graph, LayerNode, Point } from "../../src/types"; import type { DBInterface } from "../../src/db/interfaces"; /** * A mock DB that stores everything in JS memory. * @template M metadata type */ -export class Memory implements DBInterface { +export class Memory implements DBInterface { private points: Point[] = []; private metadatas: (M | null)[] = []; private graphs: Graph[] = []; diff --git a/test/db/redis.ts b/test/db/redis.ts index 32a64dc..beb23d6 100644 --- a/test/db/redis.ts +++ b/test/db/redis.ts @@ -4,7 +4,7 @@ import type { Redis } from "ioredis"; import { decodeLayerNode, decodePoint, encodeLayerNode, encodePoint } from "../../src/proto"; import { keys, safeParse } from "../../src/db/common"; -export class RedisMemory implements DBInterface { +export class RedisMemory implements DBInterface { client: Redis; constructor(client: Redis) { diff --git a/test/hnsw.test.ts b/test/hnsw.test.ts index ef9be11..9f2bce8 100644 --- a/test/hnsw.test.ts +++ b/test/hnsw.test.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-unused-vars */ + import { HNSW } from "../src/hnsw"; import { Memory } from "./db/memory"; import { KVMemory } from "./db/kvMemory"; diff --git a/test/hollow.test.ts b/test/hollow.test.ts index e881b9e..f4f210e 100644 --- a/test/hollow.test.ts +++ b/test/hollow.test.ts @@ -10,12 +10,12 @@ import { RedisCache } from "warp-contracts-redis"; type Metadata = { id: number }; -describe("HollowDB Vector", () => { +describe.skip("HollowDB Vector", () => { let train: number[][]; let metadatas: Metadata[]; let arlocal: ArLocal; - let vectordb: HollowDBVector; + let vectordb: HollowDBVector; const ARWEAVE_PORT = 3169; // testing just for 100 because that takes long enough (approx 200 seconds insert)