@atcute/car 3.1.3 → 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.
Files changed (95) hide show
  1. package/README.md +16 -48
  2. package/dist/index.d.ts +5 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +5 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/{v4/car-reader/sync-car-reader.d.ts → reader.d.ts} +3 -3
  7. package/dist/reader.d.ts.map +1 -0
  8. package/dist/{v4/car-reader/sync-car-reader.js → reader.js} +1 -3
  9. package/dist/reader.js.map +1 -0
  10. package/dist/{v4/car-reader/stream-car-reader.d.ts → streamed-reader.d.ts} +3 -3
  11. package/dist/streamed-reader.d.ts.map +1 -0
  12. package/dist/{v4/car-reader/stream-car-reader.js → streamed-reader.js} +1 -3
  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 +6 -0
  25. package/lib/{v4/car-reader/sync-car-reader.ts → reader.ts} +2 -3
  26. package/lib/{v4/car-reader/stream-car-reader.ts → streamed-reader.ts} +5 -6
  27. package/lib/{v4/car-reader/types.ts → types.ts} +14 -5
  28. package/lib/writer.ts +92 -0
  29. package/package.json +7 -10
  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,6 @@
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
+ 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 { CarReader, RepoReader } from '@atcute/car/v4';
12
+ import { fromStream } from '@atcute/car';
14
13
 
15
14
  const stream = new ReadableStream({
16
15
  /* ... */
17
16
  });
18
17
 
19
- // read AT Protocol repository exports
20
- {
21
- await using repo = RepoReader.fromStream(stream);
18
+ await using car = fromStream(stream);
22
19
 
23
- for await (const entry of repo) {
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
- for await (const entry of car) {
39
- entry;
40
- // ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
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 repo = RepoReader.fromStream(stream);
31
+ const car = fromStream(stream);
49
32
 
50
33
  try {
51
- for await (const entry of repo) {
34
+ for await (const entry of car) {
52
35
  entry;
53
- // ^? RepoEntry
36
+ // ^? CarEntry { ... }
54
37
  }
55
38
  } finally {
56
- await repo.dispose();
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
- const roots = car.roots;
53
+ const roots = car.roots;
85
54
 
86
- for (const entry of car) {
87
- entry;
88
- // ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
89
- }
55
+ for (const entry of car) {
56
+ entry;
57
+ // ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
90
58
  }
91
59
  ```
@@ -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":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AAErC,cAAc,aAAa,CAAC;AAE5B,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -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.js.map
@@ -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 * 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
10
  export declare const fromUint8Array: (buffer: Uint8Array) => SyncCarReader;
11
- //# sourceMappingURL=sync-car-reader.d.ts.map
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"}
@@ -117,9 +117,7 @@ const readCid = (reader) => {
117
117
  contents: digest,
118
118
  },
119
119
  bytes: bytes,
120
- // @ts-expect-error
121
- _str: undefined,
122
120
  };
123
121
  return cid;
124
122
  };
125
- //# sourceMappingURL=sync-car-reader.js.map
123
+ //# 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
10
  export declare const carEntryTransform: () => ReadableWritablePair<CarEntry, Uint8Array>;
11
11
  export declare const fromStream: (stream: ReadableStream<Uint8Array>) => StreamedCarReader;
12
- //# sourceMappingURL=stream-car-reader.d.ts.map
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"}
@@ -105,8 +105,6 @@ export const fromStream = (stream) => {
105
105
  contents: digest,
106
106
  },
107
107
  bytes: bytes,
108
- // @ts-expect-error
109
- _str: undefined,
110
108
  };
111
109
  return cid;
112
110
  };
@@ -177,4 +175,4 @@ export const fromStream = (stream) => {
177
175
  },
178
176
  };
179
177
  };
180
- //# sourceMappingURL=stream-car-reader.js.map
178
+ //# 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,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 * 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;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"}
@@ -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
@@ -0,0 +1,6 @@
1
+ export * from './reader.js';
2
+ export * from './streamed-reader.js';
3
+
4
+ export * from './writer.js';
5
+
6
+ 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>;
@@ -165,8 +166,6 @@ const readCid = (reader: SyncByteReader): CID.Cid => {
165
166
  contents: digest,
166
167
  },
167
168
  bytes: bytes,
168
- // @ts-expect-error
169
- _str: undefined,
170
169
  };
171
170
 
172
171
  return cid;
@@ -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<CBOR.CidLink[]>;
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<CID.Cid> => {
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: CID.Cid = {
142
+ const cid: Cid = {
142
143
  version: version,
143
144
  codec: codec,
144
145
  digest: {
@@ -146,8 +147,6 @@ export const fromStream = (stream: ReadableStream<Uint8Array>): StreamedCarReade
146
147
  contents: digest,
147
148
  },
148
149
  bytes: bytes,
149
- // @ts-expect-error
150
- _str: undefined,
151
150
  };
152
151
 
153
152
  return cid;
@@ -188,7 +187,7 @@ export const fromStream = (stream: ReadableStream<Uint8Array>): StreamedCarReade
188
187
  return (_header = { data, headerStart, headerEnd, dataStart, dataEnd });
189
188
  },
190
189
 
191
- async roots(): Promise<CBOR.CidLink[]> {
190
+ async roots(): Promise<CidLink[]> {
192
191
  const header = await this.header();
193
192
 
194
193
  return header.data.roots;
@@ -1,9 +1,8 @@
1
- import * as CBOR from '@atcute/cbor';
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: CID.CidLink[];
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 CBOR.CidLinkWrapper);
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: CID.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": "3.1.3",
5
- "description": "lightweight DASL CAR and atproto repository decoder for AT Protocol.",
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/v3/index.js",
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
- "@types/bun": "^1.2.21",
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
- "yocto-queue": "^1.2.1",
32
+ "@atcute/cid": "^2.2.6",
35
33
  "@atcute/cbor": "^2.2.7",
36
- "@atcute/cid": "^2.2.5",
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": "bun test --coverage",
39
+ "test": "vitest --coverage",
43
40
  "prepublish": "rm -rf dist; pnpm run build"
44
41
  }
45
42
  }