@hashtree/worker 0.1.24 → 0.1.26
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/LICENSE +21 -0
- package/README.md +24 -0
- package/dist/capabilities/blossomTransport.d.ts +0 -2
- package/dist/capabilities/blossomTransport.d.ts.map +1 -1
- package/dist/capabilities/blossomTransport.js +2 -59
- package/dist/capabilities/blossomTransport.js.map +1 -1
- package/dist/capabilities/meshRouterStore.d.ts +71 -0
- package/dist/capabilities/meshRouterStore.d.ts.map +1 -0
- package/dist/capabilities/meshRouterStore.js +316 -0
- package/dist/capabilities/meshRouterStore.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/iris/worker.js +32 -83
- package/dist/iris/worker.js.map +1 -1
- package/dist/iris-client.d.ts +31 -0
- package/dist/iris-client.d.ts.map +1 -0
- package/dist/iris-client.js +197 -0
- package/dist/iris-client.js.map +1 -0
- package/dist/p2p/boundedQueue.d.ts +5 -0
- package/dist/p2p/boundedQueue.d.ts.map +1 -1
- package/dist/p2p/boundedQueue.js +22 -0
- package/dist/p2p/boundedQueue.js.map +1 -1
- package/dist/p2p/index.d.ts +1 -0
- package/dist/p2p/index.d.ts.map +1 -1
- package/dist/p2p/index.js +1 -0
- package/dist/p2p/index.js.map +1 -1
- package/dist/p2p/meshQueryRouter.d.ts +44 -0
- package/dist/p2p/meshQueryRouter.d.ts.map +1 -0
- package/dist/p2p/meshQueryRouter.js +228 -0
- package/dist/p2p/meshQueryRouter.js.map +1 -0
- package/dist/p2p/uploadRateLimiter.d.ts +21 -0
- package/dist/p2p/uploadRateLimiter.d.ts.map +1 -0
- package/dist/p2p/uploadRateLimiter.js +62 -0
- package/dist/p2p/uploadRateLimiter.js.map +1 -0
- package/dist/p2p/webrtcController.d.ts +3 -5
- package/dist/p2p/webrtcController.d.ts.map +1 -1
- package/dist/p2p/webrtcController.js +34 -108
- package/dist/p2p/webrtcController.js.map +1 -1
- package/dist/p2p/webrtcProxy.d.ts +8 -1
- package/dist/p2p/webrtcProxy.d.ts.map +1 -1
- package/dist/p2p/webrtcProxy.js +64 -8
- package/dist/p2p/webrtcProxy.js.map +1 -1
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +38 -27
- package/dist/worker.js.map +1 -1
- package/package.json +15 -11
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Sirius Business Ltd.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -26,6 +26,29 @@ const { hashHex } = await client.putBlob(data);
|
|
|
26
26
|
const { data: blob } = await client.getBlob(hashHex);
|
|
27
27
|
```
|
|
28
28
|
|
|
29
|
+
## Iris Worker Client
|
|
30
|
+
|
|
31
|
+
If you are using `@hashtree/worker/iris-entry?worker` and need Iris-specific tree-root
|
|
32
|
+
metadata or subscription calls, use the dedicated Iris wrapper:
|
|
33
|
+
|
|
34
|
+
```typescript
|
|
35
|
+
import { IrisWorkerClient } from '@hashtree/worker/iris-client';
|
|
36
|
+
import HashtreeWorker from '@hashtree/worker/iris-entry?worker';
|
|
37
|
+
|
|
38
|
+
const client = new IrisWorkerClient(HashtreeWorker, {
|
|
39
|
+
storeName: 'iris-sites-worker',
|
|
40
|
+
relays: ['wss://relay.damus.io'],
|
|
41
|
+
blossomServers: [{ url: 'https://upload.iris.to', read: false, write: true }],
|
|
42
|
+
pubkey: '336f319763657d6b0e65a5b5876719e8c8dcdcf9396852be71ee26b73368b29b',
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
await client.init();
|
|
46
|
+
const root = await client.getTreeRootInfo('npub1example', 'sites/example');
|
|
47
|
+
const stop = client.onTreeRootUpdate((update) => {
|
|
48
|
+
console.log(update.treeName, update.visibility);
|
|
49
|
+
});
|
|
50
|
+
```
|
|
51
|
+
|
|
29
52
|
## Iris-Compatible Runtime Defaults
|
|
30
53
|
|
|
31
54
|
When the app runs inside Iris or another shell that injects `window.__HTREE_SERVER_URL__`
|
|
@@ -112,6 +135,7 @@ That lets the service worker map fetches back to the correct worker port when mu
|
|
|
112
135
|
## Exports
|
|
113
136
|
|
|
114
137
|
- `@hashtree/worker` — `createHtreeRuntime`, `resolveRuntimeEndpoints`, and `HashtreeWorkerClient`
|
|
138
|
+
- `@hashtree/worker/iris-client` — `IrisWorkerClient` plus Iris-specific tree-root metadata types
|
|
115
139
|
- `@hashtree/worker/worker` — `attachHashtreeWorker(...)` for embedding the worker protocol into a custom worker
|
|
116
140
|
- `@hashtree/worker/p2p` — `WebRTCController` / `WebRTCProxy` for P2P data channel management
|
|
117
141
|
- `@hashtree/worker/entry` — Worker entry point
|
|
@@ -18,7 +18,5 @@ export declare class BlossomTransport {
|
|
|
18
18
|
createUploadStore(onUploadProgress?: BlossomUploadCallback): BlossomStore;
|
|
19
19
|
upload(hashHex: string, data: Uint8Array, _mimeType?: string, onUploadProgress?: BlossomUploadCallback): Promise<void>;
|
|
20
20
|
fetch(hashHex: string): Promise<Uint8Array | null>;
|
|
21
|
-
private fetchFromReadServers;
|
|
22
|
-
private fetchFromServer;
|
|
23
21
|
}
|
|
24
22
|
//# sourceMappingURL=blossomTransport.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blossomTransport.d.ts","sourceRoot":"","sources":["../../src/capabilities/blossomTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAEZ,KAAK,qBAAqB,
|
|
1
|
+
{"version":3,"file":"blossomTransport.d.ts","sourceRoot":"","sources":["../../src/capabilities/blossomTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAEZ,KAAK,qBAAqB,EAE3B,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,EACnC,MAAM,8BAA8B,CAAC;AAEtC,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,EAKxD,CAAC;AAOF,YAAY,EACV,2BAA2B,EAC3B,qBAAqB,EACrB,6BAA6B,GAC9B,MAAM,8BAA8B,CAAC;AA6EtC,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IACvC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA0B;IAC3D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiD;IACjF,OAAO,CAAC,KAAK,CAAe;gBAEhB,OAAO,CAAC,EAAE,mBAAmB,EAAE,EAAE,iBAAiB,CAAC,EAAE,6BAA6B;IAO9F,UAAU,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,IAAI;IAKhD,UAAU,IAAI,mBAAmB,EAAE;IAInC,eAAe,IAAI,mBAAmB,EAAE;IAIxC,iBAAiB,IAAI,qBAAqB;IAI1C,OAAO,CAAC,WAAW;IAWnB,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,qBAAqB,GAAG,YAAY;IAInE,MAAM,CACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,UAAU,EAChB,SAAS,CAAC,EAAE,MAAM,EAClB,gBAAgB,CAAC,EAAE,qBAAqB,GACvC,OAAO,CAAC,IAAI,CAAC;IAYV,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;CAazD"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BlossomStore,
|
|
1
|
+
import { BlossomStore, fromHex, } from '@hashtree/core';
|
|
2
2
|
import { finalizeEvent, generateSecretKey } from 'nostr-tools/pure';
|
|
3
3
|
import { BlossomBandwidthTracker, } from './blossomBandwidthTracker.js';
|
|
4
4
|
export const DEFAULT_BLOSSOM_SERVERS = [
|
|
@@ -7,7 +7,6 @@ export const DEFAULT_BLOSSOM_SERVERS = [
|
|
|
7
7
|
{ url: 'https://blossom.primal.net', read: true, write: false },
|
|
8
8
|
{ url: 'https://upload.iris.to', read: false, write: true },
|
|
9
9
|
];
|
|
10
|
-
const READ_FETCH_TIMEOUT_MS = 10_000;
|
|
11
10
|
const MAX_CONCURRENT_READ_FETCHES = 12;
|
|
12
11
|
let activeReadFetches = 0;
|
|
13
12
|
const pendingReadFetchWaiters = [];
|
|
@@ -134,68 +133,12 @@ export class BlossomTransport {
|
|
|
134
133
|
if (inflight) {
|
|
135
134
|
return inflight;
|
|
136
135
|
}
|
|
137
|
-
const pending = this.
|
|
136
|
+
const pending = withReadFetchSlot(() => this.store.get(fromHex(hashHex)))
|
|
138
137
|
.finally(() => {
|
|
139
138
|
this.inflightFetches.delete(hashHex);
|
|
140
139
|
});
|
|
141
140
|
this.inflightFetches.set(hashHex, pending);
|
|
142
141
|
return await pending;
|
|
143
142
|
}
|
|
144
|
-
async fetchFromReadServers(hashHex) {
|
|
145
|
-
const readServers = this.servers.filter(server => server.read !== false);
|
|
146
|
-
if (readServers.length === 0) {
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
const pendingFetches = readServers.map((server) => this.fetchFromServer(normalizeServerUrl(server.url), hashHex));
|
|
150
|
-
return await new Promise((resolve) => {
|
|
151
|
-
let settled = false;
|
|
152
|
-
let remaining = pendingFetches.length;
|
|
153
|
-
for (const fetchPromise of pendingFetches) {
|
|
154
|
-
fetchPromise
|
|
155
|
-
.then((result) => {
|
|
156
|
-
if (settled)
|
|
157
|
-
return;
|
|
158
|
-
if (result) {
|
|
159
|
-
settled = true;
|
|
160
|
-
resolve(result);
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
remaining -= 1;
|
|
164
|
-
if (remaining === 0) {
|
|
165
|
-
resolve(null);
|
|
166
|
-
}
|
|
167
|
-
})
|
|
168
|
-
.catch(() => {
|
|
169
|
-
if (settled)
|
|
170
|
-
return;
|
|
171
|
-
remaining -= 1;
|
|
172
|
-
if (remaining === 0) {
|
|
173
|
-
resolve(null);
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
});
|
|
178
|
-
}
|
|
179
|
-
async fetchFromServer(baseUrl, hashHex) {
|
|
180
|
-
return await withReadFetchSlot(async () => {
|
|
181
|
-
const url = `${baseUrl}/${hashHex}.bin`;
|
|
182
|
-
const controller = new AbortController();
|
|
183
|
-
const timeout = setTimeout(() => controller.abort(), READ_FETCH_TIMEOUT_MS);
|
|
184
|
-
try {
|
|
185
|
-
const res = await fetch(url, { signal: controller.signal });
|
|
186
|
-
if (!res.ok)
|
|
187
|
-
return null;
|
|
188
|
-
const data = new Uint8Array(await res.arrayBuffer());
|
|
189
|
-
const verified = toHex(await sha256(data)) === hashHex;
|
|
190
|
-
return verified ? data : null;
|
|
191
|
-
}
|
|
192
|
-
catch {
|
|
193
|
-
return null;
|
|
194
|
-
}
|
|
195
|
-
finally {
|
|
196
|
-
clearTimeout(timeout);
|
|
197
|
-
}
|
|
198
|
-
});
|
|
199
|
-
}
|
|
200
143
|
}
|
|
201
144
|
//# sourceMappingURL=blossomTransport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"blossomTransport.js","sourceRoot":"","sources":["../../src/capabilities/blossomTransport.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAGZ,
|
|
1
|
+
{"version":3,"file":"blossomTransport.js","sourceRoot":"","sources":["../../src/capabilities/blossomTransport.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { Hash, Store } from '@hashtree/core';
|
|
2
|
+
import { type RequestDispatchConfig } from '@hashtree/nostr';
|
|
3
|
+
export interface MeshReadSource {
|
|
4
|
+
id: string;
|
|
5
|
+
get(hash: Hash): Promise<Uint8Array | null>;
|
|
6
|
+
isAvailable?: () => boolean;
|
|
7
|
+
}
|
|
8
|
+
export interface MeshRouterGetOptions {
|
|
9
|
+
sourceIds?: readonly string[];
|
|
10
|
+
skipPrimary?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface MeshRouterGetResult {
|
|
13
|
+
data: Uint8Array;
|
|
14
|
+
sourceId: string;
|
|
15
|
+
}
|
|
16
|
+
export interface MeshRouterStoreConfig {
|
|
17
|
+
primary: Store;
|
|
18
|
+
sources?: MeshReadSource[];
|
|
19
|
+
dispatch?: RequestDispatchConfig;
|
|
20
|
+
requestTimeoutMs?: number;
|
|
21
|
+
primarySourceId?: string;
|
|
22
|
+
}
|
|
23
|
+
interface SourceStats {
|
|
24
|
+
requests: number;
|
|
25
|
+
successes: number;
|
|
26
|
+
misses: number;
|
|
27
|
+
failures: number;
|
|
28
|
+
timeouts: number;
|
|
29
|
+
srttMs: number;
|
|
30
|
+
rttvarMs: number;
|
|
31
|
+
backoffLevel: number;
|
|
32
|
+
backedOffUntilMs?: number;
|
|
33
|
+
lastSuccessMs?: number;
|
|
34
|
+
lastFailureMs?: number;
|
|
35
|
+
}
|
|
36
|
+
export declare class MeshRouterStore implements Store {
|
|
37
|
+
private readonly primary;
|
|
38
|
+
private readonly primarySourceId;
|
|
39
|
+
private readonly dispatch;
|
|
40
|
+
private readonly requestTimeoutMs;
|
|
41
|
+
private readonly sources;
|
|
42
|
+
private readonly statsBySource;
|
|
43
|
+
private readonly inflightReads;
|
|
44
|
+
constructor(config: MeshRouterStoreConfig);
|
|
45
|
+
setSources(sources: MeshReadSource[]): void;
|
|
46
|
+
addSource(source: MeshReadSource): void;
|
|
47
|
+
removeSource(sourceId: string): void;
|
|
48
|
+
getDetailed(hash: Hash, options?: MeshRouterGetOptions): Promise<MeshRouterGetResult | null>;
|
|
49
|
+
getSourceStats(): Record<string, SourceStats>;
|
|
50
|
+
put(hash: Hash, data: Uint8Array): Promise<boolean>;
|
|
51
|
+
get(hash: Hash): Promise<Uint8Array | null>;
|
|
52
|
+
has(hash: Hash): Promise<boolean>;
|
|
53
|
+
delete(hash: Hash): Promise<boolean>;
|
|
54
|
+
private pendingReadKey;
|
|
55
|
+
private getCandidateSources;
|
|
56
|
+
private orderedSources;
|
|
57
|
+
private shouldProbeMultipleSources;
|
|
58
|
+
private dispatchFor;
|
|
59
|
+
private createInFlightSourceRequest;
|
|
60
|
+
private waitForNextResult;
|
|
61
|
+
private loadFromSources;
|
|
62
|
+
private statsFor;
|
|
63
|
+
private recordRequest;
|
|
64
|
+
private recordMiss;
|
|
65
|
+
private recordSuccess;
|
|
66
|
+
private recordFailure;
|
|
67
|
+
private recordTimeout;
|
|
68
|
+
private applyBackoff;
|
|
69
|
+
}
|
|
70
|
+
export {};
|
|
71
|
+
//# sourceMappingURL=meshRouterStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meshRouterStore.d.ts","sourceRoot":"","sources":["../../src/capabilities/meshRouterStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { toHex } from '@hashtree/core';
|
|
2
|
+
import { buildHedgedWavePlan, normalizeDispatchConfig, } from '@hashtree/nostr';
|
|
3
|
+
const DEFAULT_DISPATCH = {
|
|
4
|
+
initialFanout: 1,
|
|
5
|
+
hedgeFanout: 1,
|
|
6
|
+
maxFanout: 4,
|
|
7
|
+
hedgeIntervalMs: 75,
|
|
8
|
+
};
|
|
9
|
+
const DEFAULT_REQUEST_TIMEOUT_MS = 5_500;
|
|
10
|
+
const INITIAL_BACKOFF_MS = 250;
|
|
11
|
+
const MAX_BACKOFF_MS = 10_000;
|
|
12
|
+
const SCORE_TIE_DELTA = 0.15;
|
|
13
|
+
function defaultStats() {
|
|
14
|
+
return {
|
|
15
|
+
requests: 0,
|
|
16
|
+
successes: 0,
|
|
17
|
+
misses: 0,
|
|
18
|
+
failures: 0,
|
|
19
|
+
timeouts: 0,
|
|
20
|
+
srttMs: 0,
|
|
21
|
+
rttvarMs: 0,
|
|
22
|
+
backoffLevel: 0,
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function reliabilityScore(stats) {
|
|
26
|
+
return (stats.successes + 1) / (stats.requests + 2);
|
|
27
|
+
}
|
|
28
|
+
function latencyScore(stats) {
|
|
29
|
+
if (stats.srttMs <= 0)
|
|
30
|
+
return 0.5;
|
|
31
|
+
return Math.min(1, 500 / (stats.srttMs + 50));
|
|
32
|
+
}
|
|
33
|
+
function hasHistory(stats) {
|
|
34
|
+
return stats.requests > 0 || stats.successes > 0 || stats.misses > 0 || stats.failures > 0 || stats.timeouts > 0;
|
|
35
|
+
}
|
|
36
|
+
function scoreSource(stats, now) {
|
|
37
|
+
if (stats.backedOffUntilMs && stats.backedOffUntilMs > now) {
|
|
38
|
+
return Number.NEGATIVE_INFINITY;
|
|
39
|
+
}
|
|
40
|
+
const missPenalty = stats.requests > 0 ? (stats.misses / stats.requests) * 0.15 : 0;
|
|
41
|
+
const failurePenalty = stats.requests > 0 ? ((stats.failures + stats.timeouts) / stats.requests) * 0.3 : 0;
|
|
42
|
+
const recencyBonus = stats.lastSuccessMs && now - stats.lastSuccessMs < 60_000
|
|
43
|
+
? 0.1
|
|
44
|
+
: 0;
|
|
45
|
+
return (0.6 * reliabilityScore(stats) +
|
|
46
|
+
0.3 * latencyScore(stats) +
|
|
47
|
+
recencyBonus -
|
|
48
|
+
missPenalty -
|
|
49
|
+
failurePenalty);
|
|
50
|
+
}
|
|
51
|
+
export class MeshRouterStore {
|
|
52
|
+
primary;
|
|
53
|
+
primarySourceId;
|
|
54
|
+
dispatch;
|
|
55
|
+
requestTimeoutMs;
|
|
56
|
+
sources = new Map();
|
|
57
|
+
statsBySource = new Map();
|
|
58
|
+
inflightReads = new Map();
|
|
59
|
+
constructor(config) {
|
|
60
|
+
this.primary = config.primary;
|
|
61
|
+
this.primarySourceId = config.primarySourceId ?? 'primary';
|
|
62
|
+
this.dispatch = config.dispatch ?? DEFAULT_DISPATCH;
|
|
63
|
+
this.requestTimeoutMs = config.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
64
|
+
this.setSources(config.sources ?? []);
|
|
65
|
+
}
|
|
66
|
+
setSources(sources) {
|
|
67
|
+
this.sources.clear();
|
|
68
|
+
for (const source of sources) {
|
|
69
|
+
this.sources.set(source.id, source);
|
|
70
|
+
this.statsBySource.set(source.id, this.statsBySource.get(source.id) ?? defaultStats());
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
addSource(source) {
|
|
74
|
+
this.sources.set(source.id, source);
|
|
75
|
+
this.statsBySource.set(source.id, this.statsBySource.get(source.id) ?? defaultStats());
|
|
76
|
+
}
|
|
77
|
+
removeSource(sourceId) {
|
|
78
|
+
this.sources.delete(sourceId);
|
|
79
|
+
}
|
|
80
|
+
async getDetailed(hash, options = {}) {
|
|
81
|
+
if (!options.skipPrimary) {
|
|
82
|
+
const local = await this.primary.get(hash);
|
|
83
|
+
if (local) {
|
|
84
|
+
return { data: local, sourceId: this.primarySourceId };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
const pendingKey = this.pendingReadKey(hash, options);
|
|
88
|
+
let pending = this.inflightReads.get(pendingKey);
|
|
89
|
+
if (!pending) {
|
|
90
|
+
pending = this.loadFromSources(hash, options).finally(() => {
|
|
91
|
+
if (this.inflightReads.get(pendingKey) === pending) {
|
|
92
|
+
this.inflightReads.delete(pendingKey);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
this.inflightReads.set(pendingKey, pending);
|
|
96
|
+
}
|
|
97
|
+
return pending;
|
|
98
|
+
}
|
|
99
|
+
getSourceStats() {
|
|
100
|
+
return Object.fromEntries(Array.from(this.statsBySource.entries()).map(([sourceId, stats]) => [sourceId, { ...stats }]));
|
|
101
|
+
}
|
|
102
|
+
async put(hash, data) {
|
|
103
|
+
return this.primary.put(hash, data);
|
|
104
|
+
}
|
|
105
|
+
async get(hash) {
|
|
106
|
+
return (await this.getDetailed(hash))?.data ?? null;
|
|
107
|
+
}
|
|
108
|
+
async has(hash) {
|
|
109
|
+
return this.primary.has(hash);
|
|
110
|
+
}
|
|
111
|
+
async delete(hash) {
|
|
112
|
+
return this.primary.delete(hash);
|
|
113
|
+
}
|
|
114
|
+
pendingReadKey(hash, options) {
|
|
115
|
+
const sourceKey = options.sourceIds && options.sourceIds.length > 0
|
|
116
|
+
? [...options.sourceIds].sort().join(',')
|
|
117
|
+
: '*';
|
|
118
|
+
return `${toHex(hash)}:${options.skipPrimary === true ? 'skip-primary' : 'with-primary'}:${sourceKey}`;
|
|
119
|
+
}
|
|
120
|
+
getCandidateSources(sourceIds) {
|
|
121
|
+
const requested = sourceIds && sourceIds.length > 0
|
|
122
|
+
? new Set(sourceIds)
|
|
123
|
+
: null;
|
|
124
|
+
const available = Array.from(this.sources.values()).filter((source) => {
|
|
125
|
+
if (requested && !requested.has(source.id))
|
|
126
|
+
return false;
|
|
127
|
+
return source.isAvailable ? source.isAvailable() : true;
|
|
128
|
+
});
|
|
129
|
+
if (available.length === 0)
|
|
130
|
+
return [];
|
|
131
|
+
const now = Date.now();
|
|
132
|
+
const healthy = available.filter((source) => {
|
|
133
|
+
const stats = this.statsBySource.get(source.id) ?? defaultStats();
|
|
134
|
+
return !stats.backedOffUntilMs || stats.backedOffUntilMs <= now;
|
|
135
|
+
});
|
|
136
|
+
return healthy.length > 0 ? healthy : available;
|
|
137
|
+
}
|
|
138
|
+
orderedSources(sourceIds) {
|
|
139
|
+
const now = Date.now();
|
|
140
|
+
const candidates = this.getCandidateSources(sourceIds);
|
|
141
|
+
return candidates.sort((left, right) => {
|
|
142
|
+
const leftStats = this.statsBySource.get(left.id) ?? defaultStats();
|
|
143
|
+
const rightStats = this.statsBySource.get(right.id) ?? defaultStats();
|
|
144
|
+
const scoreDiff = scoreSource(rightStats, now) - scoreSource(leftStats, now);
|
|
145
|
+
if (scoreDiff !== 0)
|
|
146
|
+
return scoreDiff;
|
|
147
|
+
return left.id.localeCompare(right.id);
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
shouldProbeMultipleSources(orderedSources) {
|
|
151
|
+
if (orderedSources.length <= 1)
|
|
152
|
+
return false;
|
|
153
|
+
const [best, secondBest] = orderedSources;
|
|
154
|
+
const bestStats = this.statsBySource.get(best.id) ?? defaultStats();
|
|
155
|
+
const secondStats = this.statsBySource.get(secondBest.id) ?? defaultStats();
|
|
156
|
+
if (!hasHistory(bestStats) || !hasHistory(secondStats)) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
const now = Date.now();
|
|
160
|
+
const diff = scoreSource(bestStats, now) - scoreSource(secondStats, now);
|
|
161
|
+
return diff < SCORE_TIE_DELTA;
|
|
162
|
+
}
|
|
163
|
+
dispatchFor(sourceCount, orderedSources) {
|
|
164
|
+
const probeMultiple = this.shouldProbeMultipleSources(orderedSources);
|
|
165
|
+
const initialFanout = probeMultiple
|
|
166
|
+
? Math.min(sourceCount, 2)
|
|
167
|
+
: 1;
|
|
168
|
+
return {
|
|
169
|
+
initialFanout,
|
|
170
|
+
hedgeFanout: this.dispatch.hedgeFanout,
|
|
171
|
+
maxFanout: Math.min(this.dispatch.maxFanout, sourceCount),
|
|
172
|
+
hedgeIntervalMs: this.dispatch.hedgeIntervalMs,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
createInFlightSourceRequest(source, hash) {
|
|
176
|
+
const startedAt = Date.now();
|
|
177
|
+
this.recordRequest(source.id);
|
|
178
|
+
const task = {
|
|
179
|
+
source,
|
|
180
|
+
settled: false,
|
|
181
|
+
timeoutRecorded: false,
|
|
182
|
+
promise: Promise.resolve({ sourceId: source.id, data: null }),
|
|
183
|
+
};
|
|
184
|
+
task.promise = source.get(hash)
|
|
185
|
+
.then(async (data) => {
|
|
186
|
+
const elapsedMs = Math.max(1, Date.now() - startedAt);
|
|
187
|
+
if (data) {
|
|
188
|
+
this.recordSuccess(source.id, elapsedMs);
|
|
189
|
+
await this.primary.put(hash, data).catch(() => false);
|
|
190
|
+
return { sourceId: source.id, data };
|
|
191
|
+
}
|
|
192
|
+
if (!task.timeoutRecorded) {
|
|
193
|
+
this.recordMiss(source.id);
|
|
194
|
+
}
|
|
195
|
+
return { sourceId: source.id, data: null };
|
|
196
|
+
})
|
|
197
|
+
.catch(() => {
|
|
198
|
+
if (!task.timeoutRecorded) {
|
|
199
|
+
this.recordFailure(source.id);
|
|
200
|
+
}
|
|
201
|
+
return { sourceId: source.id, data: null };
|
|
202
|
+
});
|
|
203
|
+
return task;
|
|
204
|
+
}
|
|
205
|
+
async waitForNextResult(inFlight, waitMs) {
|
|
206
|
+
const active = inFlight.filter((task) => !task.settled);
|
|
207
|
+
if (active.length === 0 || waitMs <= 0)
|
|
208
|
+
return null;
|
|
209
|
+
const timeout = new Promise((resolve) => {
|
|
210
|
+
setTimeout(() => resolve(null), waitMs);
|
|
211
|
+
});
|
|
212
|
+
const result = await Promise.race([
|
|
213
|
+
timeout,
|
|
214
|
+
...active.map((task) => task.promise.then((value) => ({ task, ...value }))),
|
|
215
|
+
]);
|
|
216
|
+
if (!result)
|
|
217
|
+
return null;
|
|
218
|
+
result.task.settled = true;
|
|
219
|
+
return result;
|
|
220
|
+
}
|
|
221
|
+
async loadFromSources(hash, options) {
|
|
222
|
+
const orderedSources = this.orderedSources(options.sourceIds);
|
|
223
|
+
if (orderedSources.length === 0) {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
const dispatch = normalizeDispatchConfig(this.dispatchFor(orderedSources.length, orderedSources), orderedSources.length);
|
|
227
|
+
const wavePlan = buildHedgedWavePlan(orderedSources.length, dispatch);
|
|
228
|
+
if (wavePlan.length === 0)
|
|
229
|
+
return null;
|
|
230
|
+
const deadline = Date.now() + this.requestTimeoutMs;
|
|
231
|
+
const inFlight = [];
|
|
232
|
+
let nextSourceIdx = 0;
|
|
233
|
+
for (let waveIdx = 0; waveIdx < wavePlan.length; waveIdx++) {
|
|
234
|
+
const waveSize = wavePlan[waveIdx];
|
|
235
|
+
const from = nextSourceIdx;
|
|
236
|
+
const to = Math.min(from + waveSize, orderedSources.length);
|
|
237
|
+
nextSourceIdx = to;
|
|
238
|
+
for (const source of orderedSources.slice(from, to)) {
|
|
239
|
+
inFlight.push(this.createInFlightSourceRequest(source, hash));
|
|
240
|
+
}
|
|
241
|
+
const isLastWave = waveIdx === wavePlan.length - 1 || nextSourceIdx >= orderedSources.length;
|
|
242
|
+
const windowEnd = isLastWave
|
|
243
|
+
? deadline
|
|
244
|
+
: Math.min(deadline, Date.now() + dispatch.hedgeIntervalMs);
|
|
245
|
+
while (Date.now() < windowEnd) {
|
|
246
|
+
const remaining = windowEnd - Date.now();
|
|
247
|
+
const result = await this.waitForNextResult(inFlight, remaining);
|
|
248
|
+
if (!result)
|
|
249
|
+
break;
|
|
250
|
+
if (result.data) {
|
|
251
|
+
return {
|
|
252
|
+
data: result.data,
|
|
253
|
+
sourceId: result.sourceId,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
if (Date.now() >= deadline) {
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
for (const task of inFlight) {
|
|
262
|
+
if (task.settled)
|
|
263
|
+
continue;
|
|
264
|
+
task.timeoutRecorded = true;
|
|
265
|
+
this.recordTimeout(task.source.id);
|
|
266
|
+
}
|
|
267
|
+
return null;
|
|
268
|
+
}
|
|
269
|
+
statsFor(sourceId) {
|
|
270
|
+
const stats = this.statsBySource.get(sourceId);
|
|
271
|
+
if (stats)
|
|
272
|
+
return stats;
|
|
273
|
+
const created = defaultStats();
|
|
274
|
+
this.statsBySource.set(sourceId, created);
|
|
275
|
+
return created;
|
|
276
|
+
}
|
|
277
|
+
recordRequest(sourceId) {
|
|
278
|
+
this.statsFor(sourceId).requests += 1;
|
|
279
|
+
}
|
|
280
|
+
recordMiss(sourceId) {
|
|
281
|
+
this.statsFor(sourceId).misses += 1;
|
|
282
|
+
}
|
|
283
|
+
recordSuccess(sourceId, elapsedMs) {
|
|
284
|
+
const stats = this.statsFor(sourceId);
|
|
285
|
+
const now = Date.now();
|
|
286
|
+
stats.successes += 1;
|
|
287
|
+
stats.lastSuccessMs = now;
|
|
288
|
+
stats.backoffLevel = 0;
|
|
289
|
+
stats.backedOffUntilMs = undefined;
|
|
290
|
+
if (stats.srttMs === 0) {
|
|
291
|
+
stats.srttMs = elapsedMs;
|
|
292
|
+
stats.rttvarMs = elapsedMs / 2;
|
|
293
|
+
return;
|
|
294
|
+
}
|
|
295
|
+
stats.rttvarMs = 0.75 * stats.rttvarMs + 0.25 * Math.abs(stats.srttMs - elapsedMs);
|
|
296
|
+
stats.srttMs = 0.875 * stats.srttMs + 0.125 * elapsedMs;
|
|
297
|
+
}
|
|
298
|
+
recordFailure(sourceId) {
|
|
299
|
+
const stats = this.statsFor(sourceId);
|
|
300
|
+
stats.failures += 1;
|
|
301
|
+
stats.lastFailureMs = Date.now();
|
|
302
|
+
this.applyBackoff(stats);
|
|
303
|
+
}
|
|
304
|
+
recordTimeout(sourceId) {
|
|
305
|
+
const stats = this.statsFor(sourceId);
|
|
306
|
+
stats.timeouts += 1;
|
|
307
|
+
stats.lastFailureMs = Date.now();
|
|
308
|
+
this.applyBackoff(stats);
|
|
309
|
+
}
|
|
310
|
+
applyBackoff(stats) {
|
|
311
|
+
stats.backoffLevel += 1;
|
|
312
|
+
const backoffMs = Math.min(MAX_BACKOFF_MS, INITIAL_BACKOFF_MS * (2 ** Math.max(0, stats.backoffLevel - 1)));
|
|
313
|
+
stats.backedOffUntilMs = Date.now() + backoffMs;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=meshRouterStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meshRouterStore.js","sourceRoot":"","sources":["../../src/capabilities/meshRouterStore.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { HashtreeWorkerClient } from './client.js';
|
|
2
2
|
export type { WorkerFactory, P2PFetchHandler } from './client.js';
|
|
3
|
+
export { IrisWorkerClient } from './iris-client.js';
|
|
4
|
+
export type { TreeRootInfo as IrisTreeRootInfo, TreeRootUpdate as IrisTreeRootUpdate, IrisWorkerConfig, IrisWorkerRequest, IrisWorkerResponse, } from './iris-client.js';
|
|
3
5
|
export { canUseInjectedHtreeServerUrl, canUseSameOriginHtreeProtocolStreaming, getInjectedHtreeServerUrl, resolveRuntimeHtreeBaseUrl, shouldEagerLoadMediaInNativeChildRuntime, shouldPreferSameOriginHtreeRoutes, } from './runtime.js';
|
|
4
6
|
export type { HtreeRuntimeLocationLike, HtreeRuntimeWindowLike, ResolveRuntimeHtreeBaseUrlOptions, } from './runtime.js';
|
|
5
7
|
export { resolveRuntimeEndpoints, } from './runtime-network.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EACL,4BAA4B,EAC5B,sCAAsC,EACtC,yBAAyB,EACzB,0BAA0B,EAC1B,wCAAwC,EACxC,iCAAiC,GAClC,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,wBAAwB,EACxB,sBAAsB,EACtB,iCAAiC,GAClC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,8BAA8B,EAC9B,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EACV,YAAY,EACZ,6BAA6B,EAC7B,4BAA4B,EAC5B,2BAA2B,EAC3B,mBAAmB,EACnB,6BAA6B,EAC7B,+BAA+B,EAC/B,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,wBAAwB,EACxB,cAAc,EACd,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,2BAA2B,EAC3B,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,YAAY,EACV,YAAY,IAAI,gBAAgB,EAChC,cAAc,IAAI,kBAAkB,EACpC,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,4BAA4B,EAC5B,sCAAsC,EACtC,yBAAyB,EACzB,0BAA0B,EAC1B,wCAAwC,EACxC,iCAAiC,GAClC,MAAM,cAAc,CAAC;AACtB,YAAY,EACV,wBAAwB,EACxB,sBAAsB,EACtB,iCAAiC,GAClC,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,8BAA8B,EAC9B,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,YAAY,EACV,YAAY,EACZ,6BAA6B,EAC7B,4BAA4B,EAC5B,2BAA2B,EAC3B,mBAAmB,EACnB,6BAA6B,EAC7B,+BAA+B,EAC/B,kBAAkB,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AACxB,YAAY,EACV,wBAAwB,EACxB,cAAc,EACd,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,wBAAwB,EAAE,MAAM,gBAAgB,CAAC;AAC/D,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EACrB,2BAA2B,EAC3B,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { HashtreeWorkerClient } from './client.js';
|
|
2
|
+
export { IrisWorkerClient } from './iris-client.js';
|
|
2
3
|
export { canUseInjectedHtreeServerUrl, canUseSameOriginHtreeProtocolStreaming, getInjectedHtreeServerUrl, resolveRuntimeHtreeBaseUrl, shouldEagerLoadMediaInNativeChildRuntime, shouldPreferSameOriginHtreeRoutes, } from './runtime.js';
|
|
3
4
|
export { resolveRuntimeEndpoints, } from './runtime-network.js';
|
|
4
5
|
export { createHtreeRuntime } from './app-runtime.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EACL,4BAA4B,EAC5B,sCAAsC,EACtC,yBAAyB,EACzB,0BAA0B,EAC1B,wCAAwC,EACxC,iCAAiC,GAClC,MAAM,cAAc,CAAC;AAMtB,OAAO,EACL,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAWtD,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAsBxB,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAQpD,OAAO,EACL,4BAA4B,EAC5B,sCAAsC,EACtC,yBAAyB,EACzB,0BAA0B,EAC1B,wCAAwC,EACxC,iCAAiC,GAClC,MAAM,cAAc,CAAC;AAMtB,OAAO,EACL,uBAAuB,GACxB,MAAM,sBAAsB,CAAC;AAK9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAWtD,OAAO,EACL,qBAAqB,EACrB,aAAa,EACb,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAsBxB,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,gBAAgB,CAAC"}
|