@atcute/car 2.0.0 → 2.0.2
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 +9 -6
- package/dist/atproto-repo.d.ts +1 -0
- package/dist/atproto-repo.js +8 -2
- package/dist/atproto-repo.js.map +1 -1
- package/dist/reader.js +1 -1
- package/dist/reader.js.map +1 -1
- package/dist/utilities/car.d.ts +6 -0
- package/dist/utilities/car.js +10 -0
- package/dist/utilities/car.js.map +1 -0
- package/dist/utilities/{byte-reader.js → sync-byte-reader.js} +4 -1
- package/dist/utilities/sync-byte-reader.js.map +1 -0
- package/dist/utilities/sync-car-reader.d.ts +1 -1
- package/dist/utilities/sync-car-reader.js +2 -8
- package/dist/utilities/sync-car-reader.js.map +1 -1
- package/lib/atproto-repo.ts +11 -2
- package/lib/reader.ts +1 -1
- package/lib/utilities/car.ts +16 -0
- package/lib/utilities/{byte-reader.ts → sync-byte-reader.ts} +4 -0
- package/lib/utilities/sync-car-reader.ts +3 -16
- package/package.json +12 -6
- package/dist/utilities/byte-reader.js.map +0 -1
- /package/dist/utilities/{byte-reader.d.ts → sync-byte-reader.d.ts} +0 -0
package/README.md
CHANGED
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
# @atcute/car
|
|
2
2
|
|
|
3
|
-
CAR (content-addressable
|
|
3
|
+
lightweight [DASL CAR (content-addressable archives)][dasl-car] and atproto repository decoder
|
|
4
|
+
library for AT Protocol.
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
// convenient iterator for reading through an AT Protocol CAR repository
|
|
7
|
-
for (const { collection, rkey, record } of iterateAtpRepo(buf)) {
|
|
8
|
-
// ...
|
|
9
|
-
}
|
|
6
|
+
[dasl-car]: https://dasl.ing/car.html
|
|
10
7
|
|
|
8
|
+
```ts
|
|
11
9
|
// read through a CAR archive
|
|
12
10
|
const { roots, iterate } = readCar(buf);
|
|
13
11
|
|
|
14
12
|
for (const { cid, bytes } of iterate()) {
|
|
15
13
|
// ...
|
|
16
14
|
}
|
|
15
|
+
|
|
16
|
+
// convenient iterator for reading through an AT Protocol CAR repository
|
|
17
|
+
for (const { collection, rkey, record } of iterateAtpRepo(buf)) {
|
|
18
|
+
// ...
|
|
19
|
+
}
|
|
17
20
|
```
|
package/dist/atproto-repo.d.ts
CHANGED
|
@@ -5,6 +5,7 @@ export declare class RepoEntry {
|
|
|
5
5
|
readonly cid: CID.CidLink;
|
|
6
6
|
private blockmap;
|
|
7
7
|
constructor(collection: string, rkey: string, cid: CID.CidLink, blockmap: BlockMap);
|
|
8
|
+
get bytes(): Uint8Array;
|
|
8
9
|
get record(): unknown;
|
|
9
10
|
}
|
|
10
11
|
export declare function iterateAtpRepo(buf: Uint8Array): Generator<RepoEntry>;
|
package/dist/atproto-repo.js
CHANGED
|
@@ -13,12 +13,18 @@ export class RepoEntry {
|
|
|
13
13
|
this.cid = cid;
|
|
14
14
|
this.blockmap = blockmap;
|
|
15
15
|
}
|
|
16
|
+
get bytes() {
|
|
17
|
+
const cid = this.cid.$link;
|
|
18
|
+
const bytes = this.blockmap.get(cid);
|
|
19
|
+
assert(bytes != null, `cid not found in blockmap; cid=${cid}`);
|
|
20
|
+
return bytes;
|
|
21
|
+
}
|
|
16
22
|
get record() {
|
|
17
|
-
return
|
|
23
|
+
return CBOR.decode(this.bytes);
|
|
18
24
|
}
|
|
19
25
|
}
|
|
20
26
|
export function* iterateAtpRepo(buf) {
|
|
21
|
-
const { roots, iterate } = readCar(
|
|
27
|
+
const { roots, iterate } = readCar(buf);
|
|
22
28
|
assert(roots.length === 1, `expected only 1 root in the car archive; got=${roots.length}`);
|
|
23
29
|
// Collect all archive entries into a mapping of CID string -> actual bytes
|
|
24
30
|
const blockmap = new Map();
|
package/dist/atproto-repo.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"atproto-repo.js","sourceRoot":"","sources":["../lib/atproto-repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AAEnC,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;AAElC,MAAM,OAAO,SAAS;IAEJ;IACA;IACA;IACR;IAJT,YACiB,UAAkB,EAClB,IAAY,EACZ,GAAgB,EACxB,QAAkB;QAHV,eAAU,GAAV,UAAU,CAAQ;QAClB,SAAI,GAAJ,IAAI,CAAQ;QACZ,QAAG,GAAH,GAAG,CAAa;QACxB,aAAQ,GAAR,QAAQ,CAAU;IACxB,CAAC;IAEJ,IAAI,
|
|
1
|
+
{"version":3,"file":"atproto-repo.js","sourceRoot":"","sources":["../lib/atproto-repo.ts"],"names":[],"mappings":"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"}
|
package/dist/reader.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createUint8Reader } from './utilities/byte-reader.js';
|
|
1
|
+
import { createUint8Reader } from './utilities/sync-byte-reader.js';
|
|
2
2
|
import { createCarReader } from './utilities/sync-car-reader.js';
|
|
3
3
|
export const readCar = (buffer) => {
|
|
4
4
|
const reader = createUint8Reader(buffer);
|
package/dist/reader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../lib/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../lib/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAC;AAEjE,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,MAAkB,EAAE,EAAE;IAC7C,MAAM,MAAM,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACzC,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import * as CID from '@atcute/cid';
|
|
3
|
+
export const isCarV1Header = (value) => {
|
|
4
|
+
if (value === null || typeof value !== 'object') {
|
|
5
|
+
return false;
|
|
6
|
+
}
|
|
7
|
+
const { version, roots } = value;
|
|
8
|
+
return version === 1 && Array.isArray(roots) && roots.every((root) => root instanceof CBOR.CidLinkWrapper);
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=car.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"car.js","sourceRoot":"","sources":["../../lib/utilities/car.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AAOnC,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,IAAI,CAAC,cAAc,CAAC,CAAC;AAC5G,CAAC,CAAC"}
|
|
@@ -5,6 +5,9 @@ export const createUint8Reader = (buf) => {
|
|
|
5
5
|
return pos;
|
|
6
6
|
},
|
|
7
7
|
seek(size) {
|
|
8
|
+
if (size > buf.length - pos) {
|
|
9
|
+
throw new RangeError('unexpected end of data');
|
|
10
|
+
}
|
|
8
11
|
pos += size;
|
|
9
12
|
},
|
|
10
13
|
upto(size) {
|
|
@@ -22,4 +25,4 @@ export const createUint8Reader = (buf) => {
|
|
|
22
25
|
},
|
|
23
26
|
};
|
|
24
27
|
};
|
|
25
|
-
//# sourceMappingURL=byte-reader.js.map
|
|
28
|
+
//# sourceMappingURL=sync-byte-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-byte-reader.js","sourceRoot":"","sources":["../../lib/utilities/sync-byte-reader.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAe,EAAkB,EAAE;IACpE,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,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;QAClE,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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as CBOR from '@atcute/cbor';
|
|
2
2
|
import * as CID from '@atcute/cid';
|
|
3
|
-
import type { SyncByteReader } from './byte-reader.js';
|
|
3
|
+
import type { SyncByteReader } from './sync-byte-reader.js';
|
|
4
4
|
export declare const createCarReader: (reader: SyncByteReader) => {
|
|
5
5
|
roots: CBOR.CidLink[];
|
|
6
6
|
iterate(): Generator<{
|
|
@@ -1,13 +1,7 @@
|
|
|
1
1
|
import * as CBOR from '@atcute/cbor';
|
|
2
2
|
import * as CID from '@atcute/cid';
|
|
3
3
|
import * as varint from '@atcute/varint';
|
|
4
|
-
|
|
5
|
-
if (value === null || typeof value !== 'object') {
|
|
6
|
-
return false;
|
|
7
|
-
}
|
|
8
|
-
const { version, roots } = value;
|
|
9
|
-
return version === 1 && Array.isArray(roots) && roots.every((root) => root instanceof CBOR.CidLinkWrapper);
|
|
10
|
-
};
|
|
4
|
+
import { isCarV1Header } from './car.js';
|
|
11
5
|
const readVarint = (reader, size) => {
|
|
12
6
|
const buf = reader.upto(size);
|
|
13
7
|
if (buf.length === 0) {
|
|
@@ -65,7 +59,7 @@ const readBlockHeader = (reader) => {
|
|
|
65
59
|
}
|
|
66
60
|
size += reader.pos - start;
|
|
67
61
|
const cid = readCid(reader);
|
|
68
|
-
const blockSize = size -
|
|
62
|
+
const blockSize = size - (reader.pos - start);
|
|
69
63
|
return { cid, blockSize };
|
|
70
64
|
};
|
|
71
65
|
export const createCarReader = (reader) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync-car-reader.js","sourceRoot":"","sources":["../../lib/utilities/sync-car-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AACnC,OAAO,KAAK,MAAM,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"sync-car-reader.js","sourceRoot":"","sources":["../../lib/utilities/sync-car-reader.ts"],"names":[],"mappings":"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"}
|
package/lib/atproto-repo.ts
CHANGED
|
@@ -13,13 +13,22 @@ export class RepoEntry {
|
|
|
13
13
|
private blockmap: BlockMap,
|
|
14
14
|
) {}
|
|
15
15
|
|
|
16
|
+
get bytes(): Uint8Array {
|
|
17
|
+
const cid = this.cid.$link;
|
|
18
|
+
|
|
19
|
+
const bytes = this.blockmap.get(cid);
|
|
20
|
+
assert(bytes != null, `cid not found in blockmap; cid=${cid}`);
|
|
21
|
+
|
|
22
|
+
return bytes;
|
|
23
|
+
}
|
|
24
|
+
|
|
16
25
|
get record(): unknown {
|
|
17
|
-
return
|
|
26
|
+
return CBOR.decode(this.bytes);
|
|
18
27
|
}
|
|
19
28
|
}
|
|
20
29
|
|
|
21
30
|
export function* iterateAtpRepo(buf: Uint8Array): Generator<RepoEntry> {
|
|
22
|
-
const { roots, iterate } = readCar(
|
|
31
|
+
const { roots, iterate } = readCar(buf);
|
|
23
32
|
assert(roots.length === 1, `expected only 1 root in the car archive; got=${roots.length}`);
|
|
24
33
|
|
|
25
34
|
// Collect all archive entries into a mapping of CID string -> actual bytes
|
package/lib/reader.ts
CHANGED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import * as CID from '@atcute/cid';
|
|
3
|
+
|
|
4
|
+
export interface CarV1Header {
|
|
5
|
+
version: 1;
|
|
6
|
+
roots: CID.CidLink[];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export const isCarV1Header = (value: unknown): value is CarV1Header => {
|
|
10
|
+
if (value === null || typeof value !== 'object') {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const { version, roots } = value as CarV1Header;
|
|
15
|
+
return version === 1 && Array.isArray(roots) && roots.every((root) => root instanceof CBOR.CidLinkWrapper);
|
|
16
|
+
};
|
|
@@ -2,21 +2,8 @@ import * as CBOR from '@atcute/cbor';
|
|
|
2
2
|
import * as CID from '@atcute/cid';
|
|
3
3
|
import * as varint from '@atcute/varint';
|
|
4
4
|
|
|
5
|
-
import type
|
|
6
|
-
|
|
7
|
-
interface CarV1Header {
|
|
8
|
-
version: 1;
|
|
9
|
-
roots: CID.CidLink[];
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const isCarV1Header = (value: unknown): value is CarV1Header => {
|
|
13
|
-
if (value === null || typeof value !== 'object') {
|
|
14
|
-
return false;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
const { version, roots } = value as CarV1Header;
|
|
18
|
-
return version === 1 && Array.isArray(roots) && roots.every((root) => root instanceof CBOR.CidLinkWrapper);
|
|
19
|
-
};
|
|
5
|
+
import { isCarV1Header, type CarV1Header } from './car.js';
|
|
6
|
+
import type { SyncByteReader } from './sync-byte-reader.js';
|
|
20
7
|
|
|
21
8
|
const readVarint = (reader: SyncByteReader, size: number): number => {
|
|
22
9
|
const buf = reader.upto(size);
|
|
@@ -93,7 +80,7 @@ const readBlockHeader = (reader: SyncByteReader): { cid: CID.Cid; blockSize: num
|
|
|
93
80
|
size += reader.pos - start;
|
|
94
81
|
|
|
95
82
|
const cid = readCid(reader);
|
|
96
|
-
const blockSize = size -
|
|
83
|
+
const blockSize = size - (reader.pos - start);
|
|
97
84
|
|
|
98
85
|
return { cid, blockSize };
|
|
99
86
|
};
|
package/package.json
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"type": "module",
|
|
3
3
|
"name": "@atcute/car",
|
|
4
|
-
"version": "2.0.
|
|
5
|
-
"description": "
|
|
4
|
+
"version": "2.0.2",
|
|
5
|
+
"description": "lightweight DASL CAR and atproto repository decoder for AT Protocol.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"atproto",
|
|
8
|
+
"dasl",
|
|
9
|
+
"car"
|
|
10
|
+
],
|
|
6
11
|
"license": "MIT",
|
|
7
12
|
"repository": {
|
|
8
13
|
"url": "https://github.com/mary-ext/atcute",
|
|
@@ -19,12 +24,13 @@
|
|
|
19
24
|
},
|
|
20
25
|
"sideEffects": false,
|
|
21
26
|
"devDependencies": {
|
|
22
|
-
"@types/bun": "^1.1
|
|
27
|
+
"@types/bun": "^1.2.1",
|
|
28
|
+
"@atcute/multibase": "^1.1.2"
|
|
23
29
|
},
|
|
24
30
|
"dependencies": {
|
|
25
|
-
"@atcute/
|
|
26
|
-
"@atcute/
|
|
27
|
-
"@atcute/
|
|
31
|
+
"@atcute/varint": "^1.0.2",
|
|
32
|
+
"@atcute/cbor": "^2.1.2",
|
|
33
|
+
"@atcute/cid": "^2.1.0"
|
|
28
34
|
},
|
|
29
35
|
"scripts": {
|
|
30
36
|
"build": "tsc --project tsconfig.build.json",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"byte-reader.js","sourceRoot":"","sources":["../../lib/utilities/byte-reader.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,GAAe,EAAkB,EAAE;IACpE,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,OAAO;QACN,IAAI,GAAG;YACN,OAAO,GAAG,CAAC;QACZ,CAAC;QAED,IAAI,CAAC,IAAI;YACR,GAAG,IAAI,IAAI,CAAC;QACb,CAAC;QACD,IAAI,CAAC,IAAI;YACR,OAAO,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC;QAClE,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"}
|
|
File without changes
|