@atcute/car 3.1.2 → 5.0.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 +16 -48
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/{v4/car-reader/sync-car-reader.d.ts → reader.d.ts} +3 -3
- package/dist/reader.d.ts.map +1 -0
- package/dist/{v4/car-reader/sync-car-reader.js → reader.js} +1 -1
- package/dist/reader.js.map +1 -0
- package/dist/{v4/car-reader/stream-car-reader.d.ts → streamed-reader.d.ts} +3 -3
- package/dist/streamed-reader.d.ts.map +1 -0
- package/dist/{v4/car-reader/stream-car-reader.js → streamed-reader.js} +1 -1
- 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 +6 -0
- package/lib/{v4/car-reader/sync-car-reader.ts → reader.ts} +2 -1
- package/lib/{v4/car-reader/stream-car-reader.ts → streamed-reader.ts} +5 -4
- package/lib/{v4/car-reader/types.ts → types.ts} +14 -5
- package/lib/writer.ts +92 -0
- package/package.json +8 -11
- 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,6 @@
|
|
|
1
1
|
# @atcute/car
|
|
2
2
|
|
|
3
|
-
lightweight [DASL CAR (content-addressable archives)][dasl-car]
|
|
4
|
-
library for AT Protocol.
|
|
3
|
+
lightweight [DASL CAR (content-addressable archives)][dasl-car] codec library for AT Protocol.
|
|
5
4
|
|
|
6
5
|
[dasl-car]: https://dasl.ing/car.html
|
|
7
6
|
|
|
@@ -10,50 +9,34 @@ library for AT Protocol.
|
|
|
10
9
|
### streaming usage
|
|
11
10
|
|
|
12
11
|
```ts
|
|
13
|
-
import {
|
|
12
|
+
import { fromStream } from '@atcute/car';
|
|
14
13
|
|
|
15
14
|
const stream = new ReadableStream({
|
|
16
15
|
/* ... */
|
|
17
16
|
});
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
{
|
|
21
|
-
await using repo = RepoReader.fromStream(stream);
|
|
18
|
+
await using car = fromStream(stream);
|
|
22
19
|
|
|
23
|
-
|
|
24
|
-
entry;
|
|
25
|
-
// ^? RepoEntry { collection: 'app.bsky.feed.post', rkey: '3lprcc55bb222', ... }
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
repo.missingBlocks;
|
|
29
|
-
// ^? []
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// read generic CAR archives
|
|
33
|
-
{
|
|
34
|
-
await using car = CarReader.fromStream(stream);
|
|
35
|
-
|
|
36
|
-
const roots = await car.roots();
|
|
20
|
+
const roots = await car.roots();
|
|
37
21
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
22
|
+
for await (const entry of car) {
|
|
23
|
+
entry;
|
|
24
|
+
// ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
|
|
42
25
|
}
|
|
43
26
|
```
|
|
44
27
|
|
|
45
28
|
### streaming usage (for runtimes without `await using` yet)
|
|
46
29
|
|
|
47
30
|
```ts
|
|
48
|
-
const
|
|
31
|
+
const car = fromStream(stream);
|
|
49
32
|
|
|
50
33
|
try {
|
|
51
|
-
for await (const entry of
|
|
34
|
+
for await (const entry of car) {
|
|
52
35
|
entry;
|
|
53
|
-
// ^?
|
|
36
|
+
// ^? CarEntry { ... }
|
|
54
37
|
}
|
|
55
38
|
} finally {
|
|
56
|
-
await
|
|
39
|
+
await car.dispose();
|
|
57
40
|
}
|
|
58
41
|
```
|
|
59
42
|
|
|
@@ -64,28 +47,13 @@ const buffer = Uint8Array.from([
|
|
|
64
47
|
/* ... */
|
|
65
48
|
]);
|
|
66
49
|
|
|
67
|
-
// read AT Protocol repository exports
|
|
68
|
-
{
|
|
69
|
-
const repo = RepoReader.fromUint8Array(buffer);
|
|
70
|
-
|
|
71
|
-
for (const entry of repo) {
|
|
72
|
-
entry;
|
|
73
|
-
// ^? RepoEntry { collection: 'app.bsky.feed.post', rkey: '3lprcc55bb222', ... }
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
repo.missingBlocks;
|
|
77
|
-
// ^? []
|
|
78
|
-
}
|
|
79
|
-
|
|
80
50
|
// read generic CAR archives
|
|
81
|
-
|
|
82
|
-
const car = CarReader.fromUint8Array(buffer);
|
|
51
|
+
const car = fromUint8Array(buffer);
|
|
83
52
|
|
|
84
|
-
|
|
53
|
+
const roots = car.roots;
|
|
85
54
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
55
|
+
for (const entry of car) {
|
|
56
|
+
entry;
|
|
57
|
+
// ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
|
|
90
58
|
}
|
|
91
59
|
```
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,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,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
10
|
export declare const fromUint8Array: (buffer: Uint8Array) => SyncCarReader;
|
|
11
|
-
//# sourceMappingURL=
|
|
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,GAAI,QAAQ,UAAU,KAAG,aA0CnD,CAAC"}
|
|
@@ -0,0 +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;AAkB1E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAkB,EAAiB,EAAE;IACnE,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAElC,OAAO;QACN,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK;QAExB,CAAC,OAAO;YACP,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC9B,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAExC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC5B,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;gBAE5B,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC9B,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC;gBACtD,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;gBAE9C,MAAM,MAAM,GAAG,UAAU,CAAC;gBAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC;gBAC5B,MAAM,QAAQ,GAAG,QAAQ,CAAC;gBAE1B,MAAM;oBACL,GAAG;oBACH,KAAK;oBAEL,UAAU;oBACV,QAAQ;oBACR,QAAQ;oBACR,MAAM;oBACN,UAAU;oBACV,QAAQ;iBACR,CAAC;YACH,CAAC;QACF,CAAC;QAED,CAAC,MAAM,CAAC,QAAQ,CAAC;YAChB,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;KACD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,iBAAiB,GAAG,CAAC,GAAe,EAAkB,EAAE;IAC7D,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,OAAO;QACN,IAAI,GAAG;YACN,OAAO,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,IAAI;YACR,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC7B,MAAM,IAAI,UAAU,CAAC,wBAAwB,CAAC,CAAC;YAChD,CAAC;YAED,GAAG,IAAI,IAAI,CAAC;QACb,CAAC;QACD,IAAI,CAAC,IAAI;YACR,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,CAAC,IAAI,EAAE,IAAI;YACjB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBAC7B,MAAM,IAAI,UAAU,CAAC,wBAAwB,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,CAAC;YAC5C,IAAI,IAAI,EAAE,CAAC;gBACV,GAAG,IAAI,IAAI,CAAC;YACb,CAAC;YAED,OAAO,KAAK,CAAC;QACd,CAAC;KACD,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAsB,EAAE,IAAY,EAAU,EAAE;IACnE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,UAAU,CAAC,wBAAwB,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElB,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,UAAU,GAAG,CAAC,MAAsB,EAAa,EAAE;IACxD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC;IAC/B,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;QAClB,MAAM,IAAI,UAAU,CAAC,8BAA8B,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE/C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,SAAS,CAAC,2BAA2B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC;IAC3B,MAAM,SAAS,GAAG,OAAO,CAAC;IAE1B,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AAC7D,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,MAAsB,EAAW,EAAE;IACnD,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAEtC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3B,IAAI,OAAO,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;QACjC,MAAM,IAAI,UAAU,CAAC,+BAA+B,OAAO,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,KAAK,KAAK,GAAG,CAAC,WAAW,IAAI,KAAK,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC;QAC1D,MAAM,IAAI,UAAU,CAAC,8BAA8B,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,UAAU,KAAK,GAAG,CAAC,WAAW,EAAE,CAAC;QACpC,MAAM,IAAI,UAAU,CAAC,oCAAoC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACtF,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,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,UAAU,EAAE,IAAI,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;IAEjD,MAAM,GAAG,GAAY;QACpB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE;YACP,KAAK,EAAE,UAAU;YACjB,QAAQ,EAAE,MAAM;SAChB;QACD,KAAK,EAAE,KAAK;KACZ,CAAC;IAEF,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC"}
|
|
@@ -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
10
|
export declare const carEntryTransform: () => ReadableWritablePair<CarEntry, Uint8Array>;
|
|
11
11
|
export declare const fromStream: (stream: ReadableStream<Uint8Array>) => StreamedCarReader;
|
|
12
|
-
//# sourceMappingURL=
|
|
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;AAIhD,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,QAAO,oBAAoB,CAAC,QAAQ,EAAE,UAAU,CA6B7E,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,QAAQ,cAAc,CAAC,UAAU,CAAC,KAAG,iBAgM/D,CAAC"}
|
|
@@ -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,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,WAOvD,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;IACrE,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;AACvG,CAAC,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;IAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1B,CAAC;AACF,CAAC,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;IAC3D,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;AACZ,CAAC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAyB,EAA2B,EAAE;IACxF,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;AACf,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAe,EAAE,IAAgB,EAA2B,EAAE;IAC/F,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;AACf,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,cAAc,CACpC,KAAgB,EAChB,MAAoD;IAEpD,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;AACF,CAAC"}
|
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>;
|
|
@@ -1,4 +1,5 @@
|
|
|
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
4
|
import { concat } from '@atcute/uint8array';
|
|
4
5
|
|
|
@@ -6,7 +7,7 @@ import { isCarV1Header, type CarEntry, type CarHeader } from './types.js';
|
|
|
6
7
|
|
|
7
8
|
export interface StreamedCarReader {
|
|
8
9
|
header(): Promise<CarHeader>;
|
|
9
|
-
roots(): Promise<
|
|
10
|
+
roots(): Promise<CidLink[]>;
|
|
10
11
|
|
|
11
12
|
dispose(): Promise<void>;
|
|
12
13
|
|
|
@@ -110,7 +111,7 @@ export const fromStream = (stream: ReadableStream<Uint8Array>): StreamedCarReade
|
|
|
110
111
|
return buffer;
|
|
111
112
|
};
|
|
112
113
|
|
|
113
|
-
const readCid = async (): Promise<
|
|
114
|
+
const readCid = async (): Promise<Cid> => {
|
|
114
115
|
const head = await readExact(4);
|
|
115
116
|
|
|
116
117
|
const version = head[0];
|
|
@@ -138,7 +139,7 @@ export const fromStream = (stream: ReadableStream<Uint8Array>): StreamedCarReade
|
|
|
138
139
|
const bytes = concat([head, await readExact(digestSize)]);
|
|
139
140
|
const digest = bytes.subarray(4, 4 + digestSize);
|
|
140
141
|
|
|
141
|
-
const cid:
|
|
142
|
+
const cid: Cid = {
|
|
142
143
|
version: version,
|
|
143
144
|
codec: codec,
|
|
144
145
|
digest: {
|
|
@@ -186,7 +187,7 @@ export const fromStream = (stream: ReadableStream<Uint8Array>): StreamedCarReade
|
|
|
186
187
|
return (_header = { data, headerStart, headerEnd, dataStart, dataEnd });
|
|
187
188
|
},
|
|
188
189
|
|
|
189
|
-
async roots(): Promise<
|
|
190
|
+
async roots(): Promise<CidLink[]> {
|
|
190
191
|
const header = await this.header();
|
|
191
192
|
|
|
192
193
|
return header.data.roots;
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import * as CID from '@atcute/cid';
|
|
1
|
+
import { CidLinkWrapper, type Cid, type CidLink } from '@atcute/cid';
|
|
3
2
|
|
|
4
3
|
export interface CarV1Header {
|
|
5
4
|
version: 1;
|
|
6
|
-
roots:
|
|
5
|
+
roots: CidLink[];
|
|
7
6
|
}
|
|
8
7
|
|
|
9
8
|
export const isCarV1Header = (value: unknown): value is CarV1Header => {
|
|
@@ -12,7 +11,7 @@ export const isCarV1Header = (value: unknown): value is CarV1Header => {
|
|
|
12
11
|
}
|
|
13
12
|
|
|
14
13
|
const { version, roots } = value as CarV1Header;
|
|
15
|
-
return version === 1 && Array.isArray(roots) && roots.every((root) => root instanceof
|
|
14
|
+
return version === 1 && Array.isArray(roots) && roots.every((root) => root instanceof CidLinkWrapper);
|
|
16
15
|
};
|
|
17
16
|
|
|
18
17
|
export interface CarHeader {
|
|
@@ -28,7 +27,7 @@ export interface CarEntry {
|
|
|
28
27
|
entryStart: number;
|
|
29
28
|
entryEnd: number;
|
|
30
29
|
|
|
31
|
-
cid:
|
|
30
|
+
cid: Cid;
|
|
32
31
|
cidStart: number;
|
|
33
32
|
cidEnd: number;
|
|
34
33
|
|
|
@@ -36,3 +35,13 @@ export interface CarEntry {
|
|
|
36
35
|
bytesStart: number;
|
|
37
36
|
bytesEnd: number;
|
|
38
37
|
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* represents a block to be written to a CAR file
|
|
41
|
+
*/
|
|
42
|
+
export interface CarBlock {
|
|
43
|
+
/** the CID of the block (as bytes) */
|
|
44
|
+
cid: Uint8Array;
|
|
45
|
+
/** the block data */
|
|
46
|
+
data: Uint8Array;
|
|
47
|
+
}
|
package/lib/writer.ts
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import type { CidLink } from '@atcute/cid';
|
|
3
|
+
import { allocUnsafe } from '@atcute/uint8array';
|
|
4
|
+
import * as varint from '@atcute/varint';
|
|
5
|
+
|
|
6
|
+
import type { CarBlock } from './types.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* encodes a number as an unsigned varint (variable-length integer)
|
|
10
|
+
* @param n the number to encode
|
|
11
|
+
* @returns the varint-encoded bytes
|
|
12
|
+
*/
|
|
13
|
+
const encodeVarint = (n: number): Uint8Array<ArrayBuffer> => {
|
|
14
|
+
const length = varint.encodingLength(n);
|
|
15
|
+
const buf = allocUnsafe(length);
|
|
16
|
+
varint.encode(n, buf, 0);
|
|
17
|
+
return buf;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* serializes a CAR v1 header
|
|
22
|
+
* @internal
|
|
23
|
+
* @param roots array of root CIDs (typically just one)
|
|
24
|
+
* @returns the serialized header bytes
|
|
25
|
+
*/
|
|
26
|
+
export const serializeCarHeader = (roots: readonly CidLink[]): Uint8Array<ArrayBuffer> => {
|
|
27
|
+
const headerData = CBOR.encode({
|
|
28
|
+
version: 1,
|
|
29
|
+
roots: roots,
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const headerSize = encodeVarint(headerData.length);
|
|
33
|
+
const result = allocUnsafe(headerSize.length + headerData.length);
|
|
34
|
+
|
|
35
|
+
result.set(headerSize, 0);
|
|
36
|
+
result.set(headerData, headerSize.length);
|
|
37
|
+
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* serializes a single CAR entry (block)
|
|
43
|
+
* @internal
|
|
44
|
+
* @param cid the CID of the block (as bytes)
|
|
45
|
+
* @param data the block data
|
|
46
|
+
* @returns the serialized entry bytes
|
|
47
|
+
*/
|
|
48
|
+
export const serializeCarEntry = (cid: Uint8Array, data: Uint8Array): Uint8Array<ArrayBuffer> => {
|
|
49
|
+
const entrySize = encodeVarint(cid.length + data.length);
|
|
50
|
+
const result = allocUnsafe(entrySize.length + cid.length + data.length);
|
|
51
|
+
|
|
52
|
+
result.set(entrySize, 0);
|
|
53
|
+
result.set(cid, entrySize.length);
|
|
54
|
+
result.set(data, entrySize.length + cid.length);
|
|
55
|
+
|
|
56
|
+
return result;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* creates an async generator that yields CAR file chunks
|
|
61
|
+
* @param root root CIDs for the CAR file
|
|
62
|
+
* @param blocks async iterable of blocks to write
|
|
63
|
+
* @yields Uint8Array chunks of the CAR file (header, then entries)
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const blocks = async function* () {
|
|
68
|
+
* yield { cid: commitCid.bytes, data: commitBytes };
|
|
69
|
+
* yield { cid: nodeCid.bytes, data: nodeBytes };
|
|
70
|
+
* };
|
|
71
|
+
*
|
|
72
|
+
* // Stream chunks
|
|
73
|
+
* for await (const chunk of writeCarStream([rootCid], blocks())) {
|
|
74
|
+
* stream.write(chunk);
|
|
75
|
+
* }
|
|
76
|
+
*
|
|
77
|
+
* // Or collect into array (requires Array.fromAsync or polyfill)
|
|
78
|
+
* const chunks = await Array.fromAsync(writeCarStream([rootCid], blocks()));
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export async function* writeCarStream(
|
|
82
|
+
roots: CidLink[],
|
|
83
|
+
blocks: AsyncIterable<CarBlock> | Iterable<CarBlock>,
|
|
84
|
+
): AsyncGenerator<Uint8Array<ArrayBuffer>> {
|
|
85
|
+
// Emit header first
|
|
86
|
+
yield serializeCarHeader(roots);
|
|
87
|
+
|
|
88
|
+
// Then emit each block entry
|
|
89
|
+
for await (const block of blocks) {
|
|
90
|
+
yield serializeCarEntry(block.cid, block.data);
|
|
91
|
+
}
|
|
92
|
+
}
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@atcute/car",
|
|
4
|
-
"version": "
|
|
5
|
-
"description": "lightweight DASL CAR
|
|
4
|
+
"version": "5.0.0",
|
|
5
|
+
"description": "lightweight DASL CAR (content-addressable archives) codec for AT Protocol.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"atproto",
|
|
8
8
|
"dasl",
|
|
@@ -20,26 +20,23 @@
|
|
|
20
20
|
"!lib/**/*.test.ts"
|
|
21
21
|
],
|
|
22
22
|
"exports": {
|
|
23
|
-
".": "./dist/
|
|
24
|
-
"./v4": "./dist/v4/index.js",
|
|
25
|
-
"./v4/car-reader": "./dist/v4/car-reader/index.js",
|
|
26
|
-
"./v4/repo-reader": "./dist/v4/repo-reader/index.js"
|
|
23
|
+
".": "./dist/index.js"
|
|
27
24
|
},
|
|
28
25
|
"sideEffects": false,
|
|
29
26
|
"devDependencies": {
|
|
30
|
-
"@
|
|
27
|
+
"@vitest/coverage-v8": "^3.2.4",
|
|
28
|
+
"vitest": "^3.2.4",
|
|
31
29
|
"@atcute/multibase": "^1.1.6"
|
|
32
30
|
},
|
|
33
31
|
"dependencies": {
|
|
34
|
-
"
|
|
35
|
-
"@atcute/cbor": "^2.2.
|
|
36
|
-
"@atcute/cid": "^2.2.4",
|
|
32
|
+
"@atcute/cid": "^2.2.6",
|
|
33
|
+
"@atcute/cbor": "^2.2.7",
|
|
37
34
|
"@atcute/uint8array": "^1.0.5",
|
|
38
35
|
"@atcute/varint": "^1.0.3"
|
|
39
36
|
},
|
|
40
37
|
"scripts": {
|
|
41
38
|
"build": "tsc --project tsconfig.build.json",
|
|
42
|
-
"test": "
|
|
39
|
+
"test": "vitest --coverage",
|
|
43
40
|
"prepublish": "rm -rf dist; pnpm run build"
|
|
44
41
|
}
|
|
45
42
|
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export { collectBlock, isCommit, isMstNode, isTreeEntry, fromUint8Array as iterateAtpRepo, readBlock, RepoEntry, walkMstEntries, type BlockMap, type Commit, type MstNode, type NodeEntry, type TreeEntry, } from '../v4/repo-reader/index.js';
|
|
2
|
-
//# sourceMappingURL=atproto-repo.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"atproto-repo.d.ts","sourceRoot":"","sources":["../../lib/v3/atproto-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,IAAI,cAAc,EAChC,SAAS,EACT,SAAS,EACT,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,OAAO,EACZ,KAAK,SAAS,EACd,KAAK,SAAS,GACd,MAAM,4BAA4B,CAAC"}
|
package/dist/v3/atproto-repo.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"atproto-repo.js","sourceRoot":"","sources":["../../lib/v3/atproto-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,IAAI,cAAc,EAChC,SAAS,EACT,SAAS,EACT,cAAc,GAMd,MAAM,4BAA4B,CAAC"}
|
package/dist/v3/index.d.ts
DELETED
package/dist/v3/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/v3/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
|