@leofcoin/codec-format-interface 1.7.13 → 1.7.15

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.
@@ -8,6 +8,8 @@ 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
+ import 'hash-wasm';
11
13
 
12
14
  class FormatInterface extends BasicInterface {
13
15
  hashFormat;
@@ -20,12 +22,15 @@ class FormatInterface extends BasicInterface {
20
22
  this.#encoded = value;
21
23
  }
22
24
  init(buffer) {
23
- if (buffer instanceof FormatInterface && buffer?.name === this.name)
25
+ if (buffer instanceof FormatInterface && buffer?.name === this.name) {
24
26
  return buffer;
25
- else if (buffer instanceof Uint8Array)
27
+ }
28
+ else if (buffer instanceof Uint8Array) {
26
29
  this.fromUint8Array(buffer);
27
- else if (buffer instanceof ArrayBuffer)
30
+ }
31
+ else if (buffer instanceof ArrayBuffer) {
28
32
  this.fromArrayBuffer(buffer);
33
+ }
29
34
  else if (typeof buffer === 'string') {
30
35
  if (this.isHex(buffer))
31
36
  this.fromHex(buffer);
@@ -36,9 +41,13 @@ class FormatInterface extends BasicInterface {
36
41
  else
37
42
  this.fromString(buffer);
38
43
  }
39
- else {
44
+ else if (typeof buffer === 'object' && buffer !== null) {
40
45
  this.create(buffer);
41
46
  }
47
+ else {
48
+ // Explicitly reject all other types (number, boolean, undefined, symbol, function, null)
49
+ throw new TypeError(`Invalid input type for FormatInterface: ${typeof buffer}`);
50
+ }
42
51
  return this;
43
52
  }
44
53
  hasCodec() {
@@ -102,7 +111,13 @@ class FormatInterface extends BasicInterface {
102
111
  return `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
103
112
  }
104
113
  beforeHashing(decoded) {
105
- delete decoded.hash;
114
+ // Avoid copying if not needed
115
+ if (decoded && Object.prototype.hasOwnProperty.call(decoded, 'hash')) {
116
+ // Only copy if hash is present
117
+ const rest = { ...decoded };
118
+ delete rest.hash;
119
+ return rest;
120
+ }
106
121
  return decoded;
107
122
  }
108
123
  /**
@@ -128,13 +143,13 @@ class FormatInterface extends BasicInterface {
128
143
  this.encoded = buffer;
129
144
  return this.hasCodec()
130
145
  ? this.decode()
131
- : this.create(JSON.parse(new TextDecoder().decode(this.encoded), jsonParseBigInt));
146
+ : this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt));
132
147
  }
133
148
  fromArrayBuffer(buffer) {
134
149
  this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength);
135
150
  return this.hasCodec()
136
151
  ? this.decode()
137
- : this.create(JSON.parse(new TextDecoder().decode(this.encoded), jsonParseBigInt));
152
+ : this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt));
138
153
  }
139
154
  /**
140
155
  * @param {Object} data
@@ -155,3 +170,4 @@ class FormatInterface extends BasicInterface {
155
170
  }
156
171
 
157
172
  export { FormatInterface as default };
173
+ //# sourceMappingURL=codec-format-interface.js.map
@@ -0,0 +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":";;;;;;;;;;;;;AAQc,MAAO,eAAgB,SAAQ,cAAc,CAAA;AACzD,IAAA,UAAU;AACV,IAAA,KAAK;AACL,IAAA,QAAQ;AAER,IAAA,IAAI,OAAO,GAAA;QACT,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE;IACvC;IAEA,IAAI,OAAO,CAAC,KAAK,EAAA;AACf,QAAA,IAAI,CAAC,QAAQ,GAAG,KAAK;IACvB;AAEA,IAAA,IAAI,CAAC,MAA2D,EAAA;AAC9D,QAAA,IAAI,MAAM,YAAY,eAAe,IAAI,MAAM,EAAE,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE;AACnE,YAAA,OAAO,MAAM;QACf;AAAO,aAAA,IAAI,MAAM,YAAY,UAAU,EAAE;AACvC,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;QAC7B;AAAO,aAAA,IAAI,MAAM,YAAY,WAAW,EAAE;AACxC,YAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;QAC9B;AAAO,aAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;AACrC,YAAA,IAAI,IAAI,CAAC,KAAK,CAAC,MAAmB,CAAC;AAAE,gBAAA,IAAI,CAAC,OAAO,CAAC,MAAgB,CAAC;AAC9D,iBAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAsB,CAAC;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;AAChE,iBAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAsB,CAAC;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;;AAChE,gBAAA,IAAI,CAAC,UAAU,CAAC,MAAgB,CAAC;QACxC;aAAO,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE;AACxD,YAAA,IAAI,CAAC,MAAM,CAAC,MAAgB,CAAC;QAC/B;aAAO;;YAEL,MAAM,IAAI,SAAS,CAAC,CAAA,wCAAA,EAA2C,OAAO,MAAM,CAAA,CAAE,CAAC;QACjF;AACA,QAAA,OAAO,IAAI;IACb;IAEA,QAAQ,GAAA;QACN,IAAI,CAAC,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,KAAK;QAC/B,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QACrC,IAAI,KAAK,CAAC,IAAI;AAAE,YAAA,OAAO,IAAI;IAC7B;AAEA,IAAA,MAAM,CAAC,OAAoB,EAAA;AACzB,QAAA,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,OAAO;AACjC,QAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC;AAChC,QAAA,IAAI,KAAK,CAAC,WAAW,EAAE;YACrB,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;AACjD,YAAA,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI;YACtB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;;;;;QAM1C;aAAO;AACL,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,cAAA,CAAgB,CAAC;QACnC;QAEA,OAAO,IAAI,CAAC,OAAO;IACrB;AAEA,IAAA,MAAM,CAAC,OAAgB,EAAA;AACrB,QAAA,IAAI,OAAmB;AACvB,QAAA,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC,OAAO;QACjC,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QAElC,IAAI,OAAO,YAAY,UAAU;YAAE,OAAO,GAAG,OAAO;;AAC/C,YAAA,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;AAExC,QAAA,IAAI,KAAK,CAAC,WAAW,EAAE;AACrB,YAAA,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;AAC5E,YAAA,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;YACjC,UAAU,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC;AACjD,YAAA,IAAI,CAAC,OAAO,GAAG,UAAU;QAC3B;aAAO;AACL,YAAA,MAAM,IAAI,KAAK,CAAC,CAAA,aAAA,CAAe,CAAC;QAClC;QACA,OAAO,IAAI,CAAC,OAAO;IACrB;AACA;;;;AAIG;AACH,IAAA,WAAA,CAAY,MAAM,EAAE,KAAK,EAAE,OAAgD,EAAA;AACzE,QAAA,KAAK,EAAE;AACP,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,QAAA,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,GAAG,MAAM;QAEnE,IAAI,OAAO,EAAE,IAAI;AAAE,YAAA,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;AAE3C,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IACnB;AAEA,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;AACrD,QAAA,OAAO,GAAG,KAAK,CAAA,EAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;IAC1E;AAEA,IAAA,aAAa,CAAC,OAAiC,EAAA;;AAE7C,QAAA,IAAI,OAAO,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;;AAEpE,YAAA,MAAM,IAAI,GAAG,EAAE,GAAG,OAAO,EAAE;YAC3B,OAAO,IAAI,CAAC,IAAI;AAChB,YAAA,OAAO,IAAI;QACb;AACA,QAAA,OAAO,OAAO;IAChB;AAEA;;AAEG;AACH,IAAA,IAAI,WAAW,GAAA;AACb,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;;AAEvD,QAAA,OAAO,IAAIA,SAAI,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/C;AAEA;;AAEG;AACH,IAAA,MAAM,IAAI,GAAA;QACR,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK;AACjC,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;QACrD,MAAM,MAAM,GAAG,CAAA,EAAG,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;AAChF,QAAA,IAAI,CAAC,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAC,EAAE;QACtD,OAAO,IAAI,CAAC,KAAK;IACnB;AAEA,IAAA,cAAc,CAAC,MAAM,EAAA;AACnB,QAAA,IAAI,CAAC,OAAO,GAAG,MAAM;QACrB,OAAO,IAAI,CAAC,QAAQ;AAClB,cAAE,IAAI,CAAC,MAAM;cACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC;IAChG;AAEA,IAAA,eAAe,CAAC,MAAM,EAAA;AACpB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;QAC3E,OAAO,IAAI,CAAC,QAAQ;AAClB,cAAE,IAAI,CAAC,MAAM;cACX,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC;IAChG;AAEA;;AAEG;AACH,IAAA,MAAM,CAAC,IAAY,EAAA;QACjB,MAAM,OAAO,GAAG,EAAE;;QAElB,IAAI,IAAI,CAAC,IAAI;AAAE,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI;QACrC,IAAI,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE;AACzB,YAAA,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE;gBAC3B,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;YAC1B;AACA,YAAA,IAAI,CAAC,OAAO,GAAG,OAAO;;QAExB;IACF;AACD;;;;"}
@@ -1,3 +1,4 @@
1
+ import { CID } from 'multiformats/cid';
1
2
  import BasicInterface from './basic-interface.js';
2
3
  import Codec from './codec.js';
3
4
  type CodecHashOptions = {
@@ -16,6 +17,7 @@ export default class CodecHash extends BasicInterface {
16
17
  get hash(): Uint8Array;
17
18
  fromJSON(json: any): Promise<Uint8Array>;
18
19
  encode(buffer: any, name?: any): Promise<Uint8Array>;
20
+ fromCID(cid: CID | string | Uint8Array | ArrayBuffer): Promise<Uint8Array>;
19
21
  validate(buffer: any): Promise<void>;
20
22
  decode(buffer: any): {
21
23
  codec: Uint8Array;
@@ -1,4 +1,6 @@
1
1
  import varint from 'varint';
2
+ import { CID } from 'multiformats/cid';
3
+ import { createSHA512, createSHA384, createSHA256, createSHA224, createSHA1 } from 'hash-wasm';
2
4
  import BasicInterface, { jsonStringifyBigInt } from './basic-interface.js';
3
5
  import Codec from './codec.js';
4
6
  import '@vandeurenglenn/base32';
@@ -8,6 +10,55 @@ import '@vandeurenglenn/proto-array';
8
10
  import '@vandeurenglenn/typed-array-utils';
9
11
  import '@leofcoin/codecs';
10
12
 
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) => {
17
+ switch (hashVariant) {
18
+ case 1:
19
+ return createSHA1();
20
+ case 224:
21
+ return createSHA224();
22
+ case 256:
23
+ return createSHA256();
24
+ case 384:
25
+ return createSHA384();
26
+ case 512:
27
+ return createSHA512();
28
+ default:
29
+ return null;
30
+ }
31
+ };
32
+ 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
+ }
61
+ };
11
62
  class CodecHash extends BasicInterface {
12
63
  codec;
13
64
  discoCodec;
@@ -24,6 +75,15 @@ class CodecHash extends BasicInterface {
24
75
  }
25
76
  async init(uint8Array) {
26
77
  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;
86
+ }
27
87
  if (uint8Array instanceof Uint8Array) {
28
88
  this.discoCodec = new Codec(uint8Array);
29
89
  const name = this.discoCodec.name;
@@ -80,20 +140,31 @@ class CodecHash extends BasicInterface {
80
140
  const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1]);
81
141
  if (hashAlg.includes('dbl')) {
82
142
  hashAlg = hashAlg.replace('dbl-', '');
83
- // const hasher = await createKeccak(hashVariant)
84
- // await hasher.init()
85
- // hasher.update(buffer)
86
- // buffer = hasher.digest('binary')
87
- buffer = await crypto.subtle.digest(`SHA-${hashVariant}`, buffer);
88
- }
89
- // const hasher = await createKeccak(hashVariant)
90
- // await hasher.init()
91
- // hasher.update(buffer)
92
- // this.digest = hasher.digest('binary')
93
- this.digest = await crypto.subtle.digest(`SHA-${hashVariant}`, buffer);
94
- if (this.digest instanceof ArrayBuffer) {
95
- this.digest = new Uint8Array(this.digest);
143
+ buffer = await digestBuffer(hashVariant, buffer);
96
144
  }
145
+ this.digest = await digestBuffer(hashVariant, buffer);
146
+ this.size = this.digest.length;
147
+ this.codec = this.discoCodec.encode();
148
+ this.codec = this.discoCodec.codecBuffer;
149
+ const uint8Array = new Uint8Array(this.digest.length + this.prefix.length);
150
+ uint8Array.set(this.prefix);
151
+ uint8Array.set(this.digest, this.prefix.length);
152
+ this.encoded = uint8Array;
153
+ return this.encoded;
154
+ }
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;
97
168
  this.size = this.digest.length;
98
169
  this.codec = this.discoCodec.encode();
99
170
  this.codec = this.discoCodec.codecBuffer;
@@ -147,3 +218,4 @@ class CodecHash extends BasicInterface {
147
218
  }
148
219
 
149
220
  export { CodecHash as default };
221
+ //# sourceMappingURL=codec-hash.js.map
@@ -0,0 +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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"}
package/exports/codec.js CHANGED
@@ -109,3 +109,4 @@ class Codec extends BasicInterface {
109
109
  }
110
110
 
111
111
  export { Codec as default };
112
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sources":["../src/codec.ts"],"sourcesContent":["import varint from 'varint';\nimport { utils as codecUtils} from '@leofcoin/codecs'\nimport BasicInterface from './basic-interface.js'\n\nexport default class Codec extends BasicInterface {\n codecBuffer: Uint8Array\n codec: number\n hashAlg: string\n\n constructor(buffer: string | number | object | Uint8Array | ArrayBuffer) {\n super()\n if (buffer) {\n if (buffer instanceof Uint8Array) {\n const codec = varint.decode(buffer);\n const name = this.getCodecName(codec)\n if (name) {\n this.name = name\n this.encoded = buffer\n this.decode(buffer)\n } else {\n this.encode(Number(new TextDecoder().decode(buffer)))\n }\n } else if (buffer instanceof ArrayBuffer) {\n const codec = varint.decode(buffer);\n const name = this.getCodecName(codec)\n if (name) {\n this.name = name\n this.decode(buffer as Uint8Array)\n } else {\n this.encode(Number(new TextDecoder().decode(new Uint8Array(buffer))))\n }\n } else if (typeof buffer === 'string') {\n if (codecUtils.getCodec(buffer)) this.fromName(buffer)\n else if (this.isHex(buffer)) this.fromHex(buffer)\n else if (this.isBase32(buffer)) this.fromBs32(buffer)\n else if (this.isBase58(buffer)) this.fromBs58(buffer)\n else this.fromString(buffer)\n }\n if (!isNaN(buffer as number)) if (codecUtils.getCodec(buffer as number)) this.fromCodec(buffer as number)\n }\n }\n\n fromEncoded(encoded: Uint8Array): object {\n const codec = varint.decode(encoded);\n const name = this.getCodecName(codec)\n this.name = name\n this.encoded = encoded\n return this.decode(encoded)\n }\n\n getCodec(name: string): number {\n return codecUtils.getCodec(name)\n }\n\n getCodecName(codec: number): string {\n return codecUtils.getCodecName(codec)\n }\n\n getHashAlg(name: string): string {\n return codecUtils.getHashAlg(name)\n }\n\n fromCodec(codec: number) {\n this.name = this.getCodecName(codec)\n this.hashAlg = this.getHashAlg(this.name)\n this.codec = this.getCodec(this.name)\n this.codecBuffer = varint.encode(this.codec)\n this.decoded = {\n name: this.name,\n hashAlg: this.hashAlg,\n codec: this.codec,\n codecBuffer: this.codecBuffer\n }\n }\n\n fromName(name: string) {\n const codec = this.getCodec(name)\n this.name = name\n this.codec = codec\n this.hashAlg = this.getHashAlg(name)\n this.codecBuffer = varint.encode(this.codec)\n this.decoded = {\n name: this.name,\n hashAlg: this.hashAlg,\n codec: this.codec,\n codecBuffer: this.codecBuffer\n }\n }\n\n decode(encoded?: Uint8Array): object {\n encoded = encoded || this.encoded\n const codec = varint.decode(encoded);\n this.fromCodec(codec)\n return this.decoded\n }\n\n encode(codec?: number): Uint8Array {\n codec = codec || this.codec \n this.encoded = varint.encode(codec)\n return this.encoded\n }\n}\n"],"names":["codecUtils"],"mappings":"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"}
@@ -2,8 +2,23 @@ import basicInterface from './basic-interface.js';
2
2
  import formatInterface from './codec-format-interface.js';
3
3
  import codecHash from './codec-hash.js';
4
4
  import codec from './codec.js';
5
+ /**
6
+ * Codecs utility from @leofcoin/codecs
7
+ */
5
8
  export { codecs } from '@leofcoin/codecs';
9
+ /**
10
+ * Basic interface for codecs
11
+ */
6
12
  export declare const BasicInterface: typeof basicInterface;
13
+ /**
14
+ * Interface for defining codec formats
15
+ */
7
16
  export declare const FormatInterface: typeof formatInterface;
17
+ /**
18
+ * Codec hash utility class
19
+ */
8
20
  export declare const CodecHash: typeof codecHash;
21
+ /**
22
+ * Codec utility class
23
+ */
9
24
  export declare const Codec: typeof codec;
package/exports/index.js CHANGED
@@ -9,10 +9,25 @@ 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
+ import 'hash-wasm';
12
14
 
15
+ /**
16
+ * Basic interface for codecs
17
+ */
13
18
  const BasicInterface = BasicInterface$1;
19
+ /**
20
+ * Interface for defining codec formats
21
+ */
14
22
  const FormatInterface = FormatInterface$1;
23
+ /**
24
+ * Codec hash utility class
25
+ */
15
26
  const CodecHash = CodecHash$1;
27
+ /**
28
+ * Codec utility class
29
+ */
16
30
  const Codec = Codec$1;
17
31
 
18
32
  export { BasicInterface, Codec, CodecHash, FormatInterface };
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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;;;;"}
@@ -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;
7
+ hasCodec(): boolean | undefined;
8
8
  decode(encoded?: string): object;
9
9
  encode(decoded?: object): Uint8Array;
10
10
  /**
package/package.json CHANGED
@@ -1,47 +1,49 @@
1
- {
2
- "name": "@leofcoin/codec-format-interface",
3
- "version": "1.7.13",
4
- "description": "",
5
- "type": "module",
6
- "exports": {
7
- ".": "./exports/index.js"
8
- },
9
- "files": [
10
- "exports"
11
- ],
12
- "typings": "exports/index.d.ts",
13
- "scripts": {
14
- "build": "rollup -c",
15
- "test": "node test"
16
- },
17
- "repository": {
18
- "type": "git",
19
- "url": "git+https://github.com/leofcoin/codec-format-interface.git"
20
- },
21
- "keywords": [],
22
- "author": "",
23
- "license": "MIT",
24
- "bugs": {
25
- "url": "https://github.com/leofcoin/codec-format-interface/issues"
26
- },
27
- "homepage": "https://github.com/leofcoin/codec-format-interface#readme",
28
- "dependencies": {
29
- "@leofcoin/codecs": "^1.0.7",
30
- "@leofcoin/crypto": "^0.2.28",
31
- "@vandeurenglenn/base32": "^1.2.4",
32
- "@vandeurenglenn/base58": "^1.1.9",
33
- "@vandeurenglenn/is-hex": "^1.1.1",
34
- "@vandeurenglenn/proto-array": "^1.0.16",
35
- "@vandeurenglenn/typed-array-utils": "^1.2.0",
36
- "hash-wasm": "^4.11.0",
37
- "varint": "^6.0.0"
38
- },
39
- "devDependencies": {
40
- "@rollup/plugin-typescript": "^11.1.6",
41
- "@types/varint": "^6.0.3",
42
- "rollup": "^4.22.4",
43
- "tape": "^5.9.0",
44
- "tinybench": "^2.9.0",
45
- "tslib": "^2.7.0"
46
- }
47
- }
1
+ {
2
+ "name": "@leofcoin/codec-format-interface",
3
+ "version": "1.7.15",
4
+ "description": "",
5
+ "type": "module",
6
+ "exports": {
7
+ ".": "./exports/index.js"
8
+ },
9
+ "files": [
10
+ "exports"
11
+ ],
12
+ "typings": "exports/index.d.ts",
13
+ "scripts": {
14
+ "build": "rollup -c",
15
+ "test": "node test"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/leofcoin/codec-format-interface.git"
20
+ },
21
+ "keywords": [],
22
+ "author": "",
23
+ "license": "MIT",
24
+ "bugs": {
25
+ "url": "https://github.com/leofcoin/codec-format-interface/issues"
26
+ },
27
+ "homepage": "https://github.com/leofcoin/codec-format-interface#readme",
28
+ "dependencies": {
29
+ "@leofcoin/codecs": "^1.0.7",
30
+ "@leofcoin/crypto": "^0.2.37",
31
+ "@vandeurenglenn/base32": "^1.2.4",
32
+ "@vandeurenglenn/base58": "^1.1.9",
33
+ "@vandeurenglenn/is-hex": "^1.1.1",
34
+ "@vandeurenglenn/proto-array": "^1.0.17",
35
+ "@vandeurenglenn/typed-array-utils": "^1.2.0",
36
+ "hash-wasm": "^4.12.0",
37
+ "multiformats": "^13.3.2",
38
+ "varint": "^6.0.0"
39
+ },
40
+ "devDependencies": {
41
+ "@rollup/plugin-typescript": "^12.3.0",
42
+ "@types/varint": "^6.0.3",
43
+ "prettier": "^3.8.1",
44
+ "rollup": "^4.56.0",
45
+ "tape": "^5.9.0",
46
+ "tinybench": "^6.0.0",
47
+ "tslib": "^2.8.1"
48
+ }
49
+ }