@atcute/cid 2.2.4 → 2.2.6
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/dist/cid-link.d.ts +1 -5
- package/dist/cid-link.d.ts.map +1 -1
- package/dist/cid-link.js +16 -5
- package/dist/cid-link.js.map +1 -1
- package/dist/codec.d.ts +7 -6
- package/dist/codec.d.ts.map +1 -1
- package/dist/codec.js +15 -4
- package/dist/codec.js.map +1 -1
- package/lib/cid-link.ts +25 -5
- package/lib/codec.ts +26 -10
- package/package.json +3 -3
package/dist/cid-link.d.ts
CHANGED
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { type Cid } from './codec.js';
|
|
2
|
-
declare const CID_LINK_SYMBOL: unique symbol;
|
|
3
2
|
export interface CidLink {
|
|
4
3
|
$link: string;
|
|
5
4
|
}
|
|
6
5
|
export declare class CidLinkWrapper implements CidLink {
|
|
7
|
-
bytes: Uint8Array;
|
|
8
|
-
/** @internal */
|
|
9
|
-
readonly [CID_LINK_SYMBOL] = true;
|
|
6
|
+
readonly bytes: Uint8Array;
|
|
10
7
|
constructor(bytes: Uint8Array);
|
|
11
8
|
get $link(): string;
|
|
12
9
|
toJSON(): CidLink;
|
|
@@ -14,5 +11,4 @@ export declare class CidLinkWrapper implements CidLink {
|
|
|
14
11
|
export declare const isCidLink: (value: unknown) => value is CidLink;
|
|
15
12
|
export declare const toCidLink: (cid: Cid) => CidLink;
|
|
16
13
|
export declare const fromCidLink: (link: CidLink) => Cid;
|
|
17
|
-
export {};
|
|
18
14
|
//# sourceMappingURL=cid-link.d.ts.map
|
package/dist/cid-link.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cid-link.d.ts","sourceRoot":"","sources":["../lib/cid-link.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"cid-link.d.ts","sourceRoot":"","sources":["../lib/cid-link.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2C,KAAK,GAAG,EAAE,MAAM,YAAY,CAAC;AAO/E,MAAM,WAAW,OAAO;IACvB,KAAK,EAAE,MAAM,CAAC;CACd;AAED,qBAAa,cAAe,YAAW,OAAO;IAI7C,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;gBAEf,KAAK,EAAE,UAAU;IAI7B,IAAI,KAAK,IAAI,MAAM,CASlB;IAED,MAAM,IAAI,OAAO;CAGjB;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,OAOnD,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,KAAK,GAAG,KAAG,OASpC,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,MAAM,OAAO,KAAG,GAM3C,CAAC"}
|
package/dist/cid-link.js
CHANGED
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import { toBase32 } from '@atcute/multibase';
|
|
2
|
-
import { decode, fromString } from './codec.js';
|
|
2
|
+
import { CID_STRINGIFY_CACHE, decode, fromString } from './codec.js';
|
|
3
3
|
const CID_LINK_SYMBOL = Symbol.for('@atcute/cid-link-wrapper');
|
|
4
|
+
/** @internal */
|
|
5
|
+
export const CIDLINK_STRINGIFY_CACHE = new WeakMap();
|
|
4
6
|
export class CidLinkWrapper {
|
|
5
|
-
bytes;
|
|
6
7
|
/** @internal */
|
|
7
8
|
[CID_LINK_SYMBOL] = true;
|
|
9
|
+
bytes;
|
|
8
10
|
constructor(bytes) {
|
|
9
11
|
this.bytes = bytes;
|
|
10
12
|
}
|
|
11
13
|
get $link() {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
+
let str = CIDLINK_STRINGIFY_CACHE.get(this);
|
|
15
|
+
if (str === undefined) {
|
|
16
|
+
str = `b${toBase32(this.bytes)}`;
|
|
17
|
+
CIDLINK_STRINGIFY_CACHE.set(this, str);
|
|
18
|
+
}
|
|
19
|
+
return str;
|
|
14
20
|
}
|
|
15
21
|
toJSON() {
|
|
16
22
|
return { $link: this.$link };
|
|
@@ -22,7 +28,12 @@ export const isCidLink = (value) => {
|
|
|
22
28
|
(val !== null && typeof val === 'object' && typeof val.$link === 'string'));
|
|
23
29
|
};
|
|
24
30
|
export const toCidLink = (cid) => {
|
|
25
|
-
|
|
31
|
+
const inst = new CidLinkWrapper(cid.bytes);
|
|
32
|
+
const str = CID_STRINGIFY_CACHE.get(cid);
|
|
33
|
+
if (str !== undefined) {
|
|
34
|
+
CIDLINK_STRINGIFY_CACHE.set(inst, str);
|
|
35
|
+
}
|
|
36
|
+
return inst;
|
|
26
37
|
};
|
|
27
38
|
export const fromCidLink = (link) => {
|
|
28
39
|
if (link instanceof CidLinkWrapper) {
|
package/dist/cid-link.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cid-link.js","sourceRoot":"","sources":["../lib/cid-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,MAAM,EAAE,UAAU,EAAY,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"cid-link.js","sourceRoot":"","sources":["../lib/cid-link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,EAAE,UAAU,EAAY,MAAM,YAAY,CAAC;AAE/E,MAAM,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAE/D,gBAAgB;AAChB,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,OAAO,EAA0B,CAAC;AAM7E,MAAM,OAAO,cAAc;IAC1B,gBAAgB;IACP,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC;IAEzB,KAAK,CAAa;IAE3B,YAAY,KAAiB;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,IAAI,KAAK;QACR,IAAI,GAAG,GAAG,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACvB,GAAG,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAEjC,uBAAuB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;QAED,OAAO,GAAG,CAAC;IACZ,CAAC;IAED,MAAM;QACL,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;CACD;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAoB,EAAE;IAC7D,MAAM,GAAG,GAAG,KAAY,CAAC;IAEzB,OAAO,CACN,GAAG,YAAY,cAAc;QAC7B,CAAC,GAAG,KAAK,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAC1E,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,GAAQ,EAAW,EAAE;IAC9C,MAAM,IAAI,GAAG,IAAI,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEzC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACvB,uBAAuB,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAa,EAAO,EAAE;IACjD,IAAI,IAAI,YAAY,cAAc,EAAE,CAAC;QACpC,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,OAAO,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC,CAAC"}
|
package/dist/codec.d.ts
CHANGED
|
@@ -9,18 +9,18 @@ export declare const CODEC_DCBOR = 113;
|
|
|
9
9
|
*/
|
|
10
10
|
export interface Cid {
|
|
11
11
|
/** CID version, this is always `1` for CIDv1 */
|
|
12
|
-
version: number;
|
|
12
|
+
readonly version: number;
|
|
13
13
|
/** Multicodec type for the data, can be `0x55` for raw data or `0x71` for DAG-CBOR */
|
|
14
|
-
codec: number;
|
|
14
|
+
readonly codec: number;
|
|
15
15
|
/** Digest contents */
|
|
16
|
-
digest: {
|
|
16
|
+
readonly digest: {
|
|
17
17
|
/** Multicodec type for the digest, this is always `0x12` for SHA-256 */
|
|
18
|
-
codec: number;
|
|
18
|
+
readonly codec: number;
|
|
19
19
|
/** Raw hash bytes */
|
|
20
|
-
contents: Uint8Array;
|
|
20
|
+
readonly contents: Uint8Array;
|
|
21
21
|
};
|
|
22
22
|
/** Raw CID bytes */
|
|
23
|
-
bytes: Uint8Array;
|
|
23
|
+
readonly bytes: Uint8Array;
|
|
24
24
|
}
|
|
25
25
|
export declare const create: (codec: 85 | 113, data: Uint8Array) => Promise<Cid>;
|
|
26
26
|
export declare const createEmpty: (codec: 85 | 113) => Cid;
|
|
@@ -30,4 +30,5 @@ export declare const fromString: (input: string) => Cid;
|
|
|
30
30
|
export declare const toString: (cid: Cid) => string;
|
|
31
31
|
export declare const fromBinary: (input: Uint8Array) => Cid;
|
|
32
32
|
export declare const toBinary: (cid: Cid) => Uint8Array;
|
|
33
|
+
export declare const equals: (a: Cid, b: Cid) => boolean;
|
|
33
34
|
//# sourceMappingURL=codec.d.ts.map
|
package/dist/codec.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../lib/codec.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,WAAW,KAAO,CAAC;AAEhC,eAAO,MAAM,SAAS,KAAO,CAAC;AAC9B,eAAO,MAAM,WAAW,MAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../lib/codec.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,WAAW,IAAI,CAAC;AAC7B,eAAO,MAAM,WAAW,KAAO,CAAC;AAEhC,eAAO,MAAM,SAAS,KAAO,CAAC;AAC9B,eAAO,MAAM,WAAW,MAAO,CAAC;AAKhC;;;;GAIG;AACH,MAAM,WAAW,GAAG;IACnB,gDAAgD;IAChD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sFAAsF;IACtF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,QAAQ,CAAC,MAAM,EAAE;QAChB,wEAAwE;QACxE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,qBAAqB;QACrB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;KAC9B,CAAC;IACF,oBAAoB;IACpB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC3B;AAKD,eAAO,MAAM,MAAM,GAAU,OAAO,EAAI,GAAG,GAAI,EAAE,MAAM,UAAU,KAAG,OAAO,CAAC,GAAG,CA0B9E,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,EAAI,GAAG,GAAI,KAAG,GAehD,CAAC;AAEF,eAAO,MAAM,WAAW,GAAI,OAAO,UAAU,KAAG,CAAC,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,CA2CnF,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,OAAO,UAAU,KAAG,GAQ1C,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,GAgB1C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,KAAK,GAAG,KAAG,MASnC,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,OAAO,UAAU,KAAG,GAa9C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,KAAK,GAAG,KAAG,UAMnC,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,GAAG,GAAG,EAAE,GAAG,GAAG,KAAG,OAEvC,CAAC"}
|
package/dist/codec.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import { fromBase32, toBase32 } from '@atcute/multibase';
|
|
2
|
-
import { allocUnsafe, toSha256 } from '@atcute/uint8array';
|
|
2
|
+
import { allocUnsafe, toSha256, equals as isBufferEqual } from '@atcute/uint8array';
|
|
3
3
|
export const CID_VERSION = 1;
|
|
4
4
|
export const HASH_SHA256 = 0x12;
|
|
5
5
|
export const CODEC_RAW = 0x55;
|
|
6
6
|
export const CODEC_DCBOR = 0x71;
|
|
7
|
+
/** @internal */
|
|
8
|
+
export const CID_STRINGIFY_CACHE = new WeakMap();
|
|
7
9
|
// a SHA-256 CIDv1 is always going to be 36 bytes, that's 4 bytes for the
|
|
8
10
|
// header, and 32 bytes for the digest itself.
|
|
9
11
|
export const create = async (codec, data) => {
|
|
@@ -94,11 +96,17 @@ export const fromString = (input) => {
|
|
|
94
96
|
throw new RangeError(`cid too short`);
|
|
95
97
|
}
|
|
96
98
|
const bytes = fromBase32(input.slice(1));
|
|
97
|
-
|
|
99
|
+
const cid = decode(bytes);
|
|
100
|
+
CID_STRINGIFY_CACHE.set(cid, input);
|
|
101
|
+
return cid;
|
|
98
102
|
};
|
|
99
103
|
export const toString = (cid) => {
|
|
100
|
-
|
|
101
|
-
|
|
104
|
+
let str = CID_STRINGIFY_CACHE.get(cid);
|
|
105
|
+
if (str === undefined) {
|
|
106
|
+
str = `b${toBase32(cid.bytes)}`;
|
|
107
|
+
CID_STRINGIFY_CACHE.set(cid, str);
|
|
108
|
+
}
|
|
109
|
+
return str;
|
|
102
110
|
};
|
|
103
111
|
export const fromBinary = (input) => {
|
|
104
112
|
// 4 bytes + 1 byte for the 0x00 prefix
|
|
@@ -118,4 +126,7 @@ export const toBinary = (cid) => {
|
|
|
118
126
|
bytes.set(cid.bytes, 1);
|
|
119
127
|
return bytes;
|
|
120
128
|
};
|
|
129
|
+
export const equals = (a, b) => {
|
|
130
|
+
return isBufferEqual(a.bytes, b.bytes);
|
|
131
|
+
};
|
|
121
132
|
//# sourceMappingURL=codec.js.map
|
package/dist/codec.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../lib/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"codec.js","sourceRoot":"","sources":["../lib/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEpF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAC7B,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAEhC,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC;AAC9B,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC;AAEhC,gBAAgB;AAChB,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,OAAO,EAAe,CAAC;AAuB9D,yEAAyE;AACzE,8CAA8C;AAE9C,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,KAAkB,EAAE,IAAgB,EAAgB,EAAE;IAClF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,UAAU,CAAC,uBAAuB,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IAElC,KAAK,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;IACvB,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;IACjB,KAAK,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC;IACvB,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;IAEd,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAErB,MAAM,GAAG,GAAQ;QAChB,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE;YACP,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC;SAC/B;QACD,KAAK,EAAE,KAAK;KACZ,CAAC;IAEF,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAkB,EAAO,EAAE;IACtD,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEjC,MAAM,GAAG,GAAQ;QAChB,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE;YACP,KAAK,EAAE,WAAW;YAClB,QAAQ,EAAE,MAAM;SAChB;QACD,KAAK,EAAE,KAAK;KACZ,CAAC;IAEF,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAyC,EAAE;IACvF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE5B,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACvB,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAE5B,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAAC,+BAA+B,OAAO,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAClD,MAAM,IAAI,UAAU,CAAC,8BAA8B,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,UAAU,KAAK,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,UAAU,CAAC,qCAAqC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACvF,CAAC;IAED,IAAI,UAAU,KAAK,EAAE,IAAI,UAAU,KAAK,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,UAAU,CAAC,kCAAkC,UAAU,GAAG,CAAC,CAAC;IACvE,CAAC;IAED,IAAI,MAAM,GAAG,CAAC,GAAG,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,GAAG,GAAQ;QAChB,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE;YACP,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC;SAC3C;QACD,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC;KACxC,CAAC;IAEF,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAiB,EAAO,EAAE;IAChD,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAO,EAAE;IAChD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAC1C,MAAM,IAAI,WAAW,CAAC,+BAA+B,CAAC,CAAC;IACxD,CAAC;IAED,gEAAgE;IAChE,kEAAkE;IAClE,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,UAAU,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAE1B,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAQ,EAAU,EAAE;IAC5C,IAAI,GAAG,GAAG,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACvB,GAAG,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QAEhC,mBAAmB,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAiB,EAAO,EAAE;IACpD,uCAAuC;IACvC,wCAAwC;IACxC,IAAI,KAAK,CAAC,MAAM,KAAK,EAAE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/C,MAAM,IAAI,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,WAAW,CAAC,sBAAsB,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,GAAQ,EAAc,EAAE;IAChD,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAExB,OAAO,KAAK,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAM,EAAE,CAAM,EAAW,EAAE;IACjD,OAAO,aAAa,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC,CAAC"}
|
package/lib/cid-link.ts
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { toBase32 } from '@atcute/multibase';
|
|
2
2
|
|
|
3
|
-
import { decode, fromString, type Cid } from './codec.js';
|
|
3
|
+
import { CID_STRINGIFY_CACHE, decode, fromString, type Cid } from './codec.js';
|
|
4
4
|
|
|
5
5
|
const CID_LINK_SYMBOL = Symbol.for('@atcute/cid-link-wrapper');
|
|
6
6
|
|
|
7
|
+
/** @internal */
|
|
8
|
+
export const CIDLINK_STRINGIFY_CACHE = new WeakMap<CidLinkWrapper, string>();
|
|
9
|
+
|
|
7
10
|
export interface CidLink {
|
|
8
11
|
$link: string;
|
|
9
12
|
}
|
|
@@ -12,11 +15,21 @@ export class CidLinkWrapper implements CidLink {
|
|
|
12
15
|
/** @internal */
|
|
13
16
|
readonly [CID_LINK_SYMBOL] = true;
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
readonly bytes: Uint8Array;
|
|
19
|
+
|
|
20
|
+
constructor(bytes: Uint8Array) {
|
|
21
|
+
this.bytes = bytes;
|
|
22
|
+
}
|
|
16
23
|
|
|
17
24
|
get $link(): string {
|
|
18
|
-
|
|
19
|
-
|
|
25
|
+
let str = CIDLINK_STRINGIFY_CACHE.get(this);
|
|
26
|
+
if (str === undefined) {
|
|
27
|
+
str = `b${toBase32(this.bytes)}`;
|
|
28
|
+
|
|
29
|
+
CIDLINK_STRINGIFY_CACHE.set(this, str);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
return str;
|
|
20
33
|
}
|
|
21
34
|
|
|
22
35
|
toJSON(): CidLink {
|
|
@@ -34,7 +47,14 @@ export const isCidLink = (value: unknown): value is CidLink => {
|
|
|
34
47
|
};
|
|
35
48
|
|
|
36
49
|
export const toCidLink = (cid: Cid): CidLink => {
|
|
37
|
-
|
|
50
|
+
const inst = new CidLinkWrapper(cid.bytes);
|
|
51
|
+
const str = CID_STRINGIFY_CACHE.get(cid);
|
|
52
|
+
|
|
53
|
+
if (str !== undefined) {
|
|
54
|
+
CIDLINK_STRINGIFY_CACHE.set(inst, str);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return inst;
|
|
38
58
|
};
|
|
39
59
|
|
|
40
60
|
export const fromCidLink = (link: CidLink): Cid => {
|
package/lib/codec.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fromBase32, toBase32 } from '@atcute/multibase';
|
|
2
|
-
import { allocUnsafe, toSha256 } from '@atcute/uint8array';
|
|
2
|
+
import { allocUnsafe, toSha256, equals as isBufferEqual } from '@atcute/uint8array';
|
|
3
3
|
|
|
4
4
|
export const CID_VERSION = 1;
|
|
5
5
|
export const HASH_SHA256 = 0x12;
|
|
@@ -7,6 +7,9 @@ export const HASH_SHA256 = 0x12;
|
|
|
7
7
|
export const CODEC_RAW = 0x55;
|
|
8
8
|
export const CODEC_DCBOR = 0x71;
|
|
9
9
|
|
|
10
|
+
/** @internal */
|
|
11
|
+
export const CID_STRINGIFY_CACHE = new WeakMap<Cid, string>();
|
|
12
|
+
|
|
10
13
|
/**
|
|
11
14
|
* Represents a Content Identifier (CID), in particular, a limited subset of
|
|
12
15
|
* CIDv1 as described by DASL specifications.
|
|
@@ -14,18 +17,18 @@ export const CODEC_DCBOR = 0x71;
|
|
|
14
17
|
*/
|
|
15
18
|
export interface Cid {
|
|
16
19
|
/** CID version, this is always `1` for CIDv1 */
|
|
17
|
-
version: number;
|
|
20
|
+
readonly version: number;
|
|
18
21
|
/** Multicodec type for the data, can be `0x55` for raw data or `0x71` for DAG-CBOR */
|
|
19
|
-
codec: number;
|
|
22
|
+
readonly codec: number;
|
|
20
23
|
/** Digest contents */
|
|
21
|
-
digest: {
|
|
24
|
+
readonly digest: {
|
|
22
25
|
/** Multicodec type for the digest, this is always `0x12` for SHA-256 */
|
|
23
|
-
codec: number;
|
|
26
|
+
readonly codec: number;
|
|
24
27
|
/** Raw hash bytes */
|
|
25
|
-
contents: Uint8Array;
|
|
28
|
+
readonly contents: Uint8Array;
|
|
26
29
|
};
|
|
27
30
|
/** Raw CID bytes */
|
|
28
|
-
bytes: Uint8Array;
|
|
31
|
+
readonly bytes: Uint8Array;
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
// a SHA-256 CIDv1 is always going to be 36 bytes, that's 4 bytes for the
|
|
@@ -143,12 +146,21 @@ export const fromString = (input: string): Cid => {
|
|
|
143
146
|
}
|
|
144
147
|
|
|
145
148
|
const bytes = fromBase32(input.slice(1));
|
|
146
|
-
|
|
149
|
+
const cid = decode(bytes);
|
|
150
|
+
|
|
151
|
+
CID_STRINGIFY_CACHE.set(cid, input);
|
|
152
|
+
return cid;
|
|
147
153
|
};
|
|
148
154
|
|
|
149
155
|
export const toString = (cid: Cid): string => {
|
|
150
|
-
|
|
151
|
-
|
|
156
|
+
let str = CID_STRINGIFY_CACHE.get(cid);
|
|
157
|
+
if (str === undefined) {
|
|
158
|
+
str = `b${toBase32(cid.bytes)}`;
|
|
159
|
+
|
|
160
|
+
CID_STRINGIFY_CACHE.set(cid, str);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return str;
|
|
152
164
|
};
|
|
153
165
|
|
|
154
166
|
export const fromBinary = (input: Uint8Array): Cid => {
|
|
@@ -173,3 +185,7 @@ export const toBinary = (cid: Cid): Uint8Array => {
|
|
|
173
185
|
|
|
174
186
|
return bytes;
|
|
175
187
|
};
|
|
188
|
+
|
|
189
|
+
export const equals = (a: Cid, b: Cid): boolean => {
|
|
190
|
+
return isBufferEqual(a.bytes, b.bytes);
|
|
191
|
+
};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@atcute/cid",
|
|
4
|
-
"version": "2.2.
|
|
4
|
+
"version": "2.2.6",
|
|
5
5
|
"description": "lightweight DASL CID codec library for AT Protocol",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"atproto",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"@types/bun": "^1.2.21"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@atcute/
|
|
32
|
-
"@atcute/
|
|
31
|
+
"@atcute/multibase": "^1.1.6",
|
|
32
|
+
"@atcute/uint8array": "^1.0.5"
|
|
33
33
|
},
|
|
34
34
|
"scripts": {
|
|
35
35
|
"build": "tsc --project tsconfig.build.json",
|