@atcute/car 5.0.0 → 5.1.1
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 +23 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/reader.d.ts +3 -3
- package/dist/reader.d.ts.map +1 -1
- package/dist/reader.js +79 -86
- package/dist/reader.js.map +1 -1
- package/dist/streamed-reader.d.ts +3 -3
- package/dist/streamed-reader.d.ts.map +1 -1
- package/dist/streamed-reader.js +8 -13
- package/dist/streamed-reader.js.map +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.js.map +1 -1
- package/dist/writer.d.ts +1 -1
- package/dist/writer.js.map +1 -1
- package/lib/index.ts +6 -4
- package/lib/reader.ts +90 -111
- package/lib/streamed-reader.ts +9 -16
- package/lib/types.ts +1 -1
- package/lib/writer.ts +1 -1
- package/package.json +18 -14
package/README.md
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
# @atcute/car
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
content-addressable archive (CAR) codec for AT Protocol.
|
|
4
|
+
|
|
5
|
+
```sh
|
|
6
|
+
npm install @atcute/car
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
this library implements DASL's [CAR][dasl-car] format used by AT Protocol to store and transfer
|
|
10
|
+
repository data.
|
|
4
11
|
|
|
5
12
|
[dasl-car]: https://dasl.ing/car.html
|
|
6
13
|
|
|
@@ -57,3 +64,18 @@ for (const entry of car) {
|
|
|
57
64
|
// ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
|
|
58
65
|
}
|
|
59
66
|
```
|
|
67
|
+
|
|
68
|
+
### writing
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
import { writeCarStream } from '@atcute/car';
|
|
72
|
+
|
|
73
|
+
const blocks = async function* () {
|
|
74
|
+
yield { cid: commitCid.bytes, data: commitBytes };
|
|
75
|
+
yield { cid: nodeCid.bytes, data: nodeBytes };
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
for await (const chunk of writeCarStream([rootCid], blocks())) {
|
|
79
|
+
stream.write(chunk);
|
|
80
|
+
}
|
|
81
|
+
```
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from './reader.
|
|
2
|
-
export * from './streamed-reader.
|
|
3
|
-
export * from './writer.
|
|
4
|
-
export * from './types.
|
|
1
|
+
export * from './reader.ts';
|
|
2
|
+
export * from './streamed-reader.ts';
|
|
3
|
+
export * from './writer.ts';
|
|
4
|
+
export * from './types.ts';
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAEA,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AAErC,cAAc,aAAa,CAAC;AAE5B,cAAc,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AAErC,cAAc,aAAa,CAAC;AAE5B,cAAc,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAE1D,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AAErC,cAAc,aAAa,CAAC;AAE5B,cAAc,YAAY,CAAC"}
|
package/dist/reader.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import type { CidLink } from '@atcute/cid';
|
|
2
|
-
import { type CarEntry, type CarHeader } from './types.
|
|
2
|
+
import { type CarEntry, type CarHeader } from './types.ts';
|
|
3
3
|
export interface SyncCarReader {
|
|
4
4
|
readonly header: CarHeader;
|
|
5
5
|
readonly roots: CidLink[];
|
|
6
6
|
/** @deprecated do for..of on the reader directly */
|
|
7
|
-
iterate():
|
|
7
|
+
iterate(): IterableIterator<CarEntry>;
|
|
8
8
|
[Symbol.iterator](): Iterator<CarEntry>;
|
|
9
9
|
}
|
|
10
|
-
export declare const fromUint8Array: (buffer: Uint8Array) => SyncCarReader;
|
|
10
|
+
export declare const fromUint8Array: (buffer: Uint8Array<ArrayBufferLike>) => SyncCarReader;
|
|
11
11
|
//# sourceMappingURL=reader.d.ts.map
|
package/dist/reader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../lib/reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAiB,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../lib/reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAiB,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IAE1B,oDAAoD;IACpD,OAAO,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;CACxC;AAED,eAAO,MAAM,cAAc,wDAiE1B,CAAC"}
|
package/dist/reader.js
CHANGED
|
@@ -3,98 +3,91 @@ import * as CID from '@atcute/cid';
|
|
|
3
3
|
import * as varint from '@atcute/varint';
|
|
4
4
|
import { isCarV1Header } from './types.js';
|
|
5
5
|
export const fromUint8Array = (buffer) => {
|
|
6
|
-
const
|
|
7
|
-
|
|
6
|
+
const { header, nextOffset: headerOffset } = readHeader(buffer, 0);
|
|
7
|
+
let pos = headerOffset;
|
|
8
8
|
return {
|
|
9
9
|
header,
|
|
10
10
|
roots: header.data.roots,
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
cid,
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
bytesEnd
|
|
32
|
-
|
|
33
|
-
|
|
11
|
+
iterate() {
|
|
12
|
+
return {
|
|
13
|
+
next() {
|
|
14
|
+
if (pos >= buffer.length) {
|
|
15
|
+
return {
|
|
16
|
+
done: true,
|
|
17
|
+
value: undefined,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
const entryStart = pos;
|
|
21
|
+
const { value: entryLength, nextOffset: lengthOffset } = varint.decode(buffer, pos, 8);
|
|
22
|
+
pos = lengthOffset;
|
|
23
|
+
const cidStart = pos;
|
|
24
|
+
const { cid, nextOffset: cidOffset } = readCid(buffer, pos);
|
|
25
|
+
pos = cidOffset;
|
|
26
|
+
const bytesStart = pos;
|
|
27
|
+
const bytesSize = entryLength - (bytesStart - cidStart);
|
|
28
|
+
if (bytesSize < 0 || bytesStart + bytesSize > buffer.length) {
|
|
29
|
+
throw new RangeError('unexpected end of data');
|
|
30
|
+
}
|
|
31
|
+
const bytesEnd = bytesStart + bytesSize;
|
|
32
|
+
const bytes = buffer.subarray(bytesStart, bytesEnd);
|
|
33
|
+
pos = bytesEnd;
|
|
34
|
+
const cidEnd = bytesStart;
|
|
35
|
+
const entryEnd = bytesEnd;
|
|
36
|
+
return {
|
|
37
|
+
done: false,
|
|
38
|
+
value: {
|
|
39
|
+
cid,
|
|
40
|
+
bytes,
|
|
41
|
+
entryStart,
|
|
42
|
+
entryEnd,
|
|
43
|
+
cidStart,
|
|
44
|
+
cidEnd,
|
|
45
|
+
bytesStart,
|
|
46
|
+
bytesEnd,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
},
|
|
50
|
+
[Symbol.iterator]() {
|
|
51
|
+
return this;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
34
54
|
},
|
|
35
55
|
[Symbol.iterator]() {
|
|
36
56
|
return this.iterate();
|
|
37
57
|
},
|
|
38
58
|
};
|
|
39
59
|
};
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
get pos() {
|
|
44
|
-
return pos;
|
|
45
|
-
},
|
|
46
|
-
seek(size) {
|
|
47
|
-
if (size > buf.length - pos) {
|
|
48
|
-
throw new RangeError('unexpected end of data');
|
|
49
|
-
}
|
|
50
|
-
pos += size;
|
|
51
|
-
},
|
|
52
|
-
upto(size) {
|
|
53
|
-
return buf.subarray(pos, pos + size);
|
|
54
|
-
},
|
|
55
|
-
exactly(size, seek) {
|
|
56
|
-
if (size > buf.length - pos) {
|
|
57
|
-
throw new RangeError('unexpected end of data');
|
|
58
|
-
}
|
|
59
|
-
const slice = buf.subarray(pos, pos + size);
|
|
60
|
-
if (seek) {
|
|
61
|
-
pos += size;
|
|
62
|
-
}
|
|
63
|
-
return slice;
|
|
64
|
-
},
|
|
65
|
-
};
|
|
66
|
-
};
|
|
67
|
-
const readVarint = (reader, size) => {
|
|
68
|
-
const buf = reader.upto(size);
|
|
69
|
-
if (buf.length === 0) {
|
|
70
|
-
throw new RangeError(`unexpected end of data`);
|
|
71
|
-
}
|
|
72
|
-
const [int, read] = varint.decode(buf);
|
|
73
|
-
reader.seek(read);
|
|
74
|
-
return int;
|
|
75
|
-
};
|
|
76
|
-
const readHeader = (reader) => {
|
|
77
|
-
const headerStart = reader.pos;
|
|
78
|
-
const length = readVarint(reader, 8);
|
|
60
|
+
const readHeader = (source, offset) => {
|
|
61
|
+
const headerStart = offset;
|
|
62
|
+
const { value: length, nextOffset: lengthOffset } = varint.decode(source, offset, 8);
|
|
79
63
|
if (length === 0) {
|
|
80
64
|
throw new RangeError(`invalid car header; length=0`);
|
|
81
65
|
}
|
|
82
|
-
const dataStart =
|
|
83
|
-
const
|
|
84
|
-
|
|
66
|
+
const dataStart = lengthOffset;
|
|
67
|
+
const dataEnd = dataStart + length;
|
|
68
|
+
if (dataEnd > source.length) {
|
|
69
|
+
throw new RangeError('unexpected end of data');
|
|
70
|
+
}
|
|
71
|
+
const data = CBOR.decode(source.subarray(dataStart, dataEnd));
|
|
85
72
|
if (!isCarV1Header(data)) {
|
|
86
73
|
throw new TypeError(`expected a car v1 archive`);
|
|
87
74
|
}
|
|
88
|
-
const dataEnd = reader.pos;
|
|
89
75
|
const headerEnd = dataEnd;
|
|
90
|
-
return {
|
|
76
|
+
return {
|
|
77
|
+
header: { data, headerStart, headerEnd, dataStart, dataEnd },
|
|
78
|
+
nextOffset: dataEnd,
|
|
79
|
+
};
|
|
91
80
|
};
|
|
92
|
-
const readCid = (
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
const
|
|
81
|
+
const readCid = (source, offset) => {
|
|
82
|
+
const cidEnd = offset + 36;
|
|
83
|
+
if (cidEnd > source.length) {
|
|
84
|
+
throw new RangeError('unexpected end of data');
|
|
85
|
+
}
|
|
86
|
+
const bytes = source.subarray(offset, cidEnd);
|
|
87
|
+
const version = bytes[0];
|
|
88
|
+
const codec = bytes[1];
|
|
89
|
+
const digestType = bytes[2];
|
|
90
|
+
const digestSize = bytes[3];
|
|
98
91
|
if (version !== CID.CID_VERSION) {
|
|
99
92
|
throw new RangeError(`incorrect cid version (got v${version})`);
|
|
100
93
|
}
|
|
@@ -104,20 +97,20 @@ const readCid = (reader) => {
|
|
|
104
97
|
if (digestType !== CID.HASH_SHA256) {
|
|
105
98
|
throw new RangeError(`incorrect cid digest type (got 0x${digestType.toString(16)})`);
|
|
106
99
|
}
|
|
107
|
-
if (digestSize !== 32
|
|
100
|
+
if (digestSize !== 32) {
|
|
108
101
|
throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
|
|
109
102
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
103
|
+
return {
|
|
104
|
+
cid: {
|
|
105
|
+
version: version,
|
|
106
|
+
codec: codec,
|
|
107
|
+
digest: {
|
|
108
|
+
codec: digestType,
|
|
109
|
+
contents: bytes.subarray(4, 36),
|
|
110
|
+
},
|
|
111
|
+
bytes: bytes,
|
|
118
112
|
},
|
|
119
|
-
|
|
113
|
+
nextOffset: cidEnd,
|
|
120
114
|
};
|
|
121
|
-
return cid;
|
|
122
115
|
};
|
|
123
116
|
//# sourceMappingURL=reader.js.map
|
package/dist/reader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../lib/reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,cAAc,CAAC;AAErC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAiC,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../lib/reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { CidLink } from '@atcute/cid';
|
|
2
|
-
import { type CarEntry, type CarHeader } from './types.
|
|
2
|
+
import { type CarEntry, type CarHeader } from './types.ts';
|
|
3
3
|
export interface StreamedCarReader {
|
|
4
4
|
header(): Promise<CarHeader>;
|
|
5
5
|
roots(): Promise<CidLink[]>;
|
|
@@ -7,6 +7,6 @@ export interface StreamedCarReader {
|
|
|
7
7
|
[Symbol.asyncDispose](): Promise<void>;
|
|
8
8
|
[Symbol.asyncIterator](): AsyncIterator<CarEntry>;
|
|
9
9
|
}
|
|
10
|
-
export declare const carEntryTransform: () => ReadableWritablePair<CarEntry, Uint8Array
|
|
11
|
-
export declare const fromStream: (stream: ReadableStream<Uint8Array
|
|
10
|
+
export declare const carEntryTransform: () => ReadableWritablePair<CarEntry, Uint8Array<ArrayBufferLike>>;
|
|
11
|
+
export declare const fromStream: (stream: ReadableStream<Uint8Array<ArrayBufferLike>>) => StreamedCarReader;
|
|
12
12
|
//# sourceMappingURL=streamed-reader.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamed-reader.d.ts","sourceRoot":"","sources":["../lib/streamed-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAO,OAAO,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"streamed-reader.d.ts","sourceRoot":"","sources":["../lib/streamed-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAO,OAAO,EAAE,MAAM,aAAa,CAAC;AAGhD,OAAO,EAAiB,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IACjC,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC,CAAC;IAC7B,KAAK,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAE5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,MAAM,CAAC,aAAa,CAAC,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;CAClD;AAED,eAAO,MAAM,iBAAiB,mEA6B7B,CAAC;AAEF,eAAO,MAAM,UAAU,4EA0LtB,CAAC"}
|
package/dist/streamed-reader.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as CBOR from '@atcute/cbor';
|
|
2
2
|
import * as CID from '@atcute/cid';
|
|
3
|
-
import { concat } from '@atcute/uint8array';
|
|
4
3
|
import { isCarV1Header } from './types.js';
|
|
5
4
|
export const carEntryTransform = () => {
|
|
6
5
|
const transform = new TransformStream();
|
|
@@ -77,11 +76,11 @@ export const fromStream = (stream) => {
|
|
|
77
76
|
return buffer;
|
|
78
77
|
};
|
|
79
78
|
const readCid = async () => {
|
|
80
|
-
const
|
|
81
|
-
const version =
|
|
82
|
-
const codec =
|
|
83
|
-
const digestType =
|
|
84
|
-
const digestSize =
|
|
79
|
+
const bytes = await readExact(36);
|
|
80
|
+
const version = bytes[0];
|
|
81
|
+
const codec = bytes[1];
|
|
82
|
+
const digestType = bytes[2];
|
|
83
|
+
const digestSize = bytes[3];
|
|
85
84
|
if (version !== CID.CID_VERSION) {
|
|
86
85
|
throw new RangeError(`incorrect cid version (got v${version})`);
|
|
87
86
|
}
|
|
@@ -91,22 +90,18 @@ export const fromStream = (stream) => {
|
|
|
91
90
|
if (digestType !== CID.HASH_SHA256) {
|
|
92
91
|
throw new RangeError(`incorrect cid digest type (got 0x${digestType.toString(16)})`);
|
|
93
92
|
}
|
|
94
|
-
if (digestSize !== 32
|
|
93
|
+
if (digestSize !== 32) {
|
|
95
94
|
throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
|
|
96
95
|
}
|
|
97
|
-
|
|
98
|
-
const bytes = concat([head, await readExact(digestSize)]);
|
|
99
|
-
const digest = bytes.subarray(4, 4 + digestSize);
|
|
100
|
-
const cid = {
|
|
96
|
+
return {
|
|
101
97
|
version: version,
|
|
102
98
|
codec: codec,
|
|
103
99
|
digest: {
|
|
104
100
|
codec: digestType,
|
|
105
|
-
contents:
|
|
101
|
+
contents: bytes.subarray(4, 36),
|
|
106
102
|
},
|
|
107
103
|
bytes: bytes,
|
|
108
104
|
};
|
|
109
|
-
return cid;
|
|
110
105
|
};
|
|
111
106
|
return {
|
|
112
107
|
[Symbol.asyncDispose]() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamed-reader.js","sourceRoot":"","sources":["../lib/streamed-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,cAAc,CAAC;AAErC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"streamed-reader.js","sourceRoot":"","sources":["../lib/streamed-reader.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,GAAG,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,GAAG,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAErE,MAAM,WAAW,WAAW;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,OAAO,EAAE,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,0CAOzB,CAAC;AAEF,MAAM,WAAW,SAAS;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAElB,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IAEjB,GAAG,EAAE,GAAG,CAAC;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IAEf,KAAK,EAAE,UAAU,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACxB,sCAAsC;IACtC,GAAG,EAAE,UAAU,CAAC;IAChB,qBAAqB;IACrB,IAAI,EAAE,UAAU,CAAC;CACjB"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA0B,MAAM,aAAa,CAAC;AAOrE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAwB,EAAE;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAA0B,MAAM,aAAa,CAAC;AAOrE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAwB,EAAE,CAAC;IACtE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,KAAoB,CAAC;IAChD,OAAO,OAAO,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,YAAY,cAAc,CAAC,CAAC;AAAA,CACtG,CAAC"}
|
package/dist/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAEf,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAEf,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC;IAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;AAAA,CACD,CAAC"}
|
package/dist/writer.d.ts
CHANGED
package/dist/writer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../lib/writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAIzC;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,CAAS,EAA2B,EAAE;
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../lib/writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,cAAc,CAAC;AAErC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;AAIzC;;;;GAIG;AACH,MAAM,YAAY,GAAG,CAAC,CAAS,EAA2B,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IACzB,OAAO,GAAG,CAAC;AAAA,CACX,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAyB,EAA2B,EAAE,CAAC;IACzF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,OAAO,EAAE,CAAC;QACV,KAAK,EAAE,KAAK;KACZ,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAElE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO,MAAM,CAAC;AAAA,CACd,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAe,EAAE,IAAgB,EAA2B,EAAE,CAAC;IAChG,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAExE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;IAEhD,OAAO,MAAM,CAAC;AAAA,CACd,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,cAAc,CACpC,KAAgB,EAChB,MAAoD,EACV;IAC1C,oBAAoB;IACpB,MAAM,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAEhC,6BAA6B;IAC7B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,iBAAiB,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,CAAC;AAAA,CACD"}
|
package/lib/index.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
export * from './streamed-reader.js';
|
|
1
|
+
// implements github:darobin/dasl.ing@cc66c35 (2025-10-20)
|
|
3
2
|
|
|
4
|
-
export * from './
|
|
3
|
+
export * from './reader.ts';
|
|
4
|
+
export * from './streamed-reader.ts';
|
|
5
5
|
|
|
6
|
-
export * from './
|
|
6
|
+
export * from './writer.ts';
|
|
7
|
+
|
|
8
|
+
export * from './types.ts';
|
package/lib/reader.ts
CHANGED
|
@@ -3,60 +3,76 @@ import type { CidLink } from '@atcute/cid';
|
|
|
3
3
|
import * as CID from '@atcute/cid';
|
|
4
4
|
import * as varint from '@atcute/varint';
|
|
5
5
|
|
|
6
|
-
import { isCarV1Header, type CarEntry, type CarHeader } from './types.
|
|
7
|
-
|
|
8
|
-
interface SyncByteReader {
|
|
9
|
-
readonly pos: number;
|
|
10
|
-
upto(size: number): Uint8Array;
|
|
11
|
-
exactly(size: number, seek: boolean): Uint8Array;
|
|
12
|
-
seek(size: number): void;
|
|
13
|
-
}
|
|
6
|
+
import { isCarV1Header, type CarEntry, type CarHeader } from './types.ts';
|
|
14
7
|
|
|
15
8
|
export interface SyncCarReader {
|
|
16
9
|
readonly header: CarHeader;
|
|
17
10
|
readonly roots: CidLink[];
|
|
18
11
|
|
|
19
12
|
/** @deprecated do for..of on the reader directly */
|
|
20
|
-
iterate():
|
|
13
|
+
iterate(): IterableIterator<CarEntry>;
|
|
21
14
|
[Symbol.iterator](): Iterator<CarEntry>;
|
|
22
15
|
}
|
|
23
16
|
|
|
24
17
|
export const fromUint8Array = (buffer: Uint8Array): SyncCarReader => {
|
|
25
|
-
const
|
|
26
|
-
|
|
18
|
+
const { header, nextOffset: headerOffset } = readHeader(buffer, 0);
|
|
19
|
+
let pos = headerOffset;
|
|
27
20
|
|
|
28
21
|
return {
|
|
29
22
|
header,
|
|
30
23
|
roots: header.data.roots,
|
|
31
24
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
bytesStart
|
|
57
|
-
bytesEnd
|
|
58
|
-
|
|
59
|
-
|
|
25
|
+
iterate(): IterableIterator<CarEntry> {
|
|
26
|
+
return {
|
|
27
|
+
next(): IteratorResult<CarEntry> {
|
|
28
|
+
if (pos >= buffer.length) {
|
|
29
|
+
return {
|
|
30
|
+
done: true,
|
|
31
|
+
value: undefined,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const entryStart = pos;
|
|
36
|
+
const { value: entryLength, nextOffset: lengthOffset } = varint.decode(buffer, pos, 8);
|
|
37
|
+
pos = lengthOffset;
|
|
38
|
+
|
|
39
|
+
const cidStart = pos;
|
|
40
|
+
const { cid, nextOffset: cidOffset } = readCid(buffer, pos);
|
|
41
|
+
pos = cidOffset;
|
|
42
|
+
|
|
43
|
+
const bytesStart = pos;
|
|
44
|
+
const bytesSize = entryLength - (bytesStart - cidStart);
|
|
45
|
+
if (bytesSize < 0 || bytesStart + bytesSize > buffer.length) {
|
|
46
|
+
throw new RangeError('unexpected end of data');
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const bytesEnd = bytesStart + bytesSize;
|
|
50
|
+
const bytes = buffer.subarray(bytesStart, bytesEnd);
|
|
51
|
+
pos = bytesEnd;
|
|
52
|
+
|
|
53
|
+
const cidEnd = bytesStart;
|
|
54
|
+
const entryEnd = bytesEnd;
|
|
55
|
+
|
|
56
|
+
return {
|
|
57
|
+
done: false,
|
|
58
|
+
value: {
|
|
59
|
+
cid,
|
|
60
|
+
bytes,
|
|
61
|
+
|
|
62
|
+
entryStart,
|
|
63
|
+
entryEnd,
|
|
64
|
+
cidStart,
|
|
65
|
+
cidEnd,
|
|
66
|
+
bytesStart,
|
|
67
|
+
bytesEnd,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
[Symbol.iterator]() {
|
|
73
|
+
return this;
|
|
74
|
+
},
|
|
75
|
+
};
|
|
60
76
|
},
|
|
61
77
|
|
|
62
78
|
[Symbol.iterator](): Iterator<CarEntry> {
|
|
@@ -65,79 +81,44 @@ export const fromUint8Array = (buffer: Uint8Array): SyncCarReader => {
|
|
|
65
81
|
};
|
|
66
82
|
};
|
|
67
83
|
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return {
|
|
72
|
-
get pos() {
|
|
73
|
-
return pos;
|
|
74
|
-
},
|
|
75
|
-
|
|
76
|
-
seek(size) {
|
|
77
|
-
if (size > buf.length - pos) {
|
|
78
|
-
throw new RangeError('unexpected end of data');
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
pos += size;
|
|
82
|
-
},
|
|
83
|
-
upto(size) {
|
|
84
|
-
return buf.subarray(pos, pos + size);
|
|
85
|
-
},
|
|
86
|
-
exactly(size, seek) {
|
|
87
|
-
if (size > buf.length - pos) {
|
|
88
|
-
throw new RangeError('unexpected end of data');
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const slice = buf.subarray(pos, pos + size);
|
|
92
|
-
if (seek) {
|
|
93
|
-
pos += size;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
return slice;
|
|
97
|
-
},
|
|
98
|
-
};
|
|
99
|
-
};
|
|
100
|
-
|
|
101
|
-
const readVarint = (reader: SyncByteReader, size: number): number => {
|
|
102
|
-
const buf = reader.upto(size);
|
|
103
|
-
if (buf.length === 0) {
|
|
104
|
-
throw new RangeError(`unexpected end of data`);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
const [int, read] = varint.decode(buf);
|
|
108
|
-
reader.seek(read);
|
|
109
|
-
|
|
110
|
-
return int;
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
const readHeader = (reader: SyncByteReader): CarHeader => {
|
|
114
|
-
const headerStart = reader.pos;
|
|
115
|
-
const length = readVarint(reader, 8);
|
|
84
|
+
const readHeader = (source: Uint8Array, offset: number): { header: CarHeader; nextOffset: number } => {
|
|
85
|
+
const headerStart = offset;
|
|
86
|
+
const { value: length, nextOffset: lengthOffset } = varint.decode(source, offset, 8);
|
|
116
87
|
if (length === 0) {
|
|
117
88
|
throw new RangeError(`invalid car header; length=0`);
|
|
118
89
|
}
|
|
119
90
|
|
|
120
|
-
const dataStart =
|
|
121
|
-
const
|
|
91
|
+
const dataStart = lengthOffset;
|
|
92
|
+
const dataEnd = dataStart + length;
|
|
93
|
+
if (dataEnd > source.length) {
|
|
94
|
+
throw new RangeError('unexpected end of data');
|
|
95
|
+
}
|
|
122
96
|
|
|
123
|
-
const data = CBOR.decode(
|
|
97
|
+
const data = CBOR.decode(source.subarray(dataStart, dataEnd));
|
|
124
98
|
if (!isCarV1Header(data)) {
|
|
125
99
|
throw new TypeError(`expected a car v1 archive`);
|
|
126
100
|
}
|
|
127
101
|
|
|
128
|
-
const dataEnd = reader.pos;
|
|
129
102
|
const headerEnd = dataEnd;
|
|
130
103
|
|
|
131
|
-
return {
|
|
104
|
+
return {
|
|
105
|
+
header: { data, headerStart, headerEnd, dataStart, dataEnd },
|
|
106
|
+
nextOffset: dataEnd,
|
|
107
|
+
};
|
|
132
108
|
};
|
|
133
109
|
|
|
134
|
-
const readCid = (
|
|
135
|
-
const
|
|
110
|
+
const readCid = (source: Uint8Array, offset: number): { cid: CID.Cid; nextOffset: number } => {
|
|
111
|
+
const cidEnd = offset + 36;
|
|
112
|
+
if (cidEnd > source.length) {
|
|
113
|
+
throw new RangeError('unexpected end of data');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
const bytes = source.subarray(offset, cidEnd);
|
|
136
117
|
|
|
137
|
-
const version =
|
|
138
|
-
const codec =
|
|
139
|
-
const digestType =
|
|
140
|
-
const digestSize =
|
|
118
|
+
const version = bytes[0];
|
|
119
|
+
const codec = bytes[1];
|
|
120
|
+
const digestType = bytes[2];
|
|
121
|
+
const digestSize = bytes[3];
|
|
141
122
|
|
|
142
123
|
if (version !== CID.CID_VERSION) {
|
|
143
124
|
throw new RangeError(`incorrect cid version (got v${version})`);
|
|
@@ -151,22 +132,20 @@ const readCid = (reader: SyncByteReader): CID.Cid => {
|
|
|
151
132
|
throw new RangeError(`incorrect cid digest type (got 0x${digestType.toString(16)})`);
|
|
152
133
|
}
|
|
153
134
|
|
|
154
|
-
if (digestSize !== 32
|
|
135
|
+
if (digestSize !== 32) {
|
|
155
136
|
throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
|
|
156
137
|
}
|
|
157
138
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
139
|
+
return {
|
|
140
|
+
cid: {
|
|
141
|
+
version: version,
|
|
142
|
+
codec: codec,
|
|
143
|
+
digest: {
|
|
144
|
+
codec: digestType,
|
|
145
|
+
contents: bytes.subarray(4, 36),
|
|
146
|
+
},
|
|
147
|
+
bytes: bytes,
|
|
167
148
|
},
|
|
168
|
-
|
|
149
|
+
nextOffset: cidEnd,
|
|
169
150
|
};
|
|
170
|
-
|
|
171
|
-
return cid;
|
|
172
151
|
};
|
package/lib/streamed-reader.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import * as CBOR from '@atcute/cbor';
|
|
2
2
|
import type { Cid, CidLink } from '@atcute/cid';
|
|
3
3
|
import * as CID from '@atcute/cid';
|
|
4
|
-
import { concat } from '@atcute/uint8array';
|
|
5
4
|
|
|
6
|
-
import { isCarV1Header, type CarEntry, type CarHeader } from './types.
|
|
5
|
+
import { isCarV1Header, type CarEntry, type CarHeader } from './types.ts';
|
|
7
6
|
|
|
8
7
|
export interface StreamedCarReader {
|
|
9
8
|
header(): Promise<CarHeader>;
|
|
@@ -112,12 +111,12 @@ export const fromStream = (stream: ReadableStream<Uint8Array>): StreamedCarReade
|
|
|
112
111
|
};
|
|
113
112
|
|
|
114
113
|
const readCid = async (): Promise<Cid> => {
|
|
115
|
-
const
|
|
114
|
+
const bytes = await readExact(36);
|
|
116
115
|
|
|
117
|
-
const version =
|
|
118
|
-
const codec =
|
|
119
|
-
const digestType =
|
|
120
|
-
const digestSize =
|
|
116
|
+
const version = bytes[0];
|
|
117
|
+
const codec = bytes[1];
|
|
118
|
+
const digestType = bytes[2];
|
|
119
|
+
const digestSize = bytes[3];
|
|
121
120
|
|
|
122
121
|
if (version !== CID.CID_VERSION) {
|
|
123
122
|
throw new RangeError(`incorrect cid version (got v${version})`);
|
|
@@ -131,25 +130,19 @@ export const fromStream = (stream: ReadableStream<Uint8Array>): StreamedCarReade
|
|
|
131
130
|
throw new RangeError(`incorrect cid digest type (got 0x${digestType.toString(16)})`);
|
|
132
131
|
}
|
|
133
132
|
|
|
134
|
-
if (digestSize !== 32
|
|
133
|
+
if (digestSize !== 32) {
|
|
135
134
|
throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
|
|
136
135
|
}
|
|
137
136
|
|
|
138
|
-
|
|
139
|
-
const bytes = concat([head, await readExact(digestSize)]);
|
|
140
|
-
const digest = bytes.subarray(4, 4 + digestSize);
|
|
141
|
-
|
|
142
|
-
const cid: Cid = {
|
|
137
|
+
return {
|
|
143
138
|
version: version,
|
|
144
139
|
codec: codec,
|
|
145
140
|
digest: {
|
|
146
141
|
codec: digestType,
|
|
147
|
-
contents:
|
|
142
|
+
contents: bytes.subarray(4, 36),
|
|
148
143
|
},
|
|
149
144
|
bytes: bytes,
|
|
150
145
|
};
|
|
151
|
-
|
|
152
|
-
return cid;
|
|
153
146
|
};
|
|
154
147
|
|
|
155
148
|
return {
|
package/lib/types.ts
CHANGED
package/lib/writer.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { CidLink } from '@atcute/cid';
|
|
|
3
3
|
import { allocUnsafe } from '@atcute/uint8array';
|
|
4
4
|
import * as varint from '@atcute/varint';
|
|
5
5
|
|
|
6
|
-
import type { CarBlock } from './types.
|
|
6
|
+
import type { CarBlock } from './types.ts';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* encodes a number as an unsigned varint (variable-length integer)
|
package/package.json
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
{
|
|
2
|
-
"type": "module",
|
|
3
2
|
"name": "@atcute/car",
|
|
4
|
-
"version": "5.
|
|
3
|
+
"version": "5.1.1",
|
|
5
4
|
"description": "lightweight DASL CAR (content-addressable archives) codec for AT Protocol.",
|
|
6
5
|
"keywords": [
|
|
7
6
|
"atproto",
|
|
8
|
-
"
|
|
9
|
-
"
|
|
7
|
+
"car",
|
|
8
|
+
"dasl"
|
|
10
9
|
],
|
|
11
10
|
"license": "0BSD",
|
|
12
11
|
"repository": {
|
|
@@ -19,23 +18,28 @@
|
|
|
19
18
|
"!lib/**/*.bench.ts",
|
|
20
19
|
"!lib/**/*.test.ts"
|
|
21
20
|
],
|
|
21
|
+
"type": "module",
|
|
22
|
+
"sideEffects": false,
|
|
22
23
|
"exports": {
|
|
23
24
|
".": "./dist/index.js"
|
|
24
25
|
},
|
|
25
|
-
"
|
|
26
|
-
|
|
27
|
-
"@vitest/coverage-v8": "^3.2.4",
|
|
28
|
-
"vitest": "^3.2.4",
|
|
29
|
-
"@atcute/multibase": "^1.1.6"
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public"
|
|
30
28
|
},
|
|
31
29
|
"dependencies": {
|
|
32
|
-
"@atcute/
|
|
33
|
-
"@atcute/
|
|
34
|
-
"@atcute/uint8array": "^1.
|
|
35
|
-
"@atcute/varint": "^
|
|
30
|
+
"@atcute/cbor": "^2.3.2",
|
|
31
|
+
"@atcute/cid": "^2.4.1",
|
|
32
|
+
"@atcute/uint8array": "^1.1.1",
|
|
33
|
+
"@atcute/varint": "^2.0.0"
|
|
34
|
+
},
|
|
35
|
+
"devDependencies": {
|
|
36
|
+
"@types/node": "^25.2.3",
|
|
37
|
+
"@vitest/coverage-v8": "^4.0.18",
|
|
38
|
+
"vitest": "^4.0.18",
|
|
39
|
+
"@atcute/multibase": "^1.1.8"
|
|
36
40
|
},
|
|
37
41
|
"scripts": {
|
|
38
|
-
"build": "
|
|
42
|
+
"build": "tsgo --project tsconfig.build.json",
|
|
39
43
|
"test": "vitest --coverage",
|
|
40
44
|
"prepublish": "rm -rf dist; pnpm run build"
|
|
41
45
|
}
|