@helia/utils 0.0.0-031519c

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 (44) hide show
  1. package/LICENSE +4 -0
  2. package/README.md +66 -0
  3. package/dist/index.min.js +3 -0
  4. package/dist/src/index.d.ts +100 -0
  5. package/dist/src/index.d.ts.map +1 -0
  6. package/dist/src/index.js +115 -0
  7. package/dist/src/index.js.map +1 -0
  8. package/dist/src/pins.d.ts +17 -0
  9. package/dist/src/pins.d.ts.map +1 -0
  10. package/dist/src/pins.js +155 -0
  11. package/dist/src/pins.js.map +1 -0
  12. package/dist/src/routing.d.ts +43 -0
  13. package/dist/src/routing.d.ts.map +1 -0
  14. package/dist/src/routing.js +122 -0
  15. package/dist/src/routing.js.map +1 -0
  16. package/dist/src/storage.d.ts +63 -0
  17. package/dist/src/storage.d.ts.map +1 -0
  18. package/dist/src/storage.js +140 -0
  19. package/dist/src/storage.js.map +1 -0
  20. package/dist/src/utils/dag-walkers.d.ts +28 -0
  21. package/dist/src/utils/dag-walkers.d.ts.map +1 -0
  22. package/dist/src/utils/dag-walkers.js +171 -0
  23. package/dist/src/utils/dag-walkers.js.map +1 -0
  24. package/dist/src/utils/datastore-version.d.ts +3 -0
  25. package/dist/src/utils/datastore-version.d.ts.map +1 -0
  26. package/dist/src/utils/datastore-version.js +19 -0
  27. package/dist/src/utils/datastore-version.js.map +1 -0
  28. package/dist/src/utils/default-hashers.d.ts +3 -0
  29. package/dist/src/utils/default-hashers.d.ts.map +1 -0
  30. package/dist/src/utils/default-hashers.js +15 -0
  31. package/dist/src/utils/default-hashers.js.map +1 -0
  32. package/dist/src/utils/networked-storage.d.ts +67 -0
  33. package/dist/src/utils/networked-storage.d.ts.map +1 -0
  34. package/dist/src/utils/networked-storage.js +206 -0
  35. package/dist/src/utils/networked-storage.js.map +1 -0
  36. package/package.json +91 -0
  37. package/src/index.ts +225 -0
  38. package/src/pins.ts +227 -0
  39. package/src/routing.ts +169 -0
  40. package/src/storage.ts +172 -0
  41. package/src/utils/dag-walkers.ts +198 -0
  42. package/src/utils/datastore-version.ts +23 -0
  43. package/src/utils/default-hashers.ts +18 -0
  44. package/src/utils/networked-storage.ts +261 -0
@@ -0,0 +1,155 @@
1
+ import { Queue } from '@libp2p/utils/queue';
2
+ import * as cborg from 'cborg';
3
+ import { Key } from 'interface-datastore';
4
+ import { base36 } from 'multiformats/bases/base36';
5
+ import { CID } from 'multiformats/cid';
6
+ import { CustomProgressEvent } from 'progress-events';
7
+ import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
8
+ const DATASTORE_PIN_PREFIX = '/pin/';
9
+ const DATASTORE_BLOCK_PREFIX = '/pinned-block/';
10
+ const DATASTORE_ENCODING = base36;
11
+ const DAG_WALK_QUEUE_CONCURRENCY = 1;
12
+ function toDSKey(cid) {
13
+ if (cid.version === 0) {
14
+ cid = cid.toV1();
15
+ }
16
+ return new Key(`${DATASTORE_PIN_PREFIX}${cid.toString(DATASTORE_ENCODING)}`);
17
+ }
18
+ export class PinsImpl {
19
+ datastore;
20
+ blockstore;
21
+ dagWalkers;
22
+ constructor(datastore, blockstore, dagWalkers) {
23
+ this.datastore = datastore;
24
+ this.blockstore = blockstore;
25
+ this.dagWalkers = dagWalkers;
26
+ }
27
+ async *add(cid, options = {}) {
28
+ const pinKey = toDSKey(cid);
29
+ if (await this.datastore.has(pinKey)) {
30
+ throw new Error('Already pinned');
31
+ }
32
+ const depth = Math.round(options.depth ?? Infinity);
33
+ if (depth < 0) {
34
+ throw new Error('Depth must be greater than or equal to 0');
35
+ }
36
+ // use a queue to walk the DAG instead of recursion so we can traverse very large DAGs
37
+ const queue = new Queue({
38
+ concurrency: DAG_WALK_QUEUE_CONCURRENCY
39
+ });
40
+ for await (const childCid of this.#walkDag(cid, queue, {
41
+ ...options,
42
+ depth
43
+ })) {
44
+ await this.#updatePinnedBlock(childCid, (pinnedBlock) => {
45
+ // do not update pinned block if this block is already pinned by this CID
46
+ if (pinnedBlock.pinnedBy.find(c => uint8ArrayEquals(c, cid.bytes)) != null) {
47
+ return false;
48
+ }
49
+ pinnedBlock.pinCount++;
50
+ pinnedBlock.pinnedBy.push(cid.bytes);
51
+ return true;
52
+ }, options);
53
+ yield childCid;
54
+ }
55
+ const pin = {
56
+ depth,
57
+ metadata: options.metadata ?? {}
58
+ };
59
+ await this.datastore.put(pinKey, cborg.encode(pin), options);
60
+ }
61
+ /**
62
+ * Walk a DAG in an iterable fashion
63
+ */
64
+ async *#walkDag(cid, queue, options) {
65
+ if (options.depth === -1) {
66
+ return;
67
+ }
68
+ const dagWalker = this.dagWalkers[cid.code];
69
+ if (dagWalker == null) {
70
+ throw new Error(`No dag walker found for cid codec ${cid.code}`);
71
+ }
72
+ const block = await this.blockstore.get(cid, options);
73
+ yield cid;
74
+ // walk dag, ensure all blocks are present
75
+ for await (const cid of dagWalker.walk(block)) {
76
+ yield* await queue.add(async () => {
77
+ return this.#walkDag(cid, queue, {
78
+ ...options,
79
+ depth: options.depth - 1
80
+ });
81
+ });
82
+ }
83
+ }
84
+ /**
85
+ * Update the pin count for the CID
86
+ */
87
+ async #updatePinnedBlock(cid, withPinnedBlock, options) {
88
+ const blockKey = new Key(`${DATASTORE_BLOCK_PREFIX}${DATASTORE_ENCODING.encode(cid.multihash.bytes)}`);
89
+ let pinnedBlock = {
90
+ pinCount: 0,
91
+ pinnedBy: []
92
+ };
93
+ try {
94
+ pinnedBlock = cborg.decode(await this.datastore.get(blockKey, options));
95
+ }
96
+ catch (err) {
97
+ if (err.code !== 'ERR_NOT_FOUND') {
98
+ throw err;
99
+ }
100
+ }
101
+ const shouldContinue = withPinnedBlock(pinnedBlock);
102
+ if (!shouldContinue) {
103
+ return;
104
+ }
105
+ if (pinnedBlock.pinCount === 0) {
106
+ if (await this.datastore.has(blockKey)) {
107
+ await this.datastore.delete(blockKey);
108
+ return;
109
+ }
110
+ }
111
+ await this.datastore.put(blockKey, cborg.encode(pinnedBlock), options);
112
+ options.onProgress?.(new CustomProgressEvent('helia:pin:add', cid));
113
+ }
114
+ async *rm(cid, options = {}) {
115
+ const pinKey = toDSKey(cid);
116
+ const buf = await this.datastore.get(pinKey, options);
117
+ const pin = cborg.decode(buf);
118
+ await this.datastore.delete(pinKey, options);
119
+ // use a queue to walk the DAG instead of recursion so we can traverse very large DAGs
120
+ const queue = new Queue({
121
+ concurrency: DAG_WALK_QUEUE_CONCURRENCY
122
+ });
123
+ for await (const childCid of this.#walkDag(cid, queue, {
124
+ ...options,
125
+ depth: pin.depth
126
+ })) {
127
+ await this.#updatePinnedBlock(childCid, (pinnedBlock) => {
128
+ pinnedBlock.pinCount--;
129
+ pinnedBlock.pinnedBy = pinnedBlock.pinnedBy.filter(c => uint8ArrayEquals(c, cid.bytes));
130
+ return true;
131
+ }, {
132
+ ...options,
133
+ depth: pin.depth
134
+ });
135
+ yield childCid;
136
+ }
137
+ }
138
+ async *ls(options = {}) {
139
+ for await (const { key, value } of this.datastore.query({
140
+ prefix: DATASTORE_PIN_PREFIX + (options.cid != null ? `${options.cid.toString(base36)}` : '')
141
+ }, options)) {
142
+ const cid = CID.parse(key.toString().substring(5), base36);
143
+ const pin = cborg.decode(value);
144
+ yield {
145
+ cid,
146
+ ...pin
147
+ };
148
+ }
149
+ }
150
+ async isPinned(cid, options = {}) {
151
+ const blockKey = new Key(`${DATASTORE_BLOCK_PREFIX}${DATASTORE_ENCODING.encode(cid.multihash.bytes)}`);
152
+ return this.datastore.has(blockKey, options);
153
+ }
154
+ }
155
+ //# sourceMappingURL=pins.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pins.js","sourceRoot":"","sources":["../../src/pins.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import type { Routing as RoutingInterface, Provider, RoutingOptions } from '@helia/interface';
2
+ import type { AbortOptions, ComponentLogger, PeerId, PeerInfo, Startable } from '@libp2p/interface';
3
+ import type { CID } from 'multiformats/cid';
4
+ export interface RoutingInit {
5
+ routers: Array<Partial<RoutingInterface>>;
6
+ }
7
+ export interface RoutingComponents {
8
+ logger: ComponentLogger;
9
+ }
10
+ export declare class Routing implements RoutingInterface, Startable {
11
+ private readonly log;
12
+ private readonly routers;
13
+ constructor(components: RoutingComponents, init: RoutingInit);
14
+ start(): Promise<void>;
15
+ stop(): Promise<void>;
16
+ /**
17
+ * Iterates over all content routers in parallel to find providers of the given key
18
+ */
19
+ findProviders(key: CID, options?: RoutingOptions): AsyncIterable<Provider>;
20
+ /**
21
+ * Iterates over all content routers in parallel to notify it is
22
+ * a provider of the given key
23
+ */
24
+ provide(key: CID, options?: AbortOptions): Promise<void>;
25
+ /**
26
+ * Store the given key/value pair in the available content routings
27
+ */
28
+ put(key: Uint8Array, value: Uint8Array, options?: AbortOptions): Promise<void>;
29
+ /**
30
+ * Get the value to the given key.
31
+ * Times out after 1 minute by default.
32
+ */
33
+ get(key: Uint8Array, options?: AbortOptions): Promise<Uint8Array>;
34
+ /**
35
+ * Iterates over all peer routers in parallel to find the given peer
36
+ */
37
+ findPeer(id: PeerId, options?: RoutingOptions): Promise<PeerInfo>;
38
+ /**
39
+ * Attempt to find the closest peers on the network to the given key
40
+ */
41
+ getClosestPeers(key: Uint8Array, options?: RoutingOptions): AsyncIterable<PeerInfo>;
42
+ }
43
+ //# sourceMappingURL=routing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.d.ts","sourceRoot":"","sources":["../../src/routing.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,IAAI,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAU,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAC3G,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAA;CAC1C;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,qBAAa,OAAQ,YAAW,gBAAgB,EAAE,SAAS;IACzD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;gBAE7C,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW;IAKvD,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAIvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAI5B;;OAEG;IACK,aAAa,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,cAAmB,GAAG,aAAa,CAAC,QAAQ,CAAC;IA4BvF;;;OAGG;IACG,OAAO,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAanE;;OAEG;IACG,GAAG,CAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IASrF;;;OAGG;IACG,GAAG,CAAE,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IASxE;;OAEG;IACG,QAAQ,CAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,QAAQ,CAAC;IA4BxE;;OAEG;IACK,eAAe,CAAE,GAAG,EAAE,UAAU,EAAE,OAAO,GAAE,cAAmB,GAAG,aAAa,CAAC,QAAQ,CAAC;CAyBjG"}
@@ -0,0 +1,122 @@
1
+ import { CodeError, start, stop } from '@libp2p/interface';
2
+ import { PeerSet } from '@libp2p/peer-collections';
3
+ import merge from 'it-merge';
4
+ export class Routing {
5
+ log;
6
+ routers;
7
+ constructor(components, init) {
8
+ this.log = components.logger.forComponent('helia:routing');
9
+ this.routers = init.routers ?? [];
10
+ }
11
+ async start() {
12
+ await start(...this.routers);
13
+ }
14
+ async stop() {
15
+ await stop(...this.routers);
16
+ }
17
+ /**
18
+ * Iterates over all content routers in parallel to find providers of the given key
19
+ */
20
+ async *findProviders(key, options = {}) {
21
+ if (this.routers.length === 0) {
22
+ throw new CodeError('No content routers available', 'ERR_NO_ROUTERS_AVAILABLE');
23
+ }
24
+ const seen = new PeerSet();
25
+ for await (const peer of merge(...supports(this.routers, 'findProviders')
26
+ .map(router => router.findProviders(key, options)))) {
27
+ // the peer was yielded by a content router without multiaddrs and we
28
+ // failed to load them
29
+ if (peer == null) {
30
+ continue;
31
+ }
32
+ // deduplicate peers
33
+ if (seen.has(peer.id)) {
34
+ continue;
35
+ }
36
+ seen.add(peer.id);
37
+ yield peer;
38
+ }
39
+ }
40
+ /**
41
+ * Iterates over all content routers in parallel to notify it is
42
+ * a provider of the given key
43
+ */
44
+ async provide(key, options = {}) {
45
+ if (this.routers.length === 0) {
46
+ throw new CodeError('No content routers available', 'ERR_NO_ROUTERS_AVAILABLE');
47
+ }
48
+ await Promise.all(supports(this.routers, 'provide')
49
+ .map(async (router) => {
50
+ await router.provide(key, options);
51
+ }));
52
+ }
53
+ /**
54
+ * Store the given key/value pair in the available content routings
55
+ */
56
+ async put(key, value, options) {
57
+ await Promise.all(supports(this.routers, 'put')
58
+ .map(async (router) => {
59
+ await router.put(key, value, options);
60
+ }));
61
+ }
62
+ /**
63
+ * Get the value to the given key.
64
+ * Times out after 1 minute by default.
65
+ */
66
+ async get(key, options) {
67
+ return Promise.any(supports(this.routers, 'get')
68
+ .map(async (router) => {
69
+ return router.get(key, options);
70
+ }));
71
+ }
72
+ /**
73
+ * Iterates over all peer routers in parallel to find the given peer
74
+ */
75
+ async findPeer(id, options) {
76
+ if (this.routers.length === 0) {
77
+ throw new CodeError('No peer routers available', 'ERR_NO_ROUTERS_AVAILABLE');
78
+ }
79
+ const self = this;
80
+ const source = merge(...supports(this.routers, 'findPeer')
81
+ .map(router => (async function* () {
82
+ try {
83
+ yield await router.findPeer(id, options);
84
+ }
85
+ catch (err) {
86
+ self.log.error(err);
87
+ }
88
+ })()));
89
+ for await (const peer of source) {
90
+ if (peer == null) {
91
+ continue;
92
+ }
93
+ return peer;
94
+ }
95
+ throw new CodeError('Could not find peer in routing', 'ERR_NOT_FOUND');
96
+ }
97
+ /**
98
+ * Attempt to find the closest peers on the network to the given key
99
+ */
100
+ async *getClosestPeers(key, options = {}) {
101
+ if (this.routers.length === 0) {
102
+ throw new CodeError('No peer routers available', 'ERR_NO_ROUTERS_AVAILABLE');
103
+ }
104
+ const seen = new PeerSet();
105
+ for await (const peer of merge(...supports(this.routers, 'getClosestPeers')
106
+ .map(router => router.getClosestPeers(key, options)))) {
107
+ if (peer == null) {
108
+ continue;
109
+ }
110
+ // deduplicate peers
111
+ if (seen.has(peer.id)) {
112
+ continue;
113
+ }
114
+ seen.add(peer.id);
115
+ yield peer;
116
+ }
117
+ }
118
+ }
119
+ function supports(routers, key) {
120
+ return routers.filter(router => router[key] != null);
121
+ }
122
+ //# sourceMappingURL=routing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routing.js","sourceRoot":"","sources":["../../src/routing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { Blocks, Pair, DeleteManyBlocksProgressEvents, DeleteBlockProgressEvents, GetBlockProgressEvents, GetManyBlocksProgressEvents, PutManyBlocksProgressEvents, PutBlockProgressEvents, GetAllBlocksProgressEvents, GetOfflineOptions } from '@helia/interface/blocks';
2
+ import type { Pins } from '@helia/interface/pins';
3
+ import type { AbortOptions, Startable } from '@libp2p/interface';
4
+ import type { Blockstore } from 'interface-blockstore';
5
+ import type { AwaitIterable } from 'interface-store';
6
+ import type { Mortice } from 'mortice';
7
+ import type { CID } from 'multiformats/cid';
8
+ import type { ProgressOptions } from 'progress-events';
9
+ export interface BlockStorageInit {
10
+ holdGcLock?: boolean;
11
+ }
12
+ export interface GetOptions extends AbortOptions {
13
+ progress?(evt: Event): void;
14
+ }
15
+ /**
16
+ * BlockStorage is a hybrid blockstore that puts/gets blocks from a configured
17
+ * blockstore (that may be on disk, s3, or something else). If the blocks are
18
+ * not present Bitswap will be used to fetch them from network peers.
19
+ */
20
+ export declare class BlockStorage implements Blocks, Startable {
21
+ lock: Mortice;
22
+ private readonly child;
23
+ private readonly pins;
24
+ private started;
25
+ /**
26
+ * Create a new BlockStorage
27
+ */
28
+ constructor(blockstore: Blockstore, pins: Pins, options?: BlockStorageInit);
29
+ isStarted(): boolean;
30
+ start(): Promise<void>;
31
+ stop(): Promise<void>;
32
+ unwrap(): Blockstore;
33
+ /**
34
+ * Put a block to the underlying datastore
35
+ */
36
+ put(cid: CID, block: Uint8Array, options?: AbortOptions & ProgressOptions<PutBlockProgressEvents>): Promise<CID>;
37
+ /**
38
+ * Put a multiple blocks to the underlying datastore
39
+ */
40
+ putMany(blocks: AwaitIterable<{
41
+ cid: CID;
42
+ block: Uint8Array;
43
+ }>, options?: AbortOptions & ProgressOptions<PutManyBlocksProgressEvents>): AsyncIterable<CID>;
44
+ /**
45
+ * Get a block by cid
46
+ */
47
+ get(cid: CID, options?: GetOfflineOptions & AbortOptions & ProgressOptions<GetBlockProgressEvents>): Promise<Uint8Array>;
48
+ /**
49
+ * Get multiple blocks back from an (async) iterable of cids
50
+ */
51
+ getMany(cids: AwaitIterable<CID>, options?: GetOfflineOptions & AbortOptions & ProgressOptions<GetManyBlocksProgressEvents>): AsyncIterable<Pair>;
52
+ /**
53
+ * Delete a block from the blockstore
54
+ */
55
+ delete(cid: CID, options?: AbortOptions & ProgressOptions<DeleteBlockProgressEvents>): Promise<void>;
56
+ /**
57
+ * Delete multiple blocks from the blockstore
58
+ */
59
+ deleteMany(cids: AwaitIterable<CID>, options?: AbortOptions & ProgressOptions<DeleteManyBlocksProgressEvents>): AsyncIterable<CID>;
60
+ has(cid: CID, options?: AbortOptions): Promise<boolean>;
61
+ getAll(options?: AbortOptions & ProgressOptions<GetAllBlocksProgressEvents>): AsyncIterable<Pair>;
62
+ }
63
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,8BAA8B,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC/Q,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AACpD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB;AAED,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,QAAQ,CAAC,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,CAAA;CAC5B;AAED;;;;GAIG;AACH,qBAAa,YAAa,YAAW,MAAM,EAAE,SAAS;IAC7C,IAAI,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAM;IAC3B,OAAO,CAAC,OAAO,CAAS;IAExB;;OAEG;gBACU,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,gBAAqB;IAS/E,SAAS,IAAK,OAAO;IAIf,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAKvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAK5B,MAAM,IAAK,UAAU;IAIrB;;OAEG;IACG,GAAG,CAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,GAAE,YAAY,GAAG,eAAe,CAAC,sBAAsB,CAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAU3H;;OAEG;IACK,OAAO,CAAE,MAAM,EAAE,aAAa,CAAC;QAAE,GAAG,EAAE,GAAG,CAAC;QAAC,KAAK,EAAE,UAAU,CAAA;KAAE,CAAC,EAAE,OAAO,GAAE,YAAY,GAAG,eAAe,CAAC,2BAA2B,CAAM,GAAG,aAAa,CAAC,GAAG,CAAC;IAUvK;;OAEG;IACG,GAAG,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,iBAAiB,GAAG,YAAY,GAAG,eAAe,CAAC,sBAAsB,CAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAUnI;;OAEG;IACK,OAAO,CAAE,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,OAAO,GAAE,iBAAiB,GAAG,YAAY,GAAG,eAAe,CAAC,2BAA2B,CAAM,GAAG,aAAa,CAAC,IAAI,CAAC;IAU9J;;OAEG;IACG,MAAM,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,YAAY,GAAG,eAAe,CAAC,yBAAyB,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/G;;OAEG;IACK,UAAU,CAAE,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,EAAE,OAAO,GAAE,YAAY,GAAG,eAAe,CAAC,8BAA8B,CAAM,GAAG,aAAa,CAAC,GAAG,CAAC;IAoBzI,GAAG,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAU1D,MAAM,CAAE,OAAO,GAAE,YAAY,GAAG,eAAe,CAAC,0BAA0B,CAAM,GAAG,aAAa,CAAC,IAAI,CAAC;CAS/G"}
@@ -0,0 +1,140 @@
1
+ import { start, stop } from '@libp2p/interface';
2
+ import createMortice from 'mortice';
3
+ /**
4
+ * BlockStorage is a hybrid blockstore that puts/gets blocks from a configured
5
+ * blockstore (that may be on disk, s3, or something else). If the blocks are
6
+ * not present Bitswap will be used to fetch them from network peers.
7
+ */
8
+ export class BlockStorage {
9
+ lock;
10
+ child;
11
+ pins;
12
+ started;
13
+ /**
14
+ * Create a new BlockStorage
15
+ */
16
+ constructor(blockstore, pins, options = {}) {
17
+ this.child = blockstore;
18
+ this.pins = pins;
19
+ this.lock = createMortice({
20
+ singleProcess: options.holdGcLock
21
+ });
22
+ this.started = false;
23
+ }
24
+ isStarted() {
25
+ return this.started;
26
+ }
27
+ async start() {
28
+ await start(this.child);
29
+ this.started = true;
30
+ }
31
+ async stop() {
32
+ await stop(this.child);
33
+ this.started = false;
34
+ }
35
+ unwrap() {
36
+ return this.child;
37
+ }
38
+ /**
39
+ * Put a block to the underlying datastore
40
+ */
41
+ async put(cid, block, options = {}) {
42
+ const releaseLock = await this.lock.readLock();
43
+ try {
44
+ return await this.child.put(cid, block, options);
45
+ }
46
+ finally {
47
+ releaseLock();
48
+ }
49
+ }
50
+ /**
51
+ * Put a multiple blocks to the underlying datastore
52
+ */
53
+ async *putMany(blocks, options = {}) {
54
+ const releaseLock = await this.lock.readLock();
55
+ try {
56
+ yield* this.child.putMany(blocks, options);
57
+ }
58
+ finally {
59
+ releaseLock();
60
+ }
61
+ }
62
+ /**
63
+ * Get a block by cid
64
+ */
65
+ async get(cid, options = {}) {
66
+ const releaseLock = await this.lock.readLock();
67
+ try {
68
+ return await this.child.get(cid, options);
69
+ }
70
+ finally {
71
+ releaseLock();
72
+ }
73
+ }
74
+ /**
75
+ * Get multiple blocks back from an (async) iterable of cids
76
+ */
77
+ async *getMany(cids, options = {}) {
78
+ const releaseLock = await this.lock.readLock();
79
+ try {
80
+ yield* this.child.getMany(cids, options);
81
+ }
82
+ finally {
83
+ releaseLock();
84
+ }
85
+ }
86
+ /**
87
+ * Delete a block from the blockstore
88
+ */
89
+ async delete(cid, options = {}) {
90
+ const releaseLock = await this.lock.writeLock();
91
+ try {
92
+ if (await this.pins.isPinned(cid)) {
93
+ throw new Error('CID was pinned');
94
+ }
95
+ await this.child.delete(cid, options);
96
+ }
97
+ finally {
98
+ releaseLock();
99
+ }
100
+ }
101
+ /**
102
+ * Delete multiple blocks from the blockstore
103
+ */
104
+ async *deleteMany(cids, options = {}) {
105
+ const releaseLock = await this.lock.writeLock();
106
+ try {
107
+ const storage = this;
108
+ yield* this.child.deleteMany((async function* () {
109
+ for await (const cid of cids) {
110
+ if (await storage.pins.isPinned(cid)) {
111
+ throw new Error('CID was pinned');
112
+ }
113
+ yield cid;
114
+ }
115
+ }()), options);
116
+ }
117
+ finally {
118
+ releaseLock();
119
+ }
120
+ }
121
+ async has(cid, options = {}) {
122
+ const releaseLock = await this.lock.readLock();
123
+ try {
124
+ return await this.child.has(cid, options);
125
+ }
126
+ finally {
127
+ releaseLock();
128
+ }
129
+ }
130
+ async *getAll(options = {}) {
131
+ const releaseLock = await this.lock.readLock();
132
+ try {
133
+ yield* this.child.getAll(options);
134
+ }
135
+ finally {
136
+ releaseLock();
137
+ }
138
+ }
139
+ }
140
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import type { DAGWalker } from '@helia/interface';
2
+ /**
3
+ * Dag walker for dag-pb CIDs
4
+ */
5
+ export declare const dagPbWalker: DAGWalker;
6
+ /**
7
+ * Dag walker for raw CIDs
8
+ */
9
+ export declare const rawWalker: DAGWalker;
10
+ /**
11
+ * Dag walker for dag-cbor CIDs. Does not actually use dag-cbor since
12
+ * all we are interested in is extracting the the CIDs from the block
13
+ * so we can just use cborg for that.
14
+ */
15
+ export declare const dagCborWalker: DAGWalker;
16
+ /**
17
+ * Dag walker for dag-json CIDs. Does not actually use dag-json since
18
+ * all we are interested in is extracting the the CIDs from the block
19
+ * so we can just use cborg/json for that.
20
+ */
21
+ export declare const dagJsonWalker: DAGWalker;
22
+ /**
23
+ * Dag walker for json CIDs. JSON has no facility for linking to
24
+ * external blocks so the walker is a no-op.
25
+ */
26
+ export declare const jsonWalker: DAGWalker;
27
+ export declare function defaultDagWalkers(walkers?: DAGWalker[]): Record<number, DAGWalker>;
28
+ //# sourceMappingURL=dag-walkers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dag-walkers.d.ts","sourceRoot":"","sources":["../../../src/utils/dag-walkers.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,SAOzB,CAAA;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,SAKvB,CAAA;AAKD;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,SAuB3B,CAAA;AAsED;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,SA6B3B,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,SAGxB,CAAA;AAED,wBAAgB,iBAAiB,CAAE,OAAO,GAAE,SAAS,EAAO,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAevF"}