@atcute/cid 1.0.0 → 1.0.2

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @atcute/cid
2
2
 
3
- create and parse AT Protocol-blessed CIDv1 format
3
+ CIDv1 codec library.
4
4
 
5
5
  ```ts
6
6
  const parsed = parse('bafyreihffx5a2e7k5uwrmmgofbvzujc5cmw5h4espouwuxt3liqoflx3ee');
package/dist/index.d.ts CHANGED
@@ -63,3 +63,5 @@ export declare const create: (code: number, input: Uint8Array) => Promise<CID>;
63
63
  * Serialize CID into a string
64
64
  */
65
65
  export declare const format: (cid: CID) => string;
66
+ export declare const createDigest: (code: number, digest: Uint8Array) => Digest;
67
+ export declare const encode: (version: number, code: number, multihash: Uint8Array) => Uint8Array;
package/dist/index.js CHANGED
@@ -73,7 +73,7 @@ export const decodeFirst = (bytes) => {
73
73
  version: 1,
74
74
  code: specs.codec,
75
75
  digest: digest,
76
- bytes: encodeCID(1, specs.codec, digest.bytes),
76
+ bytes: bytes.subarray(0, specs.size),
77
77
  };
78
78
  return [cid, bytes.subarray(specs.size)];
79
79
  };
@@ -92,7 +92,7 @@ export const decode = (bytes) => {
92
92
  */
93
93
  export const create = async (code, input) => {
94
94
  const digest = createDigest(0x12, new Uint8Array(await crypto.subtle.digest('sha-256', input)));
95
- const bytes = encodeCID(1, code, digest.bytes);
95
+ const bytes = encode(1, code, digest.bytes);
96
96
  return {
97
97
  version: 1,
98
98
  code: code,
@@ -106,7 +106,7 @@ export const create = async (code, input) => {
106
106
  export const format = (cid) => {
107
107
  return 'b' + base32.encode(cid.bytes);
108
108
  };
109
- const createDigest = (code, digest) => {
109
+ export const createDigest = (code, digest) => {
110
110
  const size = digest.byteLength;
111
111
  const sizeOffset = varint.encodingLength(code);
112
112
  const digestOffset = sizeOffset + varint.encodingLength(size);
@@ -121,7 +121,7 @@ const createDigest = (code, digest) => {
121
121
  bytes: bytes,
122
122
  };
123
123
  };
124
- const encodeCID = (version, code, multihash) => {
124
+ export const encode = (version, code, multihash) => {
125
125
  const codeOffset = varint.encodingLength(version);
126
126
  const hashOffset = codeOffset + varint.encodingLength(code);
127
127
  const bytes = new Uint8Array(hashOffset + multihash.byteLength);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AACzC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAkCzC;;GAEG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,GAAW,EAAO,EAAE;IACzC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,YAAwB,EAAgB,EAAE;IACjE,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,IAAI,GAAG,GAAW,EAAE;QACzB,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACjE,MAAM,IAAI,MAAM,CAAC;QACjB,OAAO,CAAC,CAAC;IACV,CAAC,CAAC;IAEF,IAAI,OAAO,GAAG,IAAI,EAAE,CAAC;IACrB,IAAI,KAAK,GAAG,IAAI,CAAC,CAAC,SAAS;IAC3B,IAAK,OAAkB,KAAK,EAAE,EAAE,CAAC;QAChC,QAAQ;QACR,OAAO,GAAG,CAAC,CAAC;QACZ,MAAM,GAAG,CAAC,CAAC;IACZ,CAAC;SAAM,CAAC;QACP,KAAK,GAAG,IAAI,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;QACnB,MAAM,IAAI,UAAU,CAAC,yBAAyB,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC;IAC1B,MAAM,aAAa,GAAG,IAAI,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAG,IAAI,EAAE,CAAC;IAC1B,MAAM,IAAI,GAAG,MAAM,GAAG,UAAU,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,GAAG,UAAU,CAAC;IAExC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAC3E,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAiB,EAAqC,EAAE;IACnF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,aAAa,CAAC;IACpD,MAAM,cAAc,GAAG,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;IAEpF,IAAI,cAAc,CAAC,UAAU,KAAK,KAAK,CAAC,aAAa,EAAE,CAAC;QACvD,MAAM,IAAI,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,WAAW,GAAG,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IAEpF,MAAM,MAAM,GAAW;QACtB,IAAI,EAAE,KAAK,CAAC,aAAa;QACzB,IAAI,EAAE,KAAK,CAAC,aAAa;QACzB,MAAM,EAAE,WAAW;QACnB,KAAK,EAAE,cAAc;KACrB,CAAC;IAEF,MAAM,GAAG,GAAQ;QAChB,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,KAAK,CAAC,KAAK;QACjB,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC;KACpC,CAAC;IAEF,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC;AAEF;;GAEG;AACH,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,KAAK,CAAC,sBAAsB,CAAC,CAAC;IACzC,CAAC;IAED,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,KAAK,EAAE,IAAY,EAAE,KAAiB,EAAgB,EAAE;IAC7E,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAE5C,OAAO;QACN,OAAO,EAAE,CAAC;QACV,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,KAAK;KACZ,CAAC;AACH,CAAC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAQ,EAAU,EAAE;IAC1C,OAAO,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,MAAkB,EAAU,EAAE;IACxE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;IAC/B,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAE9D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAClD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACvC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEhC,OAAO;QACN,IAAI,EAAE,IAAI;QACV,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,MAAM;QACd,KAAK,EAAE,KAAK;KACZ,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAAe,EAAE,IAAY,EAAE,SAAqB,EAAc,EAAE;IAC1F,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IAE5D,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACjC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACvC,KAAK,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAEjC,OAAO,KAAK,CAAC;AACd,CAAC,CAAC"}
package/lib/index.ts ADDED
@@ -0,0 +1,189 @@
1
+ /**
2
+ * @module
3
+ * Bare minimum implementation for creating, parsing, and formatting
4
+ * AT Protocol-blessed CIDv1 format.
5
+ *
6
+ * As specified by AT Protocol, the blessed format is:
7
+ * - Multibase: `base32` (b)
8
+ * - Multicodec: `dag-cbor` (0x71) for record, `raw` (0x55) for blobs
9
+ * - Multihash: `sha-256` (0x12)
10
+ */
11
+
12
+ import * as base32 from '@atcute/base32';
13
+ import * as varint from '@atcute/varint';
14
+
15
+ /**
16
+ * Raw digest information
17
+ */
18
+ export interface Digest {
19
+ code: number;
20
+ size: number;
21
+ digest: Uint8Array;
22
+ bytes: Uint8Array;
23
+ }
24
+
25
+ /**
26
+ * CID information
27
+ */
28
+ export interface CID {
29
+ version: number;
30
+ code: number;
31
+ digest: Digest;
32
+ bytes: Uint8Array;
33
+ }
34
+
35
+ /**
36
+ * Information regarding CID buffer being inspected
37
+ */
38
+ export interface InspectedCID {
39
+ version: number;
40
+ codec: number;
41
+ multihashCode: number;
42
+ digestSize: number;
43
+ multihashSize: number;
44
+ size: number;
45
+ }
46
+
47
+ /**
48
+ * Parse a CID string
49
+ */
50
+ export const parse = (cid: string): CID => {
51
+ if (cid[0] !== 'b') {
52
+ throw new Error(`only base32 cidv1 is supported`);
53
+ }
54
+
55
+ const bytes = base32.decode(cid.slice(1));
56
+ return decode(bytes);
57
+ };
58
+
59
+ /**
60
+ * Provides information regarding the CID buffer
61
+ */
62
+ export const inspect = (initialBytes: Uint8Array): InspectedCID => {
63
+ let offset = 0;
64
+ const next = (): number => {
65
+ const [i, length] = varint.decode(initialBytes.subarray(offset));
66
+ offset += length;
67
+ return i;
68
+ };
69
+
70
+ let version = next();
71
+ let codec = 0x70; // dag-pb
72
+ if ((version as number) === 18) {
73
+ // CIDv0
74
+ version = 0;
75
+ offset = 0;
76
+ } else {
77
+ codec = next();
78
+ }
79
+
80
+ if (version !== 1) {
81
+ throw new RangeError(`only cidv1 is supported`);
82
+ }
83
+
84
+ const prefixSize = offset;
85
+ const multihashCode = next();
86
+ const digestSize = next();
87
+ const size = offset + digestSize;
88
+ const multihashSize = size - prefixSize;
89
+
90
+ return { version, codec, multihashCode, digestSize, multihashSize, size };
91
+ };
92
+
93
+ /**
94
+ * Decode the first CID contained, and return the remainder.
95
+ * @param bytes Buffer to decode
96
+ * @returns A tuple containing the first CID in the buffer, and the remainder
97
+ */
98
+ export const decodeFirst = (bytes: Uint8Array): [cid: CID, remainder: Uint8Array] => {
99
+ const specs = inspect(bytes);
100
+ const prefixSize = specs.size - specs.multihashSize;
101
+ const multihashBytes = bytes.subarray(prefixSize, prefixSize + specs.multihashSize);
102
+
103
+ if (multihashBytes.byteLength !== specs.multihashSize) {
104
+ throw new RangeError('incorrect cid length');
105
+ }
106
+
107
+ const digestBytes = multihashBytes.subarray(specs.multihashSize - specs.digestSize);
108
+
109
+ const digest: Digest = {
110
+ code: specs.multihashCode,
111
+ size: specs.multihashSize,
112
+ digest: digestBytes,
113
+ bytes: multihashBytes,
114
+ };
115
+
116
+ const cid: CID = {
117
+ version: 1,
118
+ code: specs.codec,
119
+ digest: digest,
120
+ bytes: bytes.subarray(0, specs.size),
121
+ };
122
+
123
+ return [cid, bytes.subarray(specs.size)];
124
+ };
125
+
126
+ /**
127
+ * Decodes a CID buffer
128
+ */
129
+ export const decode = (bytes: Uint8Array): CID => {
130
+ const [cid, remainder] = decodeFirst(bytes);
131
+
132
+ if (remainder.length !== 0) {
133
+ throw new Error(`incorrect cid length`);
134
+ }
135
+
136
+ return cid;
137
+ };
138
+
139
+ /**
140
+ * Creates a CID
141
+ */
142
+ export const create = async (code: number, input: Uint8Array): Promise<CID> => {
143
+ const digest = createDigest(0x12, new Uint8Array(await crypto.subtle.digest('sha-256', input)));
144
+ const bytes = encode(1, code, digest.bytes);
145
+
146
+ return {
147
+ version: 1,
148
+ code: code,
149
+ digest: digest,
150
+ bytes: bytes,
151
+ };
152
+ };
153
+
154
+ /**
155
+ * Serialize CID into a string
156
+ */
157
+ export const format = (cid: CID): string => {
158
+ return 'b' + base32.encode(cid.bytes);
159
+ };
160
+
161
+ export const createDigest = (code: number, digest: Uint8Array): Digest => {
162
+ const size = digest.byteLength;
163
+ const sizeOffset = varint.encodingLength(code);
164
+ const digestOffset = sizeOffset + varint.encodingLength(size);
165
+
166
+ const bytes = new Uint8Array(digestOffset + size);
167
+ varint.encode(code, bytes, 0);
168
+ varint.encode(size, bytes, sizeOffset);
169
+ bytes.set(digest, digestOffset);
170
+
171
+ return {
172
+ code: code,
173
+ size: size,
174
+ digest: digest,
175
+ bytes: bytes,
176
+ };
177
+ };
178
+
179
+ export const encode = (version: number, code: number, multihash: Uint8Array): Uint8Array => {
180
+ const codeOffset = varint.encodingLength(version);
181
+ const hashOffset = codeOffset + varint.encodingLength(code);
182
+
183
+ const bytes = new Uint8Array(hashOffset + multihash.byteLength);
184
+ varint.encode(version, bytes, 0);
185
+ varint.encode(code, bytes, codeOffset);
186
+ bytes.set(multihash, hashOffset);
187
+
188
+ return bytes;
189
+ };
package/package.json CHANGED
@@ -1,25 +1,29 @@
1
1
  {
2
2
  "type": "module",
3
3
  "name": "@atcute/cid",
4
- "version": "1.0.0",
4
+ "version": "1.0.2",
5
5
  "description": "create and parse AT Protocol-blessed CIDv1 format",
6
6
  "license": "MIT",
7
7
  "repository": {
8
- "url": "https://codeberg.org/mary-ext/atcute"
8
+ "url": "https://github.com/mary-ext/atcute",
9
+ "directory": "packages/utilities/cid"
9
10
  },
10
11
  "files": [
11
- "dist/"
12
+ "dist/",
13
+ "lib/",
14
+ "!lib/**/*.bench.ts",
15
+ "!lib/**/*.test.ts"
12
16
  ],
13
17
  "exports": {
14
18
  ".": "./dist/index.js"
15
19
  },
16
20
  "sideEffects": false,
17
21
  "devDependencies": {
18
- "@types/bun": "^1.1.6"
22
+ "@types/bun": "^1.1.12"
19
23
  },
20
24
  "dependencies": {
21
- "@atcute/base32": "^1.0.0",
22
- "@atcute/varint": "^1.0.0"
25
+ "@atcute/base32": "^1.0.1",
26
+ "@atcute/varint": "^1.0.1"
23
27
  },
24
28
  "scripts": {
25
29
  "build": "tsc --project tsconfig.build.json",