@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.
Files changed (95) hide show
  1. package/README.md +35 -45
  2. package/dist/index.d.ts +5 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +6 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/{v4/car-reader/sync-car-reader.d.ts → reader.d.ts} +4 -4
  7. package/dist/reader.d.ts.map +1 -0
  8. package/dist/{v4/car-reader/sync-car-reader.js → reader.js} +9 -14
  9. package/dist/reader.js.map +1 -0
  10. package/dist/{v4/car-reader/stream-car-reader.d.ts → streamed-reader.d.ts} +5 -5
  11. package/dist/streamed-reader.d.ts.map +1 -0
  12. package/dist/{v4/car-reader/stream-car-reader.js → streamed-reader.js} +9 -16
  13. package/dist/streamed-reader.js.map +1 -0
  14. package/dist/{v4/car-reader/types.d.ts → types.d.ts} +12 -3
  15. package/dist/types.d.ts.map +1 -0
  16. package/dist/{v4/car-reader/types.js → types.js} +2 -3
  17. package/dist/types.js.map +1 -0
  18. package/dist/utils.d.ts.map +1 -0
  19. package/dist/utils.js.map +1 -0
  20. package/dist/writer.d.ts +26 -0
  21. package/dist/writer.d.ts.map +1 -0
  22. package/dist/writer.js +77 -0
  23. package/dist/writer.js.map +1 -0
  24. package/lib/index.ts +8 -0
  25. package/lib/{v4/car-reader/sync-car-reader.ts → reader.ts} +10 -16
  26. package/lib/{v4/car-reader/stream-car-reader.ts → streamed-reader.ts} +12 -20
  27. package/lib/{v4/car-reader/types.ts → types.ts} +14 -5
  28. package/lib/writer.ts +92 -0
  29. package/package.json +14 -14
  30. package/dist/v3/atproto-repo.d.ts +0 -2
  31. package/dist/v3/atproto-repo.d.ts.map +0 -1
  32. package/dist/v3/atproto-repo.js +0 -2
  33. package/dist/v3/atproto-repo.js.map +0 -1
  34. package/dist/v3/index.d.ts +0 -3
  35. package/dist/v3/index.d.ts.map +0 -1
  36. package/dist/v3/index.js +0 -3
  37. package/dist/v3/index.js.map +0 -1
  38. package/dist/v3/reader.d.ts +0 -2
  39. package/dist/v3/reader.d.ts.map +0 -1
  40. package/dist/v3/reader.js +0 -2
  41. package/dist/v3/reader.js.map +0 -1
  42. package/dist/v4/car-reader/index.d.ts +0 -4
  43. package/dist/v4/car-reader/index.d.ts.map +0 -1
  44. package/dist/v4/car-reader/index.js +0 -4
  45. package/dist/v4/car-reader/index.js.map +0 -1
  46. package/dist/v4/car-reader/stream-car-reader.d.ts.map +0 -1
  47. package/dist/v4/car-reader/stream-car-reader.js.map +0 -1
  48. package/dist/v4/car-reader/sync-car-reader.d.ts.map +0 -1
  49. package/dist/v4/car-reader/sync-car-reader.js.map +0 -1
  50. package/dist/v4/car-reader/types.d.ts.map +0 -1
  51. package/dist/v4/car-reader/types.js.map +0 -1
  52. package/dist/v4/index.d.ts +0 -3
  53. package/dist/v4/index.d.ts.map +0 -1
  54. package/dist/v4/index.js +0 -3
  55. package/dist/v4/index.js.map +0 -1
  56. package/dist/v4/repo-reader/index.d.ts +0 -6
  57. package/dist/v4/repo-reader/index.d.ts.map +0 -1
  58. package/dist/v4/repo-reader/index.js +0 -6
  59. package/dist/v4/repo-reader/index.js.map +0 -1
  60. package/dist/v4/repo-reader/mst.d.ts +0 -48
  61. package/dist/v4/repo-reader/mst.d.ts.map +0 -1
  62. package/dist/v4/repo-reader/mst.js +0 -62
  63. package/dist/v4/repo-reader/mst.js.map +0 -1
  64. package/dist/v4/repo-reader/stream-repo-reader.d.ts +0 -25
  65. package/dist/v4/repo-reader/stream-repo-reader.d.ts.map +0 -1
  66. package/dist/v4/repo-reader/stream-repo-reader.js +0 -143
  67. package/dist/v4/repo-reader/stream-repo-reader.js.map +0 -1
  68. package/dist/v4/repo-reader/sync-blockmap.d.ts +0 -30
  69. package/dist/v4/repo-reader/sync-blockmap.d.ts.map +0 -1
  70. package/dist/v4/repo-reader/sync-blockmap.js +0 -58
  71. package/dist/v4/repo-reader/sync-blockmap.js.map +0 -1
  72. package/dist/v4/repo-reader/sync-repo-reader.d.ts +0 -3
  73. package/dist/v4/repo-reader/sync-repo-reader.d.ts.map +0 -1
  74. package/dist/v4/repo-reader/sync-repo-reader.js +0 -20
  75. package/dist/v4/repo-reader/sync-repo-reader.js.map +0 -1
  76. package/dist/v4/repo-reader/types.d.ts +0 -21
  77. package/dist/v4/repo-reader/types.d.ts.map +0 -1
  78. package/dist/v4/repo-reader/types.js +0 -37
  79. package/dist/v4/repo-reader/types.js.map +0 -1
  80. package/dist/v4/utils.d.ts.map +0 -1
  81. package/dist/v4/utils.js.map +0 -1
  82. package/lib/v3/atproto-repo.ts +0 -15
  83. package/lib/v3/index.ts +0 -2
  84. package/lib/v3/reader.ts +0 -9
  85. package/lib/v4/car-reader/index.ts +0 -4
  86. package/lib/v4/index.ts +0 -2
  87. package/lib/v4/repo-reader/index.ts +0 -6
  88. package/lib/v4/repo-reader/mst.ts +0 -110
  89. package/lib/v4/repo-reader/stream-repo-reader.ts +0 -209
  90. package/lib/v4/repo-reader/sync-blockmap.ts +0 -85
  91. package/lib/v4/repo-reader/sync-repo-reader.ts +0 -27
  92. package/lib/v4/repo-reader/types.ts +0 -32
  93. /package/dist/{v4/utils.d.ts → utils.d.ts} +0 -0
  94. /package/dist/{v4/utils.js → utils.js} +0 -0
  95. /package/lib/{v4/utils.ts → utils.ts} +0 -0
package/README.md CHANGED
@@ -1,7 +1,13 @@
1
1
  # @atcute/car
2
2
 
3
- lightweight [DASL CAR (content-addressable archives)][dasl-car] and atproto repository decoder
4
- library for AT Protocol.
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 { CarReader, RepoReader } from '@atcute/car/v4';
19
+ import { fromStream } from '@atcute/car';
14
20
 
15
21
  const stream = new ReadableStream({
16
22
  /* ... */
17
23
  });
18
24
 
19
- // read AT Protocol repository exports
20
- {
21
- await using repo = RepoReader.fromStream(stream);
25
+ await using car = fromStream(stream);
22
26
 
23
- for await (const entry of repo) {
24
- entry;
25
- // ^? RepoEntry { collection: 'app.bsky.feed.post', rkey: '3lprcc55bb222', ... }
26
- }
27
+ const roots = await car.roots();
27
28
 
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();
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 repo = RepoReader.fromStream(stream);
38
+ const car = fromStream(stream);
49
39
 
50
40
  try {
51
- for await (const entry of repo) {
41
+ for await (const entry of car) {
52
42
  entry;
53
- // ^? RepoEntry
43
+ // ^? CarEntry { ... }
54
44
  }
55
45
  } finally {
56
- await repo.dispose();
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 AT Protocol repository exports
68
- {
69
- const repo = RepoReader.fromUint8Array(buffer);
57
+ // read generic CAR archives
58
+ const car = fromUint8Array(buffer);
70
59
 
71
- for (const entry of repo) {
72
- entry;
73
- // ^? RepoEntry { collection: 'app.bsky.feed.post', rkey: '3lprcc55bb222', ... }
74
- }
60
+ const roots = car.roots;
75
61
 
76
- repo.missingBlocks;
77
- // ^? []
62
+ for (const entry of car) {
63
+ entry;
64
+ // ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
78
65
  }
66
+ ```
79
67
 
80
- // read generic CAR archives
81
- {
82
- const car = CarReader.fromUint8Array(buffer);
68
+ ### writing
83
69
 
84
- const roots = car.roots;
70
+ ```ts
71
+ import { writeCarStream } from '@atcute/car';
85
72
 
86
- for (const entry of car) {
87
- entry;
88
- // ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
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
  ```
@@ -0,0 +1,5 @@
1
+ export * from './reader.js';
2
+ export * from './streamed-reader.js';
3
+ export * from './writer.js';
4
+ export * from './types.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -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,6 @@
1
+ // implements github:darobin/dasl.ing@cc66c35 (2025-10-20)
2
+ export * from './reader.js';
3
+ export * from './streamed-reader.js';
4
+ export * from './writer.js';
5
+ export * from './types.js';
6
+ //# sourceMappingURL=index.js.map
@@ -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 * as CBOR from '@atcute/cbor';
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: CBOR.CidLink[];
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=sync-car-reader.d.ts.map
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 head = reader.exactly(4, false);
94
- const version = head[0];
95
- const codec = head[1];
96
- const digestType = head[2];
97
- const digestSize = head[3];
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 && digestSize !== 0) {
107
+ if (digestSize !== 32) {
108
108
  throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
109
109
  }
110
- const bytes = reader.exactly(4 + digestSize, true);
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: digest,
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=sync-car-reader.js.map
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 * as CBOR from '@atcute/cbor';
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<CBOR.CidLink[]>;
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>) => StreamedCarReader;
12
- //# sourceMappingURL=stream-car-reader.d.ts.map
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 head = await readExact(4);
81
- const version = head[0];
82
- const codec = head[1];
83
- const digestType = head[2];
84
- const digestSize = head[3];
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 && digestSize !== 0) {
93
+ if (digestSize !== 32) {
95
94
  throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
96
95
  }
97
- // concatenate and have digest refer back to this buffer
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: digest,
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=stream-car-reader.js.map
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 * as CID from '@atcute/cid';
1
+ import { type Cid, type CidLink } from '@atcute/cid';
2
2
  export interface CarV1Header {
3
3
  version: 1;
4
- roots: CID.CidLink[];
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: CID.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 * as CBOR from '@atcute/cbor';
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 CBOR.CidLinkWrapper);
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"}
@@ -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
@@ -0,0 +1,8 @@
1
+ // implements github:darobin/dasl.ing@cc66c35 (2025-10-20)
2
+
3
+ export * from './reader.js';
4
+ export * from './streamed-reader.js';
5
+
6
+ export * from './writer.js';
7
+
8
+ export * from './types.js';
@@ -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: CBOR.CidLink[];
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 head = reader.exactly(4, false);
135
+ const bytes = reader.exactly(36, true);
135
136
 
136
- const version = head[0];
137
- const codec = head[1];
138
- const digestType = head[2];
139
- const digestSize = head[3];
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 && digestSize !== 0) {
154
+ if (digestSize !== 32) {
154
155
  throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
155
156
  }
156
157
 
157
- const bytes = reader.exactly(4 + digestSize, true);
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: digest,
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<CBOR.CidLink[]>;
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<CID.Cid> => {
114
- const head = await readExact(4);
113
+ const readCid = async (): Promise<Cid> => {
114
+ const bytes = await readExact(36);
115
115
 
116
- const version = head[0];
117
- const codec = head[1];
118
- const digestType = head[2];
119
- const digestSize = head[3];
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 && digestSize !== 0) {
133
+ if (digestSize !== 32) {
134
134
  throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
135
135
  }
136
136
 
137
- // concatenate and have digest refer back to this buffer
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: digest,
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<CBOR.CidLink[]> {
183
+ async roots(): Promise<CidLink[]> {
192
184
  const header = await this.header();
193
185
 
194
186
  return header.data.roots;