@helia/utils 0.1.0-ecf5394 → 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.
- package/dist/index.min.js +6 -1
- package/dist/src/abstract-session.d.ts +53 -0
- package/dist/src/abstract-session.d.ts.map +1 -0
- package/dist/src/abstract-session.js +205 -0
- package/dist/src/abstract-session.js.map +1 -0
- package/dist/src/bloom-filter.d.ts +33 -0
- package/dist/src/bloom-filter.d.ts.map +1 -0
- package/dist/src/bloom-filter.js +113 -0
- package/dist/src/bloom-filter.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +15 -11
- package/dist/src/index.js.map +1 -1
- package/dist/src/routing.d.ts +4 -1
- package/dist/src/routing.d.ts.map +1 -1
- package/dist/src/routing.js +46 -14
- package/dist/src/routing.js.map +1 -1
- package/dist/src/storage.d.ts +3 -2
- package/dist/src/storage.d.ts.map +1 -1
- package/dist/src/storage.js +12 -0
- package/dist/src/storage.js.map +1 -1
- package/dist/src/utils/networked-storage.d.ts +30 -21
- package/dist/src/utils/networked-storage.d.ts.map +1 -1
- package/dist/src/utils/networked-storage.js +219 -59
- package/dist/src/utils/networked-storage.js.map +1 -1
- package/dist/typedoc-urls.json +9 -0
- package/package.json +12 -5
- package/src/abstract-session.ts +287 -0
- package/src/bloom-filter.ts +141 -0
- package/src/index.ts +37 -14
- package/src/routing.ts +52 -17
- package/src/storage.ts +16 -3
- package/src/utils/networked-storage.ts +285 -91
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { TypedEventEmitter } from '@libp2p/interface';
|
|
2
|
+
import type { BlockBroker, BlockRetrievalOptions, CreateSessionOptions } from '@helia/interface';
|
|
3
|
+
import type { AbortOptions, ComponentLogger, Logger } from '@libp2p/interface';
|
|
4
|
+
import type { CID } from 'multiformats/cid';
|
|
5
|
+
import type { ProgressEvent } from 'progress-events';
|
|
6
|
+
export interface AbstractSessionComponents {
|
|
7
|
+
logger: ComponentLogger;
|
|
8
|
+
}
|
|
9
|
+
export interface AbstractCreateSessionOptions extends CreateSessionOptions {
|
|
10
|
+
name: string;
|
|
11
|
+
}
|
|
12
|
+
export interface BlockstoreSessionEvents<Provider> {
|
|
13
|
+
provider: CustomEvent<Provider>;
|
|
14
|
+
}
|
|
15
|
+
export declare abstract class AbstractSession<Provider, RetrieveBlockProgressEvents extends ProgressEvent> extends TypedEventEmitter<BlockstoreSessionEvents<Provider>> implements BlockBroker<RetrieveBlockProgressEvents> {
|
|
16
|
+
private intialPeerSearchComplete?;
|
|
17
|
+
private readonly requests;
|
|
18
|
+
private readonly name;
|
|
19
|
+
protected log: Logger;
|
|
20
|
+
protected logger: ComponentLogger;
|
|
21
|
+
private readonly minProviders;
|
|
22
|
+
private readonly maxProviders;
|
|
23
|
+
readonly providers: Provider[];
|
|
24
|
+
private readonly evictionFilter;
|
|
25
|
+
constructor(components: AbstractSessionComponents, init: AbstractCreateSessionOptions);
|
|
26
|
+
retrieve(cid: CID, options?: BlockRetrievalOptions<RetrieveBlockProgressEvents>): Promise<Uint8Array>;
|
|
27
|
+
evict(provider: Provider): void;
|
|
28
|
+
isEvicted(provider: Provider): boolean;
|
|
29
|
+
hasProvider(provider: Provider): boolean;
|
|
30
|
+
private findProviders;
|
|
31
|
+
/**
|
|
32
|
+
* This method should search for new providers and yield them.
|
|
33
|
+
*/
|
|
34
|
+
abstract findNewProviders(cid: CID, options: AbortOptions): AsyncGenerator<Provider>;
|
|
35
|
+
/**
|
|
36
|
+
* The subclass should contact the provider and request the block from it.
|
|
37
|
+
*
|
|
38
|
+
* If the provider cannot provide the block an error should be thrown.
|
|
39
|
+
*
|
|
40
|
+
* The provider will then be excluded from ongoing queries.
|
|
41
|
+
*/
|
|
42
|
+
abstract queryProvider(cid: CID, provider: Provider, options: AbortOptions): Promise<Uint8Array>;
|
|
43
|
+
/**
|
|
44
|
+
* Turn a provider into a concise Uint8Array representation for use in a Bloom
|
|
45
|
+
* filter
|
|
46
|
+
*/
|
|
47
|
+
abstract toEvictionKey(provider: Provider): Uint8Array | string;
|
|
48
|
+
/**
|
|
49
|
+
* Return `true` if we consider one provider to be the same as another
|
|
50
|
+
*/
|
|
51
|
+
abstract equals(providerA: Provider, providerB: Provider): boolean;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=abstract-session.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract-session.d.ts","sourceRoot":"","sources":["../../src/abstract-session.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,iBAAiB,EAAmB,MAAM,mBAAmB,CAAA;AAKjF,OAAO,KAAK,EAAE,WAAW,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAC9E,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAA;AAE3C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAA;AAEpD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,eAAe,CAAA;CACxB;AAED,MAAM,WAAW,4BAA6B,SAAQ,oBAAoB;IACxE,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,uBAAuB,CAAC,QAAQ;IAC/C,QAAQ,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAA;CAChC;AAED,8BAAsB,eAAe,CAAC,QAAQ,EAAE,2BAA2B,SAAS,aAAa,CAAE,SAAQ,iBAAiB,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAE,YAAW,WAAW,CAAC,2BAA2B,CAAC;IACjN,OAAO,CAAC,wBAAwB,CAAC,CAAe;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAQ;IAC7B,SAAS,CAAC,GAAG,EAAE,MAAM,CAAA;IACrB,SAAS,CAAC,MAAM,EAAE,eAAe,CAAA;IACjC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,SAAgB,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAa;gBAE/B,UAAU,EAAE,yBAAyB,EAAE,IAAI,EAAE,4BAA4B;IAchF,QAAQ,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,qBAAqB,CAAC,2BAA2B,CAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAiIhH,KAAK,CAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAWhC,SAAS,CAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO;IAIvC,WAAW,CAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO;YAc3B,aAAa;IAuD3B;;OAEG;IACH,QAAQ,CAAC,gBAAgB,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC;IAErF;;;;;;OAMG;IACH,QAAQ,CAAC,aAAa,CAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAEjG;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAE,QAAQ,EAAE,QAAQ,GAAG,UAAU,GAAG,MAAM;IAEhE;;OAEG;IACH,QAAQ,CAAC,MAAM,CAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,GAAG,OAAO;CACpE"}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { DEFAULT_SESSION_MIN_PROVIDERS, DEFAULT_SESSION_MAX_PROVIDERS } from '@helia/interface';
|
|
2
|
+
import { CodeError, TypedEventEmitter, setMaxListeners } from '@libp2p/interface';
|
|
3
|
+
import { Queue } from '@libp2p/utils/queue';
|
|
4
|
+
import { base64 } from 'multiformats/bases/base64';
|
|
5
|
+
import pDefer from 'p-defer';
|
|
6
|
+
import { BloomFilter } from './bloom-filter.js';
|
|
7
|
+
export class AbstractSession extends TypedEventEmitter {
|
|
8
|
+
intialPeerSearchComplete;
|
|
9
|
+
requests;
|
|
10
|
+
name;
|
|
11
|
+
log;
|
|
12
|
+
logger;
|
|
13
|
+
minProviders;
|
|
14
|
+
maxProviders;
|
|
15
|
+
providers;
|
|
16
|
+
evictionFilter;
|
|
17
|
+
constructor(components, init) {
|
|
18
|
+
super();
|
|
19
|
+
setMaxListeners(Infinity, this);
|
|
20
|
+
this.name = init.name;
|
|
21
|
+
this.logger = components.logger;
|
|
22
|
+
this.log = components.logger.forComponent(this.name);
|
|
23
|
+
this.requests = new Map();
|
|
24
|
+
this.minProviders = init.minProviders ?? DEFAULT_SESSION_MIN_PROVIDERS;
|
|
25
|
+
this.maxProviders = init.maxProviders ?? DEFAULT_SESSION_MAX_PROVIDERS;
|
|
26
|
+
this.providers = [];
|
|
27
|
+
this.evictionFilter = BloomFilter.create(this.maxProviders);
|
|
28
|
+
}
|
|
29
|
+
async retrieve(cid, options = {}) {
|
|
30
|
+
// see if we are already requesting this CID in this session
|
|
31
|
+
const cidStr = base64.encode(cid.multihash.bytes);
|
|
32
|
+
const existingJob = this.requests.get(cidStr);
|
|
33
|
+
if (existingJob != null) {
|
|
34
|
+
this.log('join existing request for %c', cid);
|
|
35
|
+
return existingJob;
|
|
36
|
+
}
|
|
37
|
+
const deferred = pDefer();
|
|
38
|
+
this.requests.set(cidStr, deferred.promise);
|
|
39
|
+
if (this.providers.length === 0) {
|
|
40
|
+
let first = false;
|
|
41
|
+
if (this.intialPeerSearchComplete == null) {
|
|
42
|
+
first = true;
|
|
43
|
+
this.log = this.logger.forComponent(`${this.name}:${cid}`);
|
|
44
|
+
this.intialPeerSearchComplete = this.findProviders(cid, this.minProviders, options);
|
|
45
|
+
}
|
|
46
|
+
await this.intialPeerSearchComplete;
|
|
47
|
+
if (first) {
|
|
48
|
+
this.log('found initial session peers for %c', cid);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
let foundBlock = false;
|
|
52
|
+
// this queue manages outgoing requests - as new peers are added to the
|
|
53
|
+
// session they will be added to the queue so we can request the current
|
|
54
|
+
// block from multiple peers as they are discovered
|
|
55
|
+
const queue = new Queue({
|
|
56
|
+
concurrency: this.maxProviders
|
|
57
|
+
});
|
|
58
|
+
queue.addEventListener('error', () => { });
|
|
59
|
+
queue.addEventListener('failure', (evt) => {
|
|
60
|
+
this.log.error('error querying provider %o, evicting from session', evt.detail.job.options.provider, evt.detail.error);
|
|
61
|
+
this.evict(evt.detail.job.options.provider);
|
|
62
|
+
});
|
|
63
|
+
queue.addEventListener('success', (evt) => {
|
|
64
|
+
// peer has sent block, return it to the caller
|
|
65
|
+
foundBlock = true;
|
|
66
|
+
deferred.resolve(evt.detail.result);
|
|
67
|
+
});
|
|
68
|
+
queue.addEventListener('idle', () => {
|
|
69
|
+
if (foundBlock || options.signal?.aborted === true) {
|
|
70
|
+
// we either found the block or the user gave up
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// find more session peers and retry
|
|
74
|
+
Promise.resolve()
|
|
75
|
+
.then(async () => {
|
|
76
|
+
this.log('no session peers had block for for %c, finding new providers', cid);
|
|
77
|
+
// evict this.minProviders random providers to make room for more
|
|
78
|
+
for (let i = 0; i < this.minProviders; i++) {
|
|
79
|
+
if (this.providers.length === 0) {
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
const provider = this.providers[Math.floor(Math.random() * this.providers.length)];
|
|
83
|
+
this.evict(provider);
|
|
84
|
+
}
|
|
85
|
+
// find new providers for the CID
|
|
86
|
+
await this.findProviders(cid, this.minProviders, options);
|
|
87
|
+
// keep trying until the abort signal fires
|
|
88
|
+
this.log('found new providers re-retrieving %c', cid);
|
|
89
|
+
this.requests.delete(cidStr);
|
|
90
|
+
deferred.resolve(await this.retrieve(cid, options));
|
|
91
|
+
})
|
|
92
|
+
.catch(err => {
|
|
93
|
+
this.log.error('could not find new providers for %c', cid, err);
|
|
94
|
+
deferred.reject(err);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
const peerAddedToSessionListener = (event) => {
|
|
98
|
+
queue.add(async () => {
|
|
99
|
+
return this.queryProvider(cid, event.detail, options);
|
|
100
|
+
}, {
|
|
101
|
+
provider: event.detail
|
|
102
|
+
})
|
|
103
|
+
.catch(err => {
|
|
104
|
+
if (options.signal?.aborted === true) {
|
|
105
|
+
// skip logging error if signal was aborted because abort can happen
|
|
106
|
+
// on success (e.g. another session found the block)
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
this.log.error('error retrieving session block for %c', cid, err);
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
// add new session peers to query as they are discovered
|
|
113
|
+
this.addEventListener('provider', peerAddedToSessionListener);
|
|
114
|
+
// query each session peer directly
|
|
115
|
+
Promise.all([...this.providers].map(async (provider) => {
|
|
116
|
+
return queue.add(async () => {
|
|
117
|
+
return this.queryProvider(cid, provider, options);
|
|
118
|
+
}, {
|
|
119
|
+
provider
|
|
120
|
+
});
|
|
121
|
+
}))
|
|
122
|
+
.catch(err => {
|
|
123
|
+
if (options.signal?.aborted === true) {
|
|
124
|
+
// skip logging error if signal was aborted because abort can happen
|
|
125
|
+
// on success (e.g. another session found the block)
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
this.log.error('error retrieving session block for %c', cid, err);
|
|
129
|
+
});
|
|
130
|
+
try {
|
|
131
|
+
return await deferred.promise;
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
this.removeEventListener('provider', peerAddedToSessionListener);
|
|
135
|
+
queue.clear();
|
|
136
|
+
this.requests.delete(cidStr);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
evict(provider) {
|
|
140
|
+
this.evictionFilter.add(this.toEvictionKey(provider));
|
|
141
|
+
const index = this.providers.findIndex(prov => this.equals(prov, provider));
|
|
142
|
+
if (index === -1) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
this.providers.splice(index, 1);
|
|
146
|
+
}
|
|
147
|
+
isEvicted(provider) {
|
|
148
|
+
return this.providers.some(prov => this.equals(prov, provider));
|
|
149
|
+
}
|
|
150
|
+
hasProvider(provider) {
|
|
151
|
+
// dedupe existing gateways
|
|
152
|
+
if (this.providers.find(prov => this.equals(prov, provider)) != null) {
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
// dedupe failed session peers
|
|
156
|
+
if (this.isEvicted(provider)) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
async findProviders(cid, count, options) {
|
|
162
|
+
const deferred = pDefer();
|
|
163
|
+
let found = 0;
|
|
164
|
+
// run async to resolve the deferred promise when `count` providers are
|
|
165
|
+
// found but continue util this.providers reaches this.maxProviders
|
|
166
|
+
void Promise.resolve()
|
|
167
|
+
.then(async () => {
|
|
168
|
+
this.log('finding %d-%d new provider(s) for %c', count, this.maxProviders, cid);
|
|
169
|
+
for await (const provider of this.findNewProviders(cid, options)) {
|
|
170
|
+
if (found === this.maxProviders || options.signal?.aborted === true) {
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
if (this.hasProvider(provider)) {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
this.log('found %d/%d new providers', found, this.maxProviders);
|
|
177
|
+
this.providers.push(provider);
|
|
178
|
+
// let the new peer join current queries
|
|
179
|
+
this.safeDispatchEvent('provider', {
|
|
180
|
+
detail: provider
|
|
181
|
+
});
|
|
182
|
+
found++;
|
|
183
|
+
if (found === count) {
|
|
184
|
+
this.log('session is ready');
|
|
185
|
+
deferred.resolve();
|
|
186
|
+
// continue finding peers until we reach this.maxProviders
|
|
187
|
+
}
|
|
188
|
+
if (this.providers.length === this.maxProviders) {
|
|
189
|
+
this.log('found max session peers', found);
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
this.log('found %d/%d new session peers', found, this.maxProviders);
|
|
194
|
+
if (found < count) {
|
|
195
|
+
throw new CodeError(`Found ${found} of ${count} ${this.name} providers for ${cid}`, 'ERR_INSUFFICIENT_PROVIDERS_FOUND');
|
|
196
|
+
}
|
|
197
|
+
})
|
|
198
|
+
.catch(err => {
|
|
199
|
+
this.log.error('error searching routing for potential session peers for %c', cid, err.errors ?? err);
|
|
200
|
+
deferred.reject(err);
|
|
201
|
+
});
|
|
202
|
+
return deferred.promise;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=abstract-session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abstract-session.js","sourceRoot":"","sources":["../../src/abstract-session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAA;AAC/F,OAAO,EAAE,SAAS,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACjF,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AAClD,OAAO,MAAM,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAmB/C,MAAM,OAAgB,eAA6E,SAAQ,iBAAoD;IACrJ,wBAAwB,CAAgB;IAC/B,QAAQ,CAAkC;IAC1C,IAAI,CAAQ;IACnB,GAAG,CAAQ;IACX,MAAM,CAAiB;IAChB,YAAY,CAAQ;IACpB,YAAY,CAAQ;IACrB,SAAS,CAAY;IACpB,cAAc,CAAa;IAE5C,YAAa,UAAqC,EAAE,IAAkC;QACpF,KAAK,EAAE,CAAA;QAEP,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAA;QACrB,IAAI,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAA;QAC/B,IAAI,CAAC,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACpD,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAA;QACzB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,6BAA6B,CAAA;QACtE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,IAAI,6BAA6B,CAAA;QACtE,IAAI,CAAC,SAAS,GAAG,EAAE,CAAA;QACnB,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC7D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAE,GAAQ,EAAE,UAA8D,EAAE;QACxF,4DAA4D;QAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACjD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAE7C,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE,GAAG,CAAC,CAAA;YAC7C,OAAO,WAAW,CAAA;QACpB,CAAC;QAED,MAAM,QAAQ,GAAgC,MAAM,EAAE,CAAA;QACtD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QAE3C,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,IAAI,KAAK,GAAG,KAAK,CAAA;YAEjB,IAAI,IAAI,CAAC,wBAAwB,IAAI,IAAI,EAAE,CAAC;gBAC1C,KAAK,GAAG,IAAI,CAAA;gBACZ,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,GAAG,EAAE,CAAC,CAAA;gBAC1D,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;YACrF,CAAC;YAED,MAAM,IAAI,CAAC,wBAAwB,CAAA;YAEnC,IAAI,KAAK,EAAE,CAAC;gBACV,IAAI,CAAC,GAAG,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAA;YACrD,CAAC;QACH,CAAC;QAED,IAAI,UAAU,GAAG,KAAK,CAAA;QAEtB,uEAAuE;QACvE,wEAAwE;QACxE,mDAAmD;QACnD,MAAM,KAAK,GAAG,IAAI,KAAK,CAAwD;YAC7E,WAAW,EAAE,IAAI,CAAC,YAAY;SAC/B,CAAC,CAAA;QACF,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACzC,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YACxC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mDAAmD,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YACxC,+CAA+C;YAC/C,UAAU,GAAG,IAAI,CAAA;YACjB,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACrC,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE;YAClC,IAAI,UAAU,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;gBACnD,gDAAgD;gBAChD,OAAM;YACR,CAAC;YAED,oCAAoC;YACpC,OAAO,CAAC,OAAO,EAAE;iBACd,IAAI,CAAC,KAAK,IAAI,EAAE;gBACf,IAAI,CAAC,GAAG,CAAC,8DAA8D,EAAE,GAAG,CAAC,CAAA;gBAE7E,iEAAiE;gBACjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3C,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAChC,MAAK;oBACP,CAAC;oBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;oBAClF,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;gBACtB,CAAC;gBAED,iCAAiC;gBACjC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAA;gBAEzD,2CAA2C;gBAC3C,IAAI,CAAC,GAAG,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAA;gBACrD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBAC5B,QAAQ,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAA;YACrD,CAAC,CAAC;iBACD,KAAK,CAAC,GAAG,CAAC,EAAE;gBACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,qCAAqC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;gBAC/D,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YACtB,CAAC,CAAC,CAAA;QACN,CAAC,CAAC,CAAA;QAEF,MAAM,0BAA0B,GAAG,CAAC,KAA4B,EAAQ,EAAE;YACxE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;gBACnB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YACvD,CAAC,EAAE;gBACD,QAAQ,EAAE,KAAK,CAAC,MAAM;aACvB,CAAC;iBACC,KAAK,CAAC,GAAG,CAAC,EAAE;gBACX,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;oBACrC,oEAAoE;oBACpE,oDAAoD;oBACpD,OAAM;gBACR,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;YACnE,CAAC,CAAC,CAAA;QACN,CAAC,CAAA;QAED,wDAAwD;QACxD,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAA;QAE7D,mCAAmC;QACnC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YACrD,OAAO,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC1B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;YACnD,CAAC,EAAE;gBACD,QAAQ;aACT,CAAC,CAAA;QACJ,CAAC,CAAC,CAAC;aACA,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;gBACrC,oEAAoE;gBACpE,oDAAoD;gBACpD,OAAM;YACR,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,uCAAuC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;QACnE,CAAC,CAAC,CAAA;QAEJ,IAAI,CAAC;YACH,OAAO,MAAM,QAAQ,CAAC,OAAO,CAAA;QAC/B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,mBAAmB,CAAC,UAAU,EAAE,0BAA0B,CAAC,CAAA;YAChE,KAAK,CAAC,KAAK,EAAE,CAAA;YACb,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QAC9B,CAAC;IACH,CAAC;IAED,KAAK,CAAE,QAAkB;QACvB,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAA;QACrD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;QAE3E,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,OAAM;QACR,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;IACjC,CAAC;IAED,SAAS,CAAE,QAAkB;QAC3B,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAA;IACjE,CAAC;IAED,WAAW,CAAE,QAAkB;QAC7B,2BAA2B;QAC3B,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;YACrE,OAAO,IAAI,CAAA;QACb,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,KAAK,CAAA;IACd,CAAC;IAEO,KAAK,CAAC,aAAa,CAAE,GAAQ,EAAE,KAAa,EAAE,OAAqB;QACzE,MAAM,QAAQ,GAA0B,MAAM,EAAE,CAAA;QAChD,IAAI,KAAK,GAAG,CAAC,CAAA;QAEb,uEAAuE;QACvE,mEAAmE;QACnE,KAAK,OAAO,CAAC,OAAO,EAAE;aACnB,IAAI,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC,GAAG,CAAC,sCAAsC,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;YAE/E,IAAI,KAAK,EAAE,MAAM,QAAQ,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,CAAC;gBACjE,IAAI,KAAK,KAAK,IAAI,CAAC,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,CAAC;oBACpE,MAAK;gBACP,CAAC;gBAED,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,SAAQ;gBACV,CAAC;gBAED,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;gBAC/D,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;gBAE7B,wCAAwC;gBACxC,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE;oBACjC,MAAM,EAAE,QAAQ;iBACjB,CAAC,CAAA;gBAEF,KAAK,EAAE,CAAA;gBAEP,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;oBACpB,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAA;oBAC5B,QAAQ,CAAC,OAAO,EAAE,CAAA;oBAClB,0DAA0D;gBAC5D,CAAC;gBAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;oBAChD,IAAI,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAA;oBAC1C,MAAK;gBACP,CAAC;YACH,CAAC;YAED,IAAI,CAAC,GAAG,CAAC,+BAA+B,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,CAAA;YAEnE,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;gBAClB,MAAM,IAAI,SAAS,CAAC,SAAS,KAAK,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,kBAAkB,GAAG,EAAE,EAAE,kCAAkC,CAAC,CAAA;YACzH,CAAC;QACH,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,CAAC,EAAE;YACX,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4DAA4D,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,CAAA;YACpG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACtB,CAAC,CAAC,CAAA;QAEJ,OAAO,QAAQ,CAAC,OAAO,CAAA;IACzB,CAAC;CA0BF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export interface BloomFilterOptions {
|
|
2
|
+
seeds?: number[];
|
|
3
|
+
hashes?: number;
|
|
4
|
+
bits?: number;
|
|
5
|
+
}
|
|
6
|
+
export declare class BloomFilter {
|
|
7
|
+
/**
|
|
8
|
+
* Create a `BloomFilter` with the smallest `bits` and `hashes` value for the
|
|
9
|
+
* specified item count and error rate.
|
|
10
|
+
*/
|
|
11
|
+
static create(itemcount: number, errorRate?: number): BloomFilter;
|
|
12
|
+
readonly seeds: number[];
|
|
13
|
+
readonly bits: number;
|
|
14
|
+
buffer: Uint8Array;
|
|
15
|
+
constructor(options?: BloomFilterOptions);
|
|
16
|
+
/**
|
|
17
|
+
* Add an item to the filter
|
|
18
|
+
*/
|
|
19
|
+
add(item: Uint8Array | string): void;
|
|
20
|
+
/**
|
|
21
|
+
* Test if the filter has an item. If it returns false it definitely does not
|
|
22
|
+
* have the item. If it returns true, it probably has the item but there's
|
|
23
|
+
* an `errorRate` chance it doesn't.
|
|
24
|
+
*/
|
|
25
|
+
has(item: Uint8Array | string): boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Reset the filter
|
|
28
|
+
*/
|
|
29
|
+
clear(): void;
|
|
30
|
+
setbit(bit: number): void;
|
|
31
|
+
getbit(bit: number): boolean;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=bloom-filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bloom-filter.d.ts","sourceRoot":"","sources":["../../src/bloom-filter.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACd;AAED,qBAAa,WAAW;IACtB;;;OAGG;IACH,MAAM,CAAC,MAAM,CAAE,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,MAAc,GAAG,WAAW;IAKzE,SAAgB,KAAK,EAAE,MAAM,EAAE,CAAA;IAC/B,SAAgB,IAAI,EAAE,MAAM,CAAA;IACrB,MAAM,EAAE,UAAU,CAAA;gBAEZ,OAAO,GAAE,kBAAuB;IAW7C;;OAEG;IACH,GAAG,CAAE,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,IAAI;IAarC;;;;OAIG;IACH,GAAG,CAAE,IAAI,EAAE,UAAU,GAAG,MAAM,GAAG,OAAO;IAmBxC;;OAEG;IACH,KAAK,IAAK,IAAI;IAId,MAAM,CAAE,GAAG,EAAE,MAAM,GAAG,IAAI;IAa1B,MAAM,CAAE,GAAG,EAAE,MAAM,GAAG,OAAO;CAW9B"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
// ported from xxbloom - https://github.com/ceejbot/xxbloom/blob/master/LICENSE
|
|
2
|
+
import { randomBytes } from '@libp2p/crypto';
|
|
3
|
+
import mur from 'murmurhash3js-revisited';
|
|
4
|
+
import { Uint8ArrayList } from 'uint8arraylist';
|
|
5
|
+
import { alloc } from 'uint8arrays/alloc';
|
|
6
|
+
import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string';
|
|
7
|
+
const LN2_SQUARED = Math.LN2 * Math.LN2;
|
|
8
|
+
export class BloomFilter {
|
|
9
|
+
/**
|
|
10
|
+
* Create a `BloomFilter` with the smallest `bits` and `hashes` value for the
|
|
11
|
+
* specified item count and error rate.
|
|
12
|
+
*/
|
|
13
|
+
static create(itemcount, errorRate = 0.005) {
|
|
14
|
+
const opts = optimize(itemcount, errorRate);
|
|
15
|
+
return new BloomFilter(opts);
|
|
16
|
+
}
|
|
17
|
+
seeds;
|
|
18
|
+
bits;
|
|
19
|
+
buffer;
|
|
20
|
+
constructor(options = {}) {
|
|
21
|
+
if (options.seeds != null) {
|
|
22
|
+
this.seeds = options.seeds;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
this.seeds = generateSeeds(options.hashes ?? 8);
|
|
26
|
+
}
|
|
27
|
+
this.bits = options.bits ?? 1024;
|
|
28
|
+
this.buffer = alloc(Math.ceil(this.bits / 8));
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Add an item to the filter
|
|
32
|
+
*/
|
|
33
|
+
add(item) {
|
|
34
|
+
if (typeof item === 'string') {
|
|
35
|
+
item = uint8ArrayFromString(item);
|
|
36
|
+
}
|
|
37
|
+
for (let i = 0; i < this.seeds.length; i++) {
|
|
38
|
+
const hash = mur.x86.hash32(item, this.seeds[i]);
|
|
39
|
+
const bit = hash % this.bits;
|
|
40
|
+
this.setbit(bit);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Test if the filter has an item. If it returns false it definitely does not
|
|
45
|
+
* have the item. If it returns true, it probably has the item but there's
|
|
46
|
+
* an `errorRate` chance it doesn't.
|
|
47
|
+
*/
|
|
48
|
+
has(item) {
|
|
49
|
+
if (typeof item === 'string') {
|
|
50
|
+
item = uint8ArrayFromString(item);
|
|
51
|
+
}
|
|
52
|
+
for (let i = 0; i < this.seeds.length; i++) {
|
|
53
|
+
const hash = mur.x86.hash32(item, this.seeds[i]);
|
|
54
|
+
const bit = hash % this.bits;
|
|
55
|
+
const isSet = this.getbit(bit);
|
|
56
|
+
if (!isSet) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Reset the filter
|
|
64
|
+
*/
|
|
65
|
+
clear() {
|
|
66
|
+
this.buffer.fill(0);
|
|
67
|
+
}
|
|
68
|
+
setbit(bit) {
|
|
69
|
+
let pos = 0;
|
|
70
|
+
let shift = bit;
|
|
71
|
+
while (shift > 7) {
|
|
72
|
+
pos++;
|
|
73
|
+
shift -= 8;
|
|
74
|
+
}
|
|
75
|
+
let bitfield = this.buffer[pos];
|
|
76
|
+
bitfield |= (0x1 << shift);
|
|
77
|
+
this.buffer[pos] = bitfield;
|
|
78
|
+
}
|
|
79
|
+
getbit(bit) {
|
|
80
|
+
let pos = 0;
|
|
81
|
+
let shift = bit;
|
|
82
|
+
while (shift > 7) {
|
|
83
|
+
pos++;
|
|
84
|
+
shift -= 8;
|
|
85
|
+
}
|
|
86
|
+
const bitfield = this.buffer[pos];
|
|
87
|
+
return (bitfield & (0x1 << shift)) !== 0;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function optimize(itemcount, errorRate = 0.005) {
|
|
91
|
+
const bits = Math.round(-1 * itemcount * Math.log(errorRate) / LN2_SQUARED);
|
|
92
|
+
const hashes = Math.round((bits / itemcount) * Math.LN2);
|
|
93
|
+
return { bits, hashes };
|
|
94
|
+
}
|
|
95
|
+
function generateSeeds(count) {
|
|
96
|
+
let buf;
|
|
97
|
+
let j;
|
|
98
|
+
const seeds = [];
|
|
99
|
+
for (let i = 0; i < count; i++) {
|
|
100
|
+
buf = new Uint8ArrayList(randomBytes(4));
|
|
101
|
+
seeds[i] = buf.getUint32(0, true);
|
|
102
|
+
// Make sure we don't end up with two identical seeds,
|
|
103
|
+
// which is unlikely but possible.
|
|
104
|
+
for (j = 0; j < i; j++) {
|
|
105
|
+
if (seeds[i] === seeds[j]) {
|
|
106
|
+
i--;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
return seeds;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=bloom-filter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bloom-filter.js","sourceRoot":"","sources":["../../src/bloom-filter.ts"],"names":[],"mappings":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -25,6 +25,8 @@ import type { DNS } from '@multiformats/dns';
|
|
|
25
25
|
import type { Blockstore } from 'interface-blockstore';
|
|
26
26
|
import type { Datastore } from 'interface-datastore';
|
|
27
27
|
import type { MultihashHasher } from 'multiformats/hashes/interface';
|
|
28
|
+
export { AbstractSession, type AbstractCreateSessionOptions } from './abstract-session.js';
|
|
29
|
+
export { BloomFilter } from './bloom-filter.js';
|
|
28
30
|
/**
|
|
29
31
|
* Options used to create a Helia node.
|
|
30
32
|
*/
|
|
@@ -79,6 +81,23 @@ export interface HeliaInit {
|
|
|
79
81
|
* information about network peers or getting/putting records.
|
|
80
82
|
*/
|
|
81
83
|
routers?: Array<Partial<Routing>>;
|
|
84
|
+
/**
|
|
85
|
+
* During provider lookups, peers can be returned from routing implementations
|
|
86
|
+
* with no multiaddrs.
|
|
87
|
+
*
|
|
88
|
+
* This can happen when they've been retrieved from network peers that only
|
|
89
|
+
* store multiaddrs for a limited amount of time.
|
|
90
|
+
*
|
|
91
|
+
* When this happens the peer's info has to be looked up with a further query.
|
|
92
|
+
*
|
|
93
|
+
* To not have this query block the yielding of other providers returned with
|
|
94
|
+
* multiaddrs, a separate queue is used to perform this lookup.
|
|
95
|
+
*
|
|
96
|
+
* This config value controls the concurrency of that queue.
|
|
97
|
+
*
|
|
98
|
+
* @default 5
|
|
99
|
+
*/
|
|
100
|
+
providerLookupConcurrency?: number;
|
|
82
101
|
/**
|
|
83
102
|
* Components used by subclasses
|
|
84
103
|
*/
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AASH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAK3C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,IAAI,cAAc,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC9F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,UAAU,EAAE,UAAU,CAAA;IAEtB;;OAEG;IACH,SAAS,EAAE,SAAS,CAAA;IAEpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,EAAE,CAAA;IAE3B;;;;OAIG;IACH,UAAU,CAAC,EAAE,SAAS,EAAE,CAAA;IAExB;;;OAGG;IACH,YAAY,EAAE,KAAK,CAAC,CAAC,UAAU,EAAE,GAAG,KAAK,WAAW,CAAC,CAAA;IAErD;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB;;;OAGG;IACH,MAAM,CAAC,EAAE,eAAe,CAAA;IAExB;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAEjC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAEhC;;OAEG;IACH,GAAG,CAAC,EAAE,GAAG,CAAA;CACV;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AASH,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAK3C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,IAAI,cAAc,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAC9F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC1D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAA;AACjD,OAAO,KAAK,EAAE,eAAe,EAAU,MAAM,mBAAmB,CAAA;AAChE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAEpD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAEpE,OAAO,EAAE,eAAe,EAAE,KAAK,4BAA4B,EAAE,MAAM,uBAAuB,CAAA;AAC1F,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAE/C;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB;;OAEG;IACH,UAAU,EAAE,UAAU,CAAA;IAEtB;;OAEG;IACH,SAAS,EAAE,SAAS,CAAA;IAEpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,EAAE,CAAA;IAE3B;;;;OAIG;IACH,UAAU,CAAC,EAAE,SAAS,EAAE,CAAA;IAExB;;;OAGG;IACH,YAAY,EAAE,KAAK,CAAC,CAAC,UAAU,EAAE,GAAG,KAAK,WAAW,CAAC,CAAA;IAErD;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE,OAAO,CAAA;IAEpB;;;OAGG;IACH,MAAM,CAAC,EAAE,eAAe,CAAA;IAExB;;;OAGG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;IAEjC;;;;;;;;;;;;;;;OAeG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAA;IAElC;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAEhC;;OAEG;IACH,GAAG,CAAC,EAAE,GAAG,CAAA;CACV;AAaD,qBAAa,KAAM,YAAW,cAAc;IACnC,UAAU,EAAE,YAAY,CAAA;IACxB,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,IAAI,CAAA;IACV,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAA;IACrC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAA;IACxC,GAAG,EAAE,GAAG,CAAA;IACf,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;gBAEf,IAAI,EAAE,SAAS;IAqDtB,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IASvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAQtB,EAAE,CAAE,OAAO,GAAE,SAAc,GAAG,OAAO,CAAC,IAAI,CAAC;CA+BlD"}
|
package/dist/src/index.js
CHANGED
|
@@ -28,6 +28,8 @@ import { defaultDagWalkers } from './utils/dag-walkers.js';
|
|
|
28
28
|
import { assertDatastoreVersionIsCurrent } from './utils/datastore-version.js';
|
|
29
29
|
import { defaultHashers } from './utils/default-hashers.js';
|
|
30
30
|
import { NetworkedStorage } from './utils/networked-storage.js';
|
|
31
|
+
export { AbstractSession } from './abstract-session.js';
|
|
32
|
+
export { BloomFilter } from './bloom-filter.js';
|
|
31
33
|
export class Helia {
|
|
32
34
|
blockstore;
|
|
33
35
|
datastore;
|
|
@@ -44,6 +46,7 @@ export class Helia {
|
|
|
44
46
|
this.hashers = defaultHashers(init.hashers);
|
|
45
47
|
this.dagWalkers = defaultDagWalkers(init.dagWalkers);
|
|
46
48
|
this.dns = init.dns ?? dns();
|
|
49
|
+
// @ts-expect-error routing is not set
|
|
47
50
|
const components = {
|
|
48
51
|
blockstore: init.blockstore,
|
|
49
52
|
datastore: init.datastore,
|
|
@@ -54,16 +57,7 @@ export class Helia {
|
|
|
54
57
|
dns: this.dns,
|
|
55
58
|
...(init.components ?? {})
|
|
56
59
|
};
|
|
57
|
-
components.
|
|
58
|
-
return fn(components);
|
|
59
|
-
});
|
|
60
|
-
const networkedStorage = new NetworkedStorage(components);
|
|
61
|
-
this.pins = new PinsImpl(init.datastore, networkedStorage, this.dagWalkers);
|
|
62
|
-
this.blockstore = new BlockStorage(networkedStorage, this.pins, {
|
|
63
|
-
holdGcLock: init.holdGcLock ?? true
|
|
64
|
-
});
|
|
65
|
-
this.datastore = init.datastore;
|
|
66
|
-
this.routing = new RoutingClass(components, {
|
|
60
|
+
this.routing = components.routing = new RoutingClass(components, {
|
|
67
61
|
routers: (init.routers ?? []).flatMap((router) => {
|
|
68
62
|
// if the router itself is a router
|
|
69
63
|
const routers = [
|
|
@@ -78,7 +72,17 @@ export class Helia {
|
|
|
78
72
|
routers.push(router[peerRoutingSymbol]);
|
|
79
73
|
}
|
|
80
74
|
return routers;
|
|
81
|
-
})
|
|
75
|
+
}),
|
|
76
|
+
providerLookupConcurrency: init.providerLookupConcurrency
|
|
77
|
+
});
|
|
78
|
+
const networkedStorage = new NetworkedStorage(components);
|
|
79
|
+
this.pins = new PinsImpl(init.datastore, networkedStorage, this.dagWalkers);
|
|
80
|
+
this.blockstore = new BlockStorage(networkedStorage, this.pins, {
|
|
81
|
+
holdGcLock: init.holdGcLock ?? true
|
|
82
|
+
});
|
|
83
|
+
this.datastore = init.datastore;
|
|
84
|
+
components.blockBrokers = init.blockBrokers.map((fn) => {
|
|
85
|
+
return fn(components);
|
|
82
86
|
});
|
|
83
87
|
}
|
|
84
88
|
async start() {
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAA;AACxF,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,KAAK,MAAM,UAAU,CAAA;AAC5B,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAA;AACpC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,+BAA+B,EAAE,MAAM,8BAA8B,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/src/routing.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { AbortOptions, ComponentLogger, PeerId, PeerInfo, Startable } from
|
|
|
3
3
|
import type { CID } from 'multiformats/cid';
|
|
4
4
|
export interface RoutingInit {
|
|
5
5
|
routers: Array<Partial<RoutingInterface>>;
|
|
6
|
+
providerLookupConcurrency?: number;
|
|
6
7
|
}
|
|
7
8
|
export interface RoutingComponents {
|
|
8
9
|
logger: ComponentLogger;
|
|
@@ -10,11 +11,13 @@ export interface RoutingComponents {
|
|
|
10
11
|
export declare class Routing implements RoutingInterface, Startable {
|
|
11
12
|
private readonly log;
|
|
12
13
|
private readonly routers;
|
|
14
|
+
private readonly providerLookupConcurrency;
|
|
13
15
|
constructor(components: RoutingComponents, init: RoutingInit);
|
|
14
16
|
start(): Promise<void>;
|
|
15
17
|
stop(): Promise<void>;
|
|
16
18
|
/**
|
|
17
|
-
* Iterates over all content routers in parallel to find providers of the
|
|
19
|
+
* Iterates over all content routers in parallel to find providers of the
|
|
20
|
+
* given key
|
|
18
21
|
*/
|
|
19
22
|
findProviders(key: CID, options?: RoutingOptions): AsyncIterable<Provider>;
|
|
20
23
|
/**
|
|
@@ -1 +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;
|
|
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;AAI3C,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAA;IACzC,yBAAyB,CAAC,EAAE,MAAM,CAAA;CACnC;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;IAC1D,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAAQ;gBAErC,UAAU,EAAE,iBAAiB,EAAE,IAAI,EAAE,WAAW;IAMvD,KAAK,IAAK,OAAO,CAAC,IAAI,CAAC;IAIvB,IAAI,IAAK,OAAO,CAAC,IAAI,CAAC;IAI5B;;;OAGG;IACK,aAAa,CAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAE,cAAmB,GAAG,aAAa,CAAC,QAAQ,CAAC;IAkEvF;;;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;CAgBjG"}
|