eizen
Version:
Vector database Engine for ArchiveNET
1 lines • 109 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","names":["index_buffer","keys","q: index_buffer.IPoint","data: string","n: index_buffer.ILayerNode","idx: number","layer: number","data: string | null | undefined","initialState: Awaited<ReturnType<typeof this.client.getState>>","client: SetSDK<string>","ep: number","idx: number","idxs: number[]","q: Point","layer: number","node: LayerNode","nodes: Graph","data: M","keys: string[]","keys","entries: [key: string, value: string][]","Heap","elems: Node[]","a: Node","b: Node","a: Point","b: Point","db: DBInterface<M>","M: number","ef_construction: number","ef_search: number","idx: number","q: Point","metadata?: M","ep_copy: Node[]","newNode: LayerNode","idx","dict: Record<number, number>","ep: Node[]","ef: number","l_c: number","c_v: number","C: Node[]","K: number","ep","SetSDK","keys: string[]","values: string[]","keys","key: string","value: string","contractSDK: SetSDK<string>","options?: {\n\t\t\t/** Maximum number of bidirectional connections per node (default: 5) */\n\t\t\tm?: number;\n\t\t\t/** Size of candidate list during graph construction (default: 128) */\n\t\t\tefConstruction?: number;\n\t\t\t/** Size of candidate list during search (default: 20) */\n\t\t\tefSearch?: number;\n\t\t}","wallet: JWKInterface","warp: Warp","initialState: ContractState","ArweaveSigner"],"sources":["../proto/hnsw_comm.js","../src/codec.ts","../src/db/common/index.ts","../src/db/index.ts","../src/utils/index.ts","../src/hnsw.ts","../src/index.ts"],"sourcesContent":["/*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.<string,number>|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.<string,number>} 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.<string,*>} 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.<string,*>} 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.<string,*>} 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.<string,*>} 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.<number>|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.<number>} 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.<string,*>} 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.<string,*>} 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.<string,*>} 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.<string,*>} 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.<number>|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.<number>} 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.<string,*>} 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.<string,*>} 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.<string,*>} 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.<string,*>} 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","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\tconst qe = index_buffer.Point.encode(q).finish();\n\treturn Buffer.from(qe).toString(\"base64\");\n}\n\n/** Decodes a point from base64 encoded protobuf. */\nexport function decodePoint(data: string): index_buffer.IPoint {\n\tconst dec = Buffer.from(data, \"base64\");\n\treturn index_buffer.Point.decode(dec);\n}\n\n/** Encodes a layerNode to protobuf & base64's it. */\nexport function encodeLayerNode(n: index_buffer.ILayerNode): string {\n\tconst ne = index_buffer.LayerNode.encode({\n\t\t...n,\n\t\tvisible: n.visible || true, // is visible unless otherwise specified\n\t}).finish();\n\treturn Buffer.from(ne).toString(\"base64\");\n}\n\n/** Decodes a layerNode from base64 encoded protobuf. */\nexport function decodeLayerNode(data: string): index_buffer.ILayerNode {\n\tconst dec = Buffer.from(data, \"base64\");\n\treturn index_buffer.LayerNode.decode(dec);\n}\n","/** KVdb key generators for different data types */\nexport const keys = {\n\tlayers: \"layers\",\n\tep: \"ep\",\n\tpoints: \"points\",\n\tmetadata: (idx: number) => `m:${idx}` as const,\n\tpoint: (idx: number) => `${idx}` as const,\n\tneighbor: (layer: number, idx: number) => `${layer}__${idx}` as const,\n} as const;\n\n/** Parse JSON string, returns null for falsy values */\nexport function safeParse<V = unknown>(\n\tdata: string | null | undefined,\n): V | null {\n\treturn data ? JSON.parse(data) : null;\n}\n","import type { SetSDK } from \"hollowdb\";\nimport {\n\tdecodeLayerNode,\n\tdecodePoint,\n\tencodeLayerNode,\n\tencodePoint,\n} from \"../codec\";\nimport type { Graph, LayerNode, Point } from \"../types\";\nimport { keys, safeParse } from \"./common\";\nimport type { DBInterface } from \"./interfaces\";\n\n/**\n * EizenMemory - A distributed memory implementation for vector similarity search\n *\n * This class provides a hierarchical navigation structure for approximate nearest neighbor search.\n * It uses layered graphs where higher layers contain fewer, more connected nodes for efficient search.\n *\n * Key concepts:\n * - Points: Vector data stored with unique indices\n * - Layers: Hierarchical levels of the graph structure\n * - Neighbors: Connected nodes in each layer forming the searchable graph\n * - Entry Point (EP): Starting node for search operations\n *\n * @template M - Type for optional metadata associated with points\n */\nexport class EizenMemory<M = unknown> implements DBInterface<M> {\n\tclient: SetSDK<string>;\n\n\t/**\n\t * Deploy a new contract for this database instance\n\t *\n\t * @param initialState - Initial state configuration for the contract\n\t * @param source - ( Optional) source transaction ID for contract deployment\n\t * @returns The deployed contract transaction ID\n\t */\n\tasync deploy(\n\t\tinitialState: Awaited<ReturnType<typeof this.client.getState>>,\n\t\tsource = \"\",\n\t) {\n\t\tconst { contractTxId } = await this.client.warp.deployFromSourceTx({\n\t\t\twallet: this.client.signer,\n\t\t\tsrcTxId: source,\n\t\t\tinitState: JSON.stringify(initialState),\n\t\t});\n\n\t\treturn contractTxId;\n\t}\n\n\tconstructor(client: SetSDK<string>) {\n\t\tthis.client = client;\n\t}\n\n\t// === Entry Point Management ===\n\n\t/**\n\t * Get the current entry point index for search operations\n\t * The entry point is the starting node for navigating the graph structure\n\t */\n\tasync get_ep(): Promise<number | null> {\n\t\tconst ep = await this.client.get(keys.ep);\n\t\treturn ep === null ? null : Number.parseInt(ep);\n\t}\n\n\t/**\n\t * Set the entry point for search operations\n\t * Should typically be a well-connected node in the highest layer\n\t */\n\tasync set_ep(ep: number): Promise<void> {\n\t\tawait this.client.set(keys.ep, ep.toString());\n\t}\n\n\t// === Point (Vector) Operations ===\n\n\t/**\n\t * Retrieve a single point (vector) by its index\n\t *\n\t * @param idx - Unique identifier for the point\n\t * @returns The point data\n\t * @throws Error if point doesn't exist or has no value\n\t */\n\tasync get_point(idx: number): Promise<Point> {\n\t\tconst data = await this.client.get(keys.point(idx));\n\t\tif (!data) {\n\t\t\tthrow new Error(`No point with index ${idx}`);\n\t\t}\n\t\tconst point = decodePoint(data);\n\t\tif (!point.v) {\n\t\t\tthrow new Error(`Point at index ${idx} has no value`);\n\t\t}\n\t\treturn point.v;\n\t}\n\n\t/**\n\t * Retrieve multiple points in a single operation for better performance\n\t *\n\t * @param idxs - Array of point indices to retrieve\n\t * @returns Array of points in the same order as input indices\n\t * @throws Error if any point is missing or invalid\n\t */\n\tasync get_points(idxs: number[]): Promise<Point[]> {\n\t\tif (idxs.length === 0) return [];\n\t\tconst datas = await this.safe_get_many(idxs.map((idx) => keys.point(idx)));\n\n\t\t// Validate all points exist before processing\n\t\tconst nullPos = datas.indexOf(null);\n\t\tif (nullPos !== -1) {\n\t\t\tthrow new Error(`No point with index ${idxs[nullPos]}`);\n\t\t}\n\n\t\t// Decode all points and validate they have values\n\t\tconst points = datas.map((data, i) => {\n\t\t\tif (data === null) {\n\t\t\t\tthrow new Error(`No data for point at index ${idxs[i]}`);\n\t\t\t}\n\t\t\treturn decodePoint(data);\n\t\t});\n\n\t\treturn points.map((point, i) => {\n\t\t\tif (!point.v) {\n\t\t\t\tthrow new Error(`Point at index ${idxs[i]} has no value`);\n\t\t\t}\n\t\t\treturn point.v;\n\t\t});\n\t}\n\n\t/**\n\t * Add a new point to the database and assign it the next available index\n\t *\n\t * @param q - Point data to store\n\t * @returns The assigned index for this point\n\t */\n\tasync new_point(q: Point): Promise<number> {\n\t\tconst idx = await this.get_datasize();\n\n\t\tconst point = encodePoint({ v: q, idx });\n\t\tawait this.client.set(keys.point(idx), point);\n\t\tawait this.client.set(keys.points, (idx + 1).toString());\n\n\t\treturn idx;\n\t}\n\n\t// === Graph Structure Queries ===\n\n\t/**\n\t * Get the total number of layers in the hierarchical structure\n\t * Higher layers have fewer, more connected nodes for efficient search\n\t */\n\tasync get_num_layers(): Promise<number> {\n\t\tconst numLayers = await this.client.get(keys.layers);\n\t\treturn numLayers ? Number.parseInt(numLayers) : 0;\n\t}\n\n\t/**\n\t * Get the total number of points stored in the database\n\t * This represents the next available index for new points\n\t */\n\tasync get_datasize(): Promise<number> {\n\t\tconst datasize = await this.client.get(keys.points);\n\t\treturn datasize ? Number.parseInt(datasize) : 0;\n\t}\n\n\t// === Neighbor (Graph Edge) Operations ===\n\n\t/**\n\t * Get the neighbor connections for a specific node in a specific layer\n\t *\n\t * @param layer - Layer level (0 = base layer, higher = more sparse)\n\t * @param idx - Node index within that layer\n\t * @returns The neighbor connections for this node\n\t * @throws Error if node doesn't exist or has no neighbors\n\t */\n\tasync get_neighbor(layer: number, idx: number): Promise<LayerNode> {\n\t\tconst data = await this.client.get(keys.neighbor(layer, idx));\n\t\tif (!data) {\n\t\t\tthrow new Error(`No neighbors at layer ${layer}, index ${idx}\"`);\n\t\t}\n\t\tconst node = decodeLayerNode(data);\n\t\tif (!node.neighbors) {\n\t\t\tthrow new Error(`Node at layer ${layer}, index ${idx} has no neighbors`);\n\t\t}\n\t\treturn node.neighbors;\n\t}\n\n\t/**\n\t * Get neighbor connections for multiple nodes in a layer (batch operation)\n\t *\n\t * @param layer - Layer level to query\n\t * @param idxs - Array of node indices to retrieve\n\t * @returns Graph object mapping node indices to their neighbor lists\n\t * @throws Error if any node is missing or invalid\n\t */\n\tasync get_neighbors(layer: number, idxs: number[]): Promise<Graph> {\n\t\tconst datas = await this.safe_get_many(\n\t\t\tidxs.map((idx) => keys.neighbor(layer, idx)),\n\t\t);\n\n\t\t// Validate all nodes exist\n\t\tconst nullPos = datas.indexOf(null);\n\t\tif (nullPos !== -1) {\n\t\t\tthrow new Error(\n\t\t\t\t`No neighbors at layer ${layer}, index ${idxs[nullPos]}\"`,\n\t\t\t);\n\t\t}\n\n\t\t// Decode and validate all nodes\n\t\tconst nodes = datas.map((data, i) => {\n\t\t\tif (data === null) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`No data for neighbor at layer ${layer}, index ${idxs[i]}`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn decodeLayerNode(data);\n\t\t});\n\n\t\tconst neighbors = nodes.map((node, i) => {\n\t\t\tif (!node.neighbors) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Node at layer ${layer}, index ${idxs[i]} has no neighbors`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn node.neighbors;\n\t\t});\n\n\t\treturn Object.fromEntries(idxs.map((idx, i) => [idx, neighbors[i]]));\n\t}\n\n\t/**\n\t * Create or update neighbor connections for a single node\n\t *\n\t * @param layer - Layer level where the node exists\n\t * @param idx - Node index to update\n\t * @param node - New neighbor connections for this node\n\t */\n\tasync upsert_neighbor(\n\t\tlayer: number,\n\t\tidx: number,\n\t\tnode: LayerNode,\n\t): Promise<void> {\n\t\tconst data = encodeLayerNode({\n\t\t\tidx,\n\t\t\tlevel: layer,\n\t\t\tneighbors: node,\n\t\t});\n\t\tawait this.client.set(keys.neighbor(layer, idx), data);\n\t}\n\n\t/**\n\t * Batch update neighbor connections for multiple nodes in a layer\n\t * More efficient than individual upsert operations for bulk updates\n\t *\n\t * @param layer - Layer level to update\n\t * @param nodes - Graph mapping node indices to their new neighbor connections\n\t */\n\tasync upsert_neighbors(layer: number, nodes: Graph): Promise<void> {\n\t\tawait this.safe_set_many(\n\t\t\tObject.keys(nodes).map((idx) => {\n\t\t\t\tconst i = Number.parseInt(idx);\n\t\t\t\tconst key = keys.neighbor(layer, i);\n\t\t\t\tconst value = encodeLayerNode({\n\t\t\t\t\tidx: i,\n\t\t\t\t\tlevel: layer,\n\t\t\t\t\tneighbors: nodes[i],\n\t\t\t\t});\n\n\t\t\t\treturn [key, value];\n\t\t\t}),\n\t\t);\n\t}\n\n\t/**\n\t * Initialize a new layer and add a node with empty neighbors\n\t * This creates a new level in the hierarchical structure\n\t *\n\t * WARNING: Concurrent calls may cause race conditions in layer counting\n\t *\n\t * @param idx - Index of the node to add to the new layer\n\t */\n\tasync new_neighbor(idx: number): Promise<void> {\n\t\tconst l = await this.get_num_layers();\n\t\tawait this.upsert_neighbor(l, idx, {});\n\n\t\t// NOTE: if `new_neighbor` is run in parallel,\n\t\t// this might cause a race-condition\n\t\tawait this.client.set(keys.layers, (l + 1).toString());\n\t}\n\n\t// === Metadata Operations ===\n\n\t/**\n\t * Retrieve optional metadata associated with a point\n\t *\n\t * @param idx - Point index\n\t * @returns Metadata object or null if none exists\n\t */\n\tasync get_metadata(idx: number): Promise<M | null> {\n\t\tconst data = await this.client.get(keys.metadata(idx));\n\t\treturn safeParse<M>(data);\n\t}\n\n\t/**\n\t * Retrieve metadata for multiple points\n\t * Returns null for points that have no metadata\n\t *\n\t * @param idxs - Array of point indices\n\t * @returns Array of metadata objects (or null) in same order as input\n\t */\n\tasync get_metadatas(idxs: number[]): Promise<(M | null)[]> {\n\t\t// const datas =\n\t\treturn Promise.all(idxs.map((idx) => this.get_metadata(idx)));\n\t}\n\n\t/**\n\t * Store metadata for a specific point\n\t *\n\t * @param idx - Point index\n\t * @param data - Metadata to associate with this point\n\t */\n\tasync set_metadata(idx: number, data: M): Promise<void> {\n\t\tawait this.client.set(keys.metadata(idx), JSON.stringify(data));\n\t}\n\n\t// === Private Utility Methods ===\n\n\t/**\n\t * Safely retrieve multiple keys with automatic request splitting\n\t *\n\t * Base-DB has transaction size limits. This method automatically splits\n\t * large requests into smaller chunks when the limit is exceeded.\n\t * Uses recursive binary splitting on errors.\n\t */\n\tprivate async safe_get_many(keys: string[]): Promise<(string | null)[]> {\n\t\ttry {\n\t\t\treturn await this.client.getMany(keys);\n\t\t} catch (err) {\n\t\t\t// TODO: check error type\n\t\t\tconst half = Math.floor(keys.length >> 1);\n\n\t\t\t// prettier-ignore\n\t\t\treturn await Promise.all([\n\t\t\t\tthis.safe_get_many(keys.slice(0, half)),\n\t\t\t\tthis.safe_get_many(keys.slice(half)),\n\t\t\t]).then((results) => results.flat());\n\t\t}\n\t}\n\n\t/**\n\t * Safely set multiple key-value pairs with automatic request splitting\n\t *\n\t * Similar to safe_get_many, this handles transaction size limits by\n\t * recursively splitting large batches into smaller ones.\n\t */\n\tprivate async safe_set_many(\n\t\tentries: [key: string, value: string][],\n\t): Promise<void> {\n\t\ttry {\n\t\t\tawait this.client.setMany(\n\t\t\t\tentries.map((e) => e[0]),\n\t\t\t\tentries.map((e) => e[1]),\n\t\t\t);\n\t\t} catch (err) {\n\t\t\t//TODO: check error type\n\t\t\tconst half = Math.floor(entries.length >> 1);\n\n\t\t\t// prettier-ignore\n\t\t\tawait Promise.all([\n\t\t\t\tthis.safe_set_many(entries.slice(0, half)),\n\t\t\t\tthis.safe_set_many(entries.slice(half)),\n\t\t\t]).then((results) => results.flat());\n\t\t}\n\t}\n\n\ttoString() {\n\t\treturn \"yay, EizenDB Set with Protobufs\";\n\t}\n}\n","import { Heap } from \"heap-js\";\nimport type { Node, Point } from \"../types\";\n\n/**\n * HNSW Utility Functions\n * =====================\n *\n * This module provides utility functions and data structures used by the HNSW algorithm,\n * including distance functions, heap data structures, and vector operations.\n */\n\n/**\n * A specialized min-heap for Node types used in HNSW search algorithms.\n *\n * This heap automatically sorts nodes by their distance values (first element of the tuple).\n * It's used exten