@atcute/car 3.1.3 → 5.1.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 -45
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/{v4/car-reader/sync-car-reader.d.ts → reader.d.ts} +4 -4
- package/dist/reader.d.ts.map +1 -0
- package/dist/{v4/car-reader/sync-car-reader.js → reader.js} +9 -14
- package/dist/reader.js.map +1 -0
- package/dist/{v4/car-reader/stream-car-reader.d.ts → streamed-reader.d.ts} +5 -5
- package/dist/streamed-reader.d.ts.map +1 -0
- package/dist/{v4/car-reader/stream-car-reader.js → streamed-reader.js} +9 -16
- package/dist/streamed-reader.js.map +1 -0
- package/dist/{v4/car-reader/types.d.ts → types.d.ts} +12 -3
- package/dist/types.d.ts.map +1 -0
- package/dist/{v4/car-reader/types.js → types.js} +2 -3
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js.map +1 -0
- package/dist/writer.d.ts +26 -0
- package/dist/writer.d.ts.map +1 -0
- package/dist/writer.js +77 -0
- package/dist/writer.js.map +1 -0
- package/lib/index.ts +8 -0
- package/lib/{v4/car-reader/sync-car-reader.ts → reader.ts} +10 -16
- package/lib/{v4/car-reader/stream-car-reader.ts → streamed-reader.ts} +12 -20
- package/lib/{v4/car-reader/types.ts → types.ts} +14 -5
- package/lib/writer.ts +92 -0
- package/package.json +14 -14
- package/dist/v3/atproto-repo.d.ts +0 -2
- package/dist/v3/atproto-repo.d.ts.map +0 -1
- package/dist/v3/atproto-repo.js +0 -2
- package/dist/v3/atproto-repo.js.map +0 -1
- package/dist/v3/index.d.ts +0 -3
- package/dist/v3/index.d.ts.map +0 -1
- package/dist/v3/index.js +0 -3
- package/dist/v3/index.js.map +0 -1
- package/dist/v3/reader.d.ts +0 -2
- package/dist/v3/reader.d.ts.map +0 -1
- package/dist/v3/reader.js +0 -2
- package/dist/v3/reader.js.map +0 -1
- package/dist/v4/car-reader/index.d.ts +0 -4
- package/dist/v4/car-reader/index.d.ts.map +0 -1
- package/dist/v4/car-reader/index.js +0 -4
- package/dist/v4/car-reader/index.js.map +0 -1
- package/dist/v4/car-reader/stream-car-reader.d.ts.map +0 -1
- package/dist/v4/car-reader/stream-car-reader.js.map +0 -1
- package/dist/v4/car-reader/sync-car-reader.d.ts.map +0 -1
- package/dist/v4/car-reader/sync-car-reader.js.map +0 -1
- package/dist/v4/car-reader/types.d.ts.map +0 -1
- package/dist/v4/car-reader/types.js.map +0 -1
- package/dist/v4/index.d.ts +0 -3
- package/dist/v4/index.d.ts.map +0 -1
- package/dist/v4/index.js +0 -3
- package/dist/v4/index.js.map +0 -1
- package/dist/v4/repo-reader/index.d.ts +0 -6
- package/dist/v4/repo-reader/index.d.ts.map +0 -1
- package/dist/v4/repo-reader/index.js +0 -6
- package/dist/v4/repo-reader/index.js.map +0 -1
- package/dist/v4/repo-reader/mst.d.ts +0 -48
- package/dist/v4/repo-reader/mst.d.ts.map +0 -1
- package/dist/v4/repo-reader/mst.js +0 -62
- package/dist/v4/repo-reader/mst.js.map +0 -1
- package/dist/v4/repo-reader/stream-repo-reader.d.ts +0 -25
- package/dist/v4/repo-reader/stream-repo-reader.d.ts.map +0 -1
- package/dist/v4/repo-reader/stream-repo-reader.js +0 -143
- package/dist/v4/repo-reader/stream-repo-reader.js.map +0 -1
- package/dist/v4/repo-reader/sync-blockmap.d.ts +0 -30
- package/dist/v4/repo-reader/sync-blockmap.d.ts.map +0 -1
- package/dist/v4/repo-reader/sync-blockmap.js +0 -58
- package/dist/v4/repo-reader/sync-blockmap.js.map +0 -1
- package/dist/v4/repo-reader/sync-repo-reader.d.ts +0 -3
- package/dist/v4/repo-reader/sync-repo-reader.d.ts.map +0 -1
- package/dist/v4/repo-reader/sync-repo-reader.js +0 -20
- package/dist/v4/repo-reader/sync-repo-reader.js.map +0 -1
- package/dist/v4/repo-reader/types.d.ts +0 -21
- package/dist/v4/repo-reader/types.d.ts.map +0 -1
- package/dist/v4/repo-reader/types.js +0 -37
- package/dist/v4/repo-reader/types.js.map +0 -1
- package/dist/v4/utils.d.ts.map +0 -1
- package/dist/v4/utils.js.map +0 -1
- package/lib/v3/atproto-repo.ts +0 -15
- package/lib/v3/index.ts +0 -2
- package/lib/v3/reader.ts +0 -9
- package/lib/v4/car-reader/index.ts +0 -4
- package/lib/v4/index.ts +0 -2
- package/lib/v4/repo-reader/index.ts +0 -6
- package/lib/v4/repo-reader/mst.ts +0 -110
- package/lib/v4/repo-reader/stream-repo-reader.ts +0 -209
- package/lib/v4/repo-reader/sync-blockmap.ts +0 -85
- package/lib/v4/repo-reader/sync-repo-reader.ts +0 -27
- package/lib/v4/repo-reader/types.ts +0 -32
- /package/dist/{v4/utils.d.ts → utils.d.ts} +0 -0
- /package/dist/{v4/utils.js → utils.js} +0 -0
- /package/lib/{v4/utils.ts → utils.ts} +0 -0
package/README.md
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
# @atcute/car
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
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.
|
|
5
11
|
|
|
6
12
|
[dasl-car]: https://dasl.ing/car.html
|
|
7
13
|
|
|
@@ -10,50 +16,34 @@ library for AT Protocol.
|
|
|
10
16
|
### streaming usage
|
|
11
17
|
|
|
12
18
|
```ts
|
|
13
|
-
import {
|
|
19
|
+
import { fromStream } from '@atcute/car';
|
|
14
20
|
|
|
15
21
|
const stream = new ReadableStream({
|
|
16
22
|
/* ... */
|
|
17
23
|
});
|
|
18
24
|
|
|
19
|
-
|
|
20
|
-
{
|
|
21
|
-
await using repo = RepoReader.fromStream(stream);
|
|
25
|
+
await using car = fromStream(stream);
|
|
22
26
|
|
|
23
|
-
|
|
24
|
-
entry;
|
|
25
|
-
// ^? RepoEntry { collection: 'app.bsky.feed.post', rkey: '3lprcc55bb222', ... }
|
|
26
|
-
}
|
|
27
|
+
const roots = await car.roots();
|
|
27
28
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// read generic CAR archives
|
|
33
|
-
{
|
|
34
|
-
await using car = CarReader.fromStream(stream);
|
|
35
|
-
|
|
36
|
-
const roots = await car.roots();
|
|
37
|
-
|
|
38
|
-
for await (const entry of car) {
|
|
39
|
-
entry;
|
|
40
|
-
// ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
|
|
41
|
-
}
|
|
29
|
+
for await (const entry of car) {
|
|
30
|
+
entry;
|
|
31
|
+
// ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
|
|
42
32
|
}
|
|
43
33
|
```
|
|
44
34
|
|
|
45
35
|
### streaming usage (for runtimes without `await using` yet)
|
|
46
36
|
|
|
47
37
|
```ts
|
|
48
|
-
const
|
|
38
|
+
const car = fromStream(stream);
|
|
49
39
|
|
|
50
40
|
try {
|
|
51
|
-
for await (const entry of
|
|
41
|
+
for await (const entry of car) {
|
|
52
42
|
entry;
|
|
53
|
-
// ^?
|
|
43
|
+
// ^? CarEntry { ... }
|
|
54
44
|
}
|
|
55
45
|
} finally {
|
|
56
|
-
await
|
|
46
|
+
await car.dispose();
|
|
57
47
|
}
|
|
58
48
|
```
|
|
59
49
|
|
|
@@ -64,28 +54,28 @@ const buffer = Uint8Array.from([
|
|
|
64
54
|
/* ... */
|
|
65
55
|
]);
|
|
66
56
|
|
|
67
|
-
// read
|
|
68
|
-
|
|
69
|
-
const repo = RepoReader.fromUint8Array(buffer);
|
|
57
|
+
// read generic CAR archives
|
|
58
|
+
const car = fromUint8Array(buffer);
|
|
70
59
|
|
|
71
|
-
|
|
72
|
-
entry;
|
|
73
|
-
// ^? RepoEntry { collection: 'app.bsky.feed.post', rkey: '3lprcc55bb222', ... }
|
|
74
|
-
}
|
|
60
|
+
const roots = car.roots;
|
|
75
61
|
|
|
76
|
-
|
|
77
|
-
|
|
62
|
+
for (const entry of car) {
|
|
63
|
+
entry;
|
|
64
|
+
// ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
|
|
78
65
|
}
|
|
66
|
+
```
|
|
79
67
|
|
|
80
|
-
|
|
81
|
-
{
|
|
82
|
-
const car = CarReader.fromUint8Array(buffer);
|
|
68
|
+
### writing
|
|
83
69
|
|
|
84
|
-
|
|
70
|
+
```ts
|
|
71
|
+
import { writeCarStream } from '@atcute/car';
|
|
85
72
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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);
|
|
90
80
|
}
|
|
91
81
|
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
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
ADDED
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { CidLink } from '@atcute/cid';
|
|
2
2
|
import { type CarEntry, type CarHeader } from './types.js';
|
|
3
3
|
export interface SyncCarReader {
|
|
4
4
|
readonly header: CarHeader;
|
|
5
|
-
readonly roots:
|
|
5
|
+
readonly roots: CidLink[];
|
|
6
6
|
/** @deprecated do for..of on the reader directly */
|
|
7
7
|
iterate(): Generator<CarEntry>;
|
|
8
8
|
[Symbol.iterator](): Iterator<CarEntry>;
|
|
9
9
|
}
|
|
10
|
-
export declare const fromUint8Array: (buffer: Uint8Array) => SyncCarReader;
|
|
11
|
-
//# sourceMappingURL=
|
|
10
|
+
export declare const fromUint8Array: (buffer: Uint8Array<ArrayBufferLike>) => SyncCarReader;
|
|
11
|
+
//# sourceMappingURL=reader.d.ts.map
|
|
@@ -0,0 +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;AAS1E,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IAE1B,oDAAoD;IACpD,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;IAC/B,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;CACxC;AAED,eAAO,MAAM,cAAc,wDA0C1B,CAAC"}
|
|
@@ -90,11 +90,11 @@ const readHeader = (reader) => {
|
|
|
90
90
|
return { data, headerStart, headerEnd, dataStart, dataEnd };
|
|
91
91
|
};
|
|
92
92
|
const readCid = (reader) => {
|
|
93
|
-
const
|
|
94
|
-
const version =
|
|
95
|
-
const codec =
|
|
96
|
-
const digestType =
|
|
97
|
-
const digestSize =
|
|
93
|
+
const bytes = reader.exactly(36, true);
|
|
94
|
+
const version = bytes[0];
|
|
95
|
+
const codec = bytes[1];
|
|
96
|
+
const digestType = bytes[2];
|
|
97
|
+
const digestSize = bytes[3];
|
|
98
98
|
if (version !== CID.CID_VERSION) {
|
|
99
99
|
throw new RangeError(`incorrect cid version (got v${version})`);
|
|
100
100
|
}
|
|
@@ -104,22 +104,17 @@ const readCid = (reader) => {
|
|
|
104
104
|
if (digestType !== CID.HASH_SHA256) {
|
|
105
105
|
throw new RangeError(`incorrect cid digest type (got 0x${digestType.toString(16)})`);
|
|
106
106
|
}
|
|
107
|
-
if (digestSize !== 32
|
|
107
|
+
if (digestSize !== 32) {
|
|
108
108
|
throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
|
|
109
109
|
}
|
|
110
|
-
|
|
111
|
-
const digest = bytes.subarray(4, 4 + digestSize);
|
|
112
|
-
const cid = {
|
|
110
|
+
return {
|
|
113
111
|
version: version,
|
|
114
112
|
codec: codec,
|
|
115
113
|
digest: {
|
|
116
114
|
codec: digestType,
|
|
117
|
-
contents:
|
|
115
|
+
contents: bytes.subarray(4, 36),
|
|
118
116
|
},
|
|
119
117
|
bytes: bytes,
|
|
120
|
-
// @ts-expect-error
|
|
121
|
-
_str: undefined,
|
|
122
118
|
};
|
|
123
|
-
return cid;
|
|
124
119
|
};
|
|
125
|
-
//# sourceMappingURL=
|
|
120
|
+
//# sourceMappingURL=reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../lib/reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import type { CidLink } from '@atcute/cid';
|
|
2
2
|
import { type CarEntry, type CarHeader } from './types.js';
|
|
3
3
|
export interface StreamedCarReader {
|
|
4
4
|
header(): Promise<CarHeader>;
|
|
5
|
-
roots(): Promise<
|
|
5
|
+
roots(): Promise<CidLink[]>;
|
|
6
6
|
dispose(): Promise<void>;
|
|
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
|
|
12
|
-
//# sourceMappingURL=
|
|
10
|
+
export declare const carEntryTransform: () => ReadableWritablePair<CarEntry, Uint8Array<ArrayBufferLike>>;
|
|
11
|
+
export declare const fromStream: (stream: ReadableStream<Uint8Array<ArrayBufferLike>>) => StreamedCarReader;
|
|
12
|
+
//# sourceMappingURL=streamed-reader.d.ts.map
|
|
@@ -0,0 +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;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"}
|
|
@@ -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,24 +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
|
-
// @ts-expect-error
|
|
109
|
-
_str: undefined,
|
|
110
104
|
};
|
|
111
|
-
return cid;
|
|
112
105
|
};
|
|
113
106
|
return {
|
|
114
107
|
[Symbol.asyncDispose]() {
|
|
@@ -177,4 +170,4 @@ export const fromStream = (stream) => {
|
|
|
177
170
|
},
|
|
178
171
|
};
|
|
179
172
|
};
|
|
180
|
-
//# sourceMappingURL=
|
|
173
|
+
//# sourceMappingURL=streamed-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"streamed-reader.js","sourceRoot":"","sources":["../lib/streamed-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { type Cid, type CidLink } from '@atcute/cid';
|
|
2
2
|
export interface CarV1Header {
|
|
3
3
|
version: 1;
|
|
4
|
-
roots:
|
|
4
|
+
roots: CidLink[];
|
|
5
5
|
}
|
|
6
6
|
export declare const isCarV1Header: (value: unknown) => value is CarV1Header;
|
|
7
7
|
export interface CarHeader {
|
|
@@ -14,11 +14,20 @@ export interface CarHeader {
|
|
|
14
14
|
export interface CarEntry {
|
|
15
15
|
entryStart: number;
|
|
16
16
|
entryEnd: number;
|
|
17
|
-
cid:
|
|
17
|
+
cid: Cid;
|
|
18
18
|
cidStart: number;
|
|
19
19
|
cidEnd: number;
|
|
20
20
|
bytes: Uint8Array;
|
|
21
21
|
bytesStart: number;
|
|
22
22
|
bytesEnd: number;
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* represents a block to be written to a CAR file
|
|
26
|
+
*/
|
|
27
|
+
export interface CarBlock {
|
|
28
|
+
/** the CID of the block (as bytes) */
|
|
29
|
+
cid: Uint8Array;
|
|
30
|
+
/** the block data */
|
|
31
|
+
data: Uint8Array;
|
|
32
|
+
}
|
|
24
33
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +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,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"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as CID from '@atcute/cid';
|
|
1
|
+
import { CidLinkWrapper } from '@atcute/cid';
|
|
3
2
|
export const isCarV1Header = (value) => {
|
|
4
3
|
if (value === null || typeof value !== 'object') {
|
|
5
4
|
return false;
|
|
6
5
|
}
|
|
7
6
|
const { version, roots } = value;
|
|
8
|
-
return version === 1 && Array.isArray(roots) && roots.every((root) => root instanceof
|
|
7
|
+
return version === 1 && Array.isArray(roots) && roots.every((root) => root instanceof CidLinkWrapper);
|
|
9
8
|
};
|
|
10
9
|
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +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,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,MAAM,EAAE;IACpB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;CAKzD,CAAC"}
|
|
@@ -0,0 +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,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
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CidLink } from '@atcute/cid';
|
|
2
|
+
import type { CarBlock } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* creates an async generator that yields CAR file chunks
|
|
5
|
+
* @param root root CIDs for the CAR file
|
|
6
|
+
* @param blocks async iterable of blocks to write
|
|
7
|
+
* @yields Uint8Array chunks of the CAR file (header, then entries)
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const blocks = async function* () {
|
|
12
|
+
* yield { cid: commitCid.bytes, data: commitBytes };
|
|
13
|
+
* yield { cid: nodeCid.bytes, data: nodeBytes };
|
|
14
|
+
* };
|
|
15
|
+
*
|
|
16
|
+
* // Stream chunks
|
|
17
|
+
* for await (const chunk of writeCarStream([rootCid], blocks())) {
|
|
18
|
+
* stream.write(chunk);
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* // Or collect into array (requires Array.fromAsync or polyfill)
|
|
22
|
+
* const chunks = await Array.fromAsync(writeCarStream([rootCid], blocks()));
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare function writeCarStream(roots: CidLink[], blocks: AsyncIterable<CarBlock> | Iterable<CarBlock>): AsyncGenerator<Uint8Array<ArrayBuffer>>;
|
|
26
|
+
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../lib/writer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAqD3C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAuB,cAAc,CACpC,KAAK,EAAE,OAAO,EAAE,EAChB,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAClD,cAAc,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAQzC"}
|
package/dist/writer.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import { allocUnsafe } from '@atcute/uint8array';
|
|
3
|
+
import * as varint from '@atcute/varint';
|
|
4
|
+
/**
|
|
5
|
+
* encodes a number as an unsigned varint (variable-length integer)
|
|
6
|
+
* @param n the number to encode
|
|
7
|
+
* @returns the varint-encoded bytes
|
|
8
|
+
*/
|
|
9
|
+
const encodeVarint = (n) => {
|
|
10
|
+
const length = varint.encodingLength(n);
|
|
11
|
+
const buf = allocUnsafe(length);
|
|
12
|
+
varint.encode(n, buf, 0);
|
|
13
|
+
return buf;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* serializes a CAR v1 header
|
|
17
|
+
* @internal
|
|
18
|
+
* @param roots array of root CIDs (typically just one)
|
|
19
|
+
* @returns the serialized header bytes
|
|
20
|
+
*/
|
|
21
|
+
export const serializeCarHeader = (roots) => {
|
|
22
|
+
const headerData = CBOR.encode({
|
|
23
|
+
version: 1,
|
|
24
|
+
roots: roots,
|
|
25
|
+
});
|
|
26
|
+
const headerSize = encodeVarint(headerData.length);
|
|
27
|
+
const result = allocUnsafe(headerSize.length + headerData.length);
|
|
28
|
+
result.set(headerSize, 0);
|
|
29
|
+
result.set(headerData, headerSize.length);
|
|
30
|
+
return result;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* serializes a single CAR entry (block)
|
|
34
|
+
* @internal
|
|
35
|
+
* @param cid the CID of the block (as bytes)
|
|
36
|
+
* @param data the block data
|
|
37
|
+
* @returns the serialized entry bytes
|
|
38
|
+
*/
|
|
39
|
+
export const serializeCarEntry = (cid, data) => {
|
|
40
|
+
const entrySize = encodeVarint(cid.length + data.length);
|
|
41
|
+
const result = allocUnsafe(entrySize.length + cid.length + data.length);
|
|
42
|
+
result.set(entrySize, 0);
|
|
43
|
+
result.set(cid, entrySize.length);
|
|
44
|
+
result.set(data, entrySize.length + cid.length);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* creates an async generator that yields CAR file chunks
|
|
49
|
+
* @param root root CIDs for the CAR file
|
|
50
|
+
* @param blocks async iterable of blocks to write
|
|
51
|
+
* @yields Uint8Array chunks of the CAR file (header, then entries)
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```typescript
|
|
55
|
+
* const blocks = async function* () {
|
|
56
|
+
* yield { cid: commitCid.bytes, data: commitBytes };
|
|
57
|
+
* yield { cid: nodeCid.bytes, data: nodeBytes };
|
|
58
|
+
* };
|
|
59
|
+
*
|
|
60
|
+
* // Stream chunks
|
|
61
|
+
* for await (const chunk of writeCarStream([rootCid], blocks())) {
|
|
62
|
+
* stream.write(chunk);
|
|
63
|
+
* }
|
|
64
|
+
*
|
|
65
|
+
* // Or collect into array (requires Array.fromAsync or polyfill)
|
|
66
|
+
* const chunks = await Array.fromAsync(writeCarStream([rootCid], blocks()));
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
export async function* writeCarStream(roots, blocks) {
|
|
70
|
+
// Emit header first
|
|
71
|
+
yield serializeCarHeader(roots);
|
|
72
|
+
// Then emit each block entry
|
|
73
|
+
for await (const block of blocks) {
|
|
74
|
+
yield serializeCarEntry(block.cid, block.data);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +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,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
ADDED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import type { CidLink } from '@atcute/cid';
|
|
2
3
|
import * as CID from '@atcute/cid';
|
|
3
4
|
import * as varint from '@atcute/varint';
|
|
4
5
|
|
|
@@ -13,7 +14,7 @@ interface SyncByteReader {
|
|
|
13
14
|
|
|
14
15
|
export interface SyncCarReader {
|
|
15
16
|
readonly header: CarHeader;
|
|
16
|
-
readonly roots:
|
|
17
|
+
readonly roots: CidLink[];
|
|
17
18
|
|
|
18
19
|
/** @deprecated do for..of on the reader directly */
|
|
19
20
|
iterate(): Generator<CarEntry>;
|
|
@@ -131,12 +132,12 @@ const readHeader = (reader: SyncByteReader): CarHeader => {
|
|
|
131
132
|
};
|
|
132
133
|
|
|
133
134
|
const readCid = (reader: SyncByteReader): CID.Cid => {
|
|
134
|
-
const
|
|
135
|
+
const bytes = reader.exactly(36, true);
|
|
135
136
|
|
|
136
|
-
const version =
|
|
137
|
-
const codec =
|
|
138
|
-
const digestType =
|
|
139
|
-
const digestSize =
|
|
137
|
+
const version = bytes[0];
|
|
138
|
+
const codec = bytes[1];
|
|
139
|
+
const digestType = bytes[2];
|
|
140
|
+
const digestSize = bytes[3];
|
|
140
141
|
|
|
141
142
|
if (version !== CID.CID_VERSION) {
|
|
142
143
|
throw new RangeError(`incorrect cid version (got v${version})`);
|
|
@@ -150,24 +151,17 @@ const readCid = (reader: SyncByteReader): CID.Cid => {
|
|
|
150
151
|
throw new RangeError(`incorrect cid digest type (got 0x${digestType.toString(16)})`);
|
|
151
152
|
}
|
|
152
153
|
|
|
153
|
-
if (digestSize !== 32
|
|
154
|
+
if (digestSize !== 32) {
|
|
154
155
|
throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
|
|
155
156
|
}
|
|
156
157
|
|
|
157
|
-
|
|
158
|
-
const digest = bytes.subarray(4, 4 + digestSize);
|
|
159
|
-
|
|
160
|
-
const cid: CID.Cid = {
|
|
158
|
+
return {
|
|
161
159
|
version: version,
|
|
162
160
|
codec: codec,
|
|
163
161
|
digest: {
|
|
164
162
|
codec: digestType,
|
|
165
|
-
contents:
|
|
163
|
+
contents: bytes.subarray(4, 36),
|
|
166
164
|
},
|
|
167
165
|
bytes: bytes,
|
|
168
|
-
// @ts-expect-error
|
|
169
|
-
_str: undefined,
|
|
170
166
|
};
|
|
171
|
-
|
|
172
|
-
return cid;
|
|
173
167
|
};
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import type { Cid, CidLink } from '@atcute/cid';
|
|
2
3
|
import * as CID from '@atcute/cid';
|
|
3
|
-
import { concat } from '@atcute/uint8array';
|
|
4
4
|
|
|
5
5
|
import { isCarV1Header, type CarEntry, type CarHeader } from './types.js';
|
|
6
6
|
|
|
7
7
|
export interface StreamedCarReader {
|
|
8
8
|
header(): Promise<CarHeader>;
|
|
9
|
-
roots(): Promise<
|
|
9
|
+
roots(): Promise<CidLink[]>;
|
|
10
10
|
|
|
11
11
|
dispose(): Promise<void>;
|
|
12
12
|
|
|
@@ -110,13 +110,13 @@ export const fromStream = (stream: ReadableStream<Uint8Array>): StreamedCarReade
|
|
|
110
110
|
return buffer;
|
|
111
111
|
};
|
|
112
112
|
|
|
113
|
-
const readCid = async (): Promise<
|
|
114
|
-
const
|
|
113
|
+
const readCid = async (): Promise<Cid> => {
|
|
114
|
+
const bytes = await readExact(36);
|
|
115
115
|
|
|
116
|
-
const version =
|
|
117
|
-
const codec =
|
|
118
|
-
const digestType =
|
|
119
|
-
const digestSize =
|
|
116
|
+
const version = bytes[0];
|
|
117
|
+
const codec = bytes[1];
|
|
118
|
+
const digestType = bytes[2];
|
|
119
|
+
const digestSize = bytes[3];
|
|
120
120
|
|
|
121
121
|
if (version !== CID.CID_VERSION) {
|
|
122
122
|
throw new RangeError(`incorrect cid version (got v${version})`);
|
|
@@ -130,27 +130,19 @@ export const fromStream = (stream: ReadableStream<Uint8Array>): StreamedCarReade
|
|
|
130
130
|
throw new RangeError(`incorrect cid digest type (got 0x${digestType.toString(16)})`);
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
-
if (digestSize !== 32
|
|
133
|
+
if (digestSize !== 32) {
|
|
134
134
|
throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
|
|
138
|
-
const bytes = concat([head, await readExact(digestSize)]);
|
|
139
|
-
const digest = bytes.subarray(4, 4 + digestSize);
|
|
140
|
-
|
|
141
|
-
const cid: CID.Cid = {
|
|
137
|
+
return {
|
|
142
138
|
version: version,
|
|
143
139
|
codec: codec,
|
|
144
140
|
digest: {
|
|
145
141
|
codec: digestType,
|
|
146
|
-
contents:
|
|
142
|
+
contents: bytes.subarray(4, 36),
|
|
147
143
|
},
|
|
148
144
|
bytes: bytes,
|
|
149
|
-
// @ts-expect-error
|
|
150
|
-
_str: undefined,
|
|
151
145
|
};
|
|
152
|
-
|
|
153
|
-
return cid;
|
|
154
146
|
};
|
|
155
147
|
|
|
156
148
|
return {
|
|
@@ -188,7 +180,7 @@ export const fromStream = (stream: ReadableStream<Uint8Array>): StreamedCarReade
|
|
|
188
180
|
return (_header = { data, headerStart, headerEnd, dataStart, dataEnd });
|
|
189
181
|
},
|
|
190
182
|
|
|
191
|
-
async roots(): Promise<
|
|
183
|
+
async roots(): Promise<CidLink[]> {
|
|
192
184
|
const header = await this.header();
|
|
193
185
|
|
|
194
186
|
return header.data.roots;
|