@leofcoin/codec-format-interface 1.7.15 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,39 +4,15 @@ import isHex from '@vandeurenglenn/is-hex';
4
4
  import proto from '@vandeurenglenn/proto-array';
5
5
  import { fromBase58, fromHex, toHex, toBase32, toBase58 } from '@vandeurenglenn/typed-array-utils';
6
6
 
7
- const BASE64_CHUNK_SIZE = 0x8000;
8
- const uint8ArrayToBase64 = (value) => {
9
- if (typeof Buffer !== 'undefined')
10
- return Buffer.from(value).toString('base64');
11
- let binary = '';
12
- for (let offset = 0; offset < value.length; offset += BASE64_CHUNK_SIZE) {
13
- const slice = value.subarray(offset, offset + BASE64_CHUNK_SIZE);
14
- binary += String.fromCharCode(...slice);
15
- }
16
- return btoa(binary);
17
- };
18
- const base64ToUint8Array = (value) => {
19
- if (typeof Buffer !== 'undefined')
20
- return new Uint8Array(Buffer.from(value, 'base64'));
21
- const binary = atob(value);
22
- const output = new Uint8Array(binary.length);
23
- for (let i = 0; i < binary.length; i++)
24
- output[i] = binary.charCodeAt(i);
25
- return output;
26
- };
27
7
  const jsonStringifyBigInt = (key, value) => {
28
8
  if (typeof value === 'bigint')
29
9
  return { $bigint: value.toString() };
30
- if (value instanceof Uint8Array)
31
- return { $uint8array: uint8ArrayToBase64(value) };
32
10
  return value;
33
11
  };
34
12
  const jsonParseBigInt = (key, value) => {
35
13
  if (typeof value === 'object' && value) {
36
14
  if (value.$bigint)
37
15
  return BigInt(value.$bigint);
38
- if (value.$uint8array)
39
- return base64ToUint8Array(value.$uint8array);
40
16
  }
41
17
  return value;
42
18
  };
@@ -1 +1 @@
1
- {"version":3,"file":"basic-interface.js","sources":["../src/basic-interface.ts"],"sourcesContent":["import base32 from '@vandeurenglenn/base32'\nimport base58 from '@vandeurenglenn/base58'\nimport type { base58String } from '@vandeurenglenn/base58'\nimport type { base32String } from '@vandeurenglenn/base32'\nimport isHex from '@vandeurenglenn/is-hex'\nimport proto from '@vandeurenglenn/proto-array'\nimport {\n fromBase32,\n fromBase58,\n fromString,\n fromHex,\n fromArrayLike,\n fromUintArrayString,\n toBase32,\n toBase58,\n toHex\n} from '@vandeurenglenn/typed-array-utils'\n\nconst BASE64_CHUNK_SIZE = 0x8000\n\nconst uint8ArrayToBase64 = (value: Uint8Array): string => {\n if (typeof Buffer !== 'undefined') return Buffer.from(value).toString('base64')\n let binary = ''\n for (let offset = 0; offset < value.length; offset += BASE64_CHUNK_SIZE) {\n const slice = value.subarray(offset, offset + BASE64_CHUNK_SIZE)\n binary += String.fromCharCode(...slice)\n }\n return btoa(binary)\n}\n\nconst base64ToUint8Array = (value: string): Uint8Array => {\n if (typeof Buffer !== 'undefined') return new Uint8Array(Buffer.from(value, 'base64'))\n const binary = atob(value)\n const output = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) output[i] = binary.charCodeAt(i)\n return output\n}\n\nexport const jsonStringifyBigInt = (key, value) => {\n if (typeof value === 'bigint') return { $bigint: value.toString() }\n if (value instanceof Uint8Array) return { $uint8array: uint8ArrayToBase64(value) }\n return value\n}\n\nexport const jsonParseBigInt = (key, value) => {\n if (typeof value === 'object' && value) {\n if (value.$bigint) return BigInt(value.$bigint)\n if (value.$uint8array) return base64ToUint8Array(value.$uint8array)\n }\n return value\n}\n\nconst _textEncoder = new TextEncoder()\nconst _textDecoder = new TextDecoder()\n\nexport default class BasicInterface {\n #encoded: Uint8Array\n #decoded: object\n name: string\n #proto: object\n\n get keys() {\n // handles proto keys\n // protokey -> key\n return Object.keys(this.#proto).map((key) => (key.endsWith('?') ? key.split('?')[0] : key))\n }\n\n get encoded() {\n if (!this.#encoded) this.#encoded = this.encode()\n return this.#encoded\n }\n\n set encoded(value) {\n this.#encoded = value\n }\n\n get decoded() {\n if (!this.#decoded) this.#decoded = this.decode()\n return this.#decoded\n }\n\n set decoded(value) {\n this.#decoded = value\n }\n\n set proto(value) {\n this.#proto = value\n }\n\n get proto() {\n return this.#proto\n }\n\n decode(encoded?: Uint8Array): Object {\n encoded = encoded || this.encoded\n // Example: decode as JSON if possible (override in subclass)\n try {\n return JSON.parse(_textDecoder.decode(encoded), jsonParseBigInt)\n } catch {\n return new Object()\n }\n }\n\n encode(decoded?: object): Uint8Array {\n decoded = decoded || this.decoded\n // Example: encode as JSON (override in subclass)\n return _textEncoder.encode(JSON.stringify(decoded, jsonStringifyBigInt))\n }\n // get Codec(): Codec {}\n\n // Cache proto keys/values for reuse\n static _protoCache = new WeakMap<object, { keys: string[]; values: any[] }>()\n\n protoEncode(data: object): Uint8Array {\n let cache = BasicInterface._protoCache.get(this.proto)\n if (!cache) {\n cache = {\n keys: Object.keys(this.proto),\n values: Object.values(this.proto)\n }\n BasicInterface._protoCache.set(this.proto, cache)\n }\n // Use proto.encode directly, but avoid new array allocations inside encode if possible\n return proto.encode(this.proto, data, false)\n }\n\n protoDecode(data: Uint8Array): object {\n // Use a static output object if possible (not thread-safe, but safe for single-threaded use)\n if (!this._decodeOutput) this._decodeOutput = {}\n const result = proto.decode(this.proto, data, false)\n // Copy properties to static object to avoid new allocations\n Object.keys(result).forEach((k) => {\n this._decodeOutput[k] = result[k]\n })\n // Remove any keys not in result\n Object.keys(this._decodeOutput).forEach((k) => {\n if (!(k in result)) delete this._decodeOutput[k]\n })\n return this._decodeOutput\n }\n\n isHex(string: string): boolean {\n return isHex(string)\n }\n isBase32(string: string): boolean {\n return base32.isBase32(string)\n }\n isBase58(string: string): boolean {\n return base58.isBase58(string)\n }\n\n fromBs32(encoded: string): object {\n return this.decode(base32.decode(encoded))\n }\n\n fromBs58(encoded: base58String): object {\n return this.decode(fromBase58(encoded))\n }\n\n async toArray() {\n const array: number[] = []\n for await (const value of this.encoded.values()) {\n array.push(value)\n }\n return array\n }\n\n fromString(string: string): object {\n const array: string[] = string.split(',')\n const arrayLike = array.map((string) => Number(string))\n return this.decode(Uint8Array.from(arrayLike))\n }\n\n fromHex(string: string): object {\n return this.decode(fromHex(string))\n }\n\n fromArray(array: number[]): object {\n // Avoid unnecessary copy if already Uint8Array\n if (array instanceof Uint8Array) return this.decode(array)\n return this.decode(Uint8Array.from(array))\n }\n\n fromEncoded(encoded: Uint8Array) {\n return this.decode(encoded)\n }\n\n toString(): string {\n if (!this.encoded) this.encode()\n // Use cached string if available\n if (!this._string) this._string = Array.prototype.join.call(this.encoded, ',')\n return this._string\n }\n\n toHex(): string {\n if (!this.encoded) this.encode()\n // Use cached hex if available\n if (!this._hex) {\n if (!this._string) this._string = Array.prototype.join.call(this.encoded, ',')\n this._hex = toHex(this._string.split(',').map(Number))\n }\n return this._hex\n }\n\n /**\n * @return {String} encoded\n */\n toBs32(): base32String {\n if (!this.encoded) this.encode()\n // Use cached bs32 if available\n if (!this._bs32) this._bs32 = toBase32(this.encoded)\n return this._bs32\n }\n\n /**\n * @return {String} encoded\n */\n toBs58(): base58String {\n if (!this.encoded) this.encode()\n return toBase58(this.encoded)\n }\n}\n"],"names":[],"mappings":";;;;;;AAkBA,MAAM,iBAAiB,GAAG,MAAM;AAEhC,MAAM,kBAAkB,GAAG,CAAC,KAAiB,KAAY;IACvD,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;IAC/E,IAAI,MAAM,GAAG,EAAE;AACf,IAAA,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,MAAM,EAAE,MAAM,IAAI,iBAAiB,EAAE;AACvE,QAAA,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,CAAC;QAChE,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC;IACzC;AACA,IAAA,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,MAAM,kBAAkB,GAAG,CAAC,KAAa,KAAgB;IACvD,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,QAAA,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACtF,IAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;IAC1B,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;AAC5C,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;AACxE,IAAA,OAAO,MAAM;AACf,CAAC;MAEY,mBAAmB,GAAG,CAAC,GAAG,EAAE,KAAK,KAAI;IAChD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,QAAQ,EAAE,EAAE;IACnE,IAAI,KAAK,YAAY,UAAU;QAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE;AAClF,IAAA,OAAO,KAAK;AACd;MAEa,eAAe,GAAG,CAAC,GAAG,EAAE,KAAK,KAAI;AAC5C,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,EAAE;QACtC,IAAI,KAAK,CAAC,OAAO;AAAE,YAAA,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC;QAC/C,IAAI,KAAK,CAAC,WAAW;AAAE,YAAA,OAAO,kBAAkB,CAAC,KAAK,CAAC,WAAW,CAAC;IACrE;AACA,IAAA,OAAO,KAAK;AACd;AAEA,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE;AACtC,MAAM,YAAY,GAAG,IAAI,WAAW,EAAE;AAExB,MAAO,cAAc,CAAA;AACjC,IAAA,QAAQ;AACR,IAAA,QAAQ;AACR,IAAA,IAAI;AACJ,IAAA,MAAM;AAEN,IAAA,IAAI,IAAI,GAAA;;;AAGN,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC7F;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE;QACjD,OAAO,IAAI,CAAC,QAAQ;IACtB;IAEA,IAAI,OAAO,CAAC,KAAK,EAAA;AACf,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;IACvB;AAEA,IAAA,IAAI,OAAO,GAAA;QACT,IAAI,CAAC,IAAI,CAAC,QAAQ;AAAE,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE;QACjD,OAAO,IAAI,CAAC,QAAQ;IACtB;IAEA,IAAI,OAAO,CAAC,KAAK,EAAA;AACf,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;IACvB;IAEA,IAAI,KAAK,CAAC,KAAK,EAAA;AACb,QAAA,IAAI,CAAC,MAAM,GAAG,KAAK;IACrB;AAEA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,MAAM;IACpB;AAEA,IAAA,MAAM,CAAC,OAAoB,EAAA;AACzB,QAAA,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,OAAO;;AAEjC,QAAA,IAAI;AACF,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC;QAClE;AAAE,QAAA,MAAM;YACN,OAAO,IAAI,MAAM,EAAE;QACrB;IACF;AAEA,IAAA,MAAM,CAAC,OAAgB,EAAA;AACrB,QAAA,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,OAAO;;AAEjC,QAAA,OAAO,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAC;IAC1E;;;AAIA,IAAA,OAAO,WAAW,GAAG,IAAI,OAAO,EAA6C;AAE7E,IAAA,WAAW,CAAC,IAAY,EAAA;AACtB,QAAA,IAAI,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QACtD,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,KAAK,GAAG;gBACN,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC7B,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK;aACjC;YACD,cAAc,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC;QACnD;;AAEA,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;IAC9C;AAEA,IAAA,WAAW,CAAC,IAAgB,EAAA;;QAE1B,IAAI,CAAC,IAAI,CAAC,aAAa;AAAE,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AAChD,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC;;QAEpD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;YAChC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;AACnC,QAAA,CAAC,CAAC;;AAEF,QAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAI;AAC5C,YAAA,IAAI,EAAE,CAAC,IAAI,MAAM,CAAC;AAAE,gBAAA,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;AAClD,QAAA,CAAC,CAAC;QACF,OAAO,IAAI,CAAC,aAAa;IAC3B;AAEA,IAAA,KAAK,CAAC,MAAc,EAAA;AAClB,QAAA,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB;AACA,IAAA,QAAQ,CAAC,MAAc,EAAA;AACrB,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAChC;AACA,IAAA,QAAQ,CAAC,MAAc,EAAA;AACrB,QAAA,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAChC;AAEA,IAAA,QAAQ,CAAC,OAAe,EAAA;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC5C;AAEA,IAAA,QAAQ,CAAC,OAAqB,EAAA;QAC5B,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACzC;AAEA,IAAA,MAAM,OAAO,GAAA;QACX,MAAM,KAAK,GAAa,EAAE;AAC1B,QAAA,WAAW,MAAM,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE;AAC/C,YAAA,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QACnB;AACA,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,UAAU,CAAC,MAAc,EAAA;QACvB,MAAM,KAAK,GAAa,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC;AACzC,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChD;AAEA,IAAA,OAAO,CAAC,MAAc,EAAA;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACrC;AAEA,IAAA,SAAS,CAAC,KAAe,EAAA;;QAEvB,IAAI,KAAK,YAAY,UAAU;AAAE,YAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAC1D,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC5C;AAEA,IAAA,WAAW,CAAC,OAAmB,EAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;IAC7B;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,MAAM,EAAE;;QAEhC,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;QAC9E,OAAO,IAAI,CAAC,OAAO;IACrB;IAEA,KAAK,GAAA;QACH,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,MAAM,EAAE;;AAEhC,QAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACd,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,gBAAA,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC;AAC9E,YAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxD;QACA,OAAO,IAAI,CAAC,IAAI;IAClB;AAEA;;AAEG;IACH,MAAM,GAAA;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,MAAM,EAAE;;QAEhC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK;IACnB;AAEA;;AAEG;IACH,MAAM,GAAA;QACJ,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,MAAM,EAAE;AAChC,QAAA,OAAO,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;IAC/B;;;;;"}
1
+ {"version":3,"file":"basic-interface.js","sources":["../src/basic-interface.ts"],"sourcesContent":["import base32 from '@vandeurenglenn/base32'\nimport base58 from '@vandeurenglenn/base58'\nimport type { base58String } from '@vandeurenglenn/base58'\nimport type { base32String } from '@vandeurenglenn/base32'\nimport isHex from '@vandeurenglenn/is-hex'\nimport proto from '@vandeurenglenn/proto-array'\nimport {\n fromBase32,\n fromBase58,\n fromString,\n fromHex,\n fromArrayLike,\n fromUintArrayString,\n toBase32,\n toBase58,\n toHex\n} from '@vandeurenglenn/typed-array-utils'\n\nconst BASE64_CHUNK_SIZE = 0x8000\n\nconst uint8ArrayToBase64 = (value: Uint8Array): string => {\n if (typeof Buffer !== 'undefined') return Buffer.from(value).toString('base64')\n let binary = ''\n for (let offset = 0; offset < value.length; offset += BASE64_CHUNK_SIZE) {\n const slice = value.subarray(offset, offset + BASE64_CHUNK_SIZE)\n binary += String.fromCharCode(...slice)\n }\n return btoa(binary)\n}\n\nconst base64ToUint8Array = (value: string): Uint8Array => {\n if (typeof Buffer !== 'undefined') return new Uint8Array(Buffer.from(value, 'base64'))\n const binary = atob(value)\n const output = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) output[i] = binary.charCodeAt(i)\n return output\n}\n\nexport const jsonStringifyBigInt = (key, value) => {\n if (typeof value === 'bigint') return { $bigint: value.toString() }\n return value\n}\n\nexport const jsonParseBigInt = (key, value) => {\n if (typeof value === 'object' && value) {\n if (value.$bigint) return BigInt(value.$bigint)\n }\n return value\n}\n\nconst _textEncoder = new TextEncoder()\nconst _textDecoder = new TextDecoder()\n\nexport default class BasicInterface {\n #encoded: Uint8Array\n #decoded: object\n name: string\n #proto: object\n\n get keys() {\n // handles proto keys\n // protokey -> key\n return Object.keys(this.#proto).map((key) => (key.endsWith('?') ? key.split('?')[0] : key))\n }\n\n get encoded() {\n if (!this.#encoded) this.#encoded = this.encode()\n return this.#encoded\n }\n\n set encoded(value) {\n this.#encoded = value\n }\n\n get decoded() {\n if (!this.#decoded) this.#decoded = this.decode()\n return this.#decoded\n }\n\n set decoded(value) {\n this.#decoded = value\n }\n\n set proto(value) {\n this.#proto = value\n }\n\n get proto() {\n return this.#proto\n }\n\n decode(encoded?: Uint8Array): Object {\n encoded = encoded || this.encoded\n // Example: decode as JSON if possible (override in subclass)\n try {\n return JSON.parse(_textDecoder.decode(encoded), jsonParseBigInt)\n } catch {\n return new Object()\n }\n }\n\n encode(decoded?: object): Uint8Array {\n decoded = decoded || this.decoded\n // Example: encode as JSON (override in subclass)\n return _textEncoder.encode(JSON.stringify(decoded, jsonStringifyBigInt))\n }\n // get Codec(): Codec {}\n\n // Cache proto keys/values for reuse\n static _protoCache = new WeakMap<object, { keys: string[]; values: any[] }>()\n\n protoEncode(data: object): Uint8Array {\n let cache = BasicInterface._protoCache.get(this.proto)\n if (!cache) {\n cache = {\n keys: Object.keys(this.proto),\n values: Object.values(this.proto)\n }\n BasicInterface._protoCache.set(this.proto, cache)\n }\n // Use proto.encode directly, but avoid new array allocations inside encode if possible\n return proto.encode(this.proto, data, false)\n }\n\n protoDecode(data: Uint8Array): object {\n // Use a static output object if possible (not thread-safe, but safe for single-threaded use)\n if (!this._decodeOutput) this._decodeOutput = {}\n const result = proto.decode(this.proto, data, false)\n // Copy properties to static object to avoid new allocations\n Object.keys(result).forEach((k) => {\n this._decodeOutput[k] = result[k]\n })\n // Remove any keys not in result\n Object.keys(this._decodeOutput).forEach((k) => {\n if (!(k in result)) delete this._decodeOutput[k]\n })\n return this._decodeOutput\n }\n\n isHex(string: string): boolean {\n return isHex(string)\n }\n isBase32(string: string): boolean {\n return base32.isBase32(string)\n }\n isBase58(string: string): boolean {\n return base58.isBase58(string)\n }\n\n fromBs32(encoded: string): object {\n return this.decode(base32.decode(encoded))\n }\n\n fromBs58(encoded: base58String): object {\n return this.decode(fromBase58(encoded))\n }\n\n async toArray() {\n const array: number[] = []\n for await (const value of this.encoded.values()) {\n array.push(value)\n }\n return array\n }\n\n fromString(string: string): object {\n const array: string[] = string.split(',')\n const arrayLike = array.map((string) => Number(string))\n return this.decode(Uint8Array.from(arrayLike))\n }\n\n fromHex(string: string): object {\n return this.decode(fromHex(string))\n }\n\n fromArray(array: number[]): object {\n // Avoid unnecessary copy if already Uint8Array\n if (array instanceof Uint8Array) return this.decode(array)\n return this.decode(Uint8Array.from(array))\n }\n\n fromEncoded(encoded: Uint8Array) {\n return this.decode(encoded)\n }\n\n toString(): string {\n if (!this.encoded) this.encode()\n // Use cached string if available\n if (!this._string) this._string = Array.prototype.join.call(this.encoded, ',')\n return this._string\n }\n\n toHex(): string {\n if (!this.encoded) this.encode()\n // Use cached hex if available\n if (!this._hex) {\n if (!this._string) this._string = Array.prototype.join.call(this.encoded, ',')\n this._hex = toHex(this._string.split(',').map(Number))\n }\n return this._hex\n }\n\n /**\n * @return {String} encoded\n */\n toBs32(): base32String {\n if (!this.encoded) this.encode()\n // Use cached bs32 if available\n if (!this._bs32) this._bs32 = toBase32(this.encoded)\n return this._bs32\n }\n\n /**\n * @return {String} encoded\n */\n toBs58(): base58String {\n if (!this.encoded) this.encode()\n return toBase58(this.encoded)\n }\n}\n"],"names":[],"mappings":"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"}
@@ -8,39 +8,15 @@ var isHex = require('@vandeurenglenn/is-hex');
8
8
  var proto = require('@vandeurenglenn/proto-array');
9
9
  var typedArrayUtils = require('@vandeurenglenn/typed-array-utils');
10
10
 
11
- const BASE64_CHUNK_SIZE = 0x8000;
12
- const uint8ArrayToBase64 = (value) => {
13
- if (typeof Buffer !== 'undefined')
14
- return Buffer.from(value).toString('base64');
15
- let binary = '';
16
- for (let offset = 0; offset < value.length; offset += BASE64_CHUNK_SIZE) {
17
- const slice = value.subarray(offset, offset + BASE64_CHUNK_SIZE);
18
- binary += String.fromCharCode(...slice);
19
- }
20
- return btoa(binary);
21
- };
22
- const base64ToUint8Array = (value) => {
23
- if (typeof Buffer !== 'undefined')
24
- return new Uint8Array(Buffer.from(value, 'base64'));
25
- const binary = atob(value);
26
- const output = new Uint8Array(binary.length);
27
- for (let i = 0; i < binary.length; i++)
28
- output[i] = binary.charCodeAt(i);
29
- return output;
30
- };
31
11
  const jsonStringifyBigInt = (key, value) => {
32
12
  if (typeof value === 'bigint')
33
13
  return { $bigint: value.toString() };
34
- if (value instanceof Uint8Array)
35
- return { $uint8array: uint8ArrayToBase64(value) };
36
14
  return value;
37
15
  };
38
16
  const jsonParseBigInt = (key, value) => {
39
17
  if (typeof value === 'object' && value) {
40
18
  if (value.$bigint)
41
19
  return BigInt(value.$bigint);
42
- if (value.$uint8array)
43
- return base64ToUint8Array(value.$uint8array);
44
20
  }
45
21
  return value;
46
22
  };
@@ -1 +1 @@
1
- {"version":3,"file":"basic-interface.js","sources":["../../src/basic-interface.ts"],"sourcesContent":["import base32 from '@vandeurenglenn/base32'\nimport base58 from '@vandeurenglenn/base58'\nimport type { base58String } from '@vandeurenglenn/base58'\nimport type { base32String } from '@vandeurenglenn/base32'\nimport isHex from '@vandeurenglenn/is-hex'\nimport proto from '@vandeurenglenn/proto-array'\nimport {\n fromBase32,\n fromBase58,\n fromString,\n fromHex,\n fromArrayLike,\n fromUintArrayString,\n toBase32,\n toBase58,\n toHex\n} from '@vandeurenglenn/typed-array-utils'\n\nconst BASE64_CHUNK_SIZE = 0x8000\n\nconst uint8ArrayToBase64 = (value: Uint8Array): string => {\n if (typeof Buffer !== 'undefined') return Buffer.from(value).toString('base64')\n let binary = ''\n for (let offset = 0; offset < value.length; offset += BASE64_CHUNK_SIZE) {\n const slice = value.subarray(offset, offset + BASE64_CHUNK_SIZE)\n binary += String.fromCharCode(...slice)\n }\n return btoa(binary)\n}\n\nconst base64ToUint8Array = (value: string): Uint8Array => {\n if (typeof Buffer !== 'undefined') return new Uint8Array(Buffer.from(value, 'base64'))\n const binary = atob(value)\n const output = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) output[i] = binary.charCodeAt(i)\n return output\n}\n\nexport const jsonStringifyBigInt = (key, value) => {\n if (typeof value === 'bigint') return { $bigint: value.toString() }\n if (value instanceof Uint8Array) return { $uint8array: uint8ArrayToBase64(value) }\n return value\n}\n\nexport const jsonParseBigInt = (key, value) => {\n if (typeof value === 'object' && value) {\n if (value.$bigint) return BigInt(value.$bigint)\n if (value.$uint8array) return base64ToUint8Array(value.$uint8array)\n }\n return value\n}\n\nconst _textEncoder = new TextEncoder()\nconst _textDecoder = new TextDecoder()\n\nexport default class BasicInterface {\n #encoded: Uint8Array\n #decoded: object\n name: string\n #proto: object\n\n get keys() {\n // handles proto keys\n // protokey -> key\n return Object.keys(this.#proto).map((key) => (key.endsWith('?') ? key.split('?')[0] : key))\n }\n\n get encoded() {\n if (!this.#encoded) this.#encoded = this.encode()\n return this.#encoded\n }\n\n set encoded(value) {\n this.#encoded = value\n }\n\n get decoded() {\n if (!this.#decoded) this.#decoded = this.decode()\n return this.#decoded\n }\n\n set decoded(value) {\n this.#decoded = value\n }\n\n set proto(value) {\n this.#proto = value\n }\n\n get proto() {\n return this.#proto\n }\n\n decode(encoded?: Uint8Array): Object {\n encoded = encoded || this.encoded\n // Example: decode as JSON if possible (override in subclass)\n try {\n return JSON.parse(_textDecoder.decode(encoded), jsonParseBigInt)\n } catch {\n return new Object()\n }\n }\n\n encode(decoded?: object): Uint8Array {\n decoded = decoded || this.decoded\n // Example: encode as JSON (override in subclass)\n return _textEncoder.encode(JSON.stringify(decoded, jsonStringifyBigInt))\n }\n // get Codec(): Codec {}\n\n // Cache proto keys/values for reuse\n static _protoCache = new WeakMap<object, { keys: string[]; values: any[] }>()\n\n protoEncode(data: object): Uint8Array {\n let cache = BasicInterface._protoCache.get(this.proto)\n if (!cache) {\n cache = {\n keys: Object.keys(this.proto),\n values: Object.values(this.proto)\n }\n BasicInterface._protoCache.set(this.proto, cache)\n }\n // Use proto.encode directly, but avoid new array allocations inside encode if possible\n return proto.encode(this.proto, data, false)\n }\n\n protoDecode(data: Uint8Array): object {\n // Use a static output object if possible (not thread-safe, but safe for single-threaded use)\n if (!this._decodeOutput) this._decodeOutput = {}\n const result = proto.decode(this.proto, data, false)\n // Copy properties to static object to avoid new allocations\n Object.keys(result).forEach((k) => {\n this._decodeOutput[k] = result[k]\n })\n // Remove any keys not in result\n Object.keys(this._decodeOutput).forEach((k) => {\n if (!(k in result)) delete this._decodeOutput[k]\n })\n return this._decodeOutput\n }\n\n isHex(string: string): boolean {\n return isHex(string)\n }\n isBase32(string: string): boolean {\n return base32.isBase32(string)\n }\n isBase58(string: string): boolean {\n return base58.isBase58(string)\n }\n\n fromBs32(encoded: string): object {\n return this.decode(base32.decode(encoded))\n }\n\n fromBs58(encoded: base58String): object {\n return this.decode(fromBase58(encoded))\n }\n\n async toArray() {\n const array: number[] = []\n for await (const value of this.encoded.values()) {\n array.push(value)\n }\n return array\n }\n\n fromString(string: string): object {\n const array: string[] = string.split(',')\n const arrayLike = array.map((string) => Number(string))\n return this.decode(Uint8Array.from(arrayLike))\n }\n\n fromHex(string: string): object {\n return this.decode(fromHex(string))\n }\n\n fromArray(array: number[]): object {\n // Avoid unnecessary copy if already Uint8Array\n if (array instanceof Uint8Array) return this.decode(array)\n return this.decode(Uint8Array.from(array))\n }\n\n fromEncoded(encoded: Uint8Array) {\n return this.decode(encoded)\n }\n\n toString(): string {\n if (!this.encoded) this.encode()\n // Use cached string if available\n if (!this._string) this._string = Array.prototype.join.call(this.encoded, ',')\n return this._string\n }\n\n toHex(): string {\n if (!this.encoded) this.encode()\n // Use cached hex if available\n if (!this._hex) {\n if (!this._string) this._string = Array.prototype.join.call(this.encoded, ',')\n this._hex = toHex(this._string.split(',').map(Number))\n }\n return this._hex\n }\n\n /**\n * @return {String} encoded\n */\n toBs32(): base32String {\n if (!this.encoded) this.encode()\n // Use cached bs32 if available\n if (!this._bs32) this._bs32 = toBase32(this.encoded)\n return this._bs32\n }\n\n /**\n * @return {String} encoded\n */\n toBs58(): base58String {\n if (!this.encoded) this.encode()\n return toBase58(this.encoded)\n }\n}\n"],"names":["fromBase58","fromHex","toHex","toBase32","toBase58"],"mappings":"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"}
1
+ {"version":3,"file":"basic-interface.js","sources":["../../src/basic-interface.ts"],"sourcesContent":["import base32 from '@vandeurenglenn/base32'\nimport base58 from '@vandeurenglenn/base58'\nimport type { base58String } from '@vandeurenglenn/base58'\nimport type { base32String } from '@vandeurenglenn/base32'\nimport isHex from '@vandeurenglenn/is-hex'\nimport proto from '@vandeurenglenn/proto-array'\nimport {\n fromBase32,\n fromBase58,\n fromString,\n fromHex,\n fromArrayLike,\n fromUintArrayString,\n toBase32,\n toBase58,\n toHex\n} from '@vandeurenglenn/typed-array-utils'\n\nconst BASE64_CHUNK_SIZE = 0x8000\n\nconst uint8ArrayToBase64 = (value: Uint8Array): string => {\n if (typeof Buffer !== 'undefined') return Buffer.from(value).toString('base64')\n let binary = ''\n for (let offset = 0; offset < value.length; offset += BASE64_CHUNK_SIZE) {\n const slice = value.subarray(offset, offset + BASE64_CHUNK_SIZE)\n binary += String.fromCharCode(...slice)\n }\n return btoa(binary)\n}\n\nconst base64ToUint8Array = (value: string): Uint8Array => {\n if (typeof Buffer !== 'undefined') return new Uint8Array(Buffer.from(value, 'base64'))\n const binary = atob(value)\n const output = new Uint8Array(binary.length)\n for (let i = 0; i < binary.length; i++) output[i] = binary.charCodeAt(i)\n return output\n}\n\nexport const jsonStringifyBigInt = (key, value) => {\n if (typeof value === 'bigint') return { $bigint: value.toString() }\n return value\n}\n\nexport const jsonParseBigInt = (key, value) => {\n if (typeof value === 'object' && value) {\n if (value.$bigint) return BigInt(value.$bigint)\n }\n return value\n}\n\nconst _textEncoder = new TextEncoder()\nconst _textDecoder = new TextDecoder()\n\nexport default class BasicInterface {\n #encoded: Uint8Array\n #decoded: object\n name: string\n #proto: object\n\n get keys() {\n // handles proto keys\n // protokey -> key\n return Object.keys(this.#proto).map((key) => (key.endsWith('?') ? key.split('?')[0] : key))\n }\n\n get encoded() {\n if (!this.#encoded) this.#encoded = this.encode()\n return this.#encoded\n }\n\n set encoded(value) {\n this.#encoded = value\n }\n\n get decoded() {\n if (!this.#decoded) this.#decoded = this.decode()\n return this.#decoded\n }\n\n set decoded(value) {\n this.#decoded = value\n }\n\n set proto(value) {\n this.#proto = value\n }\n\n get proto() {\n return this.#proto\n }\n\n decode(encoded?: Uint8Array): Object {\n encoded = encoded || this.encoded\n // Example: decode as JSON if possible (override in subclass)\n try {\n return JSON.parse(_textDecoder.decode(encoded), jsonParseBigInt)\n } catch {\n return new Object()\n }\n }\n\n encode(decoded?: object): Uint8Array {\n decoded = decoded || this.decoded\n // Example: encode as JSON (override in subclass)\n return _textEncoder.encode(JSON.stringify(decoded, jsonStringifyBigInt))\n }\n // get Codec(): Codec {}\n\n // Cache proto keys/values for reuse\n static _protoCache = new WeakMap<object, { keys: string[]; values: any[] }>()\n\n protoEncode(data: object): Uint8Array {\n let cache = BasicInterface._protoCache.get(this.proto)\n if (!cache) {\n cache = {\n keys: Object.keys(this.proto),\n values: Object.values(this.proto)\n }\n BasicInterface._protoCache.set(this.proto, cache)\n }\n // Use proto.encode directly, but avoid new array allocations inside encode if possible\n return proto.encode(this.proto, data, false)\n }\n\n protoDecode(data: Uint8Array): object {\n // Use a static output object if possible (not thread-safe, but safe for single-threaded use)\n if (!this._decodeOutput) this._decodeOutput = {}\n const result = proto.decode(this.proto, data, false)\n // Copy properties to static object to avoid new allocations\n Object.keys(result).forEach((k) => {\n this._decodeOutput[k] = result[k]\n })\n // Remove any keys not in result\n Object.keys(this._decodeOutput).forEach((k) => {\n if (!(k in result)) delete this._decodeOutput[k]\n })\n return this._decodeOutput\n }\n\n isHex(string: string): boolean {\n return isHex(string)\n }\n isBase32(string: string): boolean {\n return base32.isBase32(string)\n }\n isBase58(string: string): boolean {\n return base58.isBase58(string)\n }\n\n fromBs32(encoded: string): object {\n return this.decode(base32.decode(encoded))\n }\n\n fromBs58(encoded: base58String): object {\n return this.decode(fromBase58(encoded))\n }\n\n async toArray() {\n const array: number[] = []\n for await (const value of this.encoded.values()) {\n array.push(value)\n }\n return array\n }\n\n fromString(string: string): object {\n const array: string[] = string.split(',')\n const arrayLike = array.map((string) => Number(string))\n return this.decode(Uint8Array.from(arrayLike))\n }\n\n fromHex(string: string): object {\n return this.decode(fromHex(string))\n }\n\n fromArray(array: number[]): object {\n // Avoid unnecessary copy if already Uint8Array\n if (array instanceof Uint8Array) return this.decode(array)\n return this.decode(Uint8Array.from(array))\n }\n\n fromEncoded(encoded: Uint8Array) {\n return this.decode(encoded)\n }\n\n toString(): string {\n if (!this.encoded) this.encode()\n // Use cached string if available\n if (!this._string) this._string = Array.prototype.join.call(this.encoded, ',')\n return this._string\n }\n\n toHex(): string {\n if (!this.encoded) this.encode()\n // Use cached hex if available\n if (!this._hex) {\n if (!this._string) this._string = Array.prototype.join.call(this.encoded, ',')\n this._hex = toHex(this._string.split(',').map(Number))\n }\n return this._hex\n }\n\n /**\n * @return {String} encoded\n */\n toBs32(): base32String {\n if (!this.encoded) this.encode()\n // Use cached bs32 if available\n if (!this._bs32) this._bs32 = toBase32(this.encoded)\n return this._bs32\n }\n\n /**\n * @return {String} encoded\n */\n toBs58(): base58String {\n if (!this.encoded) this.encode()\n return toBase58(this.encoded)\n }\n}\n"],"names":["fromBase58","fromHex","toHex","toBase32","toBase58"],"mappings":"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"}
@@ -10,7 +10,6 @@ require('@vandeurenglenn/proto-array');
10
10
  require('@vandeurenglenn/typed-array-utils');
11
11
  require('varint');
12
12
  require('@leofcoin/codecs');
13
- require('multiformats/cid');
14
13
  require('hash-wasm');
15
14
 
16
15
  class FormatInterface extends basicInterface.default {
@@ -112,6 +111,18 @@ class FormatInterface extends basicInterface.default {
112
111
  const upper = this.hashFormat.charAt(0).toUpperCase();
113
112
  return `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
114
113
  }
114
+ /**
115
+ * Extract content bytes without codec prefix
116
+ */
117
+ get contentBytes() {
118
+ if (!this.encoded)
119
+ return new Uint8Array(0);
120
+ const codec$1 = new codec(this.encoded);
121
+ if (codec$1.codecBuffer) {
122
+ return this.encoded.slice(codec$1.codecBuffer.length);
123
+ }
124
+ return this.encoded;
125
+ }
115
126
  beforeHashing(decoded) {
116
127
  // Avoid copying if not needed
117
128
  if (decoded && Object.prototype.hasOwnProperty.call(decoded, 'hash')) {
@@ -126,9 +137,20 @@ class FormatInterface extends basicInterface.default {
126
137
  * @return {PeernetHash}
127
138
  */
128
139
  get peernetHash() {
140
+ // Optimize: if decoded has no hash property, contentBytes are already correct
141
+ // Since protoEncode is deterministic (varint-based), we can use them directly
142
+ if (this.encoded &&
143
+ this.decoded &&
144
+ !Object.prototype.hasOwnProperty.call(this.decoded, 'hash')) {
145
+ // @ts-ignore
146
+ const hash = new codecHash({ name: this.name });
147
+ return hash.init(this.contentBytes);
148
+ }
149
+ // Fallback: must re-encode without hash property
129
150
  const decoded = this.beforeHashing({ ...this.decoded });
130
151
  // @ts-ignore
131
- return new codecHash(decoded, { name: this.name });
152
+ const hash = new codecHash({ name: this.name });
153
+ return hash.init(decoded);
132
154
  }
133
155
  /**
134
156
  * @return {peernetHash}
@@ -1 +1 @@
1
- {"version":3,"file":"codec-format-interface.js","sources":["../../src/codec-format-interface.ts"],"sourcesContent":["import BasicInterface, { jsonParseBigInt } from './basic-interface.js'\nimport Codec from './codec.js'\nimport Hash from './codec-hash.js'\n\nimport type { base58String } from '@vandeurenglenn/base58'\nimport type { base32String } from '@vandeurenglenn/base32'\nimport type { HexString } from '@vandeurenglenn/is-hex'\n\nexport default class FormatInterface extends BasicInterface implements FormatInterface {\n hashFormat: string\n #hash\n #encoded\n\n get encoded() {\n return this.#encoded || this.encode()\n }\n\n set encoded(value) {\n this.#encoded = value\n }\n\n init(buffer: Uint8Array | ArrayBuffer | FormatInterface | string) {\n if (buffer instanceof FormatInterface && buffer?.name === this.name) {\n return buffer\n } else if (buffer instanceof Uint8Array) {\n this.fromUint8Array(buffer)\n } else if (buffer instanceof ArrayBuffer) {\n this.fromArrayBuffer(buffer)\n } else if (typeof buffer === 'string') {\n if (this.isHex(buffer as HexString)) this.fromHex(buffer as string)\n else if (this.isBase58(buffer as base58String)) this.fromBs58(buffer)\n else if (this.isBase32(buffer as base32String)) this.fromBs32(buffer)\n else this.fromString(buffer as string)\n } else if (typeof buffer === 'object' && buffer !== null) {\n this.create(buffer as object)\n } else {\n // Explicitly reject all other types (number, boolean, undefined, symbol, function, null)\n throw new TypeError(`Invalid input type for FormatInterface: ${typeof buffer}`)\n }\n return this\n }\n\n hasCodec() {\n if (!this.encoded) return false\n const codec = new Codec(this.encoded)\n if (codec.name) return true\n }\n\n decode(encoded?: Uint8Array): object {\n encoded = encoded || this.encoded\n const codec = new Codec(encoded)\n if (codec.codecBuffer) {\n encoded = encoded.slice(codec.codecBuffer.length)\n this.name = codec.name\n this.decoded = this.protoDecode(encoded)\n // try {\n // this.decoded = JSON.parse(this.decoded)\n // } catch {\n\n // }\n } else {\n throw new Error(`no codec found`)\n }\n\n return this.decoded\n }\n\n encode(decoded?: object) {\n let encoded: Uint8Array\n decoded = decoded || this.decoded\n const codec = new Codec(this.name)\n\n if (decoded instanceof Uint8Array) encoded = decoded\n else encoded = this.protoEncode(decoded)\n\n if (codec.codecBuffer) {\n const uint8Array = new Uint8Array(encoded.length + codec.codecBuffer.length)\n uint8Array.set(codec.codecBuffer)\n uint8Array.set(encoded, codec.codecBuffer.length)\n this.encoded = uint8Array\n } else {\n throw new Error(`invalid codec`)\n }\n return this.encoded\n }\n /**\n * @param {Buffer|String|Object} buffer - data - The data needed to create the desired message\n * @param {Object} proto - {protoObject}\n * @param {Object} options - {hashFormat, name}\n */\n constructor(buffer, proto, options?: { hashFormat?: string; name?: string }) {\n super()\n this.proto = proto\n this.hashFormat = options?.hashFormat ? options.hashFormat : 'bs32'\n\n if (options?.name) this.name = options.name\n\n this.init(buffer)\n }\n\n get format() {\n const upper = this.hashFormat.charAt(0).toUpperCase()\n return `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`\n }\n\n beforeHashing(decoded: { [index: string]: any }) {\n // Avoid copying if not needed\n if (decoded && Object.prototype.hasOwnProperty.call(decoded, 'hash')) {\n // Only copy if hash is present\n const rest = { ...decoded }\n delete rest.hash\n return rest\n }\n return decoded\n }\n\n /**\n * @return {PeernetHash}\n */\n get peernetHash() {\n const decoded = this.beforeHashing({ ...this.decoded })\n // @ts-ignore\n return new Hash(decoded, { name: this.name })\n }\n\n /**\n * @return {peernetHash}\n */\n async hash() {\n if (this.#hash) return this.#hash\n const upper = this.hashFormat.charAt(0).toUpperCase()\n const format = `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`\n this.#hash = (await this.peernetHash)[`to${format}`]()\n return this.#hash\n }\n\n fromUint8Array(buffer) {\n this.encoded = buffer\n return this.hasCodec()\n ? this.decode()\n : this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt))\n }\n\n fromArrayBuffer(buffer) {\n this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength)\n return this.hasCodec()\n ? this.decode()\n : this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt))\n }\n\n /**\n * @param {Object} data\n */\n create(data: object) {\n const decoded = {}\n // @ts-ignore\n if (data.hash) this.#hash = data.hash\n if (this.keys?.length > 0) {\n for (const key of this.keys) {\n decoded[key] = data[key]\n }\n this.decoded = decoded\n // return this.encode(decoded)\n }\n }\n}\n"],"names":["BasicInterface","codec","Codec","Hash","jsonParseBigInt"],"mappings":"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"}
1
+ {"version":3,"file":"codec-format-interface.js","sources":["../../src/codec-format-interface.ts"],"sourcesContent":["import BasicInterface, { jsonParseBigInt } from './basic-interface.js'\nimport Codec from './codec.js'\nimport Hash from './codec-hash.js'\n\nimport type { base58String } from '@vandeurenglenn/base58'\nimport type { base32String } from '@vandeurenglenn/base32'\nimport type { HexString } from '@vandeurenglenn/is-hex'\n\nexport default class FormatInterface extends BasicInterface implements FormatInterface {\n hashFormat: string\n #hash\n #encoded\n\n get encoded() {\n return this.#encoded || this.encode()\n }\n\n set encoded(value) {\n this.#encoded = value\n }\n\n init(buffer: Uint8Array | ArrayBuffer | FormatInterface | string) {\n if (buffer instanceof FormatInterface && buffer?.name === this.name) {\n return buffer\n } else if (buffer instanceof Uint8Array) {\n this.fromUint8Array(buffer)\n } else if (buffer instanceof ArrayBuffer) {\n this.fromArrayBuffer(buffer)\n } else if (typeof buffer === 'string') {\n if (this.isHex(buffer as HexString)) this.fromHex(buffer as string)\n else if (this.isBase58(buffer as base58String)) this.fromBs58(buffer)\n else if (this.isBase32(buffer as base32String)) this.fromBs32(buffer)\n else this.fromString(buffer as string)\n } else if (typeof buffer === 'object' && buffer !== null) {\n this.create(buffer as object)\n } else {\n // Explicitly reject all other types (number, boolean, undefined, symbol, function, null)\n throw new TypeError(`Invalid input type for FormatInterface: ${typeof buffer}`)\n }\n return this\n }\n\n hasCodec() {\n if (!this.encoded) return false\n const codec = new Codec(this.encoded)\n if (codec.name) return true\n }\n\n decode(encoded?: Uint8Array): object {\n encoded = encoded || this.encoded\n const codec = new Codec(encoded)\n if (codec.codecBuffer) {\n encoded = encoded.slice(codec.codecBuffer.length)\n this.name = codec.name\n this.decoded = this.protoDecode(encoded)\n // try {\n // this.decoded = JSON.parse(this.decoded)\n // } catch {\n\n // }\n } else {\n throw new Error(`no codec found`)\n }\n\n return this.decoded\n }\n\n encode(decoded?: object) {\n let encoded: Uint8Array\n decoded = decoded || this.decoded\n const codec = new Codec(this.name)\n\n if (decoded instanceof Uint8Array) encoded = decoded\n else encoded = this.protoEncode(decoded)\n\n if (codec.codecBuffer) {\n const uint8Array = new Uint8Array(encoded.length + codec.codecBuffer.length)\n uint8Array.set(codec.codecBuffer)\n uint8Array.set(encoded, codec.codecBuffer.length)\n this.encoded = uint8Array\n } else {\n throw new Error(`invalid codec`)\n }\n return this.encoded\n }\n /**\n * @param {Buffer|String|Object} buffer - data - The data needed to create the desired message\n * @param {Object} proto - {protoObject}\n * @param {Object} options - {hashFormat, name}\n */\n constructor(buffer, proto, options?: { hashFormat?: string; name?: string }) {\n super()\n this.proto = proto\n this.hashFormat = options?.hashFormat ? options.hashFormat : 'bs32'\n\n if (options?.name) this.name = options.name\n\n this.init(buffer)\n }\n\n get format() {\n const upper = this.hashFormat.charAt(0).toUpperCase()\n return `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`\n }\n\n /**\n * Extract content bytes without codec prefix\n */\n get contentBytes(): Uint8Array {\n if (!this.encoded) return new Uint8Array(0)\n const codec = new Codec(this.encoded)\n if (codec.codecBuffer) {\n return this.encoded.slice(codec.codecBuffer.length)\n }\n return this.encoded\n }\n\n beforeHashing(decoded: { [index: string]: any }) {\n // Avoid copying if not needed\n if (decoded && Object.prototype.hasOwnProperty.call(decoded, 'hash')) {\n // Only copy if hash is present\n const rest = { ...decoded }\n delete rest.hash\n return rest\n }\n return decoded\n }\n\n /**\n * @return {PeernetHash}\n */\n get peernetHash() {\n // Optimize: if decoded has no hash property, contentBytes are already correct\n // Since protoEncode is deterministic (varint-based), we can use them directly\n if (\n this.encoded &&\n this.decoded &&\n !Object.prototype.hasOwnProperty.call(this.decoded, 'hash')\n ) {\n // @ts-ignore\n const hash = new Hash({ name: this.name })\n return hash.init(this.contentBytes)\n }\n\n // Fallback: must re-encode without hash property\n const decoded = this.beforeHashing({ ...this.decoded })\n // @ts-ignore\n const hash = new Hash({ name: this.name })\n return hash.init(decoded)\n }\n\n /**\n * @return {peernetHash}\n */\n async hash() {\n if (this.#hash) return this.#hash\n const upper = this.hashFormat.charAt(0).toUpperCase()\n const format = `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`\n this.#hash = (await this.peernetHash)[`to${format}`]()\n return this.#hash\n }\n\n fromUint8Array(buffer) {\n this.encoded = buffer\n return this.hasCodec()\n ? this.decode()\n : this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt))\n }\n\n fromArrayBuffer(buffer) {\n this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength)\n return this.hasCodec()\n ? this.decode()\n : this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt))\n }\n\n /**\n * @param {Object} data\n */\n create(data: object) {\n const decoded = {}\n // @ts-ignore\n if (data.hash) this.#hash = data.hash\n if (this.keys?.length > 0) {\n for (const key of this.keys) {\n decoded[key] = data[key]\n }\n this.decoded = decoded\n // return this.encode(decoded)\n }\n }\n}\n"],"names":["BasicInterface","codec","Codec","Hash","jsonParseBigInt"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var varint = require('varint');
4
- var cid = require('multiformats/cid');
5
4
  var hashWasm = require('hash-wasm');
6
5
  var basicInterface = require('./basic-interface.js');
7
6
  var codec = require('./codec.js');
@@ -12,10 +11,7 @@ require('@vandeurenglenn/proto-array');
12
11
  require('@vandeurenglenn/typed-array-utils');
13
12
  require('@leofcoin/codecs');
14
13
 
15
- const MAX_WEBCRYPTO_INPUT = 0x7fffffff;
16
- const STREAMING_CHUNK_SIZE = 64 * 1024 * 1024;
17
- const toUint8Array = (buffer) => buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
18
- const getStreamingHasher = async (hashVariant) => {
14
+ const createHasher = (hashVariant) => {
19
15
  switch (hashVariant) {
20
16
  case 1:
21
17
  return hashWasm.createSHA1();
@@ -28,44 +24,23 @@ const getStreamingHasher = async (hashVariant) => {
28
24
  case 512:
29
25
  return hashWasm.createSHA512();
30
26
  default:
31
- return null;
27
+ throw new Error(`unsupported hash variant: ${hashVariant}`);
32
28
  }
33
29
  };
34
30
  const digestBuffer = async (hashVariant, buffer) => {
35
- const view = toUint8Array(buffer);
36
- if (view.byteLength >= MAX_WEBCRYPTO_INPUT) {
37
- const hasher = await getStreamingHasher(hashVariant);
38
- if (!hasher) {
39
- throw new Error(`unsupported streaming hash variant: ${hashVariant}`);
40
- }
41
- hasher.init();
42
- for (let offset = 0; offset < view.byteLength; offset += STREAMING_CHUNK_SIZE) {
43
- const end = Math.min(offset + STREAMING_CHUNK_SIZE, view.byteLength);
44
- hasher.update(view.subarray(offset, end));
45
- }
46
- const digest = hasher.digest('binary');
47
- return digest instanceof Uint8Array ? digest : new Uint8Array(digest);
48
- }
49
- const sourceView = view.byteOffset === 0 && view.byteLength === view.buffer.byteLength ? view : view.slice();
50
- const digest = await crypto.subtle.digest(`SHA-${hashVariant}`, sourceView.buffer);
51
- return new Uint8Array(digest);
52
- };
53
- const parseCid = (input) => {
54
- try {
55
- if (typeof input === 'string')
56
- return cid.CID.parse(input);
57
- const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
58
- return cid.CID.decode(bytes);
59
- }
60
- catch {
61
- return null;
62
- }
31
+ const view = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
32
+ const hasher = await createHasher(hashVariant);
33
+ hasher.init();
34
+ hasher.update(view);
35
+ const digest = hasher.digest('binary');
36
+ return digest instanceof Uint8Array ? digest : new Uint8Array(digest);
63
37
  };
64
38
  class CodecHash extends basicInterface.default {
65
39
  codec;
66
40
  discoCodec;
67
41
  size;
68
- constructor(buffer, options) {
42
+ codecs;
43
+ constructor(options = { name: 'disco-hash', codecs: {} }) {
69
44
  super();
70
45
  if (options?.name)
71
46
  this.name = options.name;
@@ -73,42 +48,24 @@ class CodecHash extends basicInterface.default {
73
48
  this.name = 'disco-hash';
74
49
  if (options?.codecs)
75
50
  this.codecs = options.codecs;
76
- return this.init(buffer);
77
51
  }
78
52
  async init(uint8Array) {
79
53
  if (uint8Array) {
80
- const cid = typeof uint8Array === 'string'
81
- ? parseCid(uint8Array)
82
- : uint8Array instanceof Uint8Array || uint8Array instanceof ArrayBuffer
83
- ? parseCid(uint8Array)
84
- : null;
85
- if (cid) {
86
- await this.fromCID(cid);
87
- return this;
54
+ if (!(uint8Array instanceof Uint8Array)) {
55
+ throw new Error('CodecHash only supports Uint8Array input');
88
56
  }
89
- if (uint8Array instanceof Uint8Array) {
90
- this.discoCodec = new codec(uint8Array);
91
- const name = this.discoCodec.name;
92
- if (name) {
93
- this.name = name;
94
- this.decode(uint8Array);
95
- }
96
- else {
97
- await this.encode(uint8Array);
98
- }
57
+ // For large buffers, only check first bytes for codec prefix
58
+ // Codec prefixes are small (varint encoded), so 100 bytes is more than enough
59
+ const checkBuffer = uint8Array.length > 100 ? uint8Array.subarray(0, 100) : uint8Array;
60
+ this.discoCodec = new codec(checkBuffer);
61
+ const name = this.discoCodec.name;
62
+ if (name) {
63
+ this.name = name;
64
+ this.decode(uint8Array);
99
65
  }
100
- if (typeof uint8Array === 'string') {
101
- if (this.isHex(uint8Array))
102
- await this.fromHex(uint8Array);
103
- if (this.isBase32(uint8Array))
104
- await this.fromBs32(uint8Array);
105
- else if (this.isBase58(uint8Array))
106
- await this.fromBs58(uint8Array);
107
- else
108
- throw new Error(`unsupported string ${uint8Array}`);
66
+ else {
67
+ await this.encode(uint8Array);
109
68
  }
110
- else if (typeof uint8Array === 'object')
111
- await this.fromJSON(uint8Array);
112
69
  }
113
70
  return this;
114
71
  }
@@ -128,16 +85,12 @@ class CodecHash extends basicInterface.default {
128
85
  get hash() {
129
86
  return this.encoded;
130
87
  }
131
- fromJSON(json) {
132
- return this.encode(new TextEncoder().encode(JSON.stringify(json, basicInterface.jsonStringifyBigInt)));
133
- }
134
88
  async encode(buffer, name) {
135
89
  if (!this.name && name)
136
90
  this.name = name;
137
91
  if (!buffer)
138
- buffer = this.buffer;
92
+ throw new Error('buffer is required for encoding');
139
93
  this.discoCodec = new codec(this.name);
140
- this.discoCodec.fromName(this.name);
141
94
  let hashAlg = this.discoCodec.hashAlg;
142
95
  const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1]);
143
96
  if (hashAlg.includes('dbl')) {
@@ -154,46 +107,17 @@ class CodecHash extends basicInterface.default {
154
107
  this.encoded = uint8Array;
155
108
  return this.encoded;
156
109
  }
157
- async fromCID(cid$1) {
158
- const parsed = cid$1 instanceof cid.CID
159
- ? cid$1
160
- : typeof cid$1 === 'string' || cid$1 instanceof Uint8Array
161
- ? parseCid(cid$1)
162
- : parseCid(cid$1);
163
- if (!parsed)
164
- throw new Error('invalid cid input');
165
- if (!this.name)
166
- this.name = 'disco-hash';
167
- this.discoCodec = new codec(this.name);
168
- this.discoCodec.fromName(this.name);
169
- this.digest = parsed.multihash.digest;
170
- this.size = this.digest.length;
171
- this.codec = this.discoCodec.encode();
172
- this.codec = this.discoCodec.codecBuffer;
173
- const uint8Array = new Uint8Array(this.digest.length + this.prefix.length);
174
- uint8Array.set(this.prefix);
175
- uint8Array.set(this.digest, this.prefix.length);
176
- this.encoded = uint8Array;
177
- return this.encoded;
178
- }
179
110
  async validate(buffer) {
180
- if (Buffer.isBuffer(buffer)) {
181
- const codec = varint.decode(buffer);
182
- if (this.codecs[codec]) {
183
- this.decode(buffer);
184
- }
185
- else {
186
- await this.encode(buffer);
187
- }
111
+ if (!(buffer instanceof Uint8Array)) {
112
+ throw new Error('CodecHash only supports Uint8Array input');
113
+ }
114
+ const codec = varint.decode(buffer);
115
+ if (this.codecs[codec]) {
116
+ this.decode(buffer);
188
117
  }
189
- if (typeof buffer === 'string') {
190
- if (this.isHex(buffer))
191
- this.fromHex(buffer);
192
- if (this.isBase32(buffer))
193
- this.fromBs32(buffer);
118
+ else {
119
+ await this.encode(buffer);
194
120
  }
195
- if (typeof buffer === 'object')
196
- this.fromJSON(buffer);
197
121
  }
198
122
  decode(buffer) {
199
123
  this.encoded = buffer;
@@ -204,7 +128,7 @@ class CodecHash extends basicInterface.default {
204
128
  this.size = varint.decode(buffer);
205
129
  this.digest = buffer.slice(varint.decode.bytes);
206
130
  if (this.digest.length !== this.size) {
207
- throw new Error(`hash length inconsistent: 0x${this.encoded.toString('hex')}`);
131
+ throw new Error(`hash length inconsistent: 0x${this.encoded.toString()}`);
208
132
  }
209
133
  // const discoCodec = new Codec(codec, this.codecs)
210
134
  this.name = this.discoCodec.name;
@@ -1 +1 @@
1
- {"version":3,"file":"codec-hash.js","sources":["../../src/codec-hash.ts"],"sourcesContent":["import varint from 'varint'\nimport { CID } from 'multiformats/cid'\nimport { createSHA1, createSHA224, createSHA256, createSHA384, createSHA512 } from 'hash-wasm'\nimport BasicInterface, { jsonStringifyBigInt } from './basic-interface.js'\nimport Codec from './codec.js'\n\nconst MAX_WEBCRYPTO_INPUT = 0x7fffffff\nconst STREAMING_CHUNK_SIZE = 64 * 1024 * 1024\n\nconst toUint8Array = (buffer: ArrayBuffer | Uint8Array): Uint8Array =>\n buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)\n\nconst getStreamingHasher = async (hashVariant: number) => {\n switch (hashVariant) {\n case 1:\n return createSHA1()\n case 224:\n return createSHA224()\n case 256:\n return createSHA256()\n case 384:\n return createSHA384()\n case 512:\n return createSHA512()\n default:\n return null\n }\n}\n\nconst digestBuffer = async (hashVariant: number, buffer: ArrayBuffer | Uint8Array) => {\n const view = toUint8Array(buffer)\n if (view.byteLength >= MAX_WEBCRYPTO_INPUT) {\n const hasher = await getStreamingHasher(hashVariant)\n if (!hasher) {\n throw new Error(`unsupported streaming hash variant: ${hashVariant}`)\n }\n hasher.init()\n for (let offset = 0; offset < view.byteLength; offset += STREAMING_CHUNK_SIZE) {\n const end = Math.min(offset + STREAMING_CHUNK_SIZE, view.byteLength)\n hasher.update(view.subarray(offset, end))\n }\n const digest = hasher.digest('binary')\n return digest instanceof Uint8Array ? digest : new Uint8Array(digest)\n }\n const sourceView =\n view.byteOffset === 0 && view.byteLength === view.buffer.byteLength ? view : view.slice()\n const digest = await crypto.subtle.digest(`SHA-${hashVariant}`, sourceView.buffer)\n return new Uint8Array(digest)\n}\n\nconst parseCid = (input: string | Uint8Array | ArrayBuffer): CID | null => {\n try {\n if (typeof input === 'string') return CID.parse(input)\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input)\n return CID.decode(bytes)\n } catch {\n return null\n }\n}\n\ntype CodecHashOptions = {\n name: string\n codecs: object\n}\n\nexport default class CodecHash extends BasicInterface {\n codec: Uint8Array\n discoCodec: Codec\n size: number\n constructor(buffer, options: CodecHashOptions) {\n super()\n if (options?.name) this.name = options.name\n else this.name = 'disco-hash'\n if (options?.codecs) this.codecs = options.codecs\n return this.init(buffer)\n }\n\n async init(uint8Array) {\n if (uint8Array) {\n const cid =\n typeof uint8Array === 'string'\n ? parseCid(uint8Array)\n : uint8Array instanceof Uint8Array || uint8Array instanceof ArrayBuffer\n ? parseCid(uint8Array)\n : null\n if (cid) {\n await this.fromCID(cid)\n return this\n }\n if (uint8Array instanceof Uint8Array) {\n this.discoCodec = new Codec(uint8Array)\n const name = this.discoCodec.name\n\n if (name) {\n this.name = name\n this.decode(uint8Array)\n } else {\n await this.encode(uint8Array)\n }\n }\n\n if (typeof uint8Array === 'string') {\n if (this.isHex(uint8Array)) await this.fromHex(uint8Array)\n if (this.isBase32(uint8Array)) await this.fromBs32(uint8Array)\n else if (this.isBase58(uint8Array)) await this.fromBs58(uint8Array)\n else throw new Error(`unsupported string ${uint8Array}`)\n } else if (typeof uint8Array === 'object') await this.fromJSON(uint8Array)\n }\n return this\n }\n get prefix() {\n const length = this.length\n const uint8Array = new Uint8Array(length.length + this.discoCodec.codecBuffer.length)\n uint8Array.set(length)\n uint8Array.set(this.discoCodec.codecBuffer, length.length)\n\n return uint8Array\n }\n\n get length() {\n return varint.encode(this.size)\n }\n\n get buffer() {\n return this.encoded\n }\n\n get hash() {\n return this.encoded\n }\n\n fromJSON(json) {\n return this.encode(new TextEncoder().encode(JSON.stringify(json, jsonStringifyBigInt)))\n }\n\n async encode(buffer, name?) {\n if (!this.name && name) this.name = name\n if (!buffer) buffer = this.buffer\n this.discoCodec = new Codec(this.name)\n this.discoCodec.fromName(this.name)\n let hashAlg = this.discoCodec.hashAlg\n const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1])\n\n if (hashAlg.includes('dbl')) {\n hashAlg = hashAlg.replace('dbl-', '')\n buffer = await digestBuffer(hashVariant, buffer)\n }\n this.digest = await digestBuffer(hashVariant, buffer)\n\n this.size = this.digest.length\n\n this.codec = this.discoCodec.encode()\n this.codec = this.discoCodec.codecBuffer\n const uint8Array = new Uint8Array(this.digest.length + this.prefix.length)\n uint8Array.set(this.prefix)\n uint8Array.set(this.digest, this.prefix.length)\n\n this.encoded = uint8Array\n\n return this.encoded\n }\n\n async fromCID(cid: CID | string | Uint8Array | ArrayBuffer) {\n const parsed =\n cid instanceof CID\n ? cid\n : typeof cid === 'string' || cid instanceof Uint8Array\n ? parseCid(cid)\n : parseCid(cid as ArrayBuffer)\n if (!parsed) throw new Error('invalid cid input')\n\n if (!this.name) this.name = 'disco-hash'\n this.discoCodec = new Codec(this.name)\n this.discoCodec.fromName(this.name)\n\n this.digest = parsed.multihash.digest\n this.size = this.digest.length\n\n this.codec = this.discoCodec.encode()\n this.codec = this.discoCodec.codecBuffer\n\n const uint8Array = new Uint8Array(this.digest.length + this.prefix.length)\n uint8Array.set(this.prefix)\n uint8Array.set(this.digest, this.prefix.length)\n this.encoded = uint8Array\n return this.encoded\n }\n\n async validate(buffer) {\n if (Buffer.isBuffer(buffer)) {\n const codec = varint.decode(buffer)\n if (this.codecs[codec]) {\n this.decode(buffer)\n } else {\n await this.encode(buffer)\n }\n }\n if (typeof buffer === 'string') {\n if (this.isHex(buffer)) this.fromHex(buffer)\n if (this.isBase32(buffer)) this.fromBs32(buffer)\n }\n if (typeof buffer === 'object') this.fromJSON(buffer)\n }\n\n decode(buffer) {\n this.encoded = buffer\n const codec = varint.decode(buffer)\n\n this.discoCodec = new Codec(codec, this.codecs)\n // TODO: validate codec\n buffer = buffer.slice(varint.decode.bytes)\n this.size = varint.decode(buffer)\n this.digest = buffer.slice(varint.decode.bytes)\n if (this.digest.length !== this.size) {\n throw new Error(`hash length inconsistent: 0x${this.encoded.toString('hex')}`)\n }\n\n // const discoCodec = new Codec(codec, this.codecs)\n\n this.name = this.discoCodec.name\n\n this.size = this.digest.length\n\n return {\n codec: this.codec,\n name: this.name,\n size: this.size,\n length: this.length,\n digest: this.digest\n }\n }\n}\n"],"names":["createSHA1","createSHA224","createSHA256","createSHA384","createSHA512","CID","BasicInterface","Codec","jsonStringifyBigInt","cid","codec"],"mappings":"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"}
1
+ {"version":3,"file":"codec-hash.js","sources":["../../src/codec-hash.ts"],"sourcesContent":["import varint from 'varint'\nimport { createSHA1, createSHA224, createSHA256, createSHA384, createSHA512 } from 'hash-wasm'\nimport BasicInterface from './basic-interface.js'\nimport Codec from './codec.js'\n\nconst createHasher = (hashVariant: number) => {\n switch (hashVariant) {\n case 1:\n return createSHA1()\n case 224:\n return createSHA224()\n case 256:\n return createSHA256()\n case 384:\n return createSHA384()\n case 512:\n return createSHA512()\n default:\n throw new Error(`unsupported hash variant: ${hashVariant}`)\n }\n}\n\nconst digestBuffer = async (\n hashVariant: number,\n buffer: ArrayBuffer | Uint8Array\n): Promise<Uint8Array> => {\n const view = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)\n const hasher = await createHasher(hashVariant)\n hasher.init()\n hasher.update(view)\n const digest = hasher.digest('binary')\n return digest instanceof Uint8Array ? digest : new Uint8Array(digest)\n}\n\ntype CodecHashOptions = {\n name?: string\n codecs?: object\n}\n\nexport default class CodecHash extends BasicInterface {\n codec: Uint8Array\n discoCodec: Codec\n size: number\n codecs: object\n constructor(options: CodecHashOptions = { name: 'disco-hash', codecs: {} }) {\n super()\n if (options?.name) this.name = options.name\n else this.name = 'disco-hash'\n if (options?.codecs) this.codecs = options.codecs\n }\n\n async init(uint8Array: Uint8Array) {\n if (uint8Array) {\n if (!(uint8Array instanceof Uint8Array)) {\n throw new Error('CodecHash only supports Uint8Array input')\n }\n // For large buffers, only check first bytes for codec prefix\n // Codec prefixes are small (varint encoded), so 100 bytes is more than enough\n const checkBuffer = uint8Array.length > 100 ? uint8Array.subarray(0, 100) : uint8Array\n this.discoCodec = new Codec(checkBuffer)\n const name = this.discoCodec.name\n\n if (name) {\n this.name = name\n this.decode(uint8Array)\n } else {\n await this.encode(uint8Array)\n }\n }\n return this\n }\n get prefix() {\n const length = this.length\n const uint8Array = new Uint8Array(length.length + this.discoCodec.codecBuffer.length)\n uint8Array.set(length)\n uint8Array.set(this.discoCodec.codecBuffer, length.length)\n\n return uint8Array\n }\n\n get length() {\n return varint.encode(this.size)\n }\n\n get buffer() {\n return this.encoded\n }\n\n get hash() {\n return this.encoded\n }\n\n async encode(buffer, name?) {\n if (!this.name && name) this.name = name\n if (!buffer) throw new Error('buffer is required for encoding')\n this.discoCodec = new Codec(this.name)\n let hashAlg = this.discoCodec.hashAlg\n const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1])\n\n if (hashAlg.includes('dbl')) {\n hashAlg = hashAlg.replace('dbl-', '')\n buffer = await digestBuffer(hashVariant, buffer)\n }\n this.digest = await digestBuffer(hashVariant, buffer)\n\n this.size = this.digest.length\n\n this.codec = this.discoCodec.encode()\n this.codec = this.discoCodec.codecBuffer\n const uint8Array = new Uint8Array(this.digest.length + this.prefix.length)\n uint8Array.set(this.prefix)\n uint8Array.set(this.digest, this.prefix.length)\n\n this.encoded = uint8Array\n\n return this.encoded\n }\n\n async validate(buffer: Uint8Array) {\n if (!(buffer instanceof Uint8Array)) {\n throw new Error('CodecHash only supports Uint8Array input')\n }\n const codec = varint.decode(buffer)\n if (this.codecs[codec]) {\n this.decode(buffer)\n } else {\n await this.encode(buffer)\n }\n }\n\n decode(buffer) {\n this.encoded = buffer\n const codec = varint.decode(buffer)\n\n this.discoCodec = new Codec(codec, this.codecs)\n // TODO: validate codec\n buffer = buffer.slice(varint.decode.bytes)\n this.size = varint.decode(buffer)\n this.digest = buffer.slice(varint.decode.bytes)\n if (this.digest.length !== this.size) {\n throw new Error(`hash length inconsistent: 0x${this.encoded.toString()}`)\n }\n\n // const discoCodec = new Codec(codec, this.codecs)\n\n this.name = this.discoCodec.name\n\n this.size = this.digest.length\n\n return {\n codec: this.codec,\n name: this.name,\n size: this.size,\n length: this.length,\n digest: this.digest\n }\n }\n}\n"],"names":["createSHA1","createSHA224","createSHA256","createSHA384","createSHA512","BasicInterface","Codec","codec"],"mappings":"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"}
@@ -11,7 +11,6 @@ require('@vandeurenglenn/is-hex');
11
11
  require('@vandeurenglenn/proto-array');
12
12
  require('@vandeurenglenn/typed-array-utils');
13
13
  require('varint');
14
- require('multiformats/cid');
15
14
  require('hash-wasm');
16
15
 
17
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import basicInterface from './basic-interface.js'\nimport formatInterface from './codec-format-interface.js'\nimport codecHash from './codec-hash.js'\nimport codec from './codec.js'\n\n/**\n * Codecs utility from @leofcoin/codecs\n */\nexport { codecs } from '@leofcoin/codecs'\n\n/**\n * Basic interface for codecs\n */\nexport const BasicInterface = basicInterface\n\n/**\n * Interface for defining codec formats\n */\nexport const FormatInterface = formatInterface\n\n/**\n * Codec hash utility class\n */\nexport const CodecHash = codecHash\n\n/**\n * Codec utility class\n */\nexport const Codec = codec\n"],"names":["basicInterface","formatInterface"],"mappings":";;;;;;;;;;;;;;;;AAUA;;AAEG;AACI,MAAM,cAAc,GAAGA;AAE9B;;AAEG;AACI,MAAM,eAAe,GAAGC;AAE/B;;AAEG;AACI,MAAM,SAAS,GAAG;AAEzB;;AAEG;AACI,MAAM,KAAK,GAAG;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../src/index.ts"],"sourcesContent":["import basicInterface from './basic-interface.js'\nimport formatInterface from './codec-format-interface.js'\nimport codecHash from './codec-hash.js'\nimport codec from './codec.js'\n\n/**\n * Codecs utility from @leofcoin/codecs\n */\nexport { codecs } from '@leofcoin/codecs'\n\n/**\n * Basic interface for codecs\n */\nexport const BasicInterface = basicInterface\n\n/**\n * Interface for defining codec formats\n */\nexport const FormatInterface = formatInterface\n\n/**\n * Codec hash utility class\n */\nexport const CodecHash = codecHash\n\n/**\n * Codec utility class\n */\nexport const Codec = codec\n"],"names":["basicInterface","formatInterface"],"mappings":";;;;;;;;;;;;;;;AAUA;;AAEG;AACI,MAAM,cAAc,GAAGA;AAE9B;;AAEG;AACI,MAAM,eAAe,GAAGC;AAE/B;;AAEG;AACI,MAAM,SAAS,GAAG;AAEzB;;AAEG;AACI,MAAM,KAAK,GAAG;;;;;;;;;;;"}
@@ -6,7 +6,7 @@ export default class FormatInterface extends BasicInterface implements FormatInt
6
6
  get encoded(): any;
7
7
  set encoded(value: any);
8
8
  init(buffer: Uint8Array | ArrayBuffer | FormatInterface | string): FormatInterface;
9
- hasCodec(): boolean | undefined;
9
+ hasCodec(): boolean;
10
10
  decode(encoded?: Uint8Array): object;
11
11
  encode(decoded?: object): any;
12
12
  /**
@@ -19,6 +19,10 @@ export default class FormatInterface extends BasicInterface implements FormatInt
19
19
  name?: string;
20
20
  });
21
21
  get format(): string;
22
+ /**
23
+ * Extract content bytes without codec prefix
24
+ */
25
+ get contentBytes(): Uint8Array;
22
26
  beforeHashing(decoded: {
23
27
  [index: string]: any;
24
28
  }): {
@@ -27,7 +31,7 @@ export default class FormatInterface extends BasicInterface implements FormatInt
27
31
  /**
28
32
  * @return {PeernetHash}
29
33
  */
30
- get peernetHash(): Hash;
34
+ get peernetHash(): Promise<Hash>;
31
35
  /**
32
36
  * @return {peernetHash}
33
37
  */
@@ -8,7 +8,6 @@ import '@vandeurenglenn/proto-array';
8
8
  import '@vandeurenglenn/typed-array-utils';
9
9
  import 'varint';
10
10
  import '@leofcoin/codecs';
11
- import 'multiformats/cid';
12
11
  import 'hash-wasm';
13
12
 
14
13
  class FormatInterface extends BasicInterface {
@@ -110,6 +109,18 @@ class FormatInterface extends BasicInterface {
110
109
  const upper = this.hashFormat.charAt(0).toUpperCase();
111
110
  return `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
112
111
  }
112
+ /**
113
+ * Extract content bytes without codec prefix
114
+ */
115
+ get contentBytes() {
116
+ if (!this.encoded)
117
+ return new Uint8Array(0);
118
+ const codec = new Codec(this.encoded);
119
+ if (codec.codecBuffer) {
120
+ return this.encoded.slice(codec.codecBuffer.length);
121
+ }
122
+ return this.encoded;
123
+ }
113
124
  beforeHashing(decoded) {
114
125
  // Avoid copying if not needed
115
126
  if (decoded && Object.prototype.hasOwnProperty.call(decoded, 'hash')) {
@@ -124,9 +135,20 @@ class FormatInterface extends BasicInterface {
124
135
  * @return {PeernetHash}
125
136
  */
126
137
  get peernetHash() {
138
+ // Optimize: if decoded has no hash property, contentBytes are already correct
139
+ // Since protoEncode is deterministic (varint-based), we can use them directly
140
+ if (this.encoded &&
141
+ this.decoded &&
142
+ !Object.prototype.hasOwnProperty.call(this.decoded, 'hash')) {
143
+ // @ts-ignore
144
+ const hash = new CodecHash({ name: this.name });
145
+ return hash.init(this.contentBytes);
146
+ }
147
+ // Fallback: must re-encode without hash property
127
148
  const decoded = this.beforeHashing({ ...this.decoded });
128
149
  // @ts-ignore
129
- return new CodecHash(decoded, { name: this.name });
150
+ const hash = new CodecHash({ name: this.name });
151
+ return hash.init(decoded);
130
152
  }
131
153
  /**
132
154
  * @return {peernetHash}
@@ -1 +1 @@
1
- {"version":3,"file":"codec-format-interface.js","sources":["../src/codec-format-interface.ts"],"sourcesContent":["import BasicInterface, { jsonParseBigInt } from './basic-interface.js'\nimport Codec from './codec.js'\nimport Hash from './codec-hash.js'\n\nimport type { base58String } from '@vandeurenglenn/base58'\nimport type { base32String } from '@vandeurenglenn/base32'\nimport type { HexString } from '@vandeurenglenn/is-hex'\n\nexport default class FormatInterface extends BasicInterface implements FormatInterface {\n hashFormat: string\n #hash\n #encoded\n\n get encoded() {\n return this.#encoded || this.encode()\n }\n\n set encoded(value) {\n this.#encoded = value\n }\n\n init(buffer: Uint8Array | ArrayBuffer | FormatInterface | string) {\n if (buffer instanceof FormatInterface && buffer?.name === this.name) {\n return buffer\n } else if (buffer instanceof Uint8Array) {\n this.fromUint8Array(buffer)\n } else if (buffer instanceof ArrayBuffer) {\n this.fromArrayBuffer(buffer)\n } else if (typeof buffer === 'string') {\n if (this.isHex(buffer as HexString)) this.fromHex(buffer as string)\n else if (this.isBase58(buffer as base58String)) this.fromBs58(buffer)\n else if (this.isBase32(buffer as base32String)) this.fromBs32(buffer)\n else this.fromString(buffer as string)\n } else if (typeof buffer === 'object' && buffer !== null) {\n this.create(buffer as object)\n } else {\n // Explicitly reject all other types (number, boolean, undefined, symbol, function, null)\n throw new TypeError(`Invalid input type for FormatInterface: ${typeof buffer}`)\n }\n return this\n }\n\n hasCodec() {\n if (!this.encoded) return false\n const codec = new Codec(this.encoded)\n if (codec.name) return true\n }\n\n decode(encoded?: Uint8Array): object {\n encoded = encoded || this.encoded\n const codec = new Codec(encoded)\n if (codec.codecBuffer) {\n encoded = encoded.slice(codec.codecBuffer.length)\n this.name = codec.name\n this.decoded = this.protoDecode(encoded)\n // try {\n // this.decoded = JSON.parse(this.decoded)\n // } catch {\n\n // }\n } else {\n throw new Error(`no codec found`)\n }\n\n return this.decoded\n }\n\n encode(decoded?: object) {\n let encoded: Uint8Array\n decoded = decoded || this.decoded\n const codec = new Codec(this.name)\n\n if (decoded instanceof Uint8Array) encoded = decoded\n else encoded = this.protoEncode(decoded)\n\n if (codec.codecBuffer) {\n const uint8Array = new Uint8Array(encoded.length + codec.codecBuffer.length)\n uint8Array.set(codec.codecBuffer)\n uint8Array.set(encoded, codec.codecBuffer.length)\n this.encoded = uint8Array\n } else {\n throw new Error(`invalid codec`)\n }\n return this.encoded\n }\n /**\n * @param {Buffer|String|Object} buffer - data - The data needed to create the desired message\n * @param {Object} proto - {protoObject}\n * @param {Object} options - {hashFormat, name}\n */\n constructor(buffer, proto, options?: { hashFormat?: string; name?: string }) {\n super()\n this.proto = proto\n this.hashFormat = options?.hashFormat ? options.hashFormat : 'bs32'\n\n if (options?.name) this.name = options.name\n\n this.init(buffer)\n }\n\n get format() {\n const upper = this.hashFormat.charAt(0).toUpperCase()\n return `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`\n }\n\n beforeHashing(decoded: { [index: string]: any }) {\n // Avoid copying if not needed\n if (decoded && Object.prototype.hasOwnProperty.call(decoded, 'hash')) {\n // Only copy if hash is present\n const rest = { ...decoded }\n delete rest.hash\n return rest\n }\n return decoded\n }\n\n /**\n * @return {PeernetHash}\n */\n get peernetHash() {\n const decoded = this.beforeHashing({ ...this.decoded })\n // @ts-ignore\n return new Hash(decoded, { name: this.name })\n }\n\n /**\n * @return {peernetHash}\n */\n async hash() {\n if (this.#hash) return this.#hash\n const upper = this.hashFormat.charAt(0).toUpperCase()\n const format = `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`\n this.#hash = (await this.peernetHash)[`to${format}`]()\n return this.#hash\n }\n\n fromUint8Array(buffer) {\n this.encoded = buffer\n return this.hasCodec()\n ? this.decode()\n : this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt))\n }\n\n fromArrayBuffer(buffer) {\n this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength)\n return this.hasCodec()\n ? this.decode()\n : this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt))\n }\n\n /**\n * @param {Object} data\n */\n create(data: object) {\n const decoded = {}\n // @ts-ignore\n if (data.hash) this.#hash = data.hash\n if (this.keys?.length > 0) {\n for (const key of this.keys) {\n decoded[key] = data[key]\n }\n this.decoded = decoded\n // return this.encode(decoded)\n }\n }\n}\n"],"names":["Hash"],"mappings":"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"}
1
+ {"version":3,"file":"codec-format-interface.js","sources":["../src/codec-format-interface.ts"],"sourcesContent":["import BasicInterface, { jsonParseBigInt } from './basic-interface.js'\nimport Codec from './codec.js'\nimport Hash from './codec-hash.js'\n\nimport type { base58String } from '@vandeurenglenn/base58'\nimport type { base32String } from '@vandeurenglenn/base32'\nimport type { HexString } from '@vandeurenglenn/is-hex'\n\nexport default class FormatInterface extends BasicInterface implements FormatInterface {\n hashFormat: string\n #hash\n #encoded\n\n get encoded() {\n return this.#encoded || this.encode()\n }\n\n set encoded(value) {\n this.#encoded = value\n }\n\n init(buffer: Uint8Array | ArrayBuffer | FormatInterface | string) {\n if (buffer instanceof FormatInterface && buffer?.name === this.name) {\n return buffer\n } else if (buffer instanceof Uint8Array) {\n this.fromUint8Array(buffer)\n } else if (buffer instanceof ArrayBuffer) {\n this.fromArrayBuffer(buffer)\n } else if (typeof buffer === 'string') {\n if (this.isHex(buffer as HexString)) this.fromHex(buffer as string)\n else if (this.isBase58(buffer as base58String)) this.fromBs58(buffer)\n else if (this.isBase32(buffer as base32String)) this.fromBs32(buffer)\n else this.fromString(buffer as string)\n } else if (typeof buffer === 'object' && buffer !== null) {\n this.create(buffer as object)\n } else {\n // Explicitly reject all other types (number, boolean, undefined, symbol, function, null)\n throw new TypeError(`Invalid input type for FormatInterface: ${typeof buffer}`)\n }\n return this\n }\n\n hasCodec() {\n if (!this.encoded) return false\n const codec = new Codec(this.encoded)\n if (codec.name) return true\n }\n\n decode(encoded?: Uint8Array): object {\n encoded = encoded || this.encoded\n const codec = new Codec(encoded)\n if (codec.codecBuffer) {\n encoded = encoded.slice(codec.codecBuffer.length)\n this.name = codec.name\n this.decoded = this.protoDecode(encoded)\n // try {\n // this.decoded = JSON.parse(this.decoded)\n // } catch {\n\n // }\n } else {\n throw new Error(`no codec found`)\n }\n\n return this.decoded\n }\n\n encode(decoded?: object) {\n let encoded: Uint8Array\n decoded = decoded || this.decoded\n const codec = new Codec(this.name)\n\n if (decoded instanceof Uint8Array) encoded = decoded\n else encoded = this.protoEncode(decoded)\n\n if (codec.codecBuffer) {\n const uint8Array = new Uint8Array(encoded.length + codec.codecBuffer.length)\n uint8Array.set(codec.codecBuffer)\n uint8Array.set(encoded, codec.codecBuffer.length)\n this.encoded = uint8Array\n } else {\n throw new Error(`invalid codec`)\n }\n return this.encoded\n }\n /**\n * @param {Buffer|String|Object} buffer - data - The data needed to create the desired message\n * @param {Object} proto - {protoObject}\n * @param {Object} options - {hashFormat, name}\n */\n constructor(buffer, proto, options?: { hashFormat?: string; name?: string }) {\n super()\n this.proto = proto\n this.hashFormat = options?.hashFormat ? options.hashFormat : 'bs32'\n\n if (options?.name) this.name = options.name\n\n this.init(buffer)\n }\n\n get format() {\n const upper = this.hashFormat.charAt(0).toUpperCase()\n return `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`\n }\n\n /**\n * Extract content bytes without codec prefix\n */\n get contentBytes(): Uint8Array {\n if (!this.encoded) return new Uint8Array(0)\n const codec = new Codec(this.encoded)\n if (codec.codecBuffer) {\n return this.encoded.slice(codec.codecBuffer.length)\n }\n return this.encoded\n }\n\n beforeHashing(decoded: { [index: string]: any }) {\n // Avoid copying if not needed\n if (decoded && Object.prototype.hasOwnProperty.call(decoded, 'hash')) {\n // Only copy if hash is present\n const rest = { ...decoded }\n delete rest.hash\n return rest\n }\n return decoded\n }\n\n /**\n * @return {PeernetHash}\n */\n get peernetHash() {\n // Optimize: if decoded has no hash property, contentBytes are already correct\n // Since protoEncode is deterministic (varint-based), we can use them directly\n if (\n this.encoded &&\n this.decoded &&\n !Object.prototype.hasOwnProperty.call(this.decoded, 'hash')\n ) {\n // @ts-ignore\n const hash = new Hash({ name: this.name })\n return hash.init(this.contentBytes)\n }\n\n // Fallback: must re-encode without hash property\n const decoded = this.beforeHashing({ ...this.decoded })\n // @ts-ignore\n const hash = new Hash({ name: this.name })\n return hash.init(decoded)\n }\n\n /**\n * @return {peernetHash}\n */\n async hash() {\n if (this.#hash) return this.#hash\n const upper = this.hashFormat.charAt(0).toUpperCase()\n const format = `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`\n this.#hash = (await this.peernetHash)[`to${format}`]()\n return this.#hash\n }\n\n fromUint8Array(buffer) {\n this.encoded = buffer\n return this.hasCodec()\n ? this.decode()\n : this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt))\n }\n\n fromArrayBuffer(buffer) {\n this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength)\n return this.hasCodec()\n ? this.decode()\n : this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt))\n }\n\n /**\n * @param {Object} data\n */\n create(data: object) {\n const decoded = {}\n // @ts-ignore\n if (data.hash) this.#hash = data.hash\n if (this.keys?.length > 0) {\n for (const key of this.keys) {\n decoded[key] = data[key]\n }\n this.decoded = decoded\n // return this.encode(decoded)\n }\n }\n}\n"],"names":["Hash"],"mappings":"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"}
@@ -1,24 +1,22 @@
1
- import { CID } from 'multiformats/cid';
2
1
  import BasicInterface from './basic-interface.js';
3
2
  import Codec from './codec.js';
4
3
  type CodecHashOptions = {
5
- name: string;
6
- codecs: object;
4
+ name?: string;
5
+ codecs?: object;
7
6
  };
8
7
  export default class CodecHash extends BasicInterface {
9
8
  codec: Uint8Array;
10
9
  discoCodec: Codec;
11
10
  size: number;
12
- constructor(buffer: any, options: CodecHashOptions);
13
- init(uint8Array: any): Promise<this>;
11
+ codecs: object;
12
+ constructor(options?: CodecHashOptions);
13
+ init(uint8Array: Uint8Array): Promise<this>;
14
14
  get prefix(): Uint8Array;
15
15
  get length(): number[];
16
16
  get buffer(): Uint8Array;
17
17
  get hash(): Uint8Array;
18
- fromJSON(json: any): Promise<Uint8Array>;
19
18
  encode(buffer: any, name?: any): Promise<Uint8Array>;
20
- fromCID(cid: CID | string | Uint8Array | ArrayBuffer): Promise<Uint8Array>;
21
- validate(buffer: any): Promise<void>;
19
+ validate(buffer: Uint8Array): Promise<void>;
22
20
  decode(buffer: any): {
23
21
  codec: Uint8Array;
24
22
  name: string;
@@ -1,7 +1,6 @@
1
1
  import varint from 'varint';
2
- import { CID } from 'multiformats/cid';
3
2
  import { createSHA512, createSHA384, createSHA256, createSHA224, createSHA1 } from 'hash-wasm';
4
- import BasicInterface, { jsonStringifyBigInt } from './basic-interface.js';
3
+ import BasicInterface from './basic-interface.js';
5
4
  import Codec from './codec.js';
6
5
  import '@vandeurenglenn/base32';
7
6
  import '@vandeurenglenn/base58';
@@ -10,10 +9,7 @@ import '@vandeurenglenn/proto-array';
10
9
  import '@vandeurenglenn/typed-array-utils';
11
10
  import '@leofcoin/codecs';
12
11
 
13
- const MAX_WEBCRYPTO_INPUT = 0x7fffffff;
14
- const STREAMING_CHUNK_SIZE = 64 * 1024 * 1024;
15
- const toUint8Array = (buffer) => buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
16
- const getStreamingHasher = async (hashVariant) => {
12
+ const createHasher = (hashVariant) => {
17
13
  switch (hashVariant) {
18
14
  case 1:
19
15
  return createSHA1();
@@ -26,44 +22,23 @@ const getStreamingHasher = async (hashVariant) => {
26
22
  case 512:
27
23
  return createSHA512();
28
24
  default:
29
- return null;
25
+ throw new Error(`unsupported hash variant: ${hashVariant}`);
30
26
  }
31
27
  };
32
28
  const digestBuffer = async (hashVariant, buffer) => {
33
- const view = toUint8Array(buffer);
34
- if (view.byteLength >= MAX_WEBCRYPTO_INPUT) {
35
- const hasher = await getStreamingHasher(hashVariant);
36
- if (!hasher) {
37
- throw new Error(`unsupported streaming hash variant: ${hashVariant}`);
38
- }
39
- hasher.init();
40
- for (let offset = 0; offset < view.byteLength; offset += STREAMING_CHUNK_SIZE) {
41
- const end = Math.min(offset + STREAMING_CHUNK_SIZE, view.byteLength);
42
- hasher.update(view.subarray(offset, end));
43
- }
44
- const digest = hasher.digest('binary');
45
- return digest instanceof Uint8Array ? digest : new Uint8Array(digest);
46
- }
47
- const sourceView = view.byteOffset === 0 && view.byteLength === view.buffer.byteLength ? view : view.slice();
48
- const digest = await crypto.subtle.digest(`SHA-${hashVariant}`, sourceView.buffer);
49
- return new Uint8Array(digest);
50
- };
51
- const parseCid = (input) => {
52
- try {
53
- if (typeof input === 'string')
54
- return CID.parse(input);
55
- const bytes = input instanceof Uint8Array ? input : new Uint8Array(input);
56
- return CID.decode(bytes);
57
- }
58
- catch {
59
- return null;
60
- }
29
+ const view = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer);
30
+ const hasher = await createHasher(hashVariant);
31
+ hasher.init();
32
+ hasher.update(view);
33
+ const digest = hasher.digest('binary');
34
+ return digest instanceof Uint8Array ? digest : new Uint8Array(digest);
61
35
  };
62
36
  class CodecHash extends BasicInterface {
63
37
  codec;
64
38
  discoCodec;
65
39
  size;
66
- constructor(buffer, options) {
40
+ codecs;
41
+ constructor(options = { name: 'disco-hash', codecs: {} }) {
67
42
  super();
68
43
  if (options?.name)
69
44
  this.name = options.name;
@@ -71,42 +46,24 @@ class CodecHash extends BasicInterface {
71
46
  this.name = 'disco-hash';
72
47
  if (options?.codecs)
73
48
  this.codecs = options.codecs;
74
- return this.init(buffer);
75
49
  }
76
50
  async init(uint8Array) {
77
51
  if (uint8Array) {
78
- const cid = typeof uint8Array === 'string'
79
- ? parseCid(uint8Array)
80
- : uint8Array instanceof Uint8Array || uint8Array instanceof ArrayBuffer
81
- ? parseCid(uint8Array)
82
- : null;
83
- if (cid) {
84
- await this.fromCID(cid);
85
- return this;
52
+ if (!(uint8Array instanceof Uint8Array)) {
53
+ throw new Error('CodecHash only supports Uint8Array input');
86
54
  }
87
- if (uint8Array instanceof Uint8Array) {
88
- this.discoCodec = new Codec(uint8Array);
89
- const name = this.discoCodec.name;
90
- if (name) {
91
- this.name = name;
92
- this.decode(uint8Array);
93
- }
94
- else {
95
- await this.encode(uint8Array);
96
- }
55
+ // For large buffers, only check first bytes for codec prefix
56
+ // Codec prefixes are small (varint encoded), so 100 bytes is more than enough
57
+ const checkBuffer = uint8Array.length > 100 ? uint8Array.subarray(0, 100) : uint8Array;
58
+ this.discoCodec = new Codec(checkBuffer);
59
+ const name = this.discoCodec.name;
60
+ if (name) {
61
+ this.name = name;
62
+ this.decode(uint8Array);
97
63
  }
98
- if (typeof uint8Array === 'string') {
99
- if (this.isHex(uint8Array))
100
- await this.fromHex(uint8Array);
101
- if (this.isBase32(uint8Array))
102
- await this.fromBs32(uint8Array);
103
- else if (this.isBase58(uint8Array))
104
- await this.fromBs58(uint8Array);
105
- else
106
- throw new Error(`unsupported string ${uint8Array}`);
64
+ else {
65
+ await this.encode(uint8Array);
107
66
  }
108
- else if (typeof uint8Array === 'object')
109
- await this.fromJSON(uint8Array);
110
67
  }
111
68
  return this;
112
69
  }
@@ -126,16 +83,12 @@ class CodecHash extends BasicInterface {
126
83
  get hash() {
127
84
  return this.encoded;
128
85
  }
129
- fromJSON(json) {
130
- return this.encode(new TextEncoder().encode(JSON.stringify(json, jsonStringifyBigInt)));
131
- }
132
86
  async encode(buffer, name) {
133
87
  if (!this.name && name)
134
88
  this.name = name;
135
89
  if (!buffer)
136
- buffer = this.buffer;
90
+ throw new Error('buffer is required for encoding');
137
91
  this.discoCodec = new Codec(this.name);
138
- this.discoCodec.fromName(this.name);
139
92
  let hashAlg = this.discoCodec.hashAlg;
140
93
  const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1]);
141
94
  if (hashAlg.includes('dbl')) {
@@ -152,46 +105,17 @@ class CodecHash extends BasicInterface {
152
105
  this.encoded = uint8Array;
153
106
  return this.encoded;
154
107
  }
155
- async fromCID(cid) {
156
- const parsed = cid instanceof CID
157
- ? cid
158
- : typeof cid === 'string' || cid instanceof Uint8Array
159
- ? parseCid(cid)
160
- : parseCid(cid);
161
- if (!parsed)
162
- throw new Error('invalid cid input');
163
- if (!this.name)
164
- this.name = 'disco-hash';
165
- this.discoCodec = new Codec(this.name);
166
- this.discoCodec.fromName(this.name);
167
- this.digest = parsed.multihash.digest;
168
- this.size = this.digest.length;
169
- this.codec = this.discoCodec.encode();
170
- this.codec = this.discoCodec.codecBuffer;
171
- const uint8Array = new Uint8Array(this.digest.length + this.prefix.length);
172
- uint8Array.set(this.prefix);
173
- uint8Array.set(this.digest, this.prefix.length);
174
- this.encoded = uint8Array;
175
- return this.encoded;
176
- }
177
108
  async validate(buffer) {
178
- if (Buffer.isBuffer(buffer)) {
179
- const codec = varint.decode(buffer);
180
- if (this.codecs[codec]) {
181
- this.decode(buffer);
182
- }
183
- else {
184
- await this.encode(buffer);
185
- }
109
+ if (!(buffer instanceof Uint8Array)) {
110
+ throw new Error('CodecHash only supports Uint8Array input');
111
+ }
112
+ const codec = varint.decode(buffer);
113
+ if (this.codecs[codec]) {
114
+ this.decode(buffer);
186
115
  }
187
- if (typeof buffer === 'string') {
188
- if (this.isHex(buffer))
189
- this.fromHex(buffer);
190
- if (this.isBase32(buffer))
191
- this.fromBs32(buffer);
116
+ else {
117
+ await this.encode(buffer);
192
118
  }
193
- if (typeof buffer === 'object')
194
- this.fromJSON(buffer);
195
119
  }
196
120
  decode(buffer) {
197
121
  this.encoded = buffer;
@@ -202,7 +126,7 @@ class CodecHash extends BasicInterface {
202
126
  this.size = varint.decode(buffer);
203
127
  this.digest = buffer.slice(varint.decode.bytes);
204
128
  if (this.digest.length !== this.size) {
205
- throw new Error(`hash length inconsistent: 0x${this.encoded.toString('hex')}`);
129
+ throw new Error(`hash length inconsistent: 0x${this.encoded.toString()}`);
206
130
  }
207
131
  // const discoCodec = new Codec(codec, this.codecs)
208
132
  this.name = this.discoCodec.name;
@@ -1 +1 @@
1
- {"version":3,"file":"codec-hash.js","sources":["../src/codec-hash.ts"],"sourcesContent":["import varint from 'varint'\nimport { CID } from 'multiformats/cid'\nimport { createSHA1, createSHA224, createSHA256, createSHA384, createSHA512 } from 'hash-wasm'\nimport BasicInterface, { jsonStringifyBigInt } from './basic-interface.js'\nimport Codec from './codec.js'\n\nconst MAX_WEBCRYPTO_INPUT = 0x7fffffff\nconst STREAMING_CHUNK_SIZE = 64 * 1024 * 1024\n\nconst toUint8Array = (buffer: ArrayBuffer | Uint8Array): Uint8Array =>\n buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)\n\nconst getStreamingHasher = async (hashVariant: number) => {\n switch (hashVariant) {\n case 1:\n return createSHA1()\n case 224:\n return createSHA224()\n case 256:\n return createSHA256()\n case 384:\n return createSHA384()\n case 512:\n return createSHA512()\n default:\n return null\n }\n}\n\nconst digestBuffer = async (hashVariant: number, buffer: ArrayBuffer | Uint8Array) => {\n const view = toUint8Array(buffer)\n if (view.byteLength >= MAX_WEBCRYPTO_INPUT) {\n const hasher = await getStreamingHasher(hashVariant)\n if (!hasher) {\n throw new Error(`unsupported streaming hash variant: ${hashVariant}`)\n }\n hasher.init()\n for (let offset = 0; offset < view.byteLength; offset += STREAMING_CHUNK_SIZE) {\n const end = Math.min(offset + STREAMING_CHUNK_SIZE, view.byteLength)\n hasher.update(view.subarray(offset, end))\n }\n const digest = hasher.digest('binary')\n return digest instanceof Uint8Array ? digest : new Uint8Array(digest)\n }\n const sourceView =\n view.byteOffset === 0 && view.byteLength === view.buffer.byteLength ? view : view.slice()\n const digest = await crypto.subtle.digest(`SHA-${hashVariant}`, sourceView.buffer)\n return new Uint8Array(digest)\n}\n\nconst parseCid = (input: string | Uint8Array | ArrayBuffer): CID | null => {\n try {\n if (typeof input === 'string') return CID.parse(input)\n const bytes = input instanceof Uint8Array ? input : new Uint8Array(input)\n return CID.decode(bytes)\n } catch {\n return null\n }\n}\n\ntype CodecHashOptions = {\n name: string\n codecs: object\n}\n\nexport default class CodecHash extends BasicInterface {\n codec: Uint8Array\n discoCodec: Codec\n size: number\n constructor(buffer, options: CodecHashOptions) {\n super()\n if (options?.name) this.name = options.name\n else this.name = 'disco-hash'\n if (options?.codecs) this.codecs = options.codecs\n return this.init(buffer)\n }\n\n async init(uint8Array) {\n if (uint8Array) {\n const cid =\n typeof uint8Array === 'string'\n ? parseCid(uint8Array)\n : uint8Array instanceof Uint8Array || uint8Array instanceof ArrayBuffer\n ? parseCid(uint8Array)\n : null\n if (cid) {\n await this.fromCID(cid)\n return this\n }\n if (uint8Array instanceof Uint8Array) {\n this.discoCodec = new Codec(uint8Array)\n const name = this.discoCodec.name\n\n if (name) {\n this.name = name\n this.decode(uint8Array)\n } else {\n await this.encode(uint8Array)\n }\n }\n\n if (typeof uint8Array === 'string') {\n if (this.isHex(uint8Array)) await this.fromHex(uint8Array)\n if (this.isBase32(uint8Array)) await this.fromBs32(uint8Array)\n else if (this.isBase58(uint8Array)) await this.fromBs58(uint8Array)\n else throw new Error(`unsupported string ${uint8Array}`)\n } else if (typeof uint8Array === 'object') await this.fromJSON(uint8Array)\n }\n return this\n }\n get prefix() {\n const length = this.length\n const uint8Array = new Uint8Array(length.length + this.discoCodec.codecBuffer.length)\n uint8Array.set(length)\n uint8Array.set(this.discoCodec.codecBuffer, length.length)\n\n return uint8Array\n }\n\n get length() {\n return varint.encode(this.size)\n }\n\n get buffer() {\n return this.encoded\n }\n\n get hash() {\n return this.encoded\n }\n\n fromJSON(json) {\n return this.encode(new TextEncoder().encode(JSON.stringify(json, jsonStringifyBigInt)))\n }\n\n async encode(buffer, name?) {\n if (!this.name && name) this.name = name\n if (!buffer) buffer = this.buffer\n this.discoCodec = new Codec(this.name)\n this.discoCodec.fromName(this.name)\n let hashAlg = this.discoCodec.hashAlg\n const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1])\n\n if (hashAlg.includes('dbl')) {\n hashAlg = hashAlg.replace('dbl-', '')\n buffer = await digestBuffer(hashVariant, buffer)\n }\n this.digest = await digestBuffer(hashVariant, buffer)\n\n this.size = this.digest.length\n\n this.codec = this.discoCodec.encode()\n this.codec = this.discoCodec.codecBuffer\n const uint8Array = new Uint8Array(this.digest.length + this.prefix.length)\n uint8Array.set(this.prefix)\n uint8Array.set(this.digest, this.prefix.length)\n\n this.encoded = uint8Array\n\n return this.encoded\n }\n\n async fromCID(cid: CID | string | Uint8Array | ArrayBuffer) {\n const parsed =\n cid instanceof CID\n ? cid\n : typeof cid === 'string' || cid instanceof Uint8Array\n ? parseCid(cid)\n : parseCid(cid as ArrayBuffer)\n if (!parsed) throw new Error('invalid cid input')\n\n if (!this.name) this.name = 'disco-hash'\n this.discoCodec = new Codec(this.name)\n this.discoCodec.fromName(this.name)\n\n this.digest = parsed.multihash.digest\n this.size = this.digest.length\n\n this.codec = this.discoCodec.encode()\n this.codec = this.discoCodec.codecBuffer\n\n const uint8Array = new Uint8Array(this.digest.length + this.prefix.length)\n uint8Array.set(this.prefix)\n uint8Array.set(this.digest, this.prefix.length)\n this.encoded = uint8Array\n return this.encoded\n }\n\n async validate(buffer) {\n if (Buffer.isBuffer(buffer)) {\n const codec = varint.decode(buffer)\n if (this.codecs[codec]) {\n this.decode(buffer)\n } else {\n await this.encode(buffer)\n }\n }\n if (typeof buffer === 'string') {\n if (this.isHex(buffer)) this.fromHex(buffer)\n if (this.isBase32(buffer)) this.fromBs32(buffer)\n }\n if (typeof buffer === 'object') this.fromJSON(buffer)\n }\n\n decode(buffer) {\n this.encoded = buffer\n const codec = varint.decode(buffer)\n\n this.discoCodec = new Codec(codec, this.codecs)\n // TODO: validate codec\n buffer = buffer.slice(varint.decode.bytes)\n this.size = varint.decode(buffer)\n this.digest = buffer.slice(varint.decode.bytes)\n if (this.digest.length !== this.size) {\n throw new Error(`hash length inconsistent: 0x${this.encoded.toString('hex')}`)\n }\n\n // const discoCodec = new Codec(codec, this.codecs)\n\n this.name = this.discoCodec.name\n\n this.size = this.digest.length\n\n return {\n codec: this.codec,\n name: this.name,\n size: this.size,\n length: this.length,\n digest: this.digest\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codec-hash.js","sources":["../src/codec-hash.ts"],"sourcesContent":["import varint from 'varint'\nimport { createSHA1, createSHA224, createSHA256, createSHA384, createSHA512 } from 'hash-wasm'\nimport BasicInterface from './basic-interface.js'\nimport Codec from './codec.js'\n\nconst createHasher = (hashVariant: number) => {\n switch (hashVariant) {\n case 1:\n return createSHA1()\n case 224:\n return createSHA224()\n case 256:\n return createSHA256()\n case 384:\n return createSHA384()\n case 512:\n return createSHA512()\n default:\n throw new Error(`unsupported hash variant: ${hashVariant}`)\n }\n}\n\nconst digestBuffer = async (\n hashVariant: number,\n buffer: ArrayBuffer | Uint8Array\n): Promise<Uint8Array> => {\n const view = buffer instanceof Uint8Array ? buffer : new Uint8Array(buffer)\n const hasher = await createHasher(hashVariant)\n hasher.init()\n hasher.update(view)\n const digest = hasher.digest('binary')\n return digest instanceof Uint8Array ? digest : new Uint8Array(digest)\n}\n\ntype CodecHashOptions = {\n name?: string\n codecs?: object\n}\n\nexport default class CodecHash extends BasicInterface {\n codec: Uint8Array\n discoCodec: Codec\n size: number\n codecs: object\n constructor(options: CodecHashOptions = { name: 'disco-hash', codecs: {} }) {\n super()\n if (options?.name) this.name = options.name\n else this.name = 'disco-hash'\n if (options?.codecs) this.codecs = options.codecs\n }\n\n async init(uint8Array: Uint8Array) {\n if (uint8Array) {\n if (!(uint8Array instanceof Uint8Array)) {\n throw new Error('CodecHash only supports Uint8Array input')\n }\n // For large buffers, only check first bytes for codec prefix\n // Codec prefixes are small (varint encoded), so 100 bytes is more than enough\n const checkBuffer = uint8Array.length > 100 ? uint8Array.subarray(0, 100) : uint8Array\n this.discoCodec = new Codec(checkBuffer)\n const name = this.discoCodec.name\n\n if (name) {\n this.name = name\n this.decode(uint8Array)\n } else {\n await this.encode(uint8Array)\n }\n }\n return this\n }\n get prefix() {\n const length = this.length\n const uint8Array = new Uint8Array(length.length + this.discoCodec.codecBuffer.length)\n uint8Array.set(length)\n uint8Array.set(this.discoCodec.codecBuffer, length.length)\n\n return uint8Array\n }\n\n get length() {\n return varint.encode(this.size)\n }\n\n get buffer() {\n return this.encoded\n }\n\n get hash() {\n return this.encoded\n }\n\n async encode(buffer, name?) {\n if (!this.name && name) this.name = name\n if (!buffer) throw new Error('buffer is required for encoding')\n this.discoCodec = new Codec(this.name)\n let hashAlg = this.discoCodec.hashAlg\n const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1])\n\n if (hashAlg.includes('dbl')) {\n hashAlg = hashAlg.replace('dbl-', '')\n buffer = await digestBuffer(hashVariant, buffer)\n }\n this.digest = await digestBuffer(hashVariant, buffer)\n\n this.size = this.digest.length\n\n this.codec = this.discoCodec.encode()\n this.codec = this.discoCodec.codecBuffer\n const uint8Array = new Uint8Array(this.digest.length + this.prefix.length)\n uint8Array.set(this.prefix)\n uint8Array.set(this.digest, this.prefix.length)\n\n this.encoded = uint8Array\n\n return this.encoded\n }\n\n async validate(buffer: Uint8Array) {\n if (!(buffer instanceof Uint8Array)) {\n throw new Error('CodecHash only supports Uint8Array input')\n }\n const codec = varint.decode(buffer)\n if (this.codecs[codec]) {\n this.decode(buffer)\n } else {\n await this.encode(buffer)\n }\n }\n\n decode(buffer) {\n this.encoded = buffer\n const codec = varint.decode(buffer)\n\n this.discoCodec = new Codec(codec, this.codecs)\n // TODO: validate codec\n buffer = buffer.slice(varint.decode.bytes)\n this.size = varint.decode(buffer)\n this.digest = buffer.slice(varint.decode.bytes)\n if (this.digest.length !== this.size) {\n throw new Error(`hash length inconsistent: 0x${this.encoded.toString()}`)\n }\n\n // const discoCodec = new Codec(codec, this.codecs)\n\n this.name = this.discoCodec.name\n\n this.size = this.digest.length\n\n return {\n codec: this.codec,\n name: this.name,\n size: this.size,\n length: this.length,\n digest: this.digest\n }\n }\n}\n"],"names":[],"mappings":"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"}
package/exports/index.js CHANGED
@@ -9,7 +9,6 @@ import '@vandeurenglenn/is-hex';
9
9
  import '@vandeurenglenn/proto-array';
10
10
  import '@vandeurenglenn/typed-array-utils';
11
11
  import 'varint';
12
- import 'multiformats/cid';
13
12
  import 'hash-wasm';
14
13
 
15
14
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import basicInterface from './basic-interface.js'\nimport formatInterface from './codec-format-interface.js'\nimport codecHash from './codec-hash.js'\nimport codec from './codec.js'\n\n/**\n * Codecs utility from @leofcoin/codecs\n */\nexport { codecs } from '@leofcoin/codecs'\n\n/**\n * Basic interface for codecs\n */\nexport const BasicInterface = basicInterface\n\n/**\n * Interface for defining codec formats\n */\nexport const FormatInterface = formatInterface\n\n/**\n * Codec hash utility class\n */\nexport const CodecHash = codecHash\n\n/**\n * Codec utility class\n */\nexport const Codec = codec\n"],"names":["basicInterface","formatInterface","codecHash","codec"],"mappings":";;;;;;;;;;;;;;AAUA;;AAEG;AACI,MAAM,cAAc,GAAGA;AAE9B;;AAEG;AACI,MAAM,eAAe,GAAGC;AAE/B;;AAEG;AACI,MAAM,SAAS,GAAGC;AAEzB;;AAEG;AACI,MAAM,KAAK,GAAGC;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import basicInterface from './basic-interface.js'\nimport formatInterface from './codec-format-interface.js'\nimport codecHash from './codec-hash.js'\nimport codec from './codec.js'\n\n/**\n * Codecs utility from @leofcoin/codecs\n */\nexport { codecs } from '@leofcoin/codecs'\n\n/**\n * Basic interface for codecs\n */\nexport const BasicInterface = basicInterface\n\n/**\n * Interface for defining codec formats\n */\nexport const FormatInterface = formatInterface\n\n/**\n * Codec hash utility class\n */\nexport const CodecHash = codecHash\n\n/**\n * Codec utility class\n */\nexport const Codec = codec\n"],"names":["basicInterface","formatInterface","codecHash","codec"],"mappings":";;;;;;;;;;;;;AAUA;;AAEG;AACI,MAAM,cAAc,GAAGA;AAE9B;;AAEG;AACI,MAAM,eAAe,GAAGC;AAE/B;;AAEG;AACI,MAAM,SAAS,GAAGC;AAEzB;;AAEG;AACI,MAAM,KAAK,GAAGC;;;;"}
@@ -4,7 +4,7 @@ export default class JsonInterface extends BasicInterface implements JsonInterfa
4
4
  #private;
5
5
  hashFormat: string;
6
6
  init(buffer: Uint8Array | ArrayBuffer | JsonInterface | string): JsonInterface;
7
- hasCodec(): boolean | undefined;
7
+ hasCodec(): boolean;
8
8
  decode(encoded?: string): object;
9
9
  encode(decoded?: object): Uint8Array;
10
10
  /**
@@ -20,7 +20,7 @@ export default class JsonInterface extends BasicInterface implements JsonInterfa
20
20
  /**
21
21
  * @return {PeernetHash}
22
22
  */
23
- get peernetHash(): Hash;
23
+ get peernetHash(): Promise<Hash>;
24
24
  /**
25
25
  * @return {peernetHash}
26
26
  */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leofcoin/codec-format-interface",
3
- "version": "1.7.15",
3
+ "version": "1.8.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "exports": {
@@ -34,7 +34,6 @@
34
34
  "@vandeurenglenn/proto-array": "^1.0.17",
35
35
  "@vandeurenglenn/typed-array-utils": "^1.2.0",
36
36
  "hash-wasm": "^4.12.0",
37
- "multiformats": "^13.3.2",
38
37
  "varint": "^6.0.0"
39
38
  },
40
39
  "devDependencies": {