@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.
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +4 -4
- package/dist/src/abstract-session.d.ts +3 -3
- package/dist/src/abstract-session.d.ts.map +1 -1
- package/dist/src/abstract-session.js.map +1 -1
- package/dist/src/errors.d.ts +4 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +4 -0
- package/dist/src/errors.js.map +1 -1
- package/dist/src/graph-walker.d.ts +3 -21
- package/dist/src/graph-walker.d.ts.map +1 -1
- package/dist/src/graph-walker.js +20 -17
- package/dist/src/graph-walker.js.map +1 -1
- package/dist/src/index.d.ts +5 -168
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -130
- package/dist/src/index.js.map +1 -1
- package/dist/src/is-cid.d.ts +3 -0
- package/dist/src/is-cid.d.ts.map +1 -0
- package/dist/src/is-cid.js +8 -0
- package/dist/src/is-cid.js.map +1 -0
- package/dist/src/is-promise.d.ts.map +1 -0
- package/dist/src/is-promise.js.map +1 -0
- package/dist/typedoc-urls.json +20 -0
- package/package.json +16 -34
- package/src/abstract-session.ts +4 -4
- package/src/errors.ts +5 -0
- package/src/graph-walker.ts +30 -43
- package/src/index.ts +5 -333
- package/src/is-cid.ts +9 -0
- package/dist/src/pins.d.ts +0 -21
- package/dist/src/pins.d.ts.map +0 -1
- package/dist/src/pins.js +0 -169
- package/dist/src/pins.js.map +0 -1
- package/dist/src/routing.d.ts +0 -49
- package/dist/src/routing.d.ts.map +0 -1
- package/dist/src/routing.js +0 -305
- package/dist/src/routing.js.map +0 -1
- package/dist/src/storage.d.ts +0 -62
- package/dist/src/storage.d.ts.map +0 -1
- package/dist/src/storage.js +0 -159
- package/dist/src/storage.js.map +0 -1
- package/dist/src/utils/datastore-version.d.ts +0 -3
- package/dist/src/utils/datastore-version.d.ts.map +0 -1
- package/dist/src/utils/datastore-version.js +0 -20
- package/dist/src/utils/datastore-version.js.map +0 -1
- package/dist/src/utils/get-codec.d.ts +0 -3
- package/dist/src/utils/get-codec.d.ts.map +0 -1
- package/dist/src/utils/get-codec.js +0 -38
- package/dist/src/utils/get-codec.js.map +0 -1
- package/dist/src/utils/get-hasher.d.ts +0 -3
- package/dist/src/utils/get-hasher.d.ts.map +0 -1
- package/dist/src/utils/get-hasher.js +0 -32
- package/dist/src/utils/get-hasher.js.map +0 -1
- package/dist/src/utils/is-promise.d.ts.map +0 -1
- package/dist/src/utils/is-promise.js.map +0 -1
- package/dist/src/utils/networked-storage.d.ts +0 -27
- package/dist/src/utils/networked-storage.d.ts.map +0 -1
- package/dist/src/utils/networked-storage.js +0 -52
- package/dist/src/utils/networked-storage.js.map +0 -1
- package/dist/src/utils/session-storage.d.ts +0 -47
- package/dist/src/utils/session-storage.d.ts.map +0 -1
- package/dist/src/utils/session-storage.js +0 -148
- package/dist/src/utils/session-storage.js.map +0 -1
- package/dist/src/utils/storage.d.ts +0 -55
- package/dist/src/utils/storage.d.ts.map +0 -1
- package/dist/src/utils/storage.js +0 -225
- package/dist/src/utils/storage.js.map +0 -1
- package/src/pins.ts +0 -247
- package/src/routing.ts +0 -376
- package/src/storage.ts +0 -194
- package/src/utils/datastore-version.ts +0 -25
- package/src/utils/get-codec.ts +0 -46
- package/src/utils/get-hasher.ts +0 -39
- package/src/utils/networked-storage.ts +0 -73
- package/src/utils/session-storage.ts +0 -174
- package/src/utils/storage.ts +0 -294
- /package/dist/src/{utils/is-promise.d.ts → is-promise.d.ts} +0 -0
- /package/dist/src/{utils/is-promise.js → is-promise.js} +0 -0
- /package/src/{utils/is-promise.ts → is-promise.ts} +0 -0
package/dist/src/storage.js
DELETED
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import { start, stop } from '@libp2p/interface';
|
|
2
|
-
import createMortice from 'mortice';
|
|
3
|
-
import { BlockPinnedError } from "./errors.js";
|
|
4
|
-
/**
|
|
5
|
-
* BlockStorage is a hybrid blockstore that puts/gets blocks from a configured
|
|
6
|
-
* blockstore (that may be on disk, s3, or something else). If the blocks are
|
|
7
|
-
* not present Bitswap will be used to fetch them from network peers.
|
|
8
|
-
*/
|
|
9
|
-
export class BlockStorage {
|
|
10
|
-
lock;
|
|
11
|
-
child;
|
|
12
|
-
pins;
|
|
13
|
-
routing;
|
|
14
|
-
started;
|
|
15
|
-
/**
|
|
16
|
-
* Create a new BlockStorage
|
|
17
|
-
*/
|
|
18
|
-
constructor(blockstore, pins, routing, options = {}) {
|
|
19
|
-
this.child = blockstore;
|
|
20
|
-
this.pins = pins;
|
|
21
|
-
this.routing = routing;
|
|
22
|
-
this.lock = createMortice({
|
|
23
|
-
singleProcess: options.holdGcLock
|
|
24
|
-
});
|
|
25
|
-
this.started = false;
|
|
26
|
-
}
|
|
27
|
-
isStarted() {
|
|
28
|
-
return this.started;
|
|
29
|
-
}
|
|
30
|
-
async start() {
|
|
31
|
-
await start(this.child);
|
|
32
|
-
this.started = true;
|
|
33
|
-
}
|
|
34
|
-
async stop() {
|
|
35
|
-
await stop(this.child);
|
|
36
|
-
this.started = false;
|
|
37
|
-
}
|
|
38
|
-
unwrap() {
|
|
39
|
-
return this.child;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Put a block to the underlying datastore
|
|
43
|
-
*/
|
|
44
|
-
async put(cid, block, options = {}) {
|
|
45
|
-
options?.signal?.throwIfAborted();
|
|
46
|
-
const releaseLock = await this.lock.readLock();
|
|
47
|
-
try {
|
|
48
|
-
return await this.child.put(cid, block, options);
|
|
49
|
-
}
|
|
50
|
-
finally {
|
|
51
|
-
releaseLock();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Put a multiple blocks to the underlying datastore
|
|
56
|
-
*/
|
|
57
|
-
async *putMany(blocks, options = {}) {
|
|
58
|
-
options?.signal?.throwIfAborted();
|
|
59
|
-
const releaseLock = await this.lock.readLock();
|
|
60
|
-
try {
|
|
61
|
-
yield* this.child.putMany(blocks, options);
|
|
62
|
-
}
|
|
63
|
-
finally {
|
|
64
|
-
releaseLock();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Get a block by cid
|
|
69
|
-
*/
|
|
70
|
-
async *get(cid, options = {}) {
|
|
71
|
-
options?.signal?.throwIfAborted();
|
|
72
|
-
const releaseLock = await this.lock.readLock();
|
|
73
|
-
try {
|
|
74
|
-
yield* this.child.get(cid, options);
|
|
75
|
-
}
|
|
76
|
-
finally {
|
|
77
|
-
releaseLock();
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Get multiple blocks back from an (async) iterable of cids
|
|
82
|
-
*/
|
|
83
|
-
async *getMany(cids, options = {}) {
|
|
84
|
-
options?.signal?.throwIfAborted();
|
|
85
|
-
const releaseLock = await this.lock.readLock();
|
|
86
|
-
try {
|
|
87
|
-
yield* this.child.getMany(cids, options);
|
|
88
|
-
}
|
|
89
|
-
finally {
|
|
90
|
-
releaseLock();
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Delete a block from the blockstore
|
|
95
|
-
*/
|
|
96
|
-
async delete(cid, options = {}) {
|
|
97
|
-
options?.signal?.throwIfAborted();
|
|
98
|
-
const releaseLock = await this.lock.writeLock();
|
|
99
|
-
try {
|
|
100
|
-
if (await this.pins.isPinned(cid)) {
|
|
101
|
-
throw new BlockPinnedError('Block was pinned - please unpin and try again');
|
|
102
|
-
}
|
|
103
|
-
// stop re-providing this CID if necessary
|
|
104
|
-
await this.routing.cancelReprovide(cid, options);
|
|
105
|
-
await this.child.delete(cid, options);
|
|
106
|
-
}
|
|
107
|
-
finally {
|
|
108
|
-
releaseLock();
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* Delete multiple blocks from the blockstore
|
|
113
|
-
*/
|
|
114
|
-
async *deleteMany(cids, options = {}) {
|
|
115
|
-
options?.signal?.throwIfAborted();
|
|
116
|
-
const releaseLock = await this.lock.writeLock();
|
|
117
|
-
try {
|
|
118
|
-
const storage = this;
|
|
119
|
-
yield* this.child.deleteMany((async function* () {
|
|
120
|
-
for await (const cid of cids) {
|
|
121
|
-
if (await storage.pins.isPinned(cid)) {
|
|
122
|
-
throw new BlockPinnedError('Block was pinned - please unpin and try again');
|
|
123
|
-
}
|
|
124
|
-
// stop re-providing this CID if necessary
|
|
125
|
-
await storage.routing.cancelReprovide(cid, options);
|
|
126
|
-
yield cid;
|
|
127
|
-
}
|
|
128
|
-
}()), options);
|
|
129
|
-
}
|
|
130
|
-
finally {
|
|
131
|
-
releaseLock();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
async has(cid, options = {}) {
|
|
135
|
-
options?.signal?.throwIfAborted();
|
|
136
|
-
const releaseLock = await this.lock.readLock();
|
|
137
|
-
try {
|
|
138
|
-
return await this.child.has(cid, options);
|
|
139
|
-
}
|
|
140
|
-
finally {
|
|
141
|
-
releaseLock();
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
async *getAll(options = {}) {
|
|
145
|
-
options?.signal?.throwIfAborted();
|
|
146
|
-
const releaseLock = await this.lock.readLock();
|
|
147
|
-
try {
|
|
148
|
-
yield* this.child.getAll(options);
|
|
149
|
-
}
|
|
150
|
-
finally {
|
|
151
|
-
releaseLock();
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
createSession(root, options) {
|
|
155
|
-
options?.signal?.throwIfAborted();
|
|
156
|
-
return this.child.createSession(root, options);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
//# sourceMappingURL=storage.js.map
|
package/dist/src/storage.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,aAAa,MAAM,SAAS,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAkB9C;;;;GAIG;AACH,MAAM,OAAO,YAAY;IAChB,IAAI,CAAS;IACH,KAAK,CAAQ;IACb,IAAI,CAAM;IACV,OAAO,CAAS;IACzB,OAAO,CAAS;IAExB;;OAEG;IACH,YAAa,UAAkB,EAAE,IAAU,EAAE,OAAgB,EAAE,UAA4B,EAAE;QAC3F,IAAI,CAAC,KAAK,GAAG,UAAU,CAAA;QACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAA;QACtB,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;YACxB,aAAa,EAAE,OAAO,CAAC,UAAU;SAClC,CAAC,CAAA;QACF,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAE,GAAQ,EAAE,KAAiB,EAAE,UAAkE,EAAE;QAC1G,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;QAE9C,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;QAClD,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAE,OAAO,CAAE,MAAsD,EAAE,UAAuE,EAAE;QAChJ,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;QAE9C,IAAI,CAAC;YACH,KAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC7C,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAE,GAAG,CAAE,GAAQ,EAAE,UAAsF,EAAE;QAC7G,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;QAE9C,IAAI,CAAC;YACH,KAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QACtC,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAE,OAAO,CAAE,IAAwC,EAAE,UAA2F,EAAE;QACtJ,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;QAE9C,IAAI,CAAC;YACH,KAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QAC3C,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAE,GAAQ,EAAE,UAAqE,EAAE;QAC7F,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;QAE/C,IAAI,CAAC;YACH,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,gBAAgB,CAAC,+CAA+C,CAAC,CAAA;YAC7E,CAAC;YAED,0CAA0C;YAC1C,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;YAEhD,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QACvC,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAE,UAAU,CAAE,IAAwC,EAAE,UAA0E,EAAE;QACxI,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;QAE/C,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAA;YAEpB,KAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,SAAU,CAAC;gBAC7C,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;oBAC7B,IAAI,MAAM,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;wBACrC,MAAM,IAAI,gBAAgB,CAAC,+CAA+C,CAAC,CAAA;oBAC7E,CAAC;oBAED,0CAA0C;oBAC1C,MAAM,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;oBAEnD,MAAM,GAAG,CAAA;gBACX,CAAC;YACH,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAA;QAChB,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAE,GAAQ,EAAE,UAAwB,EAAE;QAC7C,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;QAE9C,IAAI,CAAC;YACH,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAC3C,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED,KAAK,CAAC,CAAE,MAAM,CAAE,UAAsE,EAAE;QACtF,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAA;QAE9C,IAAI,CAAC;YACH,KAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACpC,CAAC;gBAAS,CAAC;YACT,WAAW,EAAE,CAAA;QACf,CAAC;IACH,CAAC;IAED,aAAa,CAAE,IAAS,EAAE,OAAsB;QAC9C,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;QACjC,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAChD,CAAC;CACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"datastore-version.d.ts","sourceRoot":"","sources":["../../../src/utils/datastore-version.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAKpD,wBAAsB,+BAA+B,CAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAe1F"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { Key } from 'interface-datastore';
|
|
2
|
-
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
3
|
-
import { toString as uint8ArrayToString } from 'uint8arrays/to-string';
|
|
4
|
-
import { InvalidDatastoreVersionError } from "../errors.js";
|
|
5
|
-
const DS_VERSION_KEY = new Key('/version');
|
|
6
|
-
const CURRENT_VERSION = 1;
|
|
7
|
-
export async function assertDatastoreVersionIsCurrent(datastore) {
|
|
8
|
-
if (!(await datastore.has(DS_VERSION_KEY))) {
|
|
9
|
-
await datastore.put(DS_VERSION_KEY, uint8ArrayFromString(`${CURRENT_VERSION}`));
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
const buf = await datastore.get(DS_VERSION_KEY);
|
|
13
|
-
const str = uint8ArrayToString(buf);
|
|
14
|
-
const version = parseInt(str, 10);
|
|
15
|
-
if (version !== CURRENT_VERSION) {
|
|
16
|
-
// TODO: write migrations when we break compatibility - for an example, see https://github.com/ipfs/js-ipfs-repo/tree/master/packages/ipfs-repo-migrations
|
|
17
|
-
throw new InvalidDatastoreVersionError('Invalid datastore version, a datastore migration may be required');
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=datastore-version.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"datastore-version.js","sourceRoot":"","sources":["../../../src/utils/datastore-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAA;AACzC,OAAO,EAAE,UAAU,IAAI,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAC5E,OAAO,EAAE,QAAQ,IAAI,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAA;AAG3D,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAA;AAC1C,MAAM,eAAe,GAAG,CAAC,CAAA;AAEzB,MAAM,CAAC,KAAK,UAAU,+BAA+B,CAAE,SAAoB;IACzE,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC;QAC3C,MAAM,SAAS,CAAC,GAAG,CAAC,cAAc,EAAE,oBAAoB,CAAC,GAAG,eAAe,EAAE,CAAC,CAAC,CAAA;QAE/E,OAAM;IACR,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC/C,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAA;IACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAEjC,IAAI,OAAO,KAAK,eAAe,EAAE,CAAC;QAChC,0JAA0J;QAC1J,MAAM,IAAI,4BAA4B,CAAC,kEAAkE,CAAC,CAAA;IAC5G,CAAC;AACH,CAAC"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import type { BlockCodec } from 'multiformats/codecs/interface';
|
|
2
|
-
export declare function getCodec<T = any, Code extends number = any>(initialCodecs?: Array<BlockCodec<any, any>>, loadCodec?: (code: number) => BlockCodec<any, any> | Promise<BlockCodec<any, any>>): (code: Code) => BlockCodec<Code, T> | Promise<BlockCodec<Code, T>>;
|
|
3
|
-
//# sourceMappingURL=get-codec.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-codec.d.ts","sourceRoot":"","sources":["../../../src/utils/get-codec.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAE/D,wBAAgB,QAAQ,CAAE,CAAC,GAAG,GAAG,EAAE,IAAI,SAAS,MAAM,GAAG,GAAG,EAAG,aAAa,GAAE,KAAK,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAM,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAkCtQ"}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/* eslint max-depth: ["error", 7] */
|
|
2
|
-
import { UnknownCodecError } from '@helia/interface';
|
|
3
|
-
import * as dagCbor from '@ipld/dag-cbor';
|
|
4
|
-
import * as dagJson from '@ipld/dag-json';
|
|
5
|
-
import * as dagPb from '@ipld/dag-pb';
|
|
6
|
-
import * as json from 'multiformats/codecs/json';
|
|
7
|
-
import * as raw from 'multiformats/codecs/raw';
|
|
8
|
-
import { isPromise } from "./is-promise.js";
|
|
9
|
-
export function getCodec(initialCodecs = [], loadCodec) {
|
|
10
|
-
const codecs = {
|
|
11
|
-
[dagPb.code]: dagPb,
|
|
12
|
-
[raw.code]: raw,
|
|
13
|
-
[dagCbor.code]: dagCbor,
|
|
14
|
-
[dagJson.code]: dagJson,
|
|
15
|
-
[json.code]: json
|
|
16
|
-
};
|
|
17
|
-
initialCodecs.forEach(codec => {
|
|
18
|
-
codecs[codec.code] = codec;
|
|
19
|
-
});
|
|
20
|
-
return async (code) => {
|
|
21
|
-
let codec = codecs[code];
|
|
22
|
-
if (codec == null && loadCodec != null) {
|
|
23
|
-
const res = loadCodec(code);
|
|
24
|
-
if (isPromise(res)) {
|
|
25
|
-
codec = await res;
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
codec = res;
|
|
29
|
-
}
|
|
30
|
-
codecs[codec.code] = codec;
|
|
31
|
-
}
|
|
32
|
-
if (codec != null) {
|
|
33
|
-
return codec;
|
|
34
|
-
}
|
|
35
|
-
throw new UnknownCodecError(`Could not load codec for ${code}`);
|
|
36
|
-
};
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=get-codec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-codec.js","sourceRoot":"","sources":["../../../src/utils/get-codec.ts"],"names":[],"mappings":"AAAA,oCAAoC;AAEpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AACzC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,IAAI,MAAM,0BAA0B,CAAA;AAChD,OAAO,KAAK,GAAG,MAAM,yBAAyB,CAAA;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,MAAM,UAAU,QAAQ,CAAuC,gBAA6C,EAAE,EAAE,SAAkF;IAChM,MAAM,MAAM,GAAyC;QACnD,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK;QACnB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG;QACf,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO;QACvB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO;QACvB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI;KAClB,CAAA;IAED,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QAC5B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;IAC5B,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE;QACpB,IAAI,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAA;QAExB,IAAI,KAAK,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;YAE3B,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,KAAK,GAAG,MAAM,GAAG,CAAA;YACnB,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,GAAG,CAAA;YACb,CAAC;YAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAA;QAC5B,CAAC;QAED,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,IAAI,iBAAiB,CAAC,4BAA4B,IAAI,EAAE,CAAC,CAAA;IACjE,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import type { MultihashHasher } from 'multiformats/hashes/interface';
|
|
2
|
-
export declare function getHasher(initialHashers?: MultihashHasher[], loadHasher?: (code: number) => MultihashHasher | Promise<MultihashHasher>): (code: number) => MultihashHasher | Promise<MultihashHasher>;
|
|
3
|
-
//# sourceMappingURL=get-hasher.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-hasher.d.ts","sourceRoot":"","sources":["../../../src/utils/get-hasher.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE,wBAAgB,SAAS,CAAE,cAAc,GAAE,eAAe,EAAO,EAAE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC,CAgC1M"}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { UnknownHashAlgorithmError } from '@helia/interface';
|
|
2
|
-
import { identity } from 'multiformats/hashes/identity';
|
|
3
|
-
import { sha256, sha512 } from 'multiformats/hashes/sha2';
|
|
4
|
-
import { isPromise } from "./is-promise.js";
|
|
5
|
-
export function getHasher(initialHashers = [], loadHasher) {
|
|
6
|
-
const hashers = {
|
|
7
|
-
[sha256.code]: sha256,
|
|
8
|
-
[sha512.code]: sha512,
|
|
9
|
-
[identity.code]: identity
|
|
10
|
-
};
|
|
11
|
-
initialHashers.forEach(hasher => {
|
|
12
|
-
hashers[hasher.code] = hasher;
|
|
13
|
-
});
|
|
14
|
-
return async (code) => {
|
|
15
|
-
let hasher = hashers[code];
|
|
16
|
-
if (hasher == null && loadHasher != null) {
|
|
17
|
-
const res = loadHasher(code);
|
|
18
|
-
if (isPromise(res)) {
|
|
19
|
-
hasher = await res;
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
hasher = res;
|
|
23
|
-
}
|
|
24
|
-
hashers[hasher.code] = hasher;
|
|
25
|
-
}
|
|
26
|
-
if (hasher != null) {
|
|
27
|
-
return hasher;
|
|
28
|
-
}
|
|
29
|
-
throw new UnknownHashAlgorithmError(`No hasher configured for multihash code 0x${code.toString(16)}, please configure one. You can look up which hash this is at https://github.com/multiformats/multicodec/blob/master/table.csv`);
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
//# sourceMappingURL=get-hasher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"get-hasher.js","sourceRoot":"","sources":["../../../src/utils/get-hasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAG3C,MAAM,UAAU,SAAS,CAAE,iBAAoC,EAAE,EAAE,UAAyE;IAC1I,MAAM,OAAO,GAAoC;QAC/C,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM;QACrB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM;QACrB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ;KAC1B,CAAA;IAED,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;QAC9B,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAA;IAC/B,CAAC,CAAC,CAAA;IAEF,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE;QACpB,IAAI,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QAE1B,IAAI,MAAM,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;YACzC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;YAE5B,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnB,MAAM,GAAG,MAAM,GAAG,CAAA;YACpB,CAAC;iBAAM,CAAC;gBACN,MAAM,GAAG,GAAG,CAAA;YACd,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAA;QAC/B,CAAC;QAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO,MAAM,CAAA;QACf,CAAC;QAED,MAAM,IAAI,yBAAyB,CAAC,6CAA6C,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,gIAAgI,CAAC,CAAA;IACrO,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"is-promise.d.ts","sourceRoot":"","sources":["../../../src/utils/is-promise.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAE,CAAC,EAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAEvD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"is-promise.js","sourceRoot":"","sources":["../../../src/utils/is-promise.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAM,CAAO;IACpC,OAAO,CAAC,EAAE,IAAI,IAAI,IAAI,CAAA;AACxB,CAAC"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Storage } from './storage.ts';
|
|
2
|
-
import type { StorageComponents, StorageInit } from './storage.ts';
|
|
3
|
-
import type { BlockBroker, Blocks, CreateSessionOptions, SessionBlockstore } from '@helia/interface/blocks';
|
|
4
|
-
import type { AbortOptions, Startable } from '@libp2p/interface';
|
|
5
|
-
import type { Blockstore } from 'interface-blockstore';
|
|
6
|
-
import type { CID } from 'multiformats/cid';
|
|
7
|
-
export interface GetOptions extends AbortOptions {
|
|
8
|
-
progress?(evt: Event): void;
|
|
9
|
-
}
|
|
10
|
-
export type NetworkedStorageComponents = StorageComponents<BlockBroker>;
|
|
11
|
-
/**
|
|
12
|
-
* Networked storage wraps a regular blockstore - when getting blocks if the
|
|
13
|
-
* blocks are not present, the configured BlockBrokers will be used to fetch them.
|
|
14
|
-
*/
|
|
15
|
-
export declare class NetworkedStorage extends Storage<BlockBroker> implements Blocks, Startable {
|
|
16
|
-
private started;
|
|
17
|
-
/**
|
|
18
|
-
* Create a new BlockStorage
|
|
19
|
-
*/
|
|
20
|
-
constructor(components: NetworkedStorageComponents, init?: StorageInit);
|
|
21
|
-
isStarted(): boolean;
|
|
22
|
-
start(): Promise<void>;
|
|
23
|
-
stop(): Promise<void>;
|
|
24
|
-
unwrap(): Blockstore;
|
|
25
|
-
createSession(root: CID, options?: CreateSessionOptions): SessionBlockstore;
|
|
26
|
-
}
|
|
27
|
-
//# sourceMappingURL=networked-storage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"networked-storage.d.ts","sourceRoot":"","sources":["../../../src/utils/networked-storage.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3G,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,MAAM,WAAW,UAAW,SAAQ,YAAY;IAC9C,QAAQ,CAAC,CAAC,GAAG,EAAE,KAAK,GAAG,IAAI,CAAA;CAC5B;AAED,MAAM,MAAM,0BAA0B,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAA;AAEvE;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,OAAO,CAAC,WAAW,CAAE,YAAW,MAAM,EAAE,SAAS;IACrF,OAAO,CAAC,OAAO,CAAS;IAExB;;OAEG;gBACU,UAAU,EAAE,0BAA0B,EAAE,IAAI,GAAE,WAAgB;IAM3E,SAAS,IAAK,OAAO;IAIf,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAKvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAK5B,MAAM,IAAK,UAAU;IAIrB,aAAa,CAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,iBAAiB;CAsB7E"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { start, stop } from '@libp2p/interface';
|
|
2
|
-
import { InvalidConfigurationError } from "../errors.js";
|
|
3
|
-
import { SessionStorage } from "./session-storage.js";
|
|
4
|
-
import { Storage } from "./storage.js";
|
|
5
|
-
/**
|
|
6
|
-
* Networked storage wraps a regular blockstore - when getting blocks if the
|
|
7
|
-
* blocks are not present, the configured BlockBrokers will be used to fetch them.
|
|
8
|
-
*/
|
|
9
|
-
export class NetworkedStorage extends Storage {
|
|
10
|
-
started;
|
|
11
|
-
/**
|
|
12
|
-
* Create a new BlockStorage
|
|
13
|
-
*/
|
|
14
|
-
constructor(components, init = {}) {
|
|
15
|
-
super(components, init);
|
|
16
|
-
this.started = false;
|
|
17
|
-
}
|
|
18
|
-
isStarted() {
|
|
19
|
-
return this.started;
|
|
20
|
-
}
|
|
21
|
-
async start() {
|
|
22
|
-
await start(this.child, ...this.blockBrokers);
|
|
23
|
-
this.started = true;
|
|
24
|
-
}
|
|
25
|
-
async stop() {
|
|
26
|
-
await stop(this.child, ...this.blockBrokers);
|
|
27
|
-
this.started = false;
|
|
28
|
-
}
|
|
29
|
-
unwrap() {
|
|
30
|
-
return this.child;
|
|
31
|
-
}
|
|
32
|
-
createSession(root, options) {
|
|
33
|
-
if (this.blockBrokers.length === 0) {
|
|
34
|
-
throw new InvalidConfigurationError('No block brokers configured');
|
|
35
|
-
}
|
|
36
|
-
const blockBrokers = this.blockBrokers
|
|
37
|
-
.map(broker => broker.createSession?.(options))
|
|
38
|
-
.filter(broker => broker != null);
|
|
39
|
-
if (blockBrokers.length === 0) {
|
|
40
|
-
throw new InvalidConfigurationError(`No configured block brokers support sessions - tried ${this.blockBrokers.map(b => b.name).join(', ')}`);
|
|
41
|
-
}
|
|
42
|
-
return new SessionStorage({
|
|
43
|
-
blockstore: this.child,
|
|
44
|
-
blockBrokers,
|
|
45
|
-
getHasher: this.getHasher,
|
|
46
|
-
logger: this.logger
|
|
47
|
-
}, {
|
|
48
|
-
root
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
//# sourceMappingURL=networked-storage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"networked-storage.js","sourceRoot":"","sources":["../../../src/utils/networked-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAatC;;;GAGG;AACH,MAAM,OAAO,gBAAiB,SAAQ,OAAoB;IAChD,OAAO,CAAS;IAExB;;OAEG;IACH,YAAa,UAAsC,EAAE,OAAoB,EAAE;QACzE,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QAEvB,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,KAAK;QACT,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;QAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAA;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;QAC5C,IAAI,CAAC,OAAO,GAAG,KAAK,CAAA;IACtB,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,aAAa,CAAE,IAAS,EAAE,OAA8B;QACtD,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,yBAAyB,CAAC,6BAA6B,CAAC,CAAA;QACpE,CAAC;QAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY;aACnC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC,CAAC;aAC9C,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,CAAA;QAEnC,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,yBAAyB,CAAC,wDAAwD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC9I,CAAC;QAED,OAAO,IAAI,cAAc,CAAC;YACxB,UAAU,EAAE,IAAI,CAAC,KAAK;YACtB,YAAY;YACZ,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,EAAE;YACD,IAAI;SACL,CAAC,CAAA;IACJ,CAAC;CACF"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import { Storage } from './storage.ts';
|
|
2
|
-
import type { StorageComponents } from './storage.ts';
|
|
3
|
-
import type { Pair, DeleteManyBlocksProgressEvents, DeleteBlockProgressEvents, GetBlockProgressEvents, GetManyBlocksProgressEvents, PutManyBlocksProgressEvents, PutBlockProgressEvents, GetAllBlocksProgressEvents, GetOfflineOptions, SessionBlockstore, SessionBlockBroker } from '@helia/interface/blocks';
|
|
4
|
-
import type { AbortOptions, PeerId } from '@libp2p/interface';
|
|
5
|
-
import type { Multiaddr } from '@multiformats/multiaddr';
|
|
6
|
-
import type { InputPair } from 'interface-blockstore';
|
|
7
|
-
import type { CID } from 'multiformats/cid';
|
|
8
|
-
import type { ProgressOptions } from 'progress-events';
|
|
9
|
-
export interface SessionStorageInit {
|
|
10
|
-
root: CID;
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Storage subclass that can cancel any ongoing operation at any point.
|
|
14
|
-
*/
|
|
15
|
-
export declare class SessionStorage extends Storage<SessionBlockBroker> implements SessionBlockstore {
|
|
16
|
-
private readonly closeController;
|
|
17
|
-
constructor(components: StorageComponents<SessionBlockBroker>, init: SessionStorageInit);
|
|
18
|
-
close(): void;
|
|
19
|
-
addPeer(peer: PeerId | Multiaddr | Multiaddr[], options?: AbortOptions): Promise<void>;
|
|
20
|
-
/**
|
|
21
|
-
* Put a block to the underlying datastore
|
|
22
|
-
*/
|
|
23
|
-
put(cid: CID, block: Uint8Array, options?: AbortOptions & ProgressOptions<PutBlockProgressEvents>): Promise<CID>;
|
|
24
|
-
/**
|
|
25
|
-
* Put a multiple blocks to the underlying datastore
|
|
26
|
-
*/
|
|
27
|
-
putMany(blocks: Iterable<InputPair> | AsyncIterable<InputPair>, options?: AbortOptions & ProgressOptions<PutManyBlocksProgressEvents>): AsyncGenerator<CID>;
|
|
28
|
-
/**
|
|
29
|
-
* Get a block by cid
|
|
30
|
-
*/
|
|
31
|
-
get(cid: CID, options?: GetOfflineOptions & AbortOptions & ProgressOptions<GetBlockProgressEvents>): AsyncGenerator<Uint8Array>;
|
|
32
|
-
/**
|
|
33
|
-
* Get multiple blocks back from an (async) iterable of cids
|
|
34
|
-
*/
|
|
35
|
-
getMany(cids: Iterable<CID> | AsyncIterable<CID>, options?: GetOfflineOptions & AbortOptions & ProgressOptions<GetManyBlocksProgressEvents>): AsyncGenerator<Pair>;
|
|
36
|
-
/**
|
|
37
|
-
* Delete a block from the blockstore
|
|
38
|
-
*/
|
|
39
|
-
delete(cid: CID, options?: AbortOptions & ProgressOptions<DeleteBlockProgressEvents>): Promise<void>;
|
|
40
|
-
/**
|
|
41
|
-
* Delete multiple blocks from the blockstore
|
|
42
|
-
*/
|
|
43
|
-
deleteMany(cids: Iterable<CID> | AsyncIterable<CID>, options?: AbortOptions & ProgressOptions<DeleteManyBlocksProgressEvents>): AsyncGenerator<CID>;
|
|
44
|
-
has(cid: CID, options?: AbortOptions): Promise<boolean>;
|
|
45
|
-
getAll(options?: AbortOptions & ProgressOptions<GetAllBlocksProgressEvents>): AsyncGenerator<Pair>;
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=session-storage.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-storage.d.ts","sourceRoot":"","sources":["../../../src/utils/session-storage.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,8BAA8B,EAAE,yBAAyB,EAAE,sBAAsB,EAAE,2BAA2B,EAAE,2BAA2B,EAAE,sBAAsB,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AAC9S,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AACxD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAEtD,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,GAAG,CAAA;CACV;AAED;;GAEG;AACH,qBAAa,cAAe,SAAQ,OAAO,CAAC,kBAAkB,CAAE,YAAW,iBAAiB;IAC1F,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;gBAEpC,UAAU,EAAE,iBAAiB,CAAC,kBAAkB,CAAC,EAAE,IAAI,EAAE,kBAAkB;IAYxF,KAAK,IAAK,IAAI;IAIR,OAAO,CAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,EAAE,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAO7F;;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;IAc3H;;OAEG;IACK,OAAO,CAAE,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,aAAa,CAAC,SAAS,CAAC,EAAE,OAAO,GAAE,YAAY,GAAG,eAAe,CAAC,2BAA2B,CAAM,GAAG,cAAc,CAAC,GAAG,CAAC;IAcxK;;OAEG;IACK,GAAG,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,iBAAiB,GAAG,YAAY,GAAG,eAAe,CAAC,sBAAsB,CAAM,GAAG,cAAc,CAAC,UAAU,CAAC;IAc5I;;OAEG;IACK,OAAO,CAAE,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,OAAO,GAAE,iBAAiB,GAAG,YAAY,GAAG,eAAe,CAAC,2BAA2B,CAAM,GAAG,cAAc,CAAC,IAAI,CAAC;IAc/K;;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,QAAQ,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,EAAE,OAAO,GAAE,YAAY,GAAG,eAAe,CAAC,8BAA8B,CAAM,GAAG,cAAc,CAAC,GAAG,CAAC;IAc1J,GAAG,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,YAAiB,GAAG,OAAO,CAAC,OAAO,CAAC;IAc1D,MAAM,CAAE,OAAO,GAAE,YAAY,GAAG,eAAe,CAAC,0BAA0B,CAAM,GAAG,cAAc,CAAC,IAAI,CAAC;CAahH"}
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { setMaxListeners } from '@libp2p/interface';
|
|
2
|
-
import { anySignal } from 'any-signal';
|
|
3
|
-
import { Storage } from "./storage.js";
|
|
4
|
-
/**
|
|
5
|
-
* Storage subclass that can cancel any ongoing operation at any point.
|
|
6
|
-
*/
|
|
7
|
-
export class SessionStorage extends Storage {
|
|
8
|
-
closeController;
|
|
9
|
-
constructor(components, init) {
|
|
10
|
-
super(components);
|
|
11
|
-
// because brokers are allowed to continue searching for providers after the
|
|
12
|
-
// session has been created, we need a way to tell them that the user has
|
|
13
|
-
// finished using the session any in-flight requests should be cancelled
|
|
14
|
-
this.closeController = new AbortController();
|
|
15
|
-
setMaxListeners(Infinity, this.closeController.signal);
|
|
16
|
-
this.log = components.logger.forComponent(`helia:session-storage:${init.root}`);
|
|
17
|
-
}
|
|
18
|
-
close() {
|
|
19
|
-
this.closeController.abort();
|
|
20
|
-
}
|
|
21
|
-
async addPeer(peer, options) {
|
|
22
|
-
await Promise.all(this.blockBrokers
|
|
23
|
-
.map(broker => broker.addPeer(peer, options)));
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Put a block to the underlying datastore
|
|
27
|
-
*/
|
|
28
|
-
async put(cid, block, options = {}) {
|
|
29
|
-
const signal = anySignal([this.closeController.signal, options.signal]);
|
|
30
|
-
setMaxListeners(Infinity, signal);
|
|
31
|
-
try {
|
|
32
|
-
return await super.put(cid, block, {
|
|
33
|
-
...options,
|
|
34
|
-
signal
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
finally {
|
|
38
|
-
signal.clear();
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Put a multiple blocks to the underlying datastore
|
|
43
|
-
*/
|
|
44
|
-
async *putMany(blocks, options = {}) {
|
|
45
|
-
const signal = anySignal([this.closeController.signal, options.signal]);
|
|
46
|
-
setMaxListeners(Infinity, signal);
|
|
47
|
-
try {
|
|
48
|
-
yield* super.putMany(blocks, {
|
|
49
|
-
...options,
|
|
50
|
-
signal
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
finally {
|
|
54
|
-
signal.clear();
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
/**
|
|
58
|
-
* Get a block by cid
|
|
59
|
-
*/
|
|
60
|
-
async *get(cid, options = {}) {
|
|
61
|
-
const signal = anySignal([this.closeController.signal, options.signal]);
|
|
62
|
-
setMaxListeners(Infinity, signal);
|
|
63
|
-
try {
|
|
64
|
-
yield* super.get(cid, {
|
|
65
|
-
...options,
|
|
66
|
-
signal
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
finally {
|
|
70
|
-
signal.clear();
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Get multiple blocks back from an (async) iterable of cids
|
|
75
|
-
*/
|
|
76
|
-
async *getMany(cids, options = {}) {
|
|
77
|
-
const signal = anySignal([this.closeController.signal, options.signal]);
|
|
78
|
-
setMaxListeners(Infinity, signal);
|
|
79
|
-
try {
|
|
80
|
-
yield* super.getMany(cids, {
|
|
81
|
-
...options,
|
|
82
|
-
signal
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
finally {
|
|
86
|
-
signal.clear();
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Delete a block from the blockstore
|
|
91
|
-
*/
|
|
92
|
-
async delete(cid, options = {}) {
|
|
93
|
-
const signal = anySignal([this.closeController.signal, options.signal]);
|
|
94
|
-
setMaxListeners(Infinity, signal);
|
|
95
|
-
try {
|
|
96
|
-
await super.delete(cid, {
|
|
97
|
-
...options,
|
|
98
|
-
signal
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
finally {
|
|
102
|
-
signal.clear();
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
/**
|
|
106
|
-
* Delete multiple blocks from the blockstore
|
|
107
|
-
*/
|
|
108
|
-
async *deleteMany(cids, options = {}) {
|
|
109
|
-
const signal = anySignal([this.closeController.signal, options.signal]);
|
|
110
|
-
setMaxListeners(Infinity, signal);
|
|
111
|
-
try {
|
|
112
|
-
yield* super.deleteMany(cids, {
|
|
113
|
-
...options,
|
|
114
|
-
signal
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
finally {
|
|
118
|
-
signal.clear();
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
async has(cid, options = {}) {
|
|
122
|
-
const signal = anySignal([this.closeController.signal, options.signal]);
|
|
123
|
-
setMaxListeners(Infinity, signal);
|
|
124
|
-
try {
|
|
125
|
-
return await super.has(cid, {
|
|
126
|
-
...options,
|
|
127
|
-
signal
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
finally {
|
|
131
|
-
signal.clear();
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
async *getAll(options = {}) {
|
|
135
|
-
const signal = anySignal([this.closeController.signal, options.signal]);
|
|
136
|
-
setMaxListeners(Infinity, signal);
|
|
137
|
-
try {
|
|
138
|
-
yield* super.getAll({
|
|
139
|
-
...options,
|
|
140
|
-
signal
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
finally {
|
|
144
|
-
signal.clear();
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
//# sourceMappingURL=session-storage.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-storage.js","sourceRoot":"","sources":["../../../src/utils/session-storage.ts"],"names":[],"mappings":"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"}
|