@atproto/repo 0.0.1 → 0.2.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 (104) hide show
  1. package/bench/mst.bench.ts +7 -4
  2. package/bench/repo.bench.ts +25 -16
  3. package/dist/block-map.d.ts +27 -0
  4. package/dist/data-diff.d.ts +36 -0
  5. package/dist/error.d.ts +20 -0
  6. package/dist/index.d.ts +4 -1
  7. package/dist/index.js +22870 -12456
  8. package/dist/index.js.map +4 -4
  9. package/dist/mst/diff.d.ts +4 -33
  10. package/dist/mst/mst.d.ts +73 -31
  11. package/dist/mst/util.d.ts +13 -5
  12. package/dist/parse.d.ts +16 -0
  13. package/dist/readable-repo.d.ts +23 -0
  14. package/dist/repo.d.ts +19 -31
  15. package/dist/src/block-map.d.ts +23 -0
  16. package/dist/src/blockstore/persistent-blockstore.d.ts +12 -0
  17. package/dist/src/cid-set.d.ts +14 -0
  18. package/dist/src/collection.d.ts +22 -0
  19. package/dist/src/data-diff.d.ts +34 -0
  20. package/dist/src/error.d.ts +21 -0
  21. package/dist/src/index.d.ts +7 -0
  22. package/dist/src/logger.d.ts +2 -0
  23. package/dist/src/mst/diff.d.ts +33 -0
  24. package/dist/src/mst/index.d.ts +4 -0
  25. package/dist/src/mst/mst.d.ts +106 -0
  26. package/dist/src/mst/util.d.ts +9 -0
  27. package/dist/src/mst/walker.d.ts +22 -0
  28. package/dist/src/parse.d.ts +11 -0
  29. package/dist/src/readable-repo.d.ts +25 -0
  30. package/dist/src/repo.d.ts +39 -0
  31. package/dist/src/storage/error.d.ts +22 -0
  32. package/dist/src/storage/index.d.ts +1 -0
  33. package/dist/src/storage/memory-blobstore.d.ts +1 -0
  34. package/dist/src/storage/memory-blockstore.d.ts +28 -0
  35. package/dist/src/storage/readable-blockstore.d.ts +21 -0
  36. package/dist/src/storage/repo-storage.d.ts +18 -0
  37. package/dist/src/storage/sync-storage.d.ts +15 -0
  38. package/dist/src/storage/types.d.ts +12 -0
  39. package/dist/src/storage/util.d.ts +17 -0
  40. package/dist/src/structure.d.ts +39 -0
  41. package/dist/src/sync/consumer.d.ts +19 -0
  42. package/dist/src/sync/index.d.ts +2 -0
  43. package/dist/src/sync/producer.d.ts +13 -0
  44. package/dist/src/sync/provider.d.ts +11 -0
  45. package/dist/src/types.d.ts +368 -0
  46. package/dist/src/util.d.ts +13 -0
  47. package/dist/src/verify.d.ts +5 -0
  48. package/dist/storage/index.d.ts +4 -0
  49. package/dist/storage/memory-blockstore.d.ts +29 -0
  50. package/dist/storage/readable-blockstore.d.ts +24 -0
  51. package/dist/storage/repo-storage.d.ts +19 -0
  52. package/dist/storage/sync-storage.d.ts +15 -0
  53. package/dist/storage/types.d.ts +4 -0
  54. package/dist/sync/consumer.d.ts +19 -0
  55. package/dist/sync/index.d.ts +2 -0
  56. package/dist/sync/provider.d.ts +9 -0
  57. package/dist/tsconfig.build.tsbuildinfo +1 -0
  58. package/dist/types.d.ts +137 -331
  59. package/dist/util.d.ts +35 -12
  60. package/dist/verify.d.ts +31 -4
  61. package/jest.bench.config.js +2 -1
  62. package/package.json +13 -6
  63. package/src/block-map.ts +103 -0
  64. package/src/cid-set.ts +1 -2
  65. package/src/data-diff.ts +117 -0
  66. package/src/error.ts +31 -0
  67. package/src/index.ts +4 -1
  68. package/src/mst/diff.ts +120 -90
  69. package/src/mst/mst.ts +179 -187
  70. package/src/mst/util.ts +54 -31
  71. package/src/parse.ts +44 -0
  72. package/src/readable-repo.ts +75 -0
  73. package/src/repo.ts +145 -244
  74. package/src/storage/index.ts +4 -0
  75. package/src/storage/memory-blockstore.ts +133 -0
  76. package/src/storage/readable-blockstore.ts +56 -0
  77. package/src/storage/repo-storage.ts +43 -0
  78. package/src/storage/sync-storage.ts +35 -0
  79. package/src/storage/types.ts +4 -0
  80. package/src/sync/consumer.ts +140 -0
  81. package/src/sync/index.ts +2 -0
  82. package/src/sync/provider.ts +91 -0
  83. package/src/types.ts +110 -73
  84. package/src/util.ts +258 -56
  85. package/src/verify.ts +248 -42
  86. package/tests/_util.ts +132 -97
  87. package/tests/mst.test.ts +269 -122
  88. package/tests/rebase.test.ts +37 -0
  89. package/tests/repo.test.ts +48 -50
  90. package/tests/sync/checkout.test.ts +75 -0
  91. package/tests/sync/diff.test.ts +92 -0
  92. package/tests/sync/narrow.test.ts +149 -0
  93. package/tests/util.test.ts +21 -0
  94. package/tsconfig.build.tsbuildinfo +1 -1
  95. package/tsconfig.json +2 -1
  96. package/src/blockstore/index.ts +0 -2
  97. package/src/blockstore/ipld-store.ts +0 -103
  98. package/src/blockstore/memory-blockstore.ts +0 -49
  99. package/src/sync.ts +0 -38
  100. package/tests/sync.test.ts +0 -129
  101. /package/dist/{blockstore → src/blockstore}/index.d.ts +0 -0
  102. /package/dist/{blockstore → src/blockstore}/ipld-store.d.ts +0 -0
  103. /package/dist/{blockstore → src/blockstore}/memory-blockstore.d.ts +0 -0
  104. /package/dist/{sync.d.ts → src/sync.d.ts} +0 -0
@@ -0,0 +1,11 @@
1
+ import { check } from '@atproto/common';
2
+ import { CID } from 'multiformats/cid';
3
+ import BlockMap from './block-map';
4
+ export declare const getAndParse: <T>(blocks: BlockMap, cid: CID, def: check.Def<T>) => Promise<{
5
+ obj: T;
6
+ bytes: Uint8Array;
7
+ }>;
8
+ export declare const parseObj: <T>(bytes: Uint8Array, cid: CID, def: check.Def<T>) => {
9
+ obj: T;
10
+ bytes: Uint8Array;
11
+ };
@@ -0,0 +1,25 @@
1
+ import { CID } from 'multiformats/cid';
2
+ import { RepoRoot, Commit, DataStore, RepoMeta, RepoContents } from './types';
3
+ import { ReadableBlockstore } from './storage';
4
+ declare type Params = {
5
+ storage: ReadableBlockstore;
6
+ data: DataStore;
7
+ commit: Commit;
8
+ root: RepoRoot;
9
+ meta: RepoMeta;
10
+ cid: CID;
11
+ };
12
+ export declare class ReadableRepo {
13
+ storage: ReadableBlockstore;
14
+ data: DataStore;
15
+ commit: Commit;
16
+ root: RepoRoot;
17
+ meta: RepoMeta;
18
+ cid: CID;
19
+ constructor(params: Params);
20
+ static load(storage: ReadableBlockstore, commitCid: CID): Promise<ReadableRepo>;
21
+ get did(): string;
22
+ getRecord(collection: string, rkey: string): Promise<unknown | null>;
23
+ getContents(): Promise<RepoContents>;
24
+ }
25
+ export default ReadableRepo;
@@ -0,0 +1,39 @@
1
+ import { CID } from 'multiformats/cid';
2
+ import { BlockWriter } from '@ipld/car/writer';
3
+ import { RepoRoot, Commit, DataStore, RepoMeta, RecordCreateOp, RecordWriteOp } from './types';
4
+ import IpldStore from './blockstore/ipld-store';
5
+ import * as auth from '@atproto/auth';
6
+ declare type Params = {
7
+ blockstore: IpldStore;
8
+ data: DataStore;
9
+ commit: Commit;
10
+ root: RepoRoot;
11
+ meta: RepoMeta;
12
+ cid: CID;
13
+ stagedWrites: RecordWriteOp[];
14
+ };
15
+ export declare class Repo {
16
+ blockstore: IpldStore;
17
+ data: DataStore;
18
+ commit: Commit;
19
+ root: RepoRoot;
20
+ meta: RepoMeta;
21
+ cid: CID;
22
+ stagedWrites: RecordWriteOp[];
23
+ constructor(params: Params);
24
+ static create(blockstore: IpldStore, did: string, authStore: auth.AuthStore, initialRecords?: RecordCreateOp[]): Promise<Repo>;
25
+ static load(blockstore: IpldStore, cid: CID): Promise<Repo>;
26
+ private updateRepo;
27
+ get did(): string;
28
+ getRecord(collection: string, rkey: string): Promise<unknown | null>;
29
+ stageUpdate(write: RecordWriteOp | RecordWriteOp[]): Repo;
30
+ createCommit(authStore: auth.AuthStore, performUpdate?: (prev: CID, curr: CID) => Promise<CID | null>): Promise<Repo>;
31
+ revert(count: number): Promise<Repo>;
32
+ getCarNoHistory(): Promise<Uint8Array>;
33
+ getDiffCar(to: CID | null): Promise<Uint8Array>;
34
+ getFullHistory(): Promise<Uint8Array>;
35
+ private openCar;
36
+ writeCheckoutToCarStream(car: BlockWriter): Promise<void>;
37
+ writeCommitsToCarStream(car: BlockWriter, oldestCommit: CID | null, recentCommit: CID): Promise<void>;
38
+ }
39
+ export default Repo;
@@ -0,0 +1,22 @@
1
+ import { Def } from '@atproto/common/src/check';
2
+ import { CID } from 'multiformats/cid';
3
+ export declare class MissingBlockError extends Error {
4
+ cid: CID;
5
+ def?: Def<unknown> | undefined;
6
+ constructor(cid: CID, def?: Def<unknown> | undefined);
7
+ }
8
+ export declare class MissingBlocksError extends Error {
9
+ context: string;
10
+ cids: CID[];
11
+ constructor(context: string, cids: CID[]);
12
+ }
13
+ export declare class MissingCommitBlocksError extends Error {
14
+ commit: CID;
15
+ cids: CID[];
16
+ constructor(commit: CID, cids: CID[]);
17
+ }
18
+ export declare class UnexpectedObjectError extends Error {
19
+ cid: CID;
20
+ def: Def<unknown>;
21
+ constructor(cid: CID, def: Def<unknown>);
22
+ }
@@ -0,0 +1 @@
1
+ export * from './types';
@@ -0,0 +1 @@
1
+ export declare const thing = 1;
@@ -0,0 +1,28 @@
1
+ import { CID } from 'multiformats/cid';
2
+ import { CommitData } from '../types';
3
+ import BlockMap from '../block-map';
4
+ import RepoStorage from './repo-storage';
5
+ export declare class MemoryBlockstore extends RepoStorage {
6
+ blocks: BlockMap;
7
+ head: CID | null;
8
+ constructor(blocks?: BlockMap);
9
+ getHead(): Promise<CID | null>;
10
+ getBytes(cid: CID): Promise<Uint8Array | null>;
11
+ has(cid: CID): Promise<boolean>;
12
+ getBlocks(cids: CID[]): Promise<{
13
+ blocks: BlockMap;
14
+ missing: CID[];
15
+ }>;
16
+ putBlock(cid: CID, block: Uint8Array): Promise<void>;
17
+ putMany(blocks: BlockMap): Promise<void>;
18
+ indexCommits(commits: CommitData[]): Promise<void>;
19
+ updateHead(cid: CID, _prev: CID | null): Promise<void>;
20
+ applyCommit(commit: CommitData): Promise<void>;
21
+ getCommitPath(latest: CID, earliest: CID | null): Promise<CID[] | null>;
22
+ getBlocksForCommits(commits: CID[]): Promise<{
23
+ [commit: string]: BlockMap;
24
+ }>;
25
+ sizeInBytes(): Promise<number>;
26
+ destroy(): Promise<void>;
27
+ }
28
+ export default MemoryBlockstore;
@@ -0,0 +1,21 @@
1
+ import { check } from '@atproto/common';
2
+ import { CID } from 'multiformats/cid';
3
+ import BlockMap from '../block-map';
4
+ export declare abstract class ReadableBlockstore {
5
+ abstract getBytes(cid: CID): Promise<Uint8Array | null>;
6
+ abstract has(cid: CID): Promise<boolean>;
7
+ abstract getBlocks(cids: CID[]): Promise<{
8
+ blocks: BlockMap;
9
+ missing: CID[];
10
+ }>;
11
+ attemptRead<T>(cid: CID, def: check.Def<T>): Promise<{
12
+ obj: T;
13
+ bytes: Uint8Array;
14
+ } | null>;
15
+ readObjAndBytes<T>(cid: CID, def: check.Def<T>): Promise<{
16
+ obj: T;
17
+ bytes: Uint8Array;
18
+ }>;
19
+ readObj<T>(cid: CID, def: check.Def<T>): Promise<T>;
20
+ }
21
+ export default ReadableBlockstore;
@@ -0,0 +1,18 @@
1
+ import { CID } from 'multiformats/cid';
2
+ import BlockMap from '../block-map';
3
+ import { CommitBlockData, CommitData } from '../types';
4
+ import ReadableBlockstore from './readable-blockstore';
5
+ export declare abstract class RepoStorage extends ReadableBlockstore {
6
+ abstract getHead(forUpdate?: boolean): Promise<CID | null>;
7
+ abstract getCommitPath(latest: CID, earliest: CID | null): Promise<CID[] | null>;
8
+ abstract getBlocksForCommits(commits: CID[]): Promise<{
9
+ [commit: string]: BlockMap;
10
+ }>;
11
+ abstract putBlock(cid: CID, block: Uint8Array): Promise<void>;
12
+ abstract putMany(blocks: BlockMap): Promise<void>;
13
+ abstract updateHead(cid: CID, prev: CID | null): Promise<void>;
14
+ abstract indexCommits(commit: CommitData[]): Promise<void>;
15
+ applyCommit(commit: CommitData): Promise<void>;
16
+ getCommits(latest: CID, earliest: CID | null): Promise<CommitBlockData[] | null>;
17
+ }
18
+ export default RepoStorage;
@@ -0,0 +1,15 @@
1
+ import { CID } from 'multiformats/cid';
2
+ import BlockMap from '../block-map';
3
+ import ReadableBlockstore from './readable-blockstore';
4
+ export declare class SyncStorage extends ReadableBlockstore {
5
+ staged: ReadableBlockstore;
6
+ saved: ReadableBlockstore;
7
+ constructor(staged: ReadableBlockstore, saved: ReadableBlockstore);
8
+ getBytes(cid: CID): Promise<Uint8Array | null>;
9
+ getBlocks(cids: CID[]): Promise<{
10
+ blocks: BlockMap;
11
+ missing: CID[];
12
+ }>;
13
+ has(cid: CID): Promise<boolean>;
14
+ }
15
+ export default SyncStorage;
@@ -0,0 +1,12 @@
1
+ /// <reference types="node" />
2
+ import stream from 'stream';
3
+ import { CID } from 'multiformats/cid';
4
+ export interface BlobStore {
5
+ putTemp(bytes: Uint8Array | stream.Readable): Promise<string>;
6
+ makePermanent(key: string, cid: CID): Promise<void>;
7
+ putPermanent(cid: CID, bytes: Uint8Array | stream.Readable): Promise<void>;
8
+ getBytes(cid: CID): Promise<Uint8Array>;
9
+ getStream(cid: CID): Promise<stream.Readable>;
10
+ }
11
+ export declare class BlobNotFoundError extends Error {
12
+ }
@@ -0,0 +1,17 @@
1
+ import { check } from '@atproto/common';
2
+ import { CID } from 'multiformats/cid';
3
+ import BlockMap from '../block-map';
4
+ import { ReadableBlockstore } from './types';
5
+ export declare const readAndVerify: <T>(storage: ReadableBlockstore, cid: CID, def: check.Def<T>) => Promise<{
6
+ obj: T;
7
+ bytes: Uint8Array;
8
+ }>;
9
+ export declare const getAndVerify: <T>(blocks: BlockMap, cid: CID, def: check.Def<T>) => Promise<{
10
+ obj: T;
11
+ bytes: Uint8Array;
12
+ }>;
13
+ export declare const verifyObj: <T>(bytes: Uint8Array | null, cid: CID, def: check.Def<T>) => Promise<{
14
+ obj: T;
15
+ bytes: Uint8Array;
16
+ }>;
17
+ export declare const readObj: <T>(storage: ReadableBlockstore, cid: CID, schema: check.Def<T>) => Promise<T>;
@@ -0,0 +1,39 @@
1
+ import { CID } from 'multiformats/cid';
2
+ import { BlockWriter } from '@ipld/car/lib/writer-browser';
3
+ import { RepoRoot, Commit, CidWriteOp, DataStore, RepoMeta } from './types';
4
+ import IpldStore from './blockstore/ipld-store';
5
+ import * as auth from '@atproto/auth';
6
+ declare type Params = {
7
+ blockstore: IpldStore;
8
+ data: DataStore;
9
+ commit: Commit;
10
+ root: RepoRoot;
11
+ meta: RepoMeta;
12
+ cid: CID;
13
+ stagedWrites: CidWriteOp[];
14
+ };
15
+ export declare class RepoStructure {
16
+ blockstore: IpldStore;
17
+ data: DataStore;
18
+ commit: Commit;
19
+ root: RepoRoot;
20
+ meta: RepoMeta;
21
+ cid: CID;
22
+ stagedWrites: CidWriteOp[];
23
+ constructor(params: Params);
24
+ static create(blockstore: IpldStore, did: string, authStore: auth.AuthStore): Promise<RepoStructure>;
25
+ static load(blockstore: IpldStore, cid: CID): Promise<RepoStructure>;
26
+ private updateRepo;
27
+ did(): string;
28
+ getRecord(collection: string, rkey: string): Promise<unknown | null>;
29
+ stageUpdate(write: CidWriteOp | CidWriteOp[]): RepoStructure;
30
+ createCommit(authStore: auth.AuthStore, performUpdate?: (prev: CID, curr: CID) => Promise<CID | null>): Promise<RepoStructure>;
31
+ revert(count: number): Promise<RepoStructure>;
32
+ getCarNoHistory(): Promise<Uint8Array>;
33
+ getDiffCar(to: CID | null): Promise<Uint8Array>;
34
+ getFullHistory(): Promise<Uint8Array>;
35
+ private openCar;
36
+ writeCheckoutToCarStream(car: BlockWriter): Promise<void>;
37
+ writeCommitsToCarStream(car: BlockWriter, oldestCommit: CID | null, recentCommit: CID): Promise<void>;
38
+ }
39
+ export default RepoStructure;
@@ -0,0 +1,19 @@
1
+ import { CID } from 'multiformats/cid';
2
+ import { DidResolver } from '@atproto/did-resolver';
3
+ import { RepoStorage } from '../storage';
4
+ import Repo from '../repo';
5
+ import * as verify from '../verify';
6
+ import { RepoContents, WriteLog } from '../types';
7
+ export declare const loadCheckout: (storage: RepoStorage, repoCar: Uint8Array, didResolver: DidResolver) => Promise<{
8
+ root: CID;
9
+ contents: RepoContents;
10
+ }>;
11
+ export declare const loadFullRepo: (storage: RepoStorage, repoCar: Uint8Array, didResolver: DidResolver) => Promise<{
12
+ root: CID;
13
+ writeLog: WriteLog;
14
+ }>;
15
+ export declare const loadDiff: (repo: Repo, diffCar: Uint8Array, didResolver: DidResolver) => Promise<{
16
+ root: CID;
17
+ writeLog: WriteLog;
18
+ }>;
19
+ export declare const persistUpdates: (storage: RepoStorage, updateStorage: RepoStorage, updates: verify.VerifiedUpdate[]) => Promise<WriteLog>;
@@ -0,0 +1,2 @@
1
+ export * from './consumer';
2
+ export * from './provider';
@@ -0,0 +1,13 @@
1
+ import { BlockWriter } from '@ipld/car/writer';
2
+ import { CID } from 'multiformats/cid';
3
+ import { RepoStorage } from '../storage';
4
+ import { RepoRoot } from '../types';
5
+ export declare const getCheckout: (storage: RepoStorage, cid: CID) => Promise<Uint8Array>;
6
+ export declare const getDiff: (storage: RepoStorage, latest: CID, earliest: CID | null) => Promise<Uint8Array>;
7
+ export declare const getFullRepo: (storage: RepoStorage, cid: CID) => Promise<Uint8Array>;
8
+ export declare const writeCommitsToCarStream: (storage: RepoStorage, car: BlockWriter, latest: CID, earliest: CID | null) => Promise<void>;
9
+ export declare const getRecords: (storage: RepoStorage, commit: CID, paths: {
10
+ collection: string;
11
+ rkey: string;
12
+ }[]) => Promise<Uint8Array>;
13
+ export declare const writeCommitAndRootToCar: (storage: RepoStorage, car: BlockWriter, cid: CID) => Promise<RepoRoot>;
@@ -0,0 +1,11 @@
1
+ import { RecordPath } from '../types';
2
+ import { BlockWriter } from '@ipld/car/writer';
3
+ import { CID } from 'multiformats/cid';
4
+ import { RepoStorage } from '../storage';
5
+ import { RepoRoot } from '../types';
6
+ export declare const getCheckout: (storage: RepoStorage, cid: CID) => Promise<Uint8Array>;
7
+ export declare const getDiff: (storage: RepoStorage, latest: CID, earliest: CID | null) => Promise<Uint8Array>;
8
+ export declare const getFullRepo: (storage: RepoStorage, cid: CID) => Promise<Uint8Array>;
9
+ export declare const writeCommitsToCarStream: (storage: RepoStorage, car: BlockWriter, latest: CID, earliest: CID | null) => Promise<void>;
10
+ export declare const getRecords: (storage: RepoStorage, commit: CID, paths: RecordPath[]) => Promise<Uint8Array>;
11
+ export declare const writeCommitAndRootToCar: (storage: RepoStorage, car: BlockWriter, cid: CID) => Promise<RepoRoot>;