@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.
Files changed (212) hide show
  1. package/LICENSE +21 -0
  2. package/dist/app-runtime.d.ts +60 -0
  3. package/dist/app-runtime.d.ts.map +1 -0
  4. package/dist/app-runtime.js +271 -0
  5. package/dist/app-runtime.js.map +1 -0
  6. package/dist/capabilities/blossomBandwidthTracker.d.ts +26 -0
  7. package/dist/capabilities/blossomBandwidthTracker.d.ts.map +1 -0
  8. package/dist/capabilities/blossomBandwidthTracker.js +53 -0
  9. package/dist/capabilities/blossomBandwidthTracker.js.map +1 -0
  10. package/dist/capabilities/blossomTransport.d.ts +22 -0
  11. package/dist/capabilities/blossomTransport.d.ts.map +1 -0
  12. package/dist/capabilities/blossomTransport.js +139 -0
  13. package/dist/capabilities/blossomTransport.js.map +1 -0
  14. package/dist/capabilities/connectivity.d.ts +3 -0
  15. package/dist/capabilities/connectivity.d.ts.map +1 -0
  16. package/dist/capabilities/connectivity.js +49 -0
  17. package/dist/capabilities/connectivity.js.map +1 -0
  18. package/dist/capabilities/idbStorage.d.ts +25 -0
  19. package/dist/capabilities/idbStorage.d.ts.map +1 -0
  20. package/dist/capabilities/idbStorage.js +73 -0
  21. package/dist/capabilities/idbStorage.js.map +1 -0
  22. package/dist/capabilities/meshRouterStore.d.ts +71 -0
  23. package/dist/capabilities/meshRouterStore.d.ts.map +1 -0
  24. package/dist/capabilities/meshRouterStore.js +316 -0
  25. package/dist/capabilities/meshRouterStore.js.map +1 -0
  26. package/dist/capabilities/rootResolver.d.ts +10 -0
  27. package/dist/capabilities/rootResolver.d.ts.map +1 -0
  28. package/dist/capabilities/rootResolver.js +392 -0
  29. package/dist/capabilities/rootResolver.js.map +1 -0
  30. package/dist/client-id.d.ts +18 -0
  31. package/dist/client-id.d.ts.map +1 -0
  32. package/dist/client-id.js +98 -0
  33. package/dist/client-id.js.map +1 -0
  34. package/dist/client.d.ts +61 -0
  35. package/dist/client.d.ts.map +1 -0
  36. package/dist/client.js +417 -0
  37. package/dist/client.js.map +1 -0
  38. package/dist/entry.d.ts +2 -0
  39. package/dist/entry.d.ts.map +1 -0
  40. package/dist/entry.js +3 -0
  41. package/dist/entry.js.map +1 -0
  42. package/dist/htree-path.d.ts +13 -0
  43. package/dist/htree-path.d.ts.map +1 -0
  44. package/dist/htree-path.js +38 -0
  45. package/dist/htree-path.js.map +1 -0
  46. package/dist/htree-url.d.ts +22 -0
  47. package/dist/htree-url.d.ts.map +1 -0
  48. package/dist/htree-url.js +118 -0
  49. package/dist/htree-url.js.map +1 -0
  50. package/dist/index.d.ts +17 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +8 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/mediaStreaming.d.ts +7 -0
  55. package/dist/mediaStreaming.d.ts.map +1 -0
  56. package/dist/mediaStreaming.js +48 -0
  57. package/dist/mediaStreaming.js.map +1 -0
  58. package/dist/p2p/boundedQueue.d.ts +79 -0
  59. package/dist/p2p/boundedQueue.d.ts.map +1 -0
  60. package/dist/p2p/boundedQueue.js +134 -0
  61. package/dist/p2p/boundedQueue.js.map +1 -0
  62. package/dist/p2p/errorMessage.d.ts +5 -0
  63. package/dist/p2p/errorMessage.d.ts.map +1 -0
  64. package/dist/p2p/errorMessage.js +7 -0
  65. package/dist/p2p/errorMessage.js.map +1 -0
  66. package/dist/p2p/index.d.ts +8 -0
  67. package/dist/p2p/index.d.ts.map +1 -0
  68. package/dist/p2p/index.js +6 -0
  69. package/dist/p2p/index.js.map +1 -0
  70. package/dist/p2p/lruCache.d.ts +26 -0
  71. package/dist/p2p/lruCache.d.ts.map +1 -0
  72. package/dist/p2p/lruCache.js +65 -0
  73. package/dist/p2p/lruCache.js.map +1 -0
  74. package/dist/p2p/meshQueryRouter.d.ts +57 -0
  75. package/dist/p2p/meshQueryRouter.d.ts.map +1 -0
  76. package/dist/p2p/meshQueryRouter.js +264 -0
  77. package/dist/p2p/meshQueryRouter.js.map +1 -0
  78. package/dist/p2p/protocol.d.ts +10 -0
  79. package/dist/p2p/protocol.d.ts.map +1 -0
  80. package/dist/p2p/protocol.js +2 -0
  81. package/dist/p2p/protocol.js.map +1 -0
  82. package/dist/p2p/queryForwardingMachine.d.ts +46 -0
  83. package/dist/p2p/queryForwardingMachine.d.ts.map +1 -0
  84. package/dist/p2p/queryForwardingMachine.js +144 -0
  85. package/dist/p2p/queryForwardingMachine.js.map +1 -0
  86. package/dist/p2p/signaling.d.ts +63 -0
  87. package/dist/p2p/signaling.d.ts.map +1 -0
  88. package/dist/p2p/signaling.js +185 -0
  89. package/dist/p2p/signaling.js.map +1 -0
  90. package/dist/p2p/uploadRateLimiter.d.ts +21 -0
  91. package/dist/p2p/uploadRateLimiter.d.ts.map +1 -0
  92. package/dist/p2p/uploadRateLimiter.js +62 -0
  93. package/dist/p2p/uploadRateLimiter.js.map +1 -0
  94. package/dist/p2p/webrtcController.d.ts +176 -0
  95. package/dist/p2p/webrtcController.d.ts.map +1 -0
  96. package/dist/p2p/webrtcController.js +938 -0
  97. package/dist/p2p/webrtcController.js.map +1 -0
  98. package/dist/p2p/webrtcProxy.d.ts +62 -0
  99. package/dist/p2p/webrtcProxy.d.ts.map +1 -0
  100. package/dist/p2p/webrtcProxy.js +447 -0
  101. package/dist/p2p/webrtcProxy.js.map +1 -0
  102. package/dist/privacyGuards.d.ts +14 -0
  103. package/dist/privacyGuards.d.ts.map +1 -0
  104. package/dist/privacyGuards.js +27 -0
  105. package/dist/privacyGuards.js.map +1 -0
  106. package/dist/protocol.d.ts +225 -0
  107. package/dist/protocol.d.ts.map +1 -0
  108. package/dist/protocol.js +2 -0
  109. package/dist/protocol.js.map +1 -0
  110. package/dist/relay/identity.d.ts +36 -0
  111. package/dist/relay/identity.d.ts.map +1 -0
  112. package/dist/relay/identity.js +78 -0
  113. package/dist/relay/identity.js.map +1 -0
  114. package/dist/relay/mediaHandler.d.ts +64 -0
  115. package/dist/relay/mediaHandler.d.ts.map +1 -0
  116. package/dist/relay/mediaHandler.js +1285 -0
  117. package/dist/relay/mediaHandler.js.map +1 -0
  118. package/dist/relay/ndk.d.ts +96 -0
  119. package/dist/relay/ndk.d.ts.map +1 -0
  120. package/dist/relay/ndk.js +502 -0
  121. package/dist/relay/ndk.js.map +1 -0
  122. package/dist/relay/nostr-wasm.d.ts +14 -0
  123. package/dist/relay/nostr-wasm.d.ts.map +1 -0
  124. package/dist/relay/nostr-wasm.js +246 -0
  125. package/dist/relay/nostr-wasm.js.map +1 -0
  126. package/dist/relay/nostr.d.ts +60 -0
  127. package/dist/relay/nostr.d.ts.map +1 -0
  128. package/dist/relay/nostr.js +207 -0
  129. package/dist/relay/nostr.js.map +1 -0
  130. package/dist/relay/protocol.d.ts +592 -0
  131. package/dist/relay/protocol.d.ts.map +1 -0
  132. package/dist/relay/protocol.js +16 -0
  133. package/dist/relay/protocol.js.map +1 -0
  134. package/dist/relay/publicAssetUrl.d.ts +6 -0
  135. package/dist/relay/publicAssetUrl.d.ts.map +1 -0
  136. package/dist/relay/publicAssetUrl.js +14 -0
  137. package/dist/relay/publicAssetUrl.js.map +1 -0
  138. package/dist/relay/rootPathResolver.d.ts +9 -0
  139. package/dist/relay/rootPathResolver.d.ts.map +1 -0
  140. package/dist/relay/rootPathResolver.js +32 -0
  141. package/dist/relay/rootPathResolver.js.map +1 -0
  142. package/dist/relay/signing.d.ts +50 -0
  143. package/dist/relay/signing.d.ts.map +1 -0
  144. package/dist/relay/signing.js +299 -0
  145. package/dist/relay/signing.js.map +1 -0
  146. package/dist/relay/treeRootCache.d.ts +86 -0
  147. package/dist/relay/treeRootCache.d.ts.map +1 -0
  148. package/dist/relay/treeRootCache.js +269 -0
  149. package/dist/relay/treeRootCache.js.map +1 -0
  150. package/dist/relay/treeRootSubscription.d.ts +55 -0
  151. package/dist/relay/treeRootSubscription.d.ts.map +1 -0
  152. package/dist/relay/treeRootSubscription.js +478 -0
  153. package/dist/relay/treeRootSubscription.js.map +1 -0
  154. package/dist/relay/utils/constants.d.ts +76 -0
  155. package/dist/relay/utils/constants.d.ts.map +1 -0
  156. package/dist/relay/utils/constants.js +113 -0
  157. package/dist/relay/utils/constants.js.map +1 -0
  158. package/dist/relay/utils/errorMessage.d.ts +5 -0
  159. package/dist/relay/utils/errorMessage.d.ts.map +1 -0
  160. package/dist/relay/utils/errorMessage.js +8 -0
  161. package/dist/relay/utils/errorMessage.js.map +1 -0
  162. package/dist/relay/utils/lruCache.d.ts +26 -0
  163. package/dist/relay/utils/lruCache.d.ts.map +1 -0
  164. package/dist/relay/utils/lruCache.js +66 -0
  165. package/dist/relay/utils/lruCache.js.map +1 -0
  166. package/dist/relay/webrtc.d.ts +2 -0
  167. package/dist/relay/webrtc.d.ts.map +1 -0
  168. package/dist/relay/webrtc.js +3 -0
  169. package/dist/relay/webrtc.js.map +1 -0
  170. package/dist/relay/webrtcSignaling.d.ts +37 -0
  171. package/dist/relay/webrtcSignaling.d.ts.map +1 -0
  172. package/dist/relay/webrtcSignaling.js +86 -0
  173. package/dist/relay/webrtcSignaling.js.map +1 -0
  174. package/dist/relay/worker.d.ts +12 -0
  175. package/dist/relay/worker.d.ts.map +1 -0
  176. package/dist/relay/worker.js +1540 -0
  177. package/dist/relay/worker.js.map +1 -0
  178. package/dist/relay-client.d.ts +31 -0
  179. package/dist/relay-client.d.ts.map +1 -0
  180. package/dist/relay-client.js +197 -0
  181. package/dist/relay-client.js.map +1 -0
  182. package/dist/relay-entry.d.ts +2 -0
  183. package/dist/relay-entry.d.ts.map +1 -0
  184. package/dist/relay-entry.js +2 -0
  185. package/dist/relay-entry.js.map +1 -0
  186. package/dist/runtime-network.d.ts +23 -0
  187. package/dist/runtime-network.d.ts.map +1 -0
  188. package/dist/runtime-network.js +105 -0
  189. package/dist/runtime-network.js.map +1 -0
  190. package/dist/runtime.d.ts +24 -0
  191. package/dist/runtime.d.ts.map +1 -0
  192. package/dist/runtime.js +126 -0
  193. package/dist/runtime.js.map +1 -0
  194. package/dist/transferableBytes.d.ts +2 -0
  195. package/dist/transferableBytes.d.ts.map +1 -0
  196. package/dist/transferableBytes.js +6 -0
  197. package/dist/transferableBytes.js.map +1 -0
  198. package/dist/tree-root.d.ts +201 -0
  199. package/dist/tree-root.d.ts.map +1 -0
  200. package/dist/tree-root.js +632 -0
  201. package/dist/tree-root.js.map +1 -0
  202. package/dist/types.d.ts +2 -0
  203. package/dist/types.d.ts.map +1 -0
  204. package/dist/types.js +2 -0
  205. package/dist/types.js.map +1 -0
  206. package/dist/worker.d.ts +9 -0
  207. package/dist/worker.d.ts.map +1 -0
  208. package/dist/worker.js +793 -0
  209. package/dist/worker.js.map +1 -0
  210. package/package.json +14 -14
  211. package/src/capabilities/blossomTransport.ts +1 -1
  212. package/src/worker.ts +2 -1
@@ -0,0 +1,185 @@
1
+ export const SIGNALING_KIND = 25050;
2
+ export const HELLO_TAG = 'hello';
3
+ export const MAX_EVENT_AGE_SEC = 30;
4
+ const HELLO_EXPIRATION_SEC = 5 * 60;
5
+ function getSince(nowMs, maxEventAgeSec) {
6
+ return Math.floor((nowMs - maxEventAgeSec * 1000) / 1000);
7
+ }
8
+ function isExpired(event, nowSec, maxEventAgeSec) {
9
+ const createdAt = event.created_at ?? 0;
10
+ if (nowSec - createdAt > maxEventAgeSec) {
11
+ return true;
12
+ }
13
+ const expirationTag = event.tags.find((tag) => tag[0] === 'expiration');
14
+ if (expirationTag?.[1]) {
15
+ const expiration = Number.parseInt(expirationTag[1], 10);
16
+ if (Number.isFinite(expiration) && expiration < nowSec) {
17
+ return true;
18
+ }
19
+ }
20
+ return false;
21
+ }
22
+ function normalizePeerEndpoint(value, senderPubkey) {
23
+ const trimmed = value.trim();
24
+ if (!trimmed)
25
+ return senderPubkey;
26
+ return trimmed.includes(':') ? senderPubkey : trimmed;
27
+ }
28
+ function normalizeSignalingMessage(raw, senderPubkey) {
29
+ if (!raw || typeof raw !== 'object' || !('type' in raw))
30
+ return null;
31
+ const msg = raw;
32
+ if (typeof msg.type !== 'string')
33
+ return null;
34
+ if (typeof msg.peerId === 'string' && msg.type === 'hello') {
35
+ return {
36
+ ...msg,
37
+ peerId: senderPubkey,
38
+ };
39
+ }
40
+ if ('targetPeerId' in msg &&
41
+ typeof msg.targetPeerId === 'string' &&
42
+ typeof msg.peerId === 'string') {
43
+ return {
44
+ ...msg,
45
+ peerId: senderPubkey,
46
+ targetPeerId: normalizePeerEndpoint(msg.targetPeerId, senderPubkey),
47
+ };
48
+ }
49
+ if (!('recipient' in msg) || typeof msg.recipient !== 'string' || typeof msg.peerId !== 'string') {
50
+ return null;
51
+ }
52
+ const senderPeerId = senderPubkey;
53
+ const targetPeerId = normalizePeerEndpoint(msg.recipient, senderPubkey);
54
+ switch (msg.type) {
55
+ case 'offer': {
56
+ const offer = msg.offer;
57
+ const sdp = typeof offer === 'string' ? offer : offer?.sdp;
58
+ return sdp ? { type: 'offer', peerId: senderPeerId, targetPeerId, sdp } : null;
59
+ }
60
+ case 'answer': {
61
+ const answer = msg.answer;
62
+ const sdp = typeof answer === 'string' ? answer : answer?.sdp;
63
+ return sdp ? { type: 'answer', peerId: senderPeerId, targetPeerId, sdp } : null;
64
+ }
65
+ case 'candidate': {
66
+ const candidateObj = msg.candidate;
67
+ const candidate = typeof candidateObj === 'string' ? candidateObj : candidateObj?.candidate;
68
+ return candidate
69
+ ? {
70
+ type: 'candidate',
71
+ peerId: senderPeerId,
72
+ targetPeerId,
73
+ candidate,
74
+ sdpMLineIndex: typeof candidateObj === 'object' ? candidateObj?.sdpMLineIndex : undefined,
75
+ sdpMid: typeof candidateObj === 'object' ? candidateObj?.sdpMid : undefined,
76
+ }
77
+ : null;
78
+ }
79
+ case 'candidates': {
80
+ const candidates = Array.isArray(msg.candidates)
81
+ ? msg.candidates
82
+ .map((entry) => {
83
+ if (typeof entry === 'string') {
84
+ return { candidate: entry };
85
+ }
86
+ if (entry && typeof entry === 'object') {
87
+ const candidateEntry = entry;
88
+ if (typeof candidateEntry.candidate === 'string') {
89
+ return {
90
+ candidate: candidateEntry.candidate,
91
+ sdpMLineIndex: candidateEntry.sdpMLineIndex,
92
+ sdpMid: candidateEntry.sdpMid,
93
+ };
94
+ }
95
+ }
96
+ return null;
97
+ })
98
+ .filter((entry) => !!entry)
99
+ : [];
100
+ return { type: 'candidates', peerId: senderPeerId, targetPeerId, candidates };
101
+ }
102
+ default:
103
+ return null;
104
+ }
105
+ }
106
+ export function createSignalingFilters(myPubkey, nowMs = Date.now(), maxEventAgeSec = MAX_EVENT_AGE_SEC) {
107
+ const since = getSince(nowMs, maxEventAgeSec);
108
+ return {
109
+ since,
110
+ helloFilter: {
111
+ kinds: [SIGNALING_KIND],
112
+ '#l': [HELLO_TAG],
113
+ since,
114
+ },
115
+ directedFilter: {
116
+ kinds: [SIGNALING_KIND],
117
+ '#p': [myPubkey],
118
+ since,
119
+ },
120
+ };
121
+ }
122
+ export async function sendSignalingMessage({ msg, recipientPubkey, signEvent, giftWrap, publish, nowMs = () => Date.now(), }) {
123
+ if (recipientPubkey) {
124
+ const wrappedEvent = await giftWrap({
125
+ kind: SIGNALING_KIND,
126
+ content: JSON.stringify(msg),
127
+ tags: [],
128
+ }, recipientPubkey);
129
+ await publish(wrappedEvent);
130
+ return;
131
+ }
132
+ const createdAt = Math.floor(nowMs() / 1000);
133
+ const event = await signEvent({
134
+ kind: SIGNALING_KIND,
135
+ created_at: createdAt,
136
+ tags: [
137
+ ['l', HELLO_TAG],
138
+ ['peerId', msg.peerId],
139
+ ['expiration', String(createdAt + HELLO_EXPIRATION_SEC)],
140
+ ],
141
+ content: '',
142
+ });
143
+ await publish(event);
144
+ }
145
+ export async function decodeSignalingEvent({ event, giftUnwrap, nowMs = () => Date.now(), maxEventAgeSec = MAX_EVENT_AGE_SEC, }) {
146
+ const nowSec = nowMs() / 1000;
147
+ if (isExpired(event, nowSec, maxEventAgeSec)) {
148
+ return null;
149
+ }
150
+ const isHello = event.tags.some((tag) => tag[0] === 'l' && tag[1] === HELLO_TAG);
151
+ if (isHello) {
152
+ const peerIdTag = event.tags.find((tag) => tag[0] === 'peerId');
153
+ if (!peerIdTag?.[1])
154
+ return null;
155
+ const senderPeerId = normalizePeerEndpoint(event.pubkey, event.pubkey);
156
+ if (normalizePeerEndpoint(peerIdTag[1], event.pubkey) !== senderPeerId) {
157
+ return null;
158
+ }
159
+ return {
160
+ senderPubkey: event.pubkey,
161
+ message: {
162
+ type: 'hello',
163
+ peerId: senderPeerId,
164
+ },
165
+ };
166
+ }
167
+ const seal = await giftUnwrap(event);
168
+ if (!seal?.content) {
169
+ return null;
170
+ }
171
+ try {
172
+ const raw = JSON.parse(seal.content);
173
+ const message = normalizeSignalingMessage(raw, seal.pubkey);
174
+ if (!message)
175
+ return null;
176
+ return {
177
+ senderPubkey: seal.pubkey,
178
+ message,
179
+ };
180
+ }
181
+ catch {
182
+ return null;
183
+ }
184
+ }
185
+ //# sourceMappingURL=signaling.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signaling.js","sourceRoot":"","sources":["../../src/p2p/signaling.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ type UploadRateLimiterConfig = {
2
+ bytesPerSecond?: number | null;
3
+ now?: () => number;
4
+ };
5
+ type UploadReservation = {
6
+ allowed: boolean;
7
+ delayMs: number;
8
+ };
9
+ export declare class UploadRateLimiter {
10
+ private bytesPerSecond;
11
+ private availableBytes;
12
+ private lastRefillMs;
13
+ private readonly now;
14
+ constructor(config?: UploadRateLimiterConfig);
15
+ setBytesPerSecond(bytesPerSecond?: number | null): void;
16
+ getBytesPerSecond(): number | null;
17
+ reserve(byteLength: number): UploadReservation;
18
+ private refill;
19
+ }
20
+ export {};
21
+ //# sourceMappingURL=uploadRateLimiter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploadRateLimiter.d.ts","sourceRoot":"","sources":["../../src/p2p/uploadRateLimiter.ts"],"names":[],"mappings":"AAAA,KAAK,uBAAuB,GAAG;IAC7B,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB,CAAC;AAEF,KAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AASF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,cAAc,CAAgB;IACtC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEvB,MAAM,GAAE,uBAA4B;IAOhD,iBAAiB,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAUvD,iBAAiB,IAAI,MAAM,GAAG,IAAI;IAIlC,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,iBAAiB;IAyB9C,OAAO,CAAC,MAAM;CAef"}
@@ -0,0 +1,62 @@
1
+ function normalizeBytesPerSecond(value) {
2
+ if (!Number.isFinite(value) || !value || value <= 0) {
3
+ return null;
4
+ }
5
+ return Math.floor(value);
6
+ }
7
+ export class UploadRateLimiter {
8
+ bytesPerSecond;
9
+ availableBytes;
10
+ lastRefillMs;
11
+ now;
12
+ constructor(config = {}) {
13
+ this.now = config.now ?? (() => performance.now());
14
+ this.bytesPerSecond = normalizeBytesPerSecond(config.bytesPerSecond);
15
+ this.availableBytes = this.bytesPerSecond ?? Number.POSITIVE_INFINITY;
16
+ this.lastRefillMs = this.now();
17
+ }
18
+ setBytesPerSecond(bytesPerSecond) {
19
+ const nowMs = this.now();
20
+ this.refill(nowMs);
21
+ this.bytesPerSecond = normalizeBytesPerSecond(bytesPerSecond);
22
+ this.availableBytes = this.bytesPerSecond
23
+ ? Math.min(this.availableBytes, this.bytesPerSecond)
24
+ : Number.POSITIVE_INFINITY;
25
+ this.lastRefillMs = nowMs;
26
+ }
27
+ getBytesPerSecond() {
28
+ return this.bytesPerSecond;
29
+ }
30
+ reserve(byteLength) {
31
+ if (byteLength <= 0) {
32
+ return { allowed: true, delayMs: 0 };
33
+ }
34
+ const limit = this.bytesPerSecond;
35
+ if (!limit) {
36
+ return { allowed: true, delayMs: 0 };
37
+ }
38
+ const nowMs = this.now();
39
+ this.refill(nowMs);
40
+ if (this.availableBytes >= byteLength) {
41
+ this.availableBytes = Math.max(0, this.availableBytes - byteLength);
42
+ return { allowed: true, delayMs: 0 };
43
+ }
44
+ const missingBytes = byteLength - this.availableBytes;
45
+ return {
46
+ allowed: false,
47
+ delayMs: Math.max(4, Math.ceil((missingBytes / limit) * 1000)),
48
+ };
49
+ }
50
+ refill(nowMs) {
51
+ const limit = this.bytesPerSecond;
52
+ if (!limit) {
53
+ this.availableBytes = Number.POSITIVE_INFINITY;
54
+ this.lastRefillMs = nowMs;
55
+ return;
56
+ }
57
+ const elapsedMs = Math.max(0, nowMs - this.lastRefillMs);
58
+ this.lastRefillMs = nowMs;
59
+ this.availableBytes = Math.min(limit, this.availableBytes + (elapsedMs * limit) / 1000);
60
+ }
61
+ }
62
+ //# sourceMappingURL=uploadRateLimiter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uploadRateLimiter.js","sourceRoot":"","sources":["../../src/p2p/uploadRateLimiter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * Worker WebRTC Controller
3
+ *
4
+ * Controls WebRTC connections from the worker thread.
5
+ * Main thread proxy executes RTCPeerConnection operations.
6
+ *
7
+ * Worker owns:
8
+ * - Peer state tracking
9
+ * - Connection lifecycle decisions
10
+ * - Data protocol (request/response)
11
+ * - Signaling message handling
12
+ *
13
+ * Main thread proxy owns:
14
+ * - RTCPeerConnection instances (not available in workers)
15
+ * - Data channel I/O
16
+ */
17
+ import type { Store } from '@hashtree/core';
18
+ import type { WebRTCCommand, WebRTCEvent } from './protocol.js';
19
+ import { type SignalingMessage, type PeerPool, type SelectionStrategy, type RequestDispatchConfig } from '@hashtree/nostr';
20
+ export interface WebRTCControllerConfig {
21
+ pubkey: string;
22
+ localStore: Store;
23
+ sendCommand: (cmd: WebRTCCommand) => void;
24
+ sendSignaling: (msg: SignalingMessage, recipientPubkey?: string) => Promise<void>;
25
+ upstreamFetch?: (hash: Uint8Array) => Promise<Uint8Array | null>;
26
+ getFollows?: () => Set<string>;
27
+ requestTimeout?: number;
28
+ forwardRateLimit?: {
29
+ maxForwardsPerPeerWindow?: number;
30
+ windowMs?: number;
31
+ };
32
+ requestSelectionStrategy?: SelectionStrategy;
33
+ requestFairnessEnabled?: boolean;
34
+ requestDispatch?: RequestDispatchConfig;
35
+ debug?: boolean;
36
+ }
37
+ export declare class WebRTCController {
38
+ private myPeerId;
39
+ private peers;
40
+ private pendingRemoteCandidates;
41
+ private localStore;
42
+ private sendCommand;
43
+ private sendSignaling;
44
+ private classifyPeer;
45
+ private requestTimeout;
46
+ private debug;
47
+ private recentRequests;
48
+ private readonly activePeerRequests;
49
+ private readonly meshRouter;
50
+ private readonly peerSelector;
51
+ private routing;
52
+ private poolConfig;
53
+ private helloInterval?;
54
+ private readonly HELLO_INTERVAL;
55
+ constructor(config: WebRTCControllerConfig);
56
+ start(): void;
57
+ stop(): void;
58
+ private sendHello;
59
+ /**
60
+ * Public method to trigger a hello broadcast.
61
+ * Used for testing to force peer discovery after follows are set up.
62
+ */
63
+ broadcastHello(): void;
64
+ /**
65
+ * Handle incoming signaling message (from Nostr kind 25050)
66
+ *
67
+ * `peerId` is the remote endpoint identity.
68
+ */
69
+ handleSignalingMessage(msg: SignalingMessage, senderPubkey: string): Promise<void>;
70
+ private isMessageForUs;
71
+ private handleHello;
72
+ private handleOffer;
73
+ private handleAnswer;
74
+ private handleIceCandidate;
75
+ private shouldConnect;
76
+ private getPoolCount;
77
+ /**
78
+ * Check if we already have a connection from this pubkey in the 'other' pool.
79
+ * In the 'other' pool, we only allow 1 connection per pubkey to prevent spam.
80
+ */
81
+ private hasOtherPoolPubkey;
82
+ private createPeer;
83
+ private createOutboundPeer;
84
+ private closePeer;
85
+ /**
86
+ * Handle event from main thread proxy
87
+ */
88
+ handleProxyEvent(event: WebRTCEvent): void;
89
+ private onPeerCreated;
90
+ private onPeerStateChange;
91
+ private onPeerClosed;
92
+ private onOfferCreated;
93
+ private onAnswerCreated;
94
+ private onDescriptionSet;
95
+ private onIceCandidate;
96
+ private onDataChannelOpen;
97
+ private onDataChannelClose;
98
+ private onDataChannelError;
99
+ private onBufferHigh;
100
+ private onBufferLow;
101
+ private processDeferredRequests;
102
+ private orderedConnectedPeers;
103
+ private peerMetadataPointerHash;
104
+ private createInFlightRequest;
105
+ private waitForInFlightResult;
106
+ private clearPendingHashFromPeers;
107
+ private reservePeerRequest;
108
+ private releasePeerRequest;
109
+ /**
110
+ * Persist selector metadata snapshot to local store.
111
+ * Returns the snapshot hash.
112
+ */
113
+ persistPeerMetadata(): Promise<Uint8Array | null>;
114
+ /**
115
+ * Load selector metadata snapshot from local store.
116
+ */
117
+ loadPeerMetadata(): Promise<boolean>;
118
+ private sendDataToPeer;
119
+ private onDataChannelMessage;
120
+ private handleRequest;
121
+ private processRequest;
122
+ private handleResponse;
123
+ private sendResponse;
124
+ private sendRequestToPeer;
125
+ private queryPeersWithDispatch;
126
+ /**
127
+ * Request data from peers
128
+ */
129
+ get(hash: Uint8Array): Promise<Uint8Array | null>;
130
+ /**
131
+ * Get peer stats for UI
132
+ */
133
+ getPeerStats(): Array<{
134
+ peerId: string;
135
+ pubkey: string;
136
+ connected: boolean;
137
+ pool: PeerPool;
138
+ requestsSent: number;
139
+ requestsReceived: number;
140
+ responsesSent: number;
141
+ responsesReceived: number;
142
+ bytesSent: number;
143
+ bytesReceived: number;
144
+ forwardedRequests: number;
145
+ forwardedResolved: number;
146
+ forwardedSuppressed: number;
147
+ }>;
148
+ /**
149
+ * Get connected peer count
150
+ */
151
+ getConnectedCount(): number;
152
+ /**
153
+ * Set pool configuration
154
+ */
155
+ setPoolConfig(config: {
156
+ follows: {
157
+ max: number;
158
+ satisfied: number;
159
+ };
160
+ other: {
161
+ max: number;
162
+ satisfied: number;
163
+ };
164
+ }): void;
165
+ setForwardRateLimit(config?: {
166
+ maxForwardsPerPeerWindow?: number;
167
+ windowMs?: number;
168
+ }): void;
169
+ /**
170
+ * Update identity (pubkey) and restart signaling if already running.
171
+ * This keeps peerId consistent with the current account.
172
+ */
173
+ setIdentity(pubkey: string): void;
174
+ private log;
175
+ }
176
+ //# sourceMappingURL=webrtcController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webrtcController.d.ts","sourceRoot":"","sources":["../../src/p2p/webrtcController.ts"],"names":[],"mappings":"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"}