@leofcoin/codec-format-interface 1.7.14 → 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.
- package/README.md +35 -10
- package/exports/README.md +8 -0
- package/exports/basic-interface.d.ts +4 -0
- package/exports/basic-interface.js +68 -14
- package/exports/basic-interface.js.map +1 -0
- package/exports/cjs/basic-interface.js +185 -0
- package/exports/cjs/basic-interface.js.map +1 -0
- package/exports/cjs/codec-format-interface.js +197 -0
- package/exports/cjs/codec-format-interface.js.map +1 -0
- package/exports/cjs/codec-hash.js +147 -0
- package/exports/cjs/codec-hash.js.map +1 -0
- package/exports/cjs/codec.js +114 -0
- package/exports/cjs/codec.js.map +1 -0
- package/exports/cjs/index.js +41 -0
- package/exports/cjs/index.js.map +1 -0
- package/exports/codec-format-interface.d.ts +5 -1
- package/exports/codec-format-interface.js +46 -8
- package/exports/codec-format-interface.js.map +1 -0
- package/exports/codec-hash.d.ts +6 -6
- package/exports/codec-hash.js +54 -58
- package/exports/codec-hash.js.map +1 -0
- package/exports/codec.js +1 -0
- package/exports/codec.js.map +1 -0
- package/exports/index.d.ts +15 -0
- package/exports/index.js +14 -0
- package/exports/index.js.map +1 -0
- package/exports/json-interface.d.ts +1 -1
- package/package.json +4 -3
|
@@ -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 /**\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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"}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var varint = require('varint');
|
|
4
|
+
var hashWasm = require('hash-wasm');
|
|
5
|
+
var basicInterface = require('./basic-interface.js');
|
|
6
|
+
var codec = require('./codec.js');
|
|
7
|
+
require('@vandeurenglenn/base32');
|
|
8
|
+
require('@vandeurenglenn/base58');
|
|
9
|
+
require('@vandeurenglenn/is-hex');
|
|
10
|
+
require('@vandeurenglenn/proto-array');
|
|
11
|
+
require('@vandeurenglenn/typed-array-utils');
|
|
12
|
+
require('@leofcoin/codecs');
|
|
13
|
+
|
|
14
|
+
const createHasher = (hashVariant) => {
|
|
15
|
+
switch (hashVariant) {
|
|
16
|
+
case 1:
|
|
17
|
+
return hashWasm.createSHA1();
|
|
18
|
+
case 224:
|
|
19
|
+
return hashWasm.createSHA224();
|
|
20
|
+
case 256:
|
|
21
|
+
return hashWasm.createSHA256();
|
|
22
|
+
case 384:
|
|
23
|
+
return hashWasm.createSHA384();
|
|
24
|
+
case 512:
|
|
25
|
+
return hashWasm.createSHA512();
|
|
26
|
+
default:
|
|
27
|
+
throw new Error(`unsupported hash variant: ${hashVariant}`);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
const digestBuffer = async (hashVariant, buffer) => {
|
|
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);
|
|
37
|
+
};
|
|
38
|
+
class CodecHash extends basicInterface.default {
|
|
39
|
+
codec;
|
|
40
|
+
discoCodec;
|
|
41
|
+
size;
|
|
42
|
+
codecs;
|
|
43
|
+
constructor(options = { name: 'disco-hash', codecs: {} }) {
|
|
44
|
+
super();
|
|
45
|
+
if (options?.name)
|
|
46
|
+
this.name = options.name;
|
|
47
|
+
else
|
|
48
|
+
this.name = 'disco-hash';
|
|
49
|
+
if (options?.codecs)
|
|
50
|
+
this.codecs = options.codecs;
|
|
51
|
+
}
|
|
52
|
+
async init(uint8Array) {
|
|
53
|
+
if (uint8Array) {
|
|
54
|
+
if (!(uint8Array instanceof Uint8Array)) {
|
|
55
|
+
throw new Error('CodecHash only supports Uint8Array input');
|
|
56
|
+
}
|
|
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);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
await this.encode(uint8Array);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return this;
|
|
71
|
+
}
|
|
72
|
+
get prefix() {
|
|
73
|
+
const length = this.length;
|
|
74
|
+
const uint8Array = new Uint8Array(length.length + this.discoCodec.codecBuffer.length);
|
|
75
|
+
uint8Array.set(length);
|
|
76
|
+
uint8Array.set(this.discoCodec.codecBuffer, length.length);
|
|
77
|
+
return uint8Array;
|
|
78
|
+
}
|
|
79
|
+
get length() {
|
|
80
|
+
return varint.encode(this.size);
|
|
81
|
+
}
|
|
82
|
+
get buffer() {
|
|
83
|
+
return this.encoded;
|
|
84
|
+
}
|
|
85
|
+
get hash() {
|
|
86
|
+
return this.encoded;
|
|
87
|
+
}
|
|
88
|
+
async encode(buffer, name) {
|
|
89
|
+
if (!this.name && name)
|
|
90
|
+
this.name = name;
|
|
91
|
+
if (!buffer)
|
|
92
|
+
throw new Error('buffer is required for encoding');
|
|
93
|
+
this.discoCodec = new codec(this.name);
|
|
94
|
+
let hashAlg = this.discoCodec.hashAlg;
|
|
95
|
+
const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1]);
|
|
96
|
+
if (hashAlg.includes('dbl')) {
|
|
97
|
+
hashAlg = hashAlg.replace('dbl-', '');
|
|
98
|
+
buffer = await digestBuffer(hashVariant, buffer);
|
|
99
|
+
}
|
|
100
|
+
this.digest = await digestBuffer(hashVariant, buffer);
|
|
101
|
+
this.size = this.digest.length;
|
|
102
|
+
this.codec = this.discoCodec.encode();
|
|
103
|
+
this.codec = this.discoCodec.codecBuffer;
|
|
104
|
+
const uint8Array = new Uint8Array(this.digest.length + this.prefix.length);
|
|
105
|
+
uint8Array.set(this.prefix);
|
|
106
|
+
uint8Array.set(this.digest, this.prefix.length);
|
|
107
|
+
this.encoded = uint8Array;
|
|
108
|
+
return this.encoded;
|
|
109
|
+
}
|
|
110
|
+
async validate(buffer) {
|
|
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);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
await this.encode(buffer);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
decode(buffer) {
|
|
123
|
+
this.encoded = buffer;
|
|
124
|
+
const codec$1 = varint.decode(buffer);
|
|
125
|
+
this.discoCodec = new codec(codec$1, this.codecs);
|
|
126
|
+
// TODO: validate codec
|
|
127
|
+
buffer = buffer.slice(varint.decode.bytes);
|
|
128
|
+
this.size = varint.decode(buffer);
|
|
129
|
+
this.digest = buffer.slice(varint.decode.bytes);
|
|
130
|
+
if (this.digest.length !== this.size) {
|
|
131
|
+
throw new Error(`hash length inconsistent: 0x${this.encoded.toString()}`);
|
|
132
|
+
}
|
|
133
|
+
// const discoCodec = new Codec(codec, this.codecs)
|
|
134
|
+
this.name = this.discoCodec.name;
|
|
135
|
+
this.size = this.digest.length;
|
|
136
|
+
return {
|
|
137
|
+
codec: this.codec,
|
|
138
|
+
name: this.name,
|
|
139
|
+
size: this.size,
|
|
140
|
+
length: this.length,
|
|
141
|
+
digest: this.digest
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
module.exports = CodecHash;
|
|
147
|
+
//# 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 { 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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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var varint = require('varint');
|
|
4
|
+
var codecs = require('@leofcoin/codecs');
|
|
5
|
+
var basicInterface = require('./basic-interface.js');
|
|
6
|
+
require('@vandeurenglenn/base32');
|
|
7
|
+
require('@vandeurenglenn/base58');
|
|
8
|
+
require('@vandeurenglenn/is-hex');
|
|
9
|
+
require('@vandeurenglenn/proto-array');
|
|
10
|
+
require('@vandeurenglenn/typed-array-utils');
|
|
11
|
+
|
|
12
|
+
class Codec extends basicInterface.default {
|
|
13
|
+
codecBuffer;
|
|
14
|
+
codec;
|
|
15
|
+
hashAlg;
|
|
16
|
+
constructor(buffer) {
|
|
17
|
+
super();
|
|
18
|
+
if (buffer) {
|
|
19
|
+
if (buffer instanceof Uint8Array) {
|
|
20
|
+
const codec = varint.decode(buffer);
|
|
21
|
+
const name = this.getCodecName(codec);
|
|
22
|
+
if (name) {
|
|
23
|
+
this.name = name;
|
|
24
|
+
this.encoded = buffer;
|
|
25
|
+
this.decode(buffer);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
this.encode(Number(new TextDecoder().decode(buffer)));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
else if (buffer instanceof ArrayBuffer) {
|
|
32
|
+
const codec = varint.decode(buffer);
|
|
33
|
+
const name = this.getCodecName(codec);
|
|
34
|
+
if (name) {
|
|
35
|
+
this.name = name;
|
|
36
|
+
this.decode(buffer);
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
this.encode(Number(new TextDecoder().decode(new Uint8Array(buffer))));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
else if (typeof buffer === 'string') {
|
|
43
|
+
if (codecs.utils.getCodec(buffer))
|
|
44
|
+
this.fromName(buffer);
|
|
45
|
+
else if (this.isHex(buffer))
|
|
46
|
+
this.fromHex(buffer);
|
|
47
|
+
else if (this.isBase32(buffer))
|
|
48
|
+
this.fromBs32(buffer);
|
|
49
|
+
else if (this.isBase58(buffer))
|
|
50
|
+
this.fromBs58(buffer);
|
|
51
|
+
else
|
|
52
|
+
this.fromString(buffer);
|
|
53
|
+
}
|
|
54
|
+
if (!isNaN(buffer))
|
|
55
|
+
if (codecs.utils.getCodec(buffer))
|
|
56
|
+
this.fromCodec(buffer);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
fromEncoded(encoded) {
|
|
60
|
+
const codec = varint.decode(encoded);
|
|
61
|
+
const name = this.getCodecName(codec);
|
|
62
|
+
this.name = name;
|
|
63
|
+
this.encoded = encoded;
|
|
64
|
+
return this.decode(encoded);
|
|
65
|
+
}
|
|
66
|
+
getCodec(name) {
|
|
67
|
+
return codecs.utils.getCodec(name);
|
|
68
|
+
}
|
|
69
|
+
getCodecName(codec) {
|
|
70
|
+
return codecs.utils.getCodecName(codec);
|
|
71
|
+
}
|
|
72
|
+
getHashAlg(name) {
|
|
73
|
+
return codecs.utils.getHashAlg(name);
|
|
74
|
+
}
|
|
75
|
+
fromCodec(codec) {
|
|
76
|
+
this.name = this.getCodecName(codec);
|
|
77
|
+
this.hashAlg = this.getHashAlg(this.name);
|
|
78
|
+
this.codec = this.getCodec(this.name);
|
|
79
|
+
this.codecBuffer = varint.encode(this.codec);
|
|
80
|
+
this.decoded = {
|
|
81
|
+
name: this.name,
|
|
82
|
+
hashAlg: this.hashAlg,
|
|
83
|
+
codec: this.codec,
|
|
84
|
+
codecBuffer: this.codecBuffer
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
fromName(name) {
|
|
88
|
+
const codec = this.getCodec(name);
|
|
89
|
+
this.name = name;
|
|
90
|
+
this.codec = codec;
|
|
91
|
+
this.hashAlg = this.getHashAlg(name);
|
|
92
|
+
this.codecBuffer = varint.encode(this.codec);
|
|
93
|
+
this.decoded = {
|
|
94
|
+
name: this.name,
|
|
95
|
+
hashAlg: this.hashAlg,
|
|
96
|
+
codec: this.codec,
|
|
97
|
+
codecBuffer: this.codecBuffer
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
decode(encoded) {
|
|
101
|
+
encoded = encoded || this.encoded;
|
|
102
|
+
const codec = varint.decode(encoded);
|
|
103
|
+
this.fromCodec(codec);
|
|
104
|
+
return this.decoded;
|
|
105
|
+
}
|
|
106
|
+
encode(codec) {
|
|
107
|
+
codec = codec || this.codec;
|
|
108
|
+
this.encoded = varint.encode(codec);
|
|
109
|
+
return this.encoded;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
module.exports = Codec;
|
|
114
|
+
//# 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":["BasicInterface","codecUtils"],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var basicInterface = require('./basic-interface.js');
|
|
4
|
+
var codecFormatInterface = require('./codec-format-interface.js');
|
|
5
|
+
var codecHash = require('./codec-hash.js');
|
|
6
|
+
var codec = require('./codec.js');
|
|
7
|
+
var codecs = require('@leofcoin/codecs');
|
|
8
|
+
require('@vandeurenglenn/base32');
|
|
9
|
+
require('@vandeurenglenn/base58');
|
|
10
|
+
require('@vandeurenglenn/is-hex');
|
|
11
|
+
require('@vandeurenglenn/proto-array');
|
|
12
|
+
require('@vandeurenglenn/typed-array-utils');
|
|
13
|
+
require('varint');
|
|
14
|
+
require('hash-wasm');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Basic interface for codecs
|
|
18
|
+
*/
|
|
19
|
+
const BasicInterface = basicInterface.default;
|
|
20
|
+
/**
|
|
21
|
+
* Interface for defining codec formats
|
|
22
|
+
*/
|
|
23
|
+
const FormatInterface = codecFormatInterface;
|
|
24
|
+
/**
|
|
25
|
+
* Codec hash utility class
|
|
26
|
+
*/
|
|
27
|
+
const CodecHash = codecHash;
|
|
28
|
+
/**
|
|
29
|
+
* Codec utility class
|
|
30
|
+
*/
|
|
31
|
+
const Codec = codec;
|
|
32
|
+
|
|
33
|
+
Object.defineProperty(exports, "codecs", {
|
|
34
|
+
enumerable: true,
|
|
35
|
+
get: function () { return codecs.codecs; }
|
|
36
|
+
});
|
|
37
|
+
exports.BasicInterface = BasicInterface;
|
|
38
|
+
exports.Codec = Codec;
|
|
39
|
+
exports.CodecHash = CodecHash;
|
|
40
|
+
exports.FormatInterface = FormatInterface;
|
|
41
|
+
//# 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"],"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;;;;;;;;;;;"}
|
|
@@ -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,6 +8,7 @@ import '@vandeurenglenn/proto-array';
|
|
|
8
8
|
import '@vandeurenglenn/typed-array-utils';
|
|
9
9
|
import 'varint';
|
|
10
10
|
import '@leofcoin/codecs';
|
|
11
|
+
import 'hash-wasm';
|
|
11
12
|
|
|
12
13
|
class FormatInterface extends BasicInterface {
|
|
13
14
|
hashFormat;
|
|
@@ -20,12 +21,15 @@ class FormatInterface extends BasicInterface {
|
|
|
20
21
|
this.#encoded = value;
|
|
21
22
|
}
|
|
22
23
|
init(buffer) {
|
|
23
|
-
if (buffer instanceof FormatInterface && buffer?.name === this.name)
|
|
24
|
+
if (buffer instanceof FormatInterface && buffer?.name === this.name) {
|
|
24
25
|
return buffer;
|
|
25
|
-
|
|
26
|
+
}
|
|
27
|
+
else if (buffer instanceof Uint8Array) {
|
|
26
28
|
this.fromUint8Array(buffer);
|
|
27
|
-
|
|
29
|
+
}
|
|
30
|
+
else if (buffer instanceof ArrayBuffer) {
|
|
28
31
|
this.fromArrayBuffer(buffer);
|
|
32
|
+
}
|
|
29
33
|
else if (typeof buffer === 'string') {
|
|
30
34
|
if (this.isHex(buffer))
|
|
31
35
|
this.fromHex(buffer);
|
|
@@ -36,9 +40,13 @@ class FormatInterface extends BasicInterface {
|
|
|
36
40
|
else
|
|
37
41
|
this.fromString(buffer);
|
|
38
42
|
}
|
|
39
|
-
else {
|
|
43
|
+
else if (typeof buffer === 'object' && buffer !== null) {
|
|
40
44
|
this.create(buffer);
|
|
41
45
|
}
|
|
46
|
+
else {
|
|
47
|
+
// Explicitly reject all other types (number, boolean, undefined, symbol, function, null)
|
|
48
|
+
throw new TypeError(`Invalid input type for FormatInterface: ${typeof buffer}`);
|
|
49
|
+
}
|
|
42
50
|
return this;
|
|
43
51
|
}
|
|
44
52
|
hasCodec() {
|
|
@@ -101,17 +109,46 @@ class FormatInterface extends BasicInterface {
|
|
|
101
109
|
const upper = this.hashFormat.charAt(0).toUpperCase();
|
|
102
110
|
return `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
|
|
103
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
|
+
}
|
|
104
124
|
beforeHashing(decoded) {
|
|
105
|
-
|
|
125
|
+
// Avoid copying if not needed
|
|
126
|
+
if (decoded && Object.prototype.hasOwnProperty.call(decoded, 'hash')) {
|
|
127
|
+
// Only copy if hash is present
|
|
128
|
+
const rest = { ...decoded };
|
|
129
|
+
delete rest.hash;
|
|
130
|
+
return rest;
|
|
131
|
+
}
|
|
106
132
|
return decoded;
|
|
107
133
|
}
|
|
108
134
|
/**
|
|
109
135
|
* @return {PeernetHash}
|
|
110
136
|
*/
|
|
111
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
|
|
112
148
|
const decoded = this.beforeHashing({ ...this.decoded });
|
|
113
149
|
// @ts-ignore
|
|
114
|
-
|
|
150
|
+
const hash = new CodecHash({ name: this.name });
|
|
151
|
+
return hash.init(decoded);
|
|
115
152
|
}
|
|
116
153
|
/**
|
|
117
154
|
* @return {peernetHash}
|
|
@@ -128,13 +165,13 @@ class FormatInterface extends BasicInterface {
|
|
|
128
165
|
this.encoded = buffer;
|
|
129
166
|
return this.hasCodec()
|
|
130
167
|
? this.decode()
|
|
131
|
-
: this.create(JSON.parse(
|
|
168
|
+
: this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt));
|
|
132
169
|
}
|
|
133
170
|
fromArrayBuffer(buffer) {
|
|
134
171
|
this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength);
|
|
135
172
|
return this.hasCodec()
|
|
136
173
|
? this.decode()
|
|
137
|
-
: this.create(JSON.parse(
|
|
174
|
+
: this.create(JSON.parse(BasicInterface._textDecoder.decode(this.encoded), jsonParseBigInt));
|
|
138
175
|
}
|
|
139
176
|
/**
|
|
140
177
|
* @param {Object} data
|
|
@@ -155,3 +192,4 @@ class FormatInterface extends BasicInterface {
|
|
|
155
192
|
}
|
|
156
193
|
|
|
157
194
|
export { FormatInterface as default };
|
|
195
|
+
//# 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 /**\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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"}
|
package/exports/codec-hash.d.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
import BasicInterface from './basic-interface.js';
|
|
2
2
|
import Codec from './codec.js';
|
|
3
3
|
type CodecHashOptions = {
|
|
4
|
-
name
|
|
5
|
-
codecs
|
|
4
|
+
name?: string;
|
|
5
|
+
codecs?: object;
|
|
6
6
|
};
|
|
7
7
|
export default class CodecHash extends BasicInterface {
|
|
8
8
|
codec: Uint8Array;
|
|
9
9
|
discoCodec: Codec;
|
|
10
10
|
size: number;
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
codecs: object;
|
|
12
|
+
constructor(options?: CodecHashOptions);
|
|
13
|
+
init(uint8Array: Uint8Array): Promise<this>;
|
|
13
14
|
get prefix(): Uint8Array;
|
|
14
15
|
get length(): number[];
|
|
15
16
|
get buffer(): Uint8Array;
|
|
16
17
|
get hash(): Uint8Array;
|
|
17
|
-
fromJSON(json: any): Promise<Uint8Array>;
|
|
18
18
|
encode(buffer: any, name?: any): Promise<Uint8Array>;
|
|
19
|
-
validate(buffer:
|
|
19
|
+
validate(buffer: Uint8Array): Promise<void>;
|
|
20
20
|
decode(buffer: any): {
|
|
21
21
|
codec: Uint8Array;
|
|
22
22
|
name: string;
|