@hashtree/worker 0.2.1 → 0.2.3
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/dist/app-runtime.d.ts +60 -0
- package/dist/app-runtime.d.ts.map +1 -0
- package/dist/app-runtime.js +271 -0
- package/dist/app-runtime.js.map +1 -0
- package/dist/capabilities/blossomBandwidthTracker.d.ts +26 -0
- package/dist/capabilities/blossomBandwidthTracker.d.ts.map +1 -0
- package/dist/capabilities/blossomBandwidthTracker.js +53 -0
- package/dist/capabilities/blossomBandwidthTracker.js.map +1 -0
- package/dist/capabilities/blossomTransport.d.ts +22 -0
- package/dist/capabilities/blossomTransport.d.ts.map +1 -0
- package/dist/capabilities/blossomTransport.js +139 -0
- package/dist/capabilities/blossomTransport.js.map +1 -0
- package/dist/capabilities/connectivity.d.ts +3 -0
- package/dist/capabilities/connectivity.d.ts.map +1 -0
- package/dist/capabilities/connectivity.js +49 -0
- package/dist/capabilities/connectivity.js.map +1 -0
- package/dist/capabilities/idbStorage.d.ts +25 -0
- package/dist/capabilities/idbStorage.d.ts.map +1 -0
- package/dist/capabilities/idbStorage.js +73 -0
- package/dist/capabilities/idbStorage.js.map +1 -0
- 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/capabilities/rootResolver.d.ts +10 -0
- package/dist/capabilities/rootResolver.d.ts.map +1 -0
- package/dist/capabilities/rootResolver.js +392 -0
- package/dist/capabilities/rootResolver.js.map +1 -0
- package/dist/client-id.d.ts +18 -0
- package/dist/client-id.d.ts.map +1 -0
- package/dist/client-id.js +98 -0
- package/dist/client-id.js.map +1 -0
- package/dist/client.d.ts +61 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +417 -0
- package/dist/client.js.map +1 -0
- package/dist/entry.d.ts +2 -0
- package/dist/entry.d.ts.map +1 -0
- package/dist/entry.js +3 -0
- package/dist/entry.js.map +1 -0
- package/dist/htree-path.d.ts +13 -0
- package/dist/htree-path.d.ts.map +1 -0
- package/dist/htree-path.js +38 -0
- package/dist/htree-path.js.map +1 -0
- package/dist/htree-url.d.ts +22 -0
- package/dist/htree-url.d.ts.map +1 -0
- package/dist/htree-url.js +118 -0
- package/dist/htree-url.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/mediaStreaming.d.ts +7 -0
- package/dist/mediaStreaming.d.ts.map +1 -0
- package/dist/mediaStreaming.js +48 -0
- package/dist/mediaStreaming.js.map +1 -0
- package/dist/p2p/boundedQueue.d.ts +79 -0
- package/dist/p2p/boundedQueue.d.ts.map +1 -0
- package/dist/p2p/boundedQueue.js +134 -0
- package/dist/p2p/boundedQueue.js.map +1 -0
- package/dist/p2p/errorMessage.d.ts +5 -0
- package/dist/p2p/errorMessage.d.ts.map +1 -0
- package/dist/p2p/errorMessage.js +7 -0
- package/dist/p2p/errorMessage.js.map +1 -0
- package/dist/p2p/index.d.ts +8 -0
- package/dist/p2p/index.d.ts.map +1 -0
- package/dist/p2p/index.js +6 -0
- package/dist/p2p/index.js.map +1 -0
- package/dist/p2p/lruCache.d.ts +26 -0
- package/dist/p2p/lruCache.d.ts.map +1 -0
- package/dist/p2p/lruCache.js +65 -0
- package/dist/p2p/lruCache.js.map +1 -0
- package/dist/p2p/meshQueryRouter.d.ts +57 -0
- package/dist/p2p/meshQueryRouter.d.ts.map +1 -0
- package/dist/p2p/meshQueryRouter.js +264 -0
- package/dist/p2p/meshQueryRouter.js.map +1 -0
- package/dist/p2p/protocol.d.ts +10 -0
- package/dist/p2p/protocol.d.ts.map +1 -0
- package/dist/p2p/protocol.js +2 -0
- package/dist/p2p/protocol.js.map +1 -0
- package/dist/p2p/queryForwardingMachine.d.ts +46 -0
- package/dist/p2p/queryForwardingMachine.d.ts.map +1 -0
- package/dist/p2p/queryForwardingMachine.js +144 -0
- package/dist/p2p/queryForwardingMachine.js.map +1 -0
- package/dist/p2p/signaling.d.ts +63 -0
- package/dist/p2p/signaling.d.ts.map +1 -0
- package/dist/p2p/signaling.js +185 -0
- package/dist/p2p/signaling.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 +176 -0
- package/dist/p2p/webrtcController.d.ts.map +1 -0
- package/dist/p2p/webrtcController.js +938 -0
- package/dist/p2p/webrtcController.js.map +1 -0
- package/dist/p2p/webrtcProxy.d.ts +62 -0
- package/dist/p2p/webrtcProxy.d.ts.map +1 -0
- package/dist/p2p/webrtcProxy.js +447 -0
- package/dist/p2p/webrtcProxy.js.map +1 -0
- package/dist/privacyGuards.d.ts +14 -0
- package/dist/privacyGuards.d.ts.map +1 -0
- package/dist/privacyGuards.js +27 -0
- package/dist/privacyGuards.js.map +1 -0
- package/dist/protocol.d.ts +225 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +2 -0
- package/dist/protocol.js.map +1 -0
- package/dist/relay/identity.d.ts +36 -0
- package/dist/relay/identity.d.ts.map +1 -0
- package/dist/relay/identity.js +78 -0
- package/dist/relay/identity.js.map +1 -0
- package/dist/relay/mediaHandler.d.ts +64 -0
- package/dist/relay/mediaHandler.d.ts.map +1 -0
- package/dist/relay/mediaHandler.js +1285 -0
- package/dist/relay/mediaHandler.js.map +1 -0
- package/dist/relay/ndk.d.ts +96 -0
- package/dist/relay/ndk.d.ts.map +1 -0
- package/dist/relay/ndk.js +502 -0
- package/dist/relay/ndk.js.map +1 -0
- package/dist/relay/nostr-wasm.d.ts +14 -0
- package/dist/relay/nostr-wasm.d.ts.map +1 -0
- package/dist/relay/nostr-wasm.js +246 -0
- package/dist/relay/nostr-wasm.js.map +1 -0
- package/dist/relay/nostr.d.ts +60 -0
- package/dist/relay/nostr.d.ts.map +1 -0
- package/dist/relay/nostr.js +207 -0
- package/dist/relay/nostr.js.map +1 -0
- package/dist/relay/protocol.d.ts +592 -0
- package/dist/relay/protocol.d.ts.map +1 -0
- package/dist/relay/protocol.js +16 -0
- package/dist/relay/protocol.js.map +1 -0
- package/dist/relay/publicAssetUrl.d.ts +6 -0
- package/dist/relay/publicAssetUrl.d.ts.map +1 -0
- package/dist/relay/publicAssetUrl.js +14 -0
- package/dist/relay/publicAssetUrl.js.map +1 -0
- package/dist/relay/rootPathResolver.d.ts +9 -0
- package/dist/relay/rootPathResolver.d.ts.map +1 -0
- package/dist/relay/rootPathResolver.js +32 -0
- package/dist/relay/rootPathResolver.js.map +1 -0
- package/dist/relay/signing.d.ts +50 -0
- package/dist/relay/signing.d.ts.map +1 -0
- package/dist/relay/signing.js +299 -0
- package/dist/relay/signing.js.map +1 -0
- package/dist/relay/treeRootCache.d.ts +86 -0
- package/dist/relay/treeRootCache.d.ts.map +1 -0
- package/dist/relay/treeRootCache.js +269 -0
- package/dist/relay/treeRootCache.js.map +1 -0
- package/dist/relay/treeRootSubscription.d.ts +55 -0
- package/dist/relay/treeRootSubscription.d.ts.map +1 -0
- package/dist/relay/treeRootSubscription.js +478 -0
- package/dist/relay/treeRootSubscription.js.map +1 -0
- package/dist/relay/utils/constants.d.ts +76 -0
- package/dist/relay/utils/constants.d.ts.map +1 -0
- package/dist/relay/utils/constants.js +113 -0
- package/dist/relay/utils/constants.js.map +1 -0
- package/dist/relay/utils/errorMessage.d.ts +5 -0
- package/dist/relay/utils/errorMessage.d.ts.map +1 -0
- package/dist/relay/utils/errorMessage.js +8 -0
- package/dist/relay/utils/errorMessage.js.map +1 -0
- package/dist/relay/utils/lruCache.d.ts +26 -0
- package/dist/relay/utils/lruCache.d.ts.map +1 -0
- package/dist/relay/utils/lruCache.js +66 -0
- package/dist/relay/utils/lruCache.js.map +1 -0
- package/dist/relay/webrtc.d.ts +2 -0
- package/dist/relay/webrtc.d.ts.map +1 -0
- package/dist/relay/webrtc.js +3 -0
- package/dist/relay/webrtc.js.map +1 -0
- package/dist/relay/webrtcSignaling.d.ts +37 -0
- package/dist/relay/webrtcSignaling.d.ts.map +1 -0
- package/dist/relay/webrtcSignaling.js +86 -0
- package/dist/relay/webrtcSignaling.js.map +1 -0
- package/dist/relay/worker.d.ts +12 -0
- package/dist/relay/worker.d.ts.map +1 -0
- package/dist/relay/worker.js +1540 -0
- package/dist/relay/worker.js.map +1 -0
- package/dist/relay-client.d.ts +31 -0
- package/dist/relay-client.d.ts.map +1 -0
- package/dist/relay-client.js +197 -0
- package/dist/relay-client.js.map +1 -0
- package/dist/relay-entry.d.ts +2 -0
- package/dist/relay-entry.d.ts.map +1 -0
- package/dist/relay-entry.js +2 -0
- package/dist/relay-entry.js.map +1 -0
- package/dist/runtime-network.d.ts +23 -0
- package/dist/runtime-network.d.ts.map +1 -0
- package/dist/runtime-network.js +105 -0
- package/dist/runtime-network.js.map +1 -0
- package/dist/runtime.d.ts +24 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +126 -0
- package/dist/runtime.js.map +1 -0
- package/dist/transferableBytes.d.ts +2 -0
- package/dist/transferableBytes.d.ts.map +1 -0
- package/dist/transferableBytes.js +6 -0
- package/dist/transferableBytes.js.map +1 -0
- package/dist/tree-root.d.ts +201 -0
- package/dist/tree-root.d.ts.map +1 -0
- package/dist/tree-root.js +632 -0
- package/dist/tree-root.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/worker.d.ts +9 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +793 -0
- package/dist/worker.js.map +1 -0
- package/package.json +14 -14
- package/src/capabilities/blossomTransport.ts +1 -1
- package/src/worker.ts +2 -1
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
function getWindowLike(windowLike) {
|
|
2
|
+
if (windowLike)
|
|
3
|
+
return windowLike;
|
|
4
|
+
if (typeof window === 'undefined')
|
|
5
|
+
return null;
|
|
6
|
+
return window;
|
|
7
|
+
}
|
|
8
|
+
function normalizeBaseUrl(url) {
|
|
9
|
+
return (url ?? '').trim().replace(/\/$/, '');
|
|
10
|
+
}
|
|
11
|
+
function getQueryParam(name, windowLike) {
|
|
12
|
+
const runtimeWindow = getWindowLike(windowLike);
|
|
13
|
+
if (!runtimeWindow)
|
|
14
|
+
return null;
|
|
15
|
+
try {
|
|
16
|
+
const value = new URLSearchParams(runtimeWindow.location?.search ?? '').get(name);
|
|
17
|
+
return typeof value === 'string' ? value.trim() || null : null;
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function getPageProtocol(windowLike) {
|
|
24
|
+
const runtimeWindow = getWindowLike(windowLike);
|
|
25
|
+
const protocol = runtimeWindow?.location?.protocol;
|
|
26
|
+
return typeof protocol === 'string' ? protocol.toLowerCase() : null;
|
|
27
|
+
}
|
|
28
|
+
function getPageHostname(windowLike) {
|
|
29
|
+
const runtimeWindow = getWindowLike(windowLike);
|
|
30
|
+
const hostname = runtimeWindow?.location?.hostname;
|
|
31
|
+
return typeof hostname === 'string' ? hostname.toLowerCase() : null;
|
|
32
|
+
}
|
|
33
|
+
function hasCanonicalHtreeIdentity(windowLike) {
|
|
34
|
+
const runtimeWindow = getWindowLike(windowLike);
|
|
35
|
+
const injectedCanonical = runtimeWindow?.__HTREE_CANONICAL_URL__;
|
|
36
|
+
const canonical = typeof injectedCanonical === 'string' && injectedCanonical.trim()
|
|
37
|
+
? injectedCanonical.trim()
|
|
38
|
+
: getQueryParam('htree_canonical', windowLike);
|
|
39
|
+
return typeof canonical === 'string' && canonical.toLowerCase().startsWith('htree://');
|
|
40
|
+
}
|
|
41
|
+
function isLoopbackChildRuntime(windowLike) {
|
|
42
|
+
if (getPageProtocol(windowLike) !== 'http:')
|
|
43
|
+
return false;
|
|
44
|
+
const hostname = getPageHostname(windowLike);
|
|
45
|
+
if (!hostname)
|
|
46
|
+
return false;
|
|
47
|
+
return hostname === '127.0.0.1'
|
|
48
|
+
|| hostname === 'localhost'
|
|
49
|
+
|| hostname.endsWith('.htree.localhost');
|
|
50
|
+
}
|
|
51
|
+
function getServerProtocol(serverUrl) {
|
|
52
|
+
try {
|
|
53
|
+
return new URL(serverUrl).protocol.toLowerCase();
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function isLocalHttpServerUrl(serverUrl) {
|
|
60
|
+
try {
|
|
61
|
+
const parsed = new URL(serverUrl);
|
|
62
|
+
const hostname = parsed.hostname.toLowerCase();
|
|
63
|
+
return (parsed.protocol === 'http:' || parsed.protocol === 'https:')
|
|
64
|
+
&& (hostname === '127.0.0.1' || hostname === 'localhost' || hostname.endsWith('.htree.localhost'));
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
return false;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
function getWindowHtreeBaseUrl(windowLike) {
|
|
71
|
+
const runtimeWindow = getWindowLike(windowLike);
|
|
72
|
+
return normalizeBaseUrl(runtimeWindow?.htree?.htreeBaseUrl);
|
|
73
|
+
}
|
|
74
|
+
export function getInjectedHtreeServerUrl(windowLike) {
|
|
75
|
+
const runtimeWindow = getWindowLike(windowLike);
|
|
76
|
+
if (!runtimeWindow)
|
|
77
|
+
return null;
|
|
78
|
+
const override = runtimeWindow.__HTREE_SERVER_URL__;
|
|
79
|
+
const fallback = getQueryParam('htree_server', runtimeWindow);
|
|
80
|
+
const candidate = typeof override === 'string' && override.trim() ? override : fallback;
|
|
81
|
+
const normalized = normalizeBaseUrl(candidate);
|
|
82
|
+
return normalized || null;
|
|
83
|
+
}
|
|
84
|
+
export function shouldEagerLoadMediaInNativeChildRuntime(windowLike) {
|
|
85
|
+
return isLoopbackChildRuntime(windowLike) && hasCanonicalHtreeIdentity(windowLike);
|
|
86
|
+
}
|
|
87
|
+
export function shouldPreferSameOriginHtreeRoutes(windowLike) {
|
|
88
|
+
const serverUrl = getInjectedHtreeServerUrl(windowLike);
|
|
89
|
+
if (!serverUrl)
|
|
90
|
+
return false;
|
|
91
|
+
const serverProtocol = getServerProtocol(serverUrl);
|
|
92
|
+
if (serverProtocol !== 'http:')
|
|
93
|
+
return false;
|
|
94
|
+
const pageProtocol = getPageProtocol(windowLike);
|
|
95
|
+
if (pageProtocol === 'https:')
|
|
96
|
+
return true;
|
|
97
|
+
if (pageProtocol === 'htree:') {
|
|
98
|
+
const hostname = getPageHostname(windowLike);
|
|
99
|
+
return hostname?.startsWith('npub1') === true || hostname === 'self';
|
|
100
|
+
}
|
|
101
|
+
if (hasCanonicalHtreeIdentity(windowLike) && !isLoopbackChildRuntime(windowLike))
|
|
102
|
+
return true;
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
export function canUseInjectedHtreeServerUrl(windowLike) {
|
|
106
|
+
const serverUrl = getInjectedHtreeServerUrl(windowLike);
|
|
107
|
+
return !!serverUrl && !shouldPreferSameOriginHtreeRoutes(windowLike);
|
|
108
|
+
}
|
|
109
|
+
export function canUseSameOriginHtreeProtocolStreaming(windowLike) {
|
|
110
|
+
return getPageProtocol(windowLike) === 'htree:';
|
|
111
|
+
}
|
|
112
|
+
export function resolveRuntimeHtreeBaseUrl(options = {}) {
|
|
113
|
+
const { windowLike, fallbackBaseUrl } = options;
|
|
114
|
+
const injectedServerUrl = getInjectedHtreeServerUrl(windowLike);
|
|
115
|
+
if (injectedServerUrl && canUseInjectedHtreeServerUrl(windowLike)) {
|
|
116
|
+
return injectedServerUrl;
|
|
117
|
+
}
|
|
118
|
+
const windowBaseUrl = getWindowHtreeBaseUrl(windowLike);
|
|
119
|
+
if (windowBaseUrl) {
|
|
120
|
+
if (!isLocalHttpServerUrl(windowBaseUrl) || canUseInjectedHtreeServerUrl(windowLike)) {
|
|
121
|
+
return windowBaseUrl;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return normalizeBaseUrl(fallbackBaseUrl);
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transferableBytes.d.ts","sourceRoot":"","sources":["../src/transferableBytes.ts"],"names":[],"mappings":"AAEA,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAEpE"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// Worker replies may reuse bytes from caches or stores. Copy them before
|
|
2
|
+
// transfer so postMessage ownership changes do not detach the source buffer.
|
|
3
|
+
export function cloneTransferableBytes(bytes) {
|
|
4
|
+
return bytes.slice();
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=transferableBytes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transferableBytes.js","sourceRoot":"","sources":["../src/transferableBytes.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,6EAA6E;AAC7E,MAAM,UAAU,sBAAsB,CAAC,KAAiB;IACtD,OAAO,KAAK,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TreeRootRegistry - Browser-side single source of truth for tree root data
|
|
3
|
+
*
|
|
4
|
+
* This module provides:
|
|
5
|
+
* - Unified record format for all root data
|
|
6
|
+
* - Subscription API that emits cached data immediately, then updates
|
|
7
|
+
* - Async resolve with timeout for waiting on first resolution
|
|
8
|
+
* - Local write tracking with dirty flag for publish throttling
|
|
9
|
+
* - Pluggable persistence (localStorage by default)
|
|
10
|
+
*
|
|
11
|
+
* This module lives under @hashtree/worker because it coordinates with worker
|
|
12
|
+
* updates and publish flows, but it runs on the app/main thread.
|
|
13
|
+
*/
|
|
14
|
+
import type { Hash, TreeVisibility } from '@hashtree/core';
|
|
15
|
+
/**
|
|
16
|
+
* Source of the tree root update
|
|
17
|
+
*/
|
|
18
|
+
export type TreeRootSource = 'local-write' | 'nostr' | 'prefetch' | 'worker';
|
|
19
|
+
/**
|
|
20
|
+
* Core record format - single source of truth for all root data
|
|
21
|
+
*/
|
|
22
|
+
export interface TreeRootRecord {
|
|
23
|
+
hash: Hash;
|
|
24
|
+
key?: Hash;
|
|
25
|
+
visibility: TreeVisibility;
|
|
26
|
+
labels?: string[];
|
|
27
|
+
updatedAt: number;
|
|
28
|
+
source: TreeRootSource;
|
|
29
|
+
dirty: boolean;
|
|
30
|
+
encryptedKey?: string;
|
|
31
|
+
keyId?: string;
|
|
32
|
+
selfEncryptedKey?: string;
|
|
33
|
+
selfEncryptedLinkKey?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Listener callback type
|
|
37
|
+
*/
|
|
38
|
+
type Listener = (record: TreeRootRecord | null) => void;
|
|
39
|
+
/**
|
|
40
|
+
* Persistence interface - allows swapping localStorage for IndexedDB/etc
|
|
41
|
+
*/
|
|
42
|
+
export interface RegistryPersistence {
|
|
43
|
+
save(key: string, record: TreeRootRecord): void;
|
|
44
|
+
load(key: string): TreeRootRecord | null;
|
|
45
|
+
delete(key: string): void;
|
|
46
|
+
loadAll(): Map<string, TreeRootRecord>;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* TreeRootRegistry - singleton class for managing tree root data
|
|
50
|
+
*/
|
|
51
|
+
declare class TreeRootRegistryImpl {
|
|
52
|
+
private records;
|
|
53
|
+
private listeners;
|
|
54
|
+
private globalListeners;
|
|
55
|
+
private persistence;
|
|
56
|
+
private publishTimers;
|
|
57
|
+
private publishFn;
|
|
58
|
+
private publishDelay;
|
|
59
|
+
private retryDelay;
|
|
60
|
+
constructor(persistence?: RegistryPersistence);
|
|
61
|
+
/**
|
|
62
|
+
* Hydrate from persistence on startup
|
|
63
|
+
*/
|
|
64
|
+
private hydrate;
|
|
65
|
+
/**
|
|
66
|
+
* Set the publish function (called with throttling for dirty records)
|
|
67
|
+
*/
|
|
68
|
+
setPublishFn(fn: (npub: string, treeName: string, record: TreeRootRecord) => Promise<boolean>): void;
|
|
69
|
+
/**
|
|
70
|
+
* Build cache key from npub and treeName
|
|
71
|
+
*/
|
|
72
|
+
private makeKey;
|
|
73
|
+
/**
|
|
74
|
+
* Notify listeners of a record change
|
|
75
|
+
*/
|
|
76
|
+
private notify;
|
|
77
|
+
private shouldAcceptUpdate;
|
|
78
|
+
private mergeSameHashMetadata;
|
|
79
|
+
/**
|
|
80
|
+
* Sync lookup - returns cached record or null (no side effects)
|
|
81
|
+
*/
|
|
82
|
+
get(npub: string, treeName: string): TreeRootRecord | null;
|
|
83
|
+
/**
|
|
84
|
+
* Get by key directly
|
|
85
|
+
*/
|
|
86
|
+
getByKey(key: string): TreeRootRecord | null;
|
|
87
|
+
/**
|
|
88
|
+
* Async resolve - returns current record if cached, otherwise waits for first resolve
|
|
89
|
+
*/
|
|
90
|
+
resolve(npub: string, treeName: string, options?: {
|
|
91
|
+
timeoutMs?: number;
|
|
92
|
+
}): Promise<TreeRootRecord | null>;
|
|
93
|
+
/**
|
|
94
|
+
* Subscribe to updates for a specific tree
|
|
95
|
+
* Emits current snapshot immediately if available, then future updates
|
|
96
|
+
*/
|
|
97
|
+
subscribe(npub: string, treeName: string, callback: Listener): () => void;
|
|
98
|
+
/**
|
|
99
|
+
* Subscribe to all registry updates (for bridges like Tauri/worker)
|
|
100
|
+
*/
|
|
101
|
+
subscribeAll(callback: (key: string, record: TreeRootRecord | null) => void): () => void;
|
|
102
|
+
/**
|
|
103
|
+
* Set record from local write - marks dirty and schedules publish
|
|
104
|
+
*/
|
|
105
|
+
setLocal(npub: string, treeName: string, hash: Hash, options?: {
|
|
106
|
+
key?: Hash;
|
|
107
|
+
visibility?: TreeVisibility;
|
|
108
|
+
labels?: string[];
|
|
109
|
+
encryptedKey?: string;
|
|
110
|
+
keyId?: string;
|
|
111
|
+
selfEncryptedKey?: string;
|
|
112
|
+
selfEncryptedLinkKey?: string;
|
|
113
|
+
}): void;
|
|
114
|
+
/**
|
|
115
|
+
* Set record from resolver (Nostr event) - only updates if newer
|
|
116
|
+
*/
|
|
117
|
+
setFromResolver(npub: string, treeName: string, hash: Hash, updatedAt: number, options?: {
|
|
118
|
+
key?: Hash;
|
|
119
|
+
visibility?: TreeVisibility;
|
|
120
|
+
labels?: string[];
|
|
121
|
+
encryptedKey?: string;
|
|
122
|
+
keyId?: string;
|
|
123
|
+
selfEncryptedKey?: string;
|
|
124
|
+
selfEncryptedLinkKey?: string;
|
|
125
|
+
}): boolean;
|
|
126
|
+
/**
|
|
127
|
+
* Merge a decrypted key into an existing record without changing updatedAt/source.
|
|
128
|
+
* Returns true if the record was updated.
|
|
129
|
+
*/
|
|
130
|
+
mergeKey(npub: string, treeName: string, hash: Hash, key: Hash): boolean;
|
|
131
|
+
/**
|
|
132
|
+
* Set record from worker (Nostr subscription routed through worker)
|
|
133
|
+
* Similar to setFromResolver but source is 'worker'
|
|
134
|
+
*/
|
|
135
|
+
setFromWorker(npub: string, treeName: string, hash: Hash, updatedAt: number, options?: {
|
|
136
|
+
key?: Hash;
|
|
137
|
+
visibility?: TreeVisibility;
|
|
138
|
+
labels?: string[];
|
|
139
|
+
encryptedKey?: string;
|
|
140
|
+
keyId?: string;
|
|
141
|
+
selfEncryptedKey?: string;
|
|
142
|
+
selfEncryptedLinkKey?: string;
|
|
143
|
+
}): boolean;
|
|
144
|
+
/**
|
|
145
|
+
* Set record from external source (Tauri, worker, prefetch)
|
|
146
|
+
*/
|
|
147
|
+
setFromExternal(npub: string, treeName: string, hash: Hash, source: TreeRootSource, options?: {
|
|
148
|
+
key?: Hash;
|
|
149
|
+
visibility?: TreeVisibility;
|
|
150
|
+
labels?: string[];
|
|
151
|
+
updatedAt?: number;
|
|
152
|
+
encryptedKey?: string;
|
|
153
|
+
keyId?: string;
|
|
154
|
+
selfEncryptedKey?: string;
|
|
155
|
+
selfEncryptedLinkKey?: string;
|
|
156
|
+
}): void;
|
|
157
|
+
/**
|
|
158
|
+
* Delete a record
|
|
159
|
+
*/
|
|
160
|
+
delete(npub: string, treeName: string): void;
|
|
161
|
+
/**
|
|
162
|
+
* Schedule a throttled publish
|
|
163
|
+
*/
|
|
164
|
+
private schedulePublish;
|
|
165
|
+
/**
|
|
166
|
+
* Execute the publish
|
|
167
|
+
*/
|
|
168
|
+
private doPublish;
|
|
169
|
+
/**
|
|
170
|
+
* Force immediate publish of all dirty records
|
|
171
|
+
*/
|
|
172
|
+
flushPendingPublishes(): Promise<void>;
|
|
173
|
+
/**
|
|
174
|
+
* Cancel pending publish (call before delete to prevent "undelete")
|
|
175
|
+
*/
|
|
176
|
+
cancelPendingPublish(npub: string, treeName: string): void;
|
|
177
|
+
/**
|
|
178
|
+
* Get all records (for debugging/migration)
|
|
179
|
+
*/
|
|
180
|
+
getAllRecords(): Map<string, TreeRootRecord>;
|
|
181
|
+
/**
|
|
182
|
+
* Check if a record exists
|
|
183
|
+
*/
|
|
184
|
+
has(npub: string, treeName: string): boolean;
|
|
185
|
+
/**
|
|
186
|
+
* Get visibility for a tree
|
|
187
|
+
*/
|
|
188
|
+
getVisibility(npub: string, treeName: string): TreeVisibility | undefined;
|
|
189
|
+
/**
|
|
190
|
+
* Get labels for a tree
|
|
191
|
+
*/
|
|
192
|
+
getLabels(npub: string, treeName: string): string[] | undefined;
|
|
193
|
+
}
|
|
194
|
+
declare global {
|
|
195
|
+
interface Window {
|
|
196
|
+
__treeRootRegistry?: TreeRootRegistryImpl;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
export declare const treeRootRegistry: TreeRootRegistryImpl;
|
|
200
|
+
export type { TreeRootRecord as TreeRootEntry };
|
|
201
|
+
//# sourceMappingURL=tree-root.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tree-root.d.ts","sourceRoot":"","sources":["../src/tree-root.ts"],"names":[],"mappings":"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"}
|