@atcute/car 3.0.5 → 3.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/README.md +78 -7
- package/dist/v3/atproto-repo.d.ts +1 -0
- package/dist/v3/atproto-repo.js +2 -0
- package/dist/v3/atproto-repo.js.map +1 -0
- package/dist/v3/index.js.map +1 -0
- package/dist/v3/reader.d.ts +1 -0
- package/dist/v3/reader.js +2 -0
- package/dist/v3/reader.js.map +1 -0
- package/dist/v4/car-reader/index.d.ts +3 -0
- package/dist/v4/car-reader/index.js +4 -0
- package/dist/v4/car-reader/index.js.map +1 -0
- package/dist/v4/car-reader/stream-car-reader.d.ts +11 -0
- package/dist/v4/car-reader/stream-car-reader.js +178 -0
- package/dist/v4/car-reader/stream-car-reader.js.map +1 -0
- package/dist/v4/car-reader/sync-car-reader.d.ts +10 -0
- package/dist/{utilities → v4/car-reader}/sync-car-reader.js +63 -31
- package/dist/v4/car-reader/sync-car-reader.js.map +1 -0
- package/dist/{utilities/car.js → v4/car-reader/types.js} +1 -1
- package/dist/v4/car-reader/types.js.map +1 -0
- package/dist/v4/index.d.ts +2 -0
- package/dist/v4/index.js +3 -0
- package/dist/v4/index.js.map +1 -0
- package/dist/v4/repo-reader/index.d.ts +5 -0
- package/dist/v4/repo-reader/index.js +6 -0
- package/dist/v4/repo-reader/index.js.map +1 -0
- package/dist/v4/repo-reader/mst.d.ts +47 -0
- package/dist/v4/repo-reader/mst.js +62 -0
- package/dist/v4/repo-reader/mst.js.map +1 -0
- package/dist/v4/repo-reader/stream-repo-reader.d.ts +24 -0
- package/dist/v4/repo-reader/stream-repo-reader.js +143 -0
- package/dist/v4/repo-reader/stream-repo-reader.js.map +1 -0
- package/dist/v4/repo-reader/sync-blockmap.d.ts +29 -0
- package/dist/v4/repo-reader/sync-blockmap.js +58 -0
- package/dist/v4/repo-reader/sync-blockmap.js.map +1 -0
- package/dist/v4/repo-reader/sync-repo-reader.d.ts +2 -0
- package/dist/v4/repo-reader/sync-repo-reader.js +20 -0
- package/dist/v4/repo-reader/sync-repo-reader.js.map +1 -0
- package/dist/v4/repo-reader/types.d.ts +20 -0
- package/dist/v4/repo-reader/types.js +37 -0
- package/dist/v4/repo-reader/types.js.map +1 -0
- package/dist/v4/utils.d.ts +3 -0
- package/dist/v4/utils.js +6 -0
- package/dist/v4/utils.js.map +1 -0
- package/lib/v3/atproto-repo.ts +15 -0
- package/lib/v3/reader.ts +9 -0
- package/lib/v4/car-reader/index.ts +4 -0
- package/lib/v4/car-reader/stream-car-reader.ts +240 -0
- package/lib/{utilities → v4/car-reader}/sync-car-reader.ts +90 -40
- package/lib/v4/index.ts +2 -0
- package/lib/v4/repo-reader/index.ts +6 -0
- package/lib/v4/repo-reader/mst.ts +110 -0
- package/lib/v4/repo-reader/stream-repo-reader.ts +209 -0
- package/lib/v4/repo-reader/sync-blockmap.ts +85 -0
- package/lib/v4/repo-reader/sync-repo-reader.ts +27 -0
- package/lib/v4/repo-reader/types.ts +32 -0
- package/lib/v4/utils.ts +7 -0
- package/package.json +7 -2
- package/dist/atproto-repo.d.ts +0 -104
- package/dist/atproto-repo.js +0 -171
- package/dist/atproto-repo.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/reader.d.ts +0 -4
- package/dist/reader.js +0 -7
- package/dist/reader.js.map +0 -1
- package/dist/utilities/car.js.map +0 -1
- package/dist/utilities/sync-byte-reader.d.ts +0 -7
- package/dist/utilities/sync-byte-reader.js +0 -28
- package/dist/utilities/sync-byte-reader.js.map +0 -1
- package/dist/utilities/sync-car-reader.d.ts +0 -7
- package/dist/utilities/sync-car-reader.js.map +0 -1
- package/lib/atproto-repo.ts +0 -248
- package/lib/reader.ts +0 -10
- package/lib/utilities/sync-byte-reader.ts +0 -39
- /package/dist/{index.d.ts → v3/index.d.ts} +0 -0
- /package/dist/{index.js → v3/index.js} +0 -0
- /package/dist/{utilities/car.d.ts → v4/car-reader/types.d.ts} +0 -0
- /package/lib/{index.ts → v3/index.ts} +0 -0
- /package/lib/{utilities/car.ts → v4/car-reader/types.ts} +0 -0
package/README.md
CHANGED
|
@@ -5,16 +5,87 @@ library for AT Protocol.
|
|
|
5
5
|
|
|
6
6
|
[dasl-car]: https://dasl.ing/car.html
|
|
7
7
|
|
|
8
|
+
## usage
|
|
9
|
+
|
|
10
|
+
### streaming usage
|
|
11
|
+
|
|
8
12
|
```ts
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
import { CarReader, RepoReader } from '@atcute/car/v4';
|
|
14
|
+
|
|
15
|
+
const stream = new ReadableStream({
|
|
16
|
+
/* ... */
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
// read AT Protocol repository exports
|
|
20
|
+
{
|
|
21
|
+
await using repo = RepoReader.fromStream(stream);
|
|
11
22
|
|
|
12
|
-
for (const
|
|
13
|
-
|
|
23
|
+
for await (const entry of repo) {
|
|
24
|
+
entry;
|
|
25
|
+
// ^? RepoEntry { collection: 'app.bsky.feed.post', rkey: '3lprcc55bb222', ... }
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
repo.missingBlocks;
|
|
29
|
+
// ^? []
|
|
14
30
|
}
|
|
15
31
|
|
|
16
|
-
//
|
|
17
|
-
|
|
18
|
-
|
|
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
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### streaming usage (for runtimes without `await using` yet)
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
const repo = RepoReader.fromStream(stream);
|
|
49
|
+
|
|
50
|
+
try {
|
|
51
|
+
for await (const entry of repo) {
|
|
52
|
+
entry;
|
|
53
|
+
// ^? RepoEntry
|
|
54
|
+
}
|
|
55
|
+
} finally {
|
|
56
|
+
await repo.dispose();
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
### sync usage
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
const buffer = Uint8Array.from([
|
|
64
|
+
/* ... */
|
|
65
|
+
]);
|
|
66
|
+
|
|
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
|
+
// read generic CAR archives
|
|
81
|
+
{
|
|
82
|
+
const car = CarReader.fromUint8Array(buffer);
|
|
83
|
+
|
|
84
|
+
const roots = car.roots;
|
|
85
|
+
|
|
86
|
+
for (const entry of car) {
|
|
87
|
+
entry;
|
|
88
|
+
// ^? CarEntry { cid: CidLink {}, bytes: Uint8Array {}, ... }
|
|
89
|
+
}
|
|
19
90
|
}
|
|
20
91
|
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { collectBlock, isCommit, isMstNode, isTreeEntry, fromUint8Array as iterateAtpRepo, readBlock, RepoEntry, walkMstEntries, type BlockMap, type Commit, type MstNode, type NodeEntry, type TreeEntry, } from '../v4/repo-reader/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atproto-repo.js","sourceRoot":"","sources":["../../lib/v3/atproto-repo.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,YAAY,EACZ,QAAQ,EACR,SAAS,EACT,WAAW,EACX,cAAc,IAAI,cAAc,EAChC,SAAS,EACT,SAAS,EACT,cAAc,GAMd,MAAM,4BAA4B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/v3/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { isCarV1Header, fromUint8Array as readCar, type CarEntry, type CarHeader, type CarV1Header, type StreamedCarReader, type SyncCarReader, } from '../v4/car-reader/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../lib/v3/reader.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,aAAa,EACb,cAAc,IAAI,OAAO,GAMzB,MAAM,2BAA2B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/v4/car-reader/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,cAAc,wBAAwB,CAAC;AACvC,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import { type CarEntry, type CarHeader } from './types.js';
|
|
3
|
+
export interface StreamedCarReader {
|
|
4
|
+
header(): Promise<CarHeader>;
|
|
5
|
+
roots(): Promise<CBOR.CidLink[]>;
|
|
6
|
+
dispose(): Promise<void>;
|
|
7
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
8
|
+
[Symbol.asyncIterator](): AsyncIterator<CarEntry>;
|
|
9
|
+
}
|
|
10
|
+
export declare const carEntryTransform: () => ReadableWritablePair<CarEntry, Uint8Array>;
|
|
11
|
+
export declare const fromStream: (stream: ReadableStream<Uint8Array>) => StreamedCarReader;
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import * as CID from '@atcute/cid';
|
|
3
|
+
import { concat } from '@atcute/uint8array';
|
|
4
|
+
import { isCarV1Header } from './types.js';
|
|
5
|
+
export const carEntryTransform = () => {
|
|
6
|
+
const transform = new TransformStream();
|
|
7
|
+
let car;
|
|
8
|
+
return {
|
|
9
|
+
readable: new ReadableStream({
|
|
10
|
+
async start(controller) {
|
|
11
|
+
car = fromStream(transform.readable);
|
|
12
|
+
try {
|
|
13
|
+
for await (const entry of car) {
|
|
14
|
+
controller.enqueue(entry);
|
|
15
|
+
}
|
|
16
|
+
await car.dispose();
|
|
17
|
+
controller.close();
|
|
18
|
+
}
|
|
19
|
+
catch (err) {
|
|
20
|
+
controller.error(err);
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
async cancel() {
|
|
24
|
+
if (car !== undefined) {
|
|
25
|
+
await car.dispose();
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
}),
|
|
29
|
+
writable: transform.writable,
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
export const fromStream = (stream) => {
|
|
33
|
+
let chunk = new Uint8Array(0); // annoying!
|
|
34
|
+
let offset = 0;
|
|
35
|
+
let _header;
|
|
36
|
+
const reader = stream.getReader();
|
|
37
|
+
const readVarint = async () => {
|
|
38
|
+
let value = 0;
|
|
39
|
+
let shift = 0;
|
|
40
|
+
const MSB = 0x80;
|
|
41
|
+
const REST = 0x7f;
|
|
42
|
+
while (true) {
|
|
43
|
+
if (chunk.length === 0) {
|
|
44
|
+
const { value, done } = await reader.read();
|
|
45
|
+
if (done) {
|
|
46
|
+
throw new Error(`unexpected eof while decoding varint`);
|
|
47
|
+
}
|
|
48
|
+
chunk = value;
|
|
49
|
+
}
|
|
50
|
+
const byte = chunk[0];
|
|
51
|
+
chunk = chunk.subarray(1);
|
|
52
|
+
value += shift < 28 ? (byte & REST) << shift : (byte & REST) * 2 ** shift;
|
|
53
|
+
shift += 7;
|
|
54
|
+
offset++;
|
|
55
|
+
if ((byte & MSB) === 0) {
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
const readExact = async (n) => {
|
|
61
|
+
const buffer = new Uint8Array(n);
|
|
62
|
+
let written = 0;
|
|
63
|
+
while (written < n) {
|
|
64
|
+
if (chunk.length === 0) {
|
|
65
|
+
const { value, done } = await reader.read();
|
|
66
|
+
if (done) {
|
|
67
|
+
throw new Error('unexpected eof while reading data');
|
|
68
|
+
}
|
|
69
|
+
chunk = value;
|
|
70
|
+
}
|
|
71
|
+
const taken = Math.min(n - written, chunk.length);
|
|
72
|
+
buffer.set(chunk.subarray(0, taken), written);
|
|
73
|
+
written += taken;
|
|
74
|
+
chunk = chunk.subarray(taken);
|
|
75
|
+
}
|
|
76
|
+
offset += n;
|
|
77
|
+
return buffer;
|
|
78
|
+
};
|
|
79
|
+
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];
|
|
85
|
+
if (version !== CID.CID_VERSION) {
|
|
86
|
+
throw new RangeError(`incorrect cid version (got v${version})`);
|
|
87
|
+
}
|
|
88
|
+
if (codec !== CID.CODEC_DCBOR && codec !== CID.CODEC_RAW) {
|
|
89
|
+
throw new RangeError(`incorrect cid codec (got 0x${codec.toString(16)})`);
|
|
90
|
+
}
|
|
91
|
+
if (digestType !== CID.HASH_SHA256) {
|
|
92
|
+
throw new RangeError(`incorrect cid digest type (got 0x${digestType.toString(16)})`);
|
|
93
|
+
}
|
|
94
|
+
if (digestSize !== 32 && digestSize !== 0) {
|
|
95
|
+
throw new RangeError(`incorrect cid digest size (got ${digestSize})`);
|
|
96
|
+
}
|
|
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 = {
|
|
101
|
+
version: version,
|
|
102
|
+
codec: codec,
|
|
103
|
+
digest: {
|
|
104
|
+
codec: digestType,
|
|
105
|
+
contents: digest,
|
|
106
|
+
},
|
|
107
|
+
bytes: bytes,
|
|
108
|
+
};
|
|
109
|
+
return cid;
|
|
110
|
+
};
|
|
111
|
+
return {
|
|
112
|
+
[Symbol.asyncDispose]() {
|
|
113
|
+
return this.dispose();
|
|
114
|
+
},
|
|
115
|
+
async dispose() {
|
|
116
|
+
await reader.cancel();
|
|
117
|
+
},
|
|
118
|
+
async header() {
|
|
119
|
+
if (_header !== undefined) {
|
|
120
|
+
return _header;
|
|
121
|
+
}
|
|
122
|
+
const headerStart = offset;
|
|
123
|
+
const headerSize = await readVarint();
|
|
124
|
+
if (headerSize === 0) {
|
|
125
|
+
throw new RangeError(`invalid car header; length=0`);
|
|
126
|
+
}
|
|
127
|
+
const dataStart = offset;
|
|
128
|
+
const raw = await readExact(headerSize);
|
|
129
|
+
const data = CBOR.decode(raw);
|
|
130
|
+
if (!isCarV1Header(data)) {
|
|
131
|
+
throw new TypeError(`expected a car v1 archive`);
|
|
132
|
+
}
|
|
133
|
+
const dataEnd = offset;
|
|
134
|
+
const headerEnd = offset;
|
|
135
|
+
return (_header = { data, headerStart, headerEnd, dataStart, dataEnd });
|
|
136
|
+
},
|
|
137
|
+
async roots() {
|
|
138
|
+
const header = await this.header();
|
|
139
|
+
return header.data.roots;
|
|
140
|
+
},
|
|
141
|
+
async *[Symbol.asyncIterator]() {
|
|
142
|
+
// ensure the header is read first
|
|
143
|
+
if (_header === undefined) {
|
|
144
|
+
await this.header();
|
|
145
|
+
}
|
|
146
|
+
while (true) {
|
|
147
|
+
if (chunk.length === 0) {
|
|
148
|
+
const { value, done } = await reader.read();
|
|
149
|
+
if (done) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
chunk = value;
|
|
153
|
+
}
|
|
154
|
+
const entryStart = offset;
|
|
155
|
+
const entrySize = await readVarint();
|
|
156
|
+
const cidStart = offset;
|
|
157
|
+
const cid = await readCid();
|
|
158
|
+
const bytesStart = offset;
|
|
159
|
+
const bytesSize = entrySize - (bytesStart - cidStart);
|
|
160
|
+
const bytes = await readExact(bytesSize);
|
|
161
|
+
const cidEnd = bytesStart;
|
|
162
|
+
const bytesEnd = offset;
|
|
163
|
+
const entryEnd = bytesEnd;
|
|
164
|
+
yield {
|
|
165
|
+
cid,
|
|
166
|
+
bytes,
|
|
167
|
+
entryStart,
|
|
168
|
+
entryEnd,
|
|
169
|
+
cidStart,
|
|
170
|
+
cidEnd,
|
|
171
|
+
bytesStart,
|
|
172
|
+
bytesEnd,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
//# sourceMappingURL=stream-car-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream-car-reader.js","sourceRoot":"","sources":["../../../lib/v4/car-reader/stream-car-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import { type CarEntry, type CarHeader } from './types.js';
|
|
3
|
+
export interface SyncCarReader {
|
|
4
|
+
readonly header: CarHeader;
|
|
5
|
+
readonly roots: CBOR.CidLink[];
|
|
6
|
+
/** @deprecated do for..of on the reader directly */
|
|
7
|
+
iterate(): Generator<CarEntry>;
|
|
8
|
+
[Symbol.iterator](): Iterator<CarEntry>;
|
|
9
|
+
}
|
|
10
|
+
export declare const fromUint8Array: (buffer: Uint8Array) => SyncCarReader;
|
|
@@ -1,7 +1,69 @@
|
|
|
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
|
-
import { isCarV1Header } from './
|
|
4
|
+
import { isCarV1Header } from './types.js';
|
|
5
|
+
export const fromUint8Array = (buffer) => {
|
|
6
|
+
const reader = createUint8Reader(buffer);
|
|
7
|
+
const header = readHeader(reader);
|
|
8
|
+
return {
|
|
9
|
+
header,
|
|
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
|
+
}
|
|
34
|
+
},
|
|
35
|
+
[Symbol.iterator]() {
|
|
36
|
+
return this.iterate();
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
};
|
|
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
|
+
};
|
|
5
67
|
const readVarint = (reader, size) => {
|
|
6
68
|
const buf = reader.upto(size);
|
|
7
69
|
if (buf.length === 0) {
|
|
@@ -58,34 +120,4 @@ const readCid = (reader) => {
|
|
|
58
120
|
};
|
|
59
121
|
return cid;
|
|
60
122
|
};
|
|
61
|
-
export const createCarReader = (reader) => {
|
|
62
|
-
const header = readHeader(reader);
|
|
63
|
-
return {
|
|
64
|
-
header,
|
|
65
|
-
*iterate() {
|
|
66
|
-
while (reader.upto(8 + 36).length > 0) {
|
|
67
|
-
const entryStart = reader.pos;
|
|
68
|
-
const entrySize = readVarint(reader, 8);
|
|
69
|
-
const cidStart = reader.pos;
|
|
70
|
-
const cid = readCid(reader);
|
|
71
|
-
const bytesStart = reader.pos;
|
|
72
|
-
const bytesSize = entrySize - (bytesStart - cidStart);
|
|
73
|
-
const bytes = reader.exactly(bytesSize, true);
|
|
74
|
-
const cidEnd = bytesStart;
|
|
75
|
-
const bytesEnd = reader.pos;
|
|
76
|
-
const entryEnd = bytesEnd;
|
|
77
|
-
yield {
|
|
78
|
-
cid,
|
|
79
|
-
bytes,
|
|
80
|
-
entryStart,
|
|
81
|
-
entryEnd,
|
|
82
|
-
cidStart,
|
|
83
|
-
cidEnd,
|
|
84
|
-
bytesStart,
|
|
85
|
-
bytesEnd,
|
|
86
|
-
};
|
|
87
|
-
}
|
|
88
|
-
},
|
|
89
|
-
};
|
|
90
|
-
};
|
|
91
123
|
//# sourceMappingURL=sync-car-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-car-reader.js","sourceRoot":"","sources":["../../../lib/v4/car-reader/sync-car-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../lib/v4/car-reader/types.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"}
|
package/dist/v4/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/v4/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../lib/v4/repo-reader/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAE3B,cAAc,UAAU,CAAC;AACzB,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import * as CID from '@atcute/cid';
|
|
3
|
+
/** commit object */
|
|
4
|
+
export interface Commit {
|
|
5
|
+
version: 3;
|
|
6
|
+
did: string;
|
|
7
|
+
data: CID.CidLink;
|
|
8
|
+
rev: string;
|
|
9
|
+
prev: CID.CidLink | null;
|
|
10
|
+
sig: CBOR.Bytes;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* checks if a value is a valid commit object
|
|
14
|
+
* @param value the value to check
|
|
15
|
+
* @returns true if the value is a valid commit object, false otherwise
|
|
16
|
+
*/
|
|
17
|
+
export declare const isCommit: (value: unknown) => value is Commit;
|
|
18
|
+
/** mst tree entry object */
|
|
19
|
+
export interface TreeEntry {
|
|
20
|
+
/** count of bytes shared with previous TreeEntry in this Node (if any) */
|
|
21
|
+
p: number;
|
|
22
|
+
/** remainder of key for this TreeEntry, after "prefixlen" have been removed */
|
|
23
|
+
k: CBOR.Bytes;
|
|
24
|
+
/** link to a sub-tree Node at a lower level which has keys sorting after this TreeEntry's key (to the "right"), but before the next TreeEntry's key in this Node (if any) */
|
|
25
|
+
v: CID.CidLink;
|
|
26
|
+
/** next subtree (to the right of leaf) */
|
|
27
|
+
t: CID.CidLink | null;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* checks if a value is a valid mst tree entry object
|
|
31
|
+
* @param value the value to check
|
|
32
|
+
* @returns true if the value is a valid mst tree entry object, false otherwise
|
|
33
|
+
*/
|
|
34
|
+
export declare const isTreeEntry: (value: unknown) => value is TreeEntry;
|
|
35
|
+
/** mst node object */
|
|
36
|
+
export interface MstNode {
|
|
37
|
+
/** link to sub-tree Node on a lower level and with all keys sorting before keys at this node */
|
|
38
|
+
l: CID.CidLink | null;
|
|
39
|
+
/** ordered list of TreeEntry objects */
|
|
40
|
+
e: TreeEntry[];
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* checks if a value is a valid mst node object
|
|
44
|
+
* @param value the value to check
|
|
45
|
+
* @returns true if the value is a valid mst node object, false otherwise
|
|
46
|
+
*/
|
|
47
|
+
export declare const isMstNode: (value: unknown) => value is MstNode;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import * as CBOR from '@atcute/cbor';
|
|
2
|
+
import * as CID from '@atcute/cid';
|
|
3
|
+
const isCidLink = (value) => {
|
|
4
|
+
if (value instanceof CID.CidLinkWrapper) {
|
|
5
|
+
return true;
|
|
6
|
+
}
|
|
7
|
+
if (value === null || typeof value !== 'object') {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
return '$link' in value && typeof value.$link === 'string';
|
|
11
|
+
};
|
|
12
|
+
const isBytes = (value) => {
|
|
13
|
+
if (value instanceof CBOR.BytesWrapper) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (value === null || typeof value !== 'object') {
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
return '$bytes' in value && typeof value.$bytes === 'string';
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* checks if a value is a valid commit object
|
|
23
|
+
* @param value the value to check
|
|
24
|
+
* @returns true if the value is a valid commit object, false otherwise
|
|
25
|
+
*/
|
|
26
|
+
export const isCommit = (value) => {
|
|
27
|
+
if (value === null || typeof value !== 'object') {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
const obj = value;
|
|
31
|
+
return (obj.version === 3 &&
|
|
32
|
+
typeof obj.did === 'string' &&
|
|
33
|
+
isCidLink(obj.data) &&
|
|
34
|
+
typeof obj.rev === 'string' &&
|
|
35
|
+
(obj.prev === null || isCidLink(obj.prev)) &&
|
|
36
|
+
isBytes(obj.sig));
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* checks if a value is a valid mst tree entry object
|
|
40
|
+
* @param value the value to check
|
|
41
|
+
* @returns true if the value is a valid mst tree entry object, false otherwise
|
|
42
|
+
*/
|
|
43
|
+
export const isTreeEntry = (value) => {
|
|
44
|
+
if (value === null || typeof value !== 'object') {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
const obj = value;
|
|
48
|
+
return (typeof obj.p === 'number' && isBytes(obj.k) && isCidLink(obj.v) && (obj.t === null || isCidLink(obj.t)));
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* checks if a value is a valid mst node object
|
|
52
|
+
* @param value the value to check
|
|
53
|
+
* @returns true if the value is a valid mst node object, false otherwise
|
|
54
|
+
*/
|
|
55
|
+
export const isMstNode = (value) => {
|
|
56
|
+
if (value === null || typeof value !== 'object') {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
const obj = value;
|
|
60
|
+
return (obj.l === null || isCidLink(obj.l)) && Array.isArray(obj.e) && obj.e.every(isTreeEntry);
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=mst.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mst.js","sourceRoot":"","sources":["../../../lib/v4/repo-reader/mst.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,cAAc,CAAC;AACrC,OAAO,KAAK,GAAG,MAAM,aAAa,CAAC;AAEnC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAwB,EAAE;IAC1D,IAAI,KAAK,YAAY,GAAG,CAAC,cAAc,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,OAAO,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC;AAC5D,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,KAAc,EAAuB,EAAE;IACvD,IAAI,KAAK,YAAY,IAAI,CAAC,YAAY,EAAE,CAAC;QACxC,OAAO,IAAI,CAAC;IACb,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,QAAQ,IAAI,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC;AAC9D,CAAC,CAAC;AAYF;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAmB,EAAE;IAC3D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAE7C,OAAO,CACN,GAAG,CAAC,OAAO,KAAK,CAAC;QACjB,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ;QAC3B,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;QACnB,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ;QAC3B,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAChB,CAAC;AACH,CAAC,CAAC;AAcF;;;;GAIG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,KAAc,EAAsB,EAAE;IACjE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAE7C,OAAO,CACN,OAAO,GAAG,CAAC,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACvG,CAAC;AACH,CAAC,CAAC;AAUF;;;;GAIG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAc,EAAoB,EAAE;IAC7D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC;IACd,CAAC;IAED,MAAM,GAAG,GAAG,KAAgC,CAAC;IAE7C,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACjG,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { RepoEntry } from './types.js';
|
|
2
|
+
export type MissingBlockEntry = {
|
|
3
|
+
cid: string;
|
|
4
|
+
type: 'record';
|
|
5
|
+
key: string;
|
|
6
|
+
} | {
|
|
7
|
+
cid: string;
|
|
8
|
+
type: 'mst-node';
|
|
9
|
+
} | {
|
|
10
|
+
cid: string;
|
|
11
|
+
type: 'commit';
|
|
12
|
+
};
|
|
13
|
+
export interface StreamedRepoReader {
|
|
14
|
+
/**
|
|
15
|
+
* list of blocks that were referenced but not found in the repository.
|
|
16
|
+
* blocks may be reported as missing if multiple records share the same CID.
|
|
17
|
+
*/
|
|
18
|
+
readonly missingBlocks: readonly MissingBlockEntry[];
|
|
19
|
+
dispose(): Promise<void>;
|
|
20
|
+
[Symbol.asyncDispose](): Promise<void>;
|
|
21
|
+
[Symbol.asyncIterator](): AsyncIterator<RepoEntry>;
|
|
22
|
+
}
|
|
23
|
+
export declare const repoEntryTransform: () => ReadableWritablePair<RepoEntry, Uint8Array>;
|
|
24
|
+
export declare const fromStream: (stream: ReadableStream<Uint8Array>) => StreamedRepoReader;
|