@helia/utils 2.5.2-f6cc7640 → 3.0.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 (80) hide show
  1. package/dist/index.min.js +1 -1
  2. package/dist/index.min.js.map +4 -4
  3. package/dist/src/abstract-session.d.ts +3 -3
  4. package/dist/src/abstract-session.d.ts.map +1 -1
  5. package/dist/src/abstract-session.js.map +1 -1
  6. package/dist/src/errors.d.ts +4 -0
  7. package/dist/src/errors.d.ts.map +1 -1
  8. package/dist/src/errors.js +4 -0
  9. package/dist/src/errors.js.map +1 -1
  10. package/dist/src/graph-walker.d.ts +3 -21
  11. package/dist/src/graph-walker.d.ts.map +1 -1
  12. package/dist/src/graph-walker.js +20 -17
  13. package/dist/src/graph-walker.js.map +1 -1
  14. package/dist/src/index.d.ts +5 -168
  15. package/dist/src/index.d.ts.map +1 -1
  16. package/dist/src/index.js +5 -130
  17. package/dist/src/index.js.map +1 -1
  18. package/dist/src/is-cid.d.ts +3 -0
  19. package/dist/src/is-cid.d.ts.map +1 -0
  20. package/dist/src/is-cid.js +8 -0
  21. package/dist/src/is-cid.js.map +1 -0
  22. package/dist/src/is-promise.d.ts.map +1 -0
  23. package/dist/src/is-promise.js.map +1 -0
  24. package/dist/typedoc-urls.json +20 -0
  25. package/package.json +16 -34
  26. package/src/abstract-session.ts +4 -4
  27. package/src/errors.ts +5 -0
  28. package/src/graph-walker.ts +30 -43
  29. package/src/index.ts +5 -333
  30. package/src/is-cid.ts +9 -0
  31. package/dist/src/pins.d.ts +0 -21
  32. package/dist/src/pins.d.ts.map +0 -1
  33. package/dist/src/pins.js +0 -169
  34. package/dist/src/pins.js.map +0 -1
  35. package/dist/src/routing.d.ts +0 -49
  36. package/dist/src/routing.d.ts.map +0 -1
  37. package/dist/src/routing.js +0 -305
  38. package/dist/src/routing.js.map +0 -1
  39. package/dist/src/storage.d.ts +0 -62
  40. package/dist/src/storage.d.ts.map +0 -1
  41. package/dist/src/storage.js +0 -159
  42. package/dist/src/storage.js.map +0 -1
  43. package/dist/src/utils/datastore-version.d.ts +0 -3
  44. package/dist/src/utils/datastore-version.d.ts.map +0 -1
  45. package/dist/src/utils/datastore-version.js +0 -20
  46. package/dist/src/utils/datastore-version.js.map +0 -1
  47. package/dist/src/utils/get-codec.d.ts +0 -3
  48. package/dist/src/utils/get-codec.d.ts.map +0 -1
  49. package/dist/src/utils/get-codec.js +0 -38
  50. package/dist/src/utils/get-codec.js.map +0 -1
  51. package/dist/src/utils/get-hasher.d.ts +0 -3
  52. package/dist/src/utils/get-hasher.d.ts.map +0 -1
  53. package/dist/src/utils/get-hasher.js +0 -32
  54. package/dist/src/utils/get-hasher.js.map +0 -1
  55. package/dist/src/utils/is-promise.d.ts.map +0 -1
  56. package/dist/src/utils/is-promise.js.map +0 -1
  57. package/dist/src/utils/networked-storage.d.ts +0 -27
  58. package/dist/src/utils/networked-storage.d.ts.map +0 -1
  59. package/dist/src/utils/networked-storage.js +0 -52
  60. package/dist/src/utils/networked-storage.js.map +0 -1
  61. package/dist/src/utils/session-storage.d.ts +0 -47
  62. package/dist/src/utils/session-storage.d.ts.map +0 -1
  63. package/dist/src/utils/session-storage.js +0 -148
  64. package/dist/src/utils/session-storage.js.map +0 -1
  65. package/dist/src/utils/storage.d.ts +0 -55
  66. package/dist/src/utils/storage.d.ts.map +0 -1
  67. package/dist/src/utils/storage.js +0 -225
  68. package/dist/src/utils/storage.js.map +0 -1
  69. package/src/pins.ts +0 -247
  70. package/src/routing.ts +0 -376
  71. package/src/storage.ts +0 -194
  72. package/src/utils/datastore-version.ts +0 -25
  73. package/src/utils/get-codec.ts +0 -46
  74. package/src/utils/get-hasher.ts +0 -39
  75. package/src/utils/networked-storage.ts +0 -73
  76. package/src/utils/session-storage.ts +0 -174
  77. package/src/utils/storage.ts +0 -294
  78. /package/dist/src/{utils/is-promise.d.ts → is-promise.d.ts} +0 -0
  79. /package/dist/src/{utils/is-promise.js → is-promise.js} +0 -0
  80. /package/src/{utils/is-promise.ts → is-promise.ts} +0 -0
@@ -1,55 +0,0 @@
1
- import type { HasherLoader } from '@helia/interface';
2
- import type { BlockBroker, Pair, DeleteManyBlocksProgressEvents, DeleteBlockProgressEvents, GetBlockProgressEvents, GetManyBlocksProgressEvents, PutManyBlocksProgressEvents, PutBlockProgressEvents, GetAllBlocksProgressEvents, GetOfflineOptions, BlockRetrievalOptions } from '@helia/interface/blocks';
3
- import type { AbortOptions, ComponentLogger, Logger } from '@libp2p/interface';
4
- import type { Blockstore, InputPair } from 'interface-blockstore';
5
- import type { CID } from 'multiformats/cid';
6
- import type { MultihashHasher } from 'multiformats/hashes/interface';
7
- import type { ProgressEvent, ProgressOptions } from 'progress-events';
8
- export interface StorageComponents<Broker extends BlockBroker<ProgressEvent<any, any>, ProgressEvent<any, any>>> {
9
- blockstore: Blockstore;
10
- logger: ComponentLogger;
11
- blockBrokers: Broker[];
12
- getHasher: HasherLoader;
13
- }
14
- export interface StorageInit {
15
- maxIdentityHashDigestLength?: number;
16
- }
17
- export declare class Storage<Broker extends BlockBroker<ProgressEvent<any, any>, ProgressEvent<any, any>>> implements Blockstore {
18
- protected readonly child: Blockstore;
19
- protected readonly getHasher: HasherLoader;
20
- protected log: Logger;
21
- protected readonly logger: ComponentLogger;
22
- protected readonly blockBrokers: Broker[];
23
- /**
24
- * Create a new BlockStorage
25
- */
26
- constructor(components: StorageComponents<Broker>, init?: StorageInit);
27
- /**
28
- * Put a block to the underlying datastore
29
- */
30
- put(cid: CID, block: Uint8Array, options?: AbortOptions & ProgressOptions<PutBlockProgressEvents>): Promise<CID>;
31
- /**
32
- * Put a multiple blocks to the underlying datastore
33
- */
34
- putMany(blocks: Iterable<InputPair> | AsyncIterable<InputPair>, options?: AbortOptions & ProgressOptions<PutManyBlocksProgressEvents>): AsyncGenerator<CID>;
35
- /**
36
- * Get a block by cid
37
- */
38
- get(cid: CID, options?: GetOfflineOptions & AbortOptions & ProgressOptions<GetBlockProgressEvents>): AsyncGenerator<Uint8Array>;
39
- /**
40
- * Get multiple blocks back from an (async) iterable of cids
41
- */
42
- getMany(cids: Iterable<CID> | AsyncIterable<CID>, options?: GetOfflineOptions & AbortOptions & ProgressOptions<GetManyBlocksProgressEvents>): AsyncGenerator<Pair>;
43
- /**
44
- * Delete a block from the blockstore
45
- */
46
- delete(cid: CID, options?: AbortOptions & ProgressOptions<DeleteBlockProgressEvents>): Promise<void>;
47
- /**
48
- * Delete multiple blocks from the blockstore
49
- */
50
- deleteMany(cids: Iterable<CID> | AsyncIterable<CID>, options?: AbortOptions & ProgressOptions<DeleteManyBlocksProgressEvents>): AsyncGenerator<CID>;
51
- has(cid: CID, options?: AbortOptions): Promise<boolean>;
52
- getAll(options?: AbortOptions & ProgressOptions<GetAllBlocksProgressEvents>): AsyncGenerator<Pair>;
53
- }
54
- export declare const getCidBlockVerifierFunction: (cid: CID, hasher: MultihashHasher) => Required<BlockRetrievalOptions>["validateFn"];
55
- //# sourceMappingURL=storage.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../../../src/utils/storage.ts"],"names":[],"mappings":"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"}
@@ -1,225 +0,0 @@
1
- import { InvalidMultihashError, InvalidParametersError, setMaxListeners } from '@libp2p/interface';
2
- import { anySignal } from 'any-signal';
3
- import { IdentityBlockstore } from 'blockstore-core/identity';
4
- import filter from 'it-filter';
5
- import forEach from 'it-foreach';
6
- import { CustomProgressEvent } from 'progress-events';
7
- import { equals as uint8ArrayEquals } from 'uint8arrays/equals';
8
- import { BlockNotFoundWhileOfflineError, InvalidConfigurationError, LoadBlockFailedError } from "../errors.js";
9
- import { isPromise } from "./is-promise.js";
10
- const DEFAULT_MAX_IDENTITY_HASH_DIGEST_LENGTH = 128;
11
- export class Storage {
12
- child;
13
- getHasher;
14
- log;
15
- logger;
16
- blockBrokers;
17
- /**
18
- * Create a new BlockStorage
19
- */
20
- constructor(components, init = {}) {
21
- this.log = components.logger.forComponent('helia:networked-storage');
22
- this.logger = components.logger;
23
- this.blockBrokers = components.blockBrokers;
24
- this.child = new IdentityBlockstore(components.blockstore, {
25
- maxDigestLength: init.maxIdentityHashDigestLength ?? DEFAULT_MAX_IDENTITY_HASH_DIGEST_LENGTH
26
- });
27
- this.getHasher = components.getHasher;
28
- }
29
- /**
30
- * Put a block to the underlying datastore
31
- */
32
- async put(cid, block, options = {}) {
33
- if (await this.child.has(cid, options)) {
34
- options.onProgress?.(new CustomProgressEvent('blocks:put:duplicate', cid));
35
- return cid;
36
- }
37
- options.onProgress?.(new CustomProgressEvent('blocks:put:providers:notify', cid));
38
- await Promise.all(this.blockBrokers.map(async (broker) => broker.announce?.(cid, options)));
39
- options.onProgress?.(new CustomProgressEvent('blocks:put:blockstore:put', cid));
40
- return this.child.put(cid, block, options);
41
- }
42
- /**
43
- * Put a multiple blocks to the underlying datastore
44
- */
45
- async *putMany(blocks, options = {}) {
46
- const missingBlocks = filter(blocks, async ({ cid }) => {
47
- const has = await this.child.has(cid, options);
48
- if (has) {
49
- options.onProgress?.(new CustomProgressEvent('blocks:put-many:duplicate', cid));
50
- }
51
- return !has;
52
- });
53
- const notifyEach = forEach(missingBlocks, async ({ cid }) => {
54
- options.onProgress?.(new CustomProgressEvent('blocks:put-many:providers:notify', cid));
55
- await Promise.all(this.blockBrokers.map(async (broker) => broker.announce?.(cid, options)));
56
- });
57
- options.onProgress?.(new CustomProgressEvent('blocks:put-many:blockstore:put-many'));
58
- yield* this.child.putMany(notifyEach, options);
59
- }
60
- /**
61
- * Get a block by cid
62
- */
63
- async *get(cid, options = {}) {
64
- const has = await this.child.has(cid, options);
65
- const offline = options.offline === true;
66
- if (!has) {
67
- if (offline) {
68
- throw new BlockNotFoundWhileOfflineError('The block was present in the blockstore and the node is running offline so cannot fetch it');
69
- }
70
- const hasher = await this.getHasher(cid.multihash.code);
71
- options?.signal?.throwIfAborted();
72
- // we do not have the block locally, get it from a block provider
73
- options.onProgress?.(new CustomProgressEvent('blocks:get:providers:get', cid));
74
- const block = await raceBlockRetrievers(cid, this.blockBrokers, hasher, {
75
- ...options,
76
- log: this.log
77
- });
78
- options.onProgress?.(new CustomProgressEvent('blocks:get:blockstore:put', cid));
79
- await this.child.put(cid, block, options);
80
- // notify other block providers of the new block
81
- options.onProgress?.(new CustomProgressEvent('blocks:get:providers:notify', cid));
82
- await Promise.all(this.blockBrokers.map(async (broker) => broker.announce?.(cid, options)));
83
- yield block;
84
- return;
85
- }
86
- options.onProgress?.(new CustomProgressEvent('blocks:get:blockstore:get', cid));
87
- yield* this.child.get(cid, options);
88
- }
89
- /**
90
- * Get multiple blocks back from an (async) iterable of cids
91
- */
92
- async *getMany(cids, options = {}) {
93
- options.onProgress?.(new CustomProgressEvent('blocks:get-many:blockstore:get-many'));
94
- yield* this.child.getMany(forEach(cids, async (cid) => {
95
- const has = await this.child.has(cid, options);
96
- const offline = options.offline === true;
97
- if (!has) {
98
- if (offline) {
99
- throw new BlockNotFoundWhileOfflineError('The block was present in the blockstore and the node is running offline so cannot fetch it');
100
- }
101
- const hasher = await this.getHasher(cid.multihash.code);
102
- options?.signal?.throwIfAborted();
103
- // we do not have the block locally, get it from a block provider
104
- options.onProgress?.(new CustomProgressEvent('blocks:get-many:providers:get', cid));
105
- const block = await raceBlockRetrievers(cid, this.blockBrokers, hasher, {
106
- ...options,
107
- log: this.log
108
- });
109
- options.onProgress?.(new CustomProgressEvent('blocks:get-many:blockstore:put', cid));
110
- await this.child.put(cid, block, options);
111
- // notify other block providers of the new block
112
- options.onProgress?.(new CustomProgressEvent('blocks:get-many:providers:notify', cid));
113
- await Promise.all(this.blockBrokers.map(async (broker) => broker.announce?.(cid, options)));
114
- }
115
- }));
116
- }
117
- /**
118
- * Delete a block from the blockstore
119
- */
120
- async delete(cid, options = {}) {
121
- options.onProgress?.(new CustomProgressEvent('blocks:delete:blockstore:delete', cid));
122
- await this.child.delete(cid, options);
123
- }
124
- /**
125
- * Delete multiple blocks from the blockstore
126
- */
127
- async *deleteMany(cids, options = {}) {
128
- options.onProgress?.(new CustomProgressEvent('blocks:delete-many:blockstore:delete-many'));
129
- yield* this.child.deleteMany((async function* () {
130
- for await (const cid of cids) {
131
- yield cid;
132
- }
133
- }()), options);
134
- }
135
- async has(cid, options = {}) {
136
- return this.child.has(cid, options);
137
- }
138
- async *getAll(options = {}) {
139
- options.onProgress?.(new CustomProgressEvent('blocks:get-all:blockstore:get-many'));
140
- yield* this.child.getAll(options);
141
- }
142
- }
143
- /**
144
- * Race block providers cancelling any pending requests once the block has been
145
- * found.
146
- */
147
- async function raceBlockRetrievers(cid, blockBrokers, hasher, options) {
148
- const validateFn = getCidBlockVerifierFunction(cid, hasher);
149
- const controller = new AbortController();
150
- const signal = anySignal([controller.signal, options.signal]);
151
- setMaxListeners(Infinity, controller.signal, signal);
152
- const retrievers = [];
153
- for (const broker of blockBrokers) {
154
- if (isRetrievingBlockBroker(broker)) {
155
- retrievers.push(broker);
156
- }
157
- }
158
- if (retrievers.length === 0) {
159
- throw new InvalidConfigurationError(`No block brokers capable of retrieving blocks are configured, the CID ${cid} cannot be fetched from the network`);
160
- }
161
- try {
162
- return await Promise.any(retrievers
163
- .map(async (retriever) => {
164
- try {
165
- let blocksWereValidated = false;
166
- const block = await retriever.retrieve(cid, {
167
- ...options,
168
- signal,
169
- validateFn: async (block) => {
170
- await validateFn(block);
171
- options.signal?.throwIfAborted();
172
- blocksWereValidated = true;
173
- }
174
- });
175
- if (!blocksWereValidated) {
176
- // the blockBroker either did not throw an error when attempting to validate the block
177
- // or did not call the validateFn at all. We should validate the block ourselves
178
- await validateFn(block);
179
- options.signal?.throwIfAborted();
180
- }
181
- return block;
182
- }
183
- catch (err) {
184
- options.log.error('could not retrieve verified block for %c from %s - %e', cid, retriever.name, err);
185
- throw err;
186
- }
187
- }));
188
- }
189
- catch (err) {
190
- throw new LoadBlockFailedError(err.errors, `Failed to load block for ${cid}`);
191
- }
192
- finally {
193
- // we have the block from the fastest block retriever, abort any still
194
- // in-flight retrieve attempts
195
- controller.abort();
196
- signal.clear();
197
- }
198
- }
199
- function isRetrievingBlockBroker(broker) {
200
- return typeof broker.retrieve === 'function';
201
- }
202
- export const getCidBlockVerifierFunction = (cid, hasher) => {
203
- if (hasher == null) {
204
- throw new InvalidParametersError(`No hasher configured for multihash code 0x${cid.multihash.code.toString(16)}, please configure one. You can look up which hash this is at https://github.com/multiformats/multicodec/blob/master/table.csv`);
205
- }
206
- return async (block) => {
207
- // verify block
208
- let hash;
209
- const res = hasher.digest(block, {
210
- // support truncated hashes where they are truncated
211
- truncate: cid.multihash.digest.byteLength
212
- });
213
- if (isPromise(res)) {
214
- hash = await res;
215
- }
216
- else {
217
- hash = res;
218
- }
219
- if (!uint8ArrayEquals(hash.digest, cid.multihash.digest)) {
220
- // if a hash mismatch occurs for a TrustlessGatewayBlockBroker, we should try another gateway
221
- throw new InvalidMultihashError('Hash of downloaded block did not match multihash from passed CID');
222
- }
223
- };
224
- };
225
- //# sourceMappingURL=storage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../../src/utils/storage.ts"],"names":[],"mappings":"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"}
package/src/pins.ts DELETED
@@ -1,247 +0,0 @@
1
- import { InvalidParametersError } from '@libp2p/interface'
2
- import { Queue } from '@libp2p/utils'
3
- import * as cborg from 'cborg'
4
- import { Key } from 'interface-datastore'
5
- import toBuffer from 'it-to-buffer'
6
- import { base36 } from 'multiformats/bases/base36'
7
- import { createUnsafe } from 'multiformats/block'
8
- import { CID } from 'multiformats/cid'
9
- import { CustomProgressEvent } from 'progress-events'
10
- import { equals as uint8ArrayEquals } from 'uint8arrays/equals'
11
- import { AlreadyPinnedError } from './errors.ts'
12
- import type { CodecLoader } from '@helia/interface'
13
- import type { GetBlockProgressEvents } from '@helia/interface/blocks'
14
- import type { AddOptions, AddPinEvents, IsPinnedOptions, LsOptions, Pin, Pins, RmOptions } from '@helia/interface/pins'
15
- import type { AbortOptions } from '@libp2p/interface'
16
- import type { Blockstore } from 'interface-blockstore'
17
- import type { Datastore } from 'interface-datastore'
18
- import type { Version } from 'multiformats/cid'
19
- import type { ProgressOptions } from 'progress-events'
20
-
21
- interface DatastorePin {
22
- /**
23
- * 0 for a direct pin or an arbitrary (+ve, whole) number or Infinity
24
- */
25
- depth: number
26
-
27
- /**
28
- * User-specific metadata for the pin
29
- */
30
- metadata: Record<string, string | number | boolean>
31
- }
32
-
33
- interface DatastorePinnedBlock {
34
- pinCount: number
35
- pinnedBy: Uint8Array[]
36
- }
37
-
38
- /**
39
- * Callback for updating a {@link DatastorePinnedBlock}'s properties when
40
- * calling `#updatePinnedBlock`
41
- *
42
- * The callback should return `false` to prevent any pinning modifications to
43
- * the block, and true in all other cases.
44
- */
45
- interface WithPinnedBlockCallback {
46
- (pinnedBlock: DatastorePinnedBlock): boolean
47
- }
48
-
49
- const DATASTORE_PIN_PREFIX = '/pin/'
50
- const DATASTORE_BLOCK_PREFIX = '/pinned-block/'
51
- const DATASTORE_ENCODING = base36
52
- const DAG_WALK_QUEUE_CONCURRENCY = 1
53
-
54
- interface WalkDagOptions extends AbortOptions, ProgressOptions<GetBlockProgressEvents | AddPinEvents> {
55
- depth: number
56
- }
57
-
58
- function toDSKey (cid: CID): Key {
59
- if (cid.version === 0) {
60
- cid = cid.toV1()
61
- }
62
-
63
- return new Key(`${DATASTORE_PIN_PREFIX}${cid.toString(DATASTORE_ENCODING)}`)
64
- }
65
-
66
- export class PinsImpl implements Pins {
67
- private readonly datastore: Datastore
68
- private readonly blockstore: Blockstore
69
- private readonly getCodec: CodecLoader
70
-
71
- constructor (datastore: Datastore, blockstore: Blockstore, getCodec: CodecLoader) {
72
- this.datastore = datastore
73
- this.blockstore = blockstore
74
- this.getCodec = getCodec
75
- }
76
-
77
- async * add (cid: CID<unknown, number, number, Version>, options: AddOptions = {}): AsyncGenerator<CID, void, undefined> {
78
- const pinKey = toDSKey(cid)
79
-
80
- if (await this.datastore.has(pinKey)) {
81
- throw new AlreadyPinnedError('Already pinned')
82
- }
83
-
84
- const depth = Math.round(options.depth ?? Infinity)
85
-
86
- if (depth < 0) {
87
- throw new InvalidParametersError('Depth must be greater than or equal to 0')
88
- }
89
-
90
- // use a queue to walk the DAG instead of recursion so we can traverse very large DAGs
91
- const queue = new Queue<AsyncGenerator<CID>>({
92
- concurrency: DAG_WALK_QUEUE_CONCURRENCY
93
- })
94
-
95
- for await (const childCid of this.#walkDag(cid, queue, {
96
- ...options,
97
- depth
98
- })) {
99
- await this.#updatePinnedBlock(childCid, (pinnedBlock: DatastorePinnedBlock) => {
100
- // do not update pinned block if this block is already pinned by this CID
101
- if (pinnedBlock.pinnedBy.find(c => uint8ArrayEquals(c, cid.bytes)) != null) {
102
- return false
103
- }
104
-
105
- pinnedBlock.pinCount++
106
- pinnedBlock.pinnedBy.push(cid.bytes)
107
- return true
108
- }, options)
109
-
110
- yield childCid
111
- }
112
-
113
- const pin: DatastorePin = {
114
- depth,
115
- metadata: options.metadata ?? {}
116
- }
117
-
118
- await this.datastore.put(pinKey, cborg.encode(pin), options)
119
- }
120
-
121
- /**
122
- * Walk a DAG in an iterable fashion
123
- */
124
- async * #walkDag (cid: CID, queue: Queue<AsyncGenerator<CID>>, options: WalkDagOptions): AsyncGenerator<CID> {
125
- if (options.depth === -1) {
126
- return
127
- }
128
-
129
- const codec = await this.getCodec(cid.code)
130
- const bytes = await toBuffer(this.blockstore.get(cid, options))
131
- const block = createUnsafe({ bytes, cid, codec })
132
-
133
- yield cid
134
-
135
- // walk dag, ensure all blocks are present
136
- for (const [,cid] of block.links()) {
137
- yield * await queue.add(async () => {
138
- return this.#walkDag(cid, queue, {
139
- ...options,
140
- depth: options.depth - 1
141
- })
142
- })
143
- }
144
- }
145
-
146
- /**
147
- * Update the pin count for the CID
148
- */
149
- async #updatePinnedBlock (cid: CID, withPinnedBlock: WithPinnedBlockCallback, options: AddOptions): Promise<void> {
150
- const blockKey = new Key(`${DATASTORE_BLOCK_PREFIX}${DATASTORE_ENCODING.encode(cid.multihash.bytes)}`)
151
-
152
- let pinnedBlock: DatastorePinnedBlock = {
153
- pinCount: 0,
154
- pinnedBy: []
155
- }
156
-
157
- try {
158
- pinnedBlock = cborg.decode(await this.datastore.get(blockKey, options))
159
- } catch (err: any) {
160
- if (err.name !== 'NotFoundError') {
161
- throw err
162
- }
163
- }
164
-
165
- const shouldContinue = withPinnedBlock(pinnedBlock)
166
-
167
- if (!shouldContinue) {
168
- return
169
- }
170
-
171
- if (pinnedBlock.pinCount === 0) {
172
- if (await this.datastore.has(blockKey)) {
173
- await this.datastore.delete(blockKey)
174
- return
175
- }
176
- }
177
-
178
- await this.datastore.put(blockKey, cborg.encode(pinnedBlock), options)
179
- options.onProgress?.(new CustomProgressEvent<CID>('helia:pin:add', cid))
180
- }
181
-
182
- async * rm (cid: CID<unknown, number, number, Version>, options: RmOptions = {}): AsyncGenerator<CID, void, undefined> {
183
- const pinKey = toDSKey(cid)
184
- const buf = await this.datastore.get(pinKey, options)
185
- const pin = cborg.decode(buf)
186
-
187
- await this.datastore.delete(pinKey, options)
188
-
189
- // use a queue to walk the DAG instead of recursion so we can traverse very large DAGs
190
- const queue = new Queue<AsyncGenerator<CID>>({
191
- concurrency: DAG_WALK_QUEUE_CONCURRENCY
192
- })
193
-
194
- for await (const childCid of this.#walkDag(cid, queue, {
195
- ...options,
196
- depth: pin.depth
197
- })) {
198
- await this.#updatePinnedBlock(childCid, (pinnedBlock): boolean => {
199
- pinnedBlock.pinCount--
200
- pinnedBlock.pinnedBy = pinnedBlock.pinnedBy.filter(c => uint8ArrayEquals(c, cid.bytes))
201
- return true
202
- }, {
203
- ...options,
204
- depth: pin.depth
205
- })
206
-
207
- yield childCid
208
- }
209
- }
210
-
211
- async * ls (options: LsOptions = {}): AsyncGenerator<Pin, void, undefined> {
212
- for await (const { key, value } of this.datastore.query({
213
- prefix: DATASTORE_PIN_PREFIX + (options.cid != null ? `${options.cid.toString(base36)}` : '')
214
- }, options)) {
215
- const cid = CID.parse(key.toString().substring(5), base36)
216
- const pin = cborg.decode(value)
217
-
218
- yield {
219
- cid,
220
- ...pin
221
- }
222
- }
223
- }
224
-
225
- async isPinned (cid: CID, options: IsPinnedOptions = {}): Promise<boolean> {
226
- const blockKey = new Key(`${DATASTORE_BLOCK_PREFIX}${DATASTORE_ENCODING.encode(cid.multihash.bytes)}`)
227
-
228
- return this.datastore.has(blockKey, options)
229
- }
230
-
231
- async get (cid: CID, options?: AbortOptions): Promise<Pin> {
232
- const pinKey = toDSKey(cid)
233
- const buf = await this.datastore.get(pinKey, options)
234
-
235
- return cborg.decode(buf)
236
- }
237
-
238
- async setMetadata (cid: CID, metadata: Record<string, string | number | boolean> | undefined, options?: AbortOptions): Promise<void> {
239
- const pinKey = toDSKey(cid)
240
- const buf = await this.datastore.get(pinKey, options)
241
- const pin: DatastorePin = cborg.decode(buf)
242
-
243
- pin.metadata = metadata ?? {}
244
-
245
- await this.datastore.put(pinKey, cborg.encode(pin), options)
246
- }
247
- }