@atcute/car 5.1.0 → 5.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- export * from './reader.js';
2
- export * from './streamed-reader.js';
3
- export * from './writer.js';
4
- export * from './types.js';
1
+ export * from './reader.ts';
2
+ export * from './streamed-reader.ts';
3
+ export * from './writer.ts';
4
+ export * from './types.ts';
5
5
  //# sourceMappingURL=index.d.ts.map
package/dist/reader.d.ts CHANGED
@@ -1,10 +1,10 @@
1
1
  import type { CidLink } from '@atcute/cid';
2
- import { type CarEntry, type CarHeader } from './types.js';
2
+ import { type CarEntry, type CarHeader } from './types.ts';
3
3
  export interface SyncCarReader {
4
4
  readonly header: CarHeader;
5
5
  readonly roots: CidLink[];
6
6
  /** @deprecated do for..of on the reader directly */
7
- iterate(): Generator<CarEntry>;
7
+ iterate(): IterableIterator<CarEntry>;
8
8
  [Symbol.iterator](): Iterator<CarEntry>;
9
9
  }
10
10
  export declare const fromUint8Array: (buffer: Uint8Array<ArrayBufferLike>) => SyncCarReader;
@@ -1 +1 @@
1
- {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../lib/reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAiB,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;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"}
1
+ {"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../lib/reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,EAAiB,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE1E,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC;IAE1B,oDAAoD;IACpD,OAAO,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAAC;CACxC;AAED,eAAO,MAAM,cAAc,wDAiE1B,CAAC"}
package/dist/reader.js CHANGED
@@ -3,94 +3,87 @@ import * as CID from '@atcute/cid';
3
3
  import * as varint from '@atcute/varint';
4
4
  import { isCarV1Header } from './types.js';
5
5
  export const fromUint8Array = (buffer) => {
6
- const reader = createUint8Reader(buffer);
7
- const header = readHeader(reader);
6
+ const { header, nextOffset: headerOffset } = readHeader(buffer, 0);
7
+ let pos = headerOffset;
8
8
  return {
9
9
  header,
10
10
  roots: header.data.roots,
11
- *iterate() {
12
- while (reader.upto(8 + 36).length > 0) {
13
- const entryStart = reader.pos;
14
- const entrySize = readVarint(reader, 8);
15
- const cidStart = reader.pos;
16
- const cid = readCid(reader);
17
- const bytesStart = reader.pos;
18
- const bytesSize = entrySize - (bytesStart - cidStart);
19
- const bytes = reader.exactly(bytesSize, true);
20
- const cidEnd = bytesStart;
21
- const bytesEnd = reader.pos;
22
- const entryEnd = bytesEnd;
23
- yield {
24
- cid,
25
- bytes,
26
- entryStart,
27
- entryEnd,
28
- cidStart,
29
- cidEnd,
30
- bytesStart,
31
- bytesEnd,
32
- };
33
- }
11
+ iterate() {
12
+ return {
13
+ next() {
14
+ if (pos >= buffer.length) {
15
+ return {
16
+ done: true,
17
+ value: undefined,
18
+ };
19
+ }
20
+ const entryStart = pos;
21
+ const { value: entryLength, nextOffset: lengthOffset } = varint.decode(buffer, pos, 8);
22
+ pos = lengthOffset;
23
+ const cidStart = pos;
24
+ const { cid, nextOffset: cidOffset } = readCid(buffer, pos);
25
+ pos = cidOffset;
26
+ const bytesStart = pos;
27
+ const bytesSize = entryLength - (bytesStart - cidStart);
28
+ if (bytesSize < 0 || bytesStart + bytesSize > buffer.length) {
29
+ throw new RangeError('unexpected end of data');
30
+ }
31
+ const bytesEnd = bytesStart + bytesSize;
32
+ const bytes = buffer.subarray(bytesStart, bytesEnd);
33
+ pos = bytesEnd;
34
+ const cidEnd = bytesStart;
35
+ const entryEnd = bytesEnd;
36
+ return {
37
+ done: false,
38
+ value: {
39
+ cid,
40
+ bytes,
41
+ entryStart,
42
+ entryEnd,
43
+ cidStart,
44
+ cidEnd,
45
+ bytesStart,
46
+ bytesEnd,
47
+ },
48
+ };
49
+ },
50
+ [Symbol.iterator]() {
51
+ return this;
52
+ },
53
+ };
34
54
  },
35
55
  [Symbol.iterator]() {
36
56
  return this.iterate();
37
57
  },
38
58
  };
39
59
  };
40
- const createUint8Reader = (buf) => {
41
- let pos = 0;
42
- return {
43
- get pos() {
44
- return pos;
45
- },
46
- seek(size) {
47
- if (size > buf.length - pos) {
48
- throw new RangeError('unexpected end of data');
49
- }
50
- pos += size;
51
- },
52
- upto(size) {
53
- return buf.subarray(pos, pos + size);
54
- },
55
- exactly(size, seek) {
56
- if (size > buf.length - pos) {
57
- throw new RangeError('unexpected end of data');
58
- }
59
- const slice = buf.subarray(pos, pos + size);
60
- if (seek) {
61
- pos += size;
62
- }
63
- return slice;
64
- },
65
- };
66
- };
67
- const readVarint = (reader, size) => {
68
- const buf = reader.upto(size);
69
- if (buf.length === 0) {
70
- throw new RangeError(`unexpected end of data`);
71
- }
72
- const [int, read] = varint.decode(buf);
73
- reader.seek(read);
74
- return int;
75
- };
76
- const readHeader = (reader) => {
77
- const headerStart = reader.pos;
78
- const length = readVarint(reader, 8);
60
+ const readHeader = (source, offset) => {
61
+ const headerStart = offset;
62
+ const { value: length, nextOffset: lengthOffset } = varint.decode(source, offset, 8);
79
63
  if (length === 0) {
80
64
  throw new RangeError(`invalid car header; length=0`);
81
65
  }
82
- const dataStart = reader.pos;
83
- const rawHeader = reader.exactly(length, true);
84
- const data = CBOR.decode(rawHeader);
66
+ const dataStart = lengthOffset;
67
+ const dataEnd = dataStart + length;
68
+ if (dataEnd > source.length) {
69
+ throw new RangeError('unexpected end of data');
70
+ }
71
+ const data = CBOR.decode(source.subarray(dataStart, dataEnd));
85
72
  if (!isCarV1Header(data)) {
86
73
  throw new TypeError(`expected a car v1 archive`);
87
74
  }
88
- const dataEnd = reader.pos;
89
75
  const headerEnd = dataEnd;
90
- return { data, headerStart, headerEnd, dataStart, dataEnd };
76
+ return {
77
+ header: { data, headerStart, headerEnd, dataStart, dataEnd },
78
+ nextOffset: dataEnd,
79
+ };
91
80
  };
92
- const readCid = (reader) => {
93
- const bytes = reader.exactly(36, true);
81
+ const readCid = (source, offset) => {
82
+ const cidEnd = offset + 36;
83
+ if (cidEnd > source.length) {
84
+ throw new RangeError('unexpected end of data');
85
+ }
86
+ const bytes = source.subarray(offset, cidEnd);
94
87
  const version = bytes[0];
95
88
  const codec = bytes[1];
96
89
  const digestType = bytes[2];
@@ -108,13 +101,16 @@ const readCid = (reader) => {
108
101
  throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
109
102
  }
110
103
  return {
111
- version: version,
112
- codec: codec,
113
- digest: {
114
- codec: digestType,
115
- contents: bytes.subarray(4, 36),
104
+ cid: {
105
+ version: version,
106
+ codec: codec,
107
+ digest: {
108
+ codec: digestType,
109
+ contents: bytes.subarray(4, 36),
110
+ },
111
+ bytes: bytes,
116
112
  },
117
- bytes: bytes,
113
+ nextOffset: cidEnd,
118
114
  };
119
115
  };
120
116
  //# sourceMappingURL=reader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reader.js","sourceRoot":"","sources":["../lib/reader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../lib/reader.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import type { CidLink } from '@atcute/cid';
2
- import { type CarEntry, type CarHeader } from './types.js';
2
+ import { type CarEntry, type CarHeader } from './types.ts';
3
3
  export interface StreamedCarReader {
4
4
  header(): Promise<CarHeader>;
5
5
  roots(): Promise<CidLink[]>;
package/dist/writer.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { CidLink } from '@atcute/cid';
2
- import type { CarBlock } from './types.js';
2
+ import type { CarBlock } from './types.ts';
3
3
  /**
4
4
  * creates an async generator that yields CAR file chunks
5
5
  * @param root root CIDs for the CAR file
package/lib/index.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  // implements github:darobin/dasl.ing@cc66c35 (2025-10-20)
2
2
 
3
- export * from './reader.js';
4
- export * from './streamed-reader.js';
3
+ export * from './reader.ts';
4
+ export * from './streamed-reader.ts';
5
5
 
6
- export * from './writer.js';
6
+ export * from './writer.ts';
7
7
 
8
- export * from './types.js';
8
+ export * from './types.ts';
package/lib/reader.ts CHANGED
@@ -3,60 +3,76 @@ import type { CidLink } from '@atcute/cid';
3
3
  import * as CID from '@atcute/cid';
4
4
  import * as varint from '@atcute/varint';
5
5
 
6
- import { isCarV1Header, type CarEntry, type CarHeader } from './types.js';
7
-
8
- interface SyncByteReader {
9
- readonly pos: number;
10
- upto(size: number): Uint8Array;
11
- exactly(size: number, seek: boolean): Uint8Array;
12
- seek(size: number): void;
13
- }
6
+ import { isCarV1Header, type CarEntry, type CarHeader } from './types.ts';
14
7
 
15
8
  export interface SyncCarReader {
16
9
  readonly header: CarHeader;
17
10
  readonly roots: CidLink[];
18
11
 
19
12
  /** @deprecated do for..of on the reader directly */
20
- iterate(): Generator<CarEntry>;
13
+ iterate(): IterableIterator<CarEntry>;
21
14
  [Symbol.iterator](): Iterator<CarEntry>;
22
15
  }
23
16
 
24
17
  export const fromUint8Array = (buffer: Uint8Array): SyncCarReader => {
25
- const reader = createUint8Reader(buffer);
26
- const header = readHeader(reader);
18
+ const { header, nextOffset: headerOffset } = readHeader(buffer, 0);
19
+ let pos = headerOffset;
27
20
 
28
21
  return {
29
22
  header,
30
23
  roots: header.data.roots,
31
24
 
32
- *iterate() {
33
- while (reader.upto(8 + 36).length > 0) {
34
- const entryStart = reader.pos;
35
- const entrySize = readVarint(reader, 8);
36
-
37
- const cidStart = reader.pos;
38
- const cid = readCid(reader);
39
-
40
- const bytesStart = reader.pos;
41
- const bytesSize = entrySize - (bytesStart - cidStart);
42
- const bytes = reader.exactly(bytesSize, true);
43
-
44
- const cidEnd = bytesStart;
45
- const bytesEnd = reader.pos;
46
- const entryEnd = bytesEnd;
47
-
48
- yield {
49
- cid,
50
- bytes,
51
-
52
- entryStart,
53
- entryEnd,
54
- cidStart,
55
- cidEnd,
56
- bytesStart,
57
- bytesEnd,
58
- };
59
- }
25
+ iterate(): IterableIterator<CarEntry> {
26
+ return {
27
+ next(): IteratorResult<CarEntry> {
28
+ if (pos >= buffer.length) {
29
+ return {
30
+ done: true,
31
+ value: undefined,
32
+ };
33
+ }
34
+
35
+ const entryStart = pos;
36
+ const { value: entryLength, nextOffset: lengthOffset } = varint.decode(buffer, pos, 8);
37
+ pos = lengthOffset;
38
+
39
+ const cidStart = pos;
40
+ const { cid, nextOffset: cidOffset } = readCid(buffer, pos);
41
+ pos = cidOffset;
42
+
43
+ const bytesStart = pos;
44
+ const bytesSize = entryLength - (bytesStart - cidStart);
45
+ if (bytesSize < 0 || bytesStart + bytesSize > buffer.length) {
46
+ throw new RangeError('unexpected end of data');
47
+ }
48
+
49
+ const bytesEnd = bytesStart + bytesSize;
50
+ const bytes = buffer.subarray(bytesStart, bytesEnd);
51
+ pos = bytesEnd;
52
+
53
+ const cidEnd = bytesStart;
54
+ const entryEnd = bytesEnd;
55
+
56
+ return {
57
+ done: false,
58
+ value: {
59
+ cid,
60
+ bytes,
61
+
62
+ entryStart,
63
+ entryEnd,
64
+ cidStart,
65
+ cidEnd,
66
+ bytesStart,
67
+ bytesEnd,
68
+ },
69
+ };
70
+ },
71
+
72
+ [Symbol.iterator]() {
73
+ return this;
74
+ },
75
+ };
60
76
  },
61
77
 
62
78
  [Symbol.iterator](): Iterator<CarEntry> {
@@ -65,74 +81,39 @@ export const fromUint8Array = (buffer: Uint8Array): SyncCarReader => {
65
81
  };
66
82
  };
67
83
 
68
- const createUint8Reader = (buf: Uint8Array): SyncByteReader => {
69
- let pos = 0;
70
-
71
- return {
72
- get pos() {
73
- return pos;
74
- },
75
-
76
- seek(size) {
77
- if (size > buf.length - pos) {
78
- throw new RangeError('unexpected end of data');
79
- }
80
-
81
- pos += size;
82
- },
83
- upto(size) {
84
- return buf.subarray(pos, pos + size);
85
- },
86
- exactly(size, seek) {
87
- if (size > buf.length - pos) {
88
- throw new RangeError('unexpected end of data');
89
- }
90
-
91
- const slice = buf.subarray(pos, pos + size);
92
- if (seek) {
93
- pos += size;
94
- }
95
-
96
- return slice;
97
- },
98
- };
99
- };
100
-
101
- const readVarint = (reader: SyncByteReader, size: number): number => {
102
- const buf = reader.upto(size);
103
- if (buf.length === 0) {
104
- throw new RangeError(`unexpected end of data`);
105
- }
106
-
107
- const [int, read] = varint.decode(buf);
108
- reader.seek(read);
109
-
110
- return int;
111
- };
112
-
113
- const readHeader = (reader: SyncByteReader): CarHeader => {
114
- const headerStart = reader.pos;
115
- const length = readVarint(reader, 8);
84
+ const readHeader = (source: Uint8Array, offset: number): { header: CarHeader; nextOffset: number } => {
85
+ const headerStart = offset;
86
+ const { value: length, nextOffset: lengthOffset } = varint.decode(source, offset, 8);
116
87
  if (length === 0) {
117
88
  throw new RangeError(`invalid car header; length=0`);
118
89
  }
119
90
 
120
- const dataStart = reader.pos;
121
- const rawHeader = reader.exactly(length, true);
91
+ const dataStart = lengthOffset;
92
+ const dataEnd = dataStart + length;
93
+ if (dataEnd > source.length) {
94
+ throw new RangeError('unexpected end of data');
95
+ }
122
96
 
123
- const data = CBOR.decode(rawHeader);
97
+ const data = CBOR.decode(source.subarray(dataStart, dataEnd));
124
98
  if (!isCarV1Header(data)) {
125
99
  throw new TypeError(`expected a car v1 archive`);
126
100
  }
127
101
 
128
- const dataEnd = reader.pos;
129
102
  const headerEnd = dataEnd;
130
103
 
131
- return { data, headerStart, headerEnd, dataStart, dataEnd };
104
+ return {
105
+ header: { data, headerStart, headerEnd, dataStart, dataEnd },
106
+ nextOffset: dataEnd,
107
+ };
132
108
  };
133
109
 
134
- const readCid = (reader: SyncByteReader): CID.Cid => {
135
- const bytes = reader.exactly(36, true);
110
+ const readCid = (source: Uint8Array, offset: number): { cid: CID.Cid; nextOffset: number } => {
111
+ const cidEnd = offset + 36;
112
+ if (cidEnd > source.length) {
113
+ throw new RangeError('unexpected end of data');
114
+ }
115
+
116
+ const bytes = source.subarray(offset, cidEnd);
136
117
 
137
118
  const version = bytes[0];
138
119
  const codec = bytes[1];
@@ -156,12 +137,15 @@ const readCid = (reader: SyncByteReader): CID.Cid => {
156
137
  }
157
138
 
158
139
  return {
159
- version: version,
160
- codec: codec,
161
- digest: {
162
- codec: digestType,
163
- contents: bytes.subarray(4, 36),
140
+ cid: {
141
+ version: version,
142
+ codec: codec,
143
+ digest: {
144
+ codec: digestType,
145
+ contents: bytes.subarray(4, 36),
146
+ },
147
+ bytes: bytes,
164
148
  },
165
- bytes: bytes,
149
+ nextOffset: cidEnd,
166
150
  };
167
151
  };
@@ -2,7 +2,7 @@ import * as CBOR from '@atcute/cbor';
2
2
  import type { Cid, CidLink } from '@atcute/cid';
3
3
  import * as CID from '@atcute/cid';
4
4
 
5
- import { isCarV1Header, type CarEntry, type CarHeader } from './types.js';
5
+ import { isCarV1Header, type CarEntry, type CarHeader } from './types.ts';
6
6
 
7
7
  export interface StreamedCarReader {
8
8
  header(): Promise<CarHeader>;
package/lib/writer.ts CHANGED
@@ -3,7 +3,7 @@ import type { CidLink } from '@atcute/cid';
3
3
  import { allocUnsafe } from '@atcute/uint8array';
4
4
  import * as varint from '@atcute/varint';
5
5
 
6
- import type { CarBlock } from './types.js';
6
+ import type { CarBlock } from './types.ts';
7
7
 
8
8
  /**
9
9
  * encodes a number as an unsigned varint (variable-length integer)
package/package.json CHANGED
@@ -1,41 +1,42 @@
1
1
  {
2
- "type": "module",
3
2
  "name": "@atcute/car",
4
- "version": "5.1.0",
3
+ "version": "5.1.1",
5
4
  "description": "lightweight DASL CAR (content-addressable archives) codec for AT Protocol.",
6
5
  "keywords": [
7
6
  "atproto",
8
- "dasl",
9
- "car"
7
+ "car",
8
+ "dasl"
10
9
  ],
11
10
  "license": "0BSD",
12
11
  "repository": {
13
12
  "url": "https://github.com/mary-ext/atcute",
14
13
  "directory": "packages/utilities/car"
15
14
  },
16
- "publishConfig": {
17
- "access": "public"
18
- },
19
15
  "files": [
20
16
  "dist/",
21
17
  "lib/",
22
18
  "!lib/**/*.bench.ts",
23
19
  "!lib/**/*.test.ts"
24
20
  ],
21
+ "type": "module",
22
+ "sideEffects": false,
25
23
  "exports": {
26
24
  ".": "./dist/index.js"
27
25
  },
28
- "sideEffects": false,
29
- "devDependencies": {
30
- "@vitest/coverage-v8": "^4.0.16",
31
- "vitest": "^4.0.16",
32
- "@atcute/multibase": "^1.1.6"
26
+ "publishConfig": {
27
+ "access": "public"
33
28
  },
34
29
  "dependencies": {
35
- "@atcute/cbor": "^2.3.0",
36
- "@atcute/cid": "^2.4.0",
37
- "@atcute/varint": "^1.0.3",
38
- "@atcute/uint8array": "^1.0.6"
30
+ "@atcute/cbor": "^2.3.2",
31
+ "@atcute/cid": "^2.4.1",
32
+ "@atcute/uint8array": "^1.1.1",
33
+ "@atcute/varint": "^2.0.0"
34
+ },
35
+ "devDependencies": {
36
+ "@types/node": "^25.2.3",
37
+ "@vitest/coverage-v8": "^4.0.18",
38
+ "vitest": "^4.0.18",
39
+ "@atcute/multibase": "^1.1.8"
39
40
  },
40
41
  "scripts": {
41
42
  "build": "tsgo --project tsconfig.build.json",