@unicitylabs/nostr-js-sdk 0.0.1

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 (124) hide show
  1. package/README.md +290 -0
  2. package/dist/browser/index.js +8444 -0
  3. package/dist/browser/index.js.map +1 -0
  4. package/dist/browser/index.min.js +12 -0
  5. package/dist/browser/index.min.js.map +1 -0
  6. package/dist/browser/index.umd.js +8524 -0
  7. package/dist/browser/index.umd.js.map +1 -0
  8. package/dist/browser/index.umd.min.js +12 -0
  9. package/dist/browser/index.umd.min.js.map +1 -0
  10. package/dist/cjs/NostrKeyManager.js +265 -0
  11. package/dist/cjs/NostrKeyManager.js.map +1 -0
  12. package/dist/cjs/client/NostrClient.js +518 -0
  13. package/dist/cjs/client/NostrClient.js.map +1 -0
  14. package/dist/cjs/client/NostrEventListener.js +31 -0
  15. package/dist/cjs/client/NostrEventListener.js.map +1 -0
  16. package/dist/cjs/client/WebSocketAdapter.js +90 -0
  17. package/dist/cjs/client/WebSocketAdapter.js.map +1 -0
  18. package/dist/cjs/client/index.js +18 -0
  19. package/dist/cjs/client/index.js.map +1 -0
  20. package/dist/cjs/crypto/bech32.js +201 -0
  21. package/dist/cjs/crypto/bech32.js.map +1 -0
  22. package/dist/cjs/crypto/index.js +49 -0
  23. package/dist/cjs/crypto/index.js.map +1 -0
  24. package/dist/cjs/crypto/nip04.js +327 -0
  25. package/dist/cjs/crypto/nip04.js.map +1 -0
  26. package/dist/cjs/crypto/schnorr.js +101 -0
  27. package/dist/cjs/crypto/schnorr.js.map +1 -0
  28. package/dist/cjs/index.js +57 -0
  29. package/dist/cjs/index.js.map +1 -0
  30. package/dist/cjs/nametag/NametagBinding.js +196 -0
  31. package/dist/cjs/nametag/NametagBinding.js.map +1 -0
  32. package/dist/cjs/nametag/NametagUtils.js +156 -0
  33. package/dist/cjs/nametag/NametagUtils.js.map +1 -0
  34. package/dist/cjs/nametag/index.js +47 -0
  35. package/dist/cjs/nametag/index.js.map +1 -0
  36. package/dist/cjs/protocol/Event.js +209 -0
  37. package/dist/cjs/protocol/Event.js.map +1 -0
  38. package/dist/cjs/protocol/EventKinds.js +126 -0
  39. package/dist/cjs/protocol/EventKinds.js.map +1 -0
  40. package/dist/cjs/protocol/Filter.js +202 -0
  41. package/dist/cjs/protocol/Filter.js.map +1 -0
  42. package/dist/cjs/protocol/index.js +50 -0
  43. package/dist/cjs/protocol/index.js.map +1 -0
  44. package/dist/cjs/token/TokenTransferProtocol.js +196 -0
  45. package/dist/cjs/token/TokenTransferProtocol.js.map +1 -0
  46. package/dist/cjs/token/index.js +45 -0
  47. package/dist/cjs/token/index.js.map +1 -0
  48. package/dist/esm/NostrKeyManager.js +228 -0
  49. package/dist/esm/NostrKeyManager.js.map +1 -0
  50. package/dist/esm/client/NostrClient.js +481 -0
  51. package/dist/esm/client/NostrClient.js.map +1 -0
  52. package/dist/esm/client/NostrEventListener.js +27 -0
  53. package/dist/esm/client/NostrEventListener.js.map +1 -0
  54. package/dist/esm/client/WebSocketAdapter.js +52 -0
  55. package/dist/esm/client/WebSocketAdapter.js.map +1 -0
  56. package/dist/esm/client/index.js +7 -0
  57. package/dist/esm/client/index.js.map +1 -0
  58. package/dist/esm/crypto/bech32.js +193 -0
  59. package/dist/esm/crypto/bech32.js.map +1 -0
  60. package/dist/esm/crypto/index.js +10 -0
  61. package/dist/esm/crypto/index.js.map +1 -0
  62. package/dist/esm/crypto/nip04.js +286 -0
  63. package/dist/esm/crypto/nip04.js.map +1 -0
  64. package/dist/esm/crypto/schnorr.js +93 -0
  65. package/dist/esm/crypto/schnorr.js.map +1 -0
  66. package/dist/esm/index.js +32 -0
  67. package/dist/esm/index.js.map +1 -0
  68. package/dist/esm/nametag/NametagBinding.js +155 -0
  69. package/dist/esm/nametag/NametagBinding.js.map +1 -0
  70. package/dist/esm/nametag/NametagUtils.js +149 -0
  71. package/dist/esm/nametag/NametagUtils.js.map +1 -0
  72. package/dist/esm/nametag/index.js +8 -0
  73. package/dist/esm/nametag/index.js.map +1 -0
  74. package/dist/esm/protocol/Event.js +172 -0
  75. package/dist/esm/protocol/Event.js.map +1 -0
  76. package/dist/esm/protocol/EventKinds.js +119 -0
  77. package/dist/esm/protocol/EventKinds.js.map +1 -0
  78. package/dist/esm/protocol/Filter.js +197 -0
  79. package/dist/esm/protocol/Filter.js.map +1 -0
  80. package/dist/esm/protocol/index.js +8 -0
  81. package/dist/esm/protocol/index.js.map +1 -0
  82. package/dist/esm/token/TokenTransferProtocol.js +154 -0
  83. package/dist/esm/token/TokenTransferProtocol.js.map +1 -0
  84. package/dist/esm/token/index.js +6 -0
  85. package/dist/esm/token/index.js.map +1 -0
  86. package/dist/types/NostrKeyManager.d.ts +150 -0
  87. package/dist/types/NostrKeyManager.d.ts.map +1 -0
  88. package/dist/types/client/NostrClient.d.ts +154 -0
  89. package/dist/types/client/NostrClient.d.ts.map +1 -0
  90. package/dist/types/client/NostrEventListener.d.ts +40 -0
  91. package/dist/types/client/NostrEventListener.d.ts.map +1 -0
  92. package/dist/types/client/WebSocketAdapter.d.ts +55 -0
  93. package/dist/types/client/WebSocketAdapter.d.ts.map +1 -0
  94. package/dist/types/client/index.d.ts +9 -0
  95. package/dist/types/client/index.d.ts.map +1 -0
  96. package/dist/types/crypto/bech32.d.ts +51 -0
  97. package/dist/types/crypto/bech32.d.ts.map +1 -0
  98. package/dist/types/crypto/index.d.ts +10 -0
  99. package/dist/types/crypto/index.d.ts.map +1 -0
  100. package/dist/types/crypto/nip04.d.ts +56 -0
  101. package/dist/types/crypto/nip04.d.ts.map +1 -0
  102. package/dist/types/crypto/schnorr.d.ts +47 -0
  103. package/dist/types/crypto/schnorr.d.ts.map +1 -0
  104. package/dist/types/index.d.ts +31 -0
  105. package/dist/types/index.d.ts.map +1 -0
  106. package/dist/types/nametag/NametagBinding.d.ts +68 -0
  107. package/dist/types/nametag/NametagBinding.d.ts.map +1 -0
  108. package/dist/types/nametag/NametagUtils.d.ts +44 -0
  109. package/dist/types/nametag/NametagUtils.d.ts.map +1 -0
  110. package/dist/types/nametag/index.d.ts +8 -0
  111. package/dist/types/nametag/index.d.ts.map +1 -0
  112. package/dist/types/protocol/Event.d.ts +112 -0
  113. package/dist/types/protocol/Event.d.ts.map +1 -0
  114. package/dist/types/protocol/EventKinds.d.ts +62 -0
  115. package/dist/types/protocol/EventKinds.d.ts.map +1 -0
  116. package/dist/types/protocol/Filter.d.ts +146 -0
  117. package/dist/types/protocol/Filter.d.ts.map +1 -0
  118. package/dist/types/protocol/index.d.ts +10 -0
  119. package/dist/types/protocol/index.d.ts.map +1 -0
  120. package/dist/types/token/TokenTransferProtocol.d.ts +67 -0
  121. package/dist/types/token/TokenTransferProtocol.d.ts.map +1 -0
  122. package/dist/types/token/index.d.ts +6 -0
  123. package/dist/types/token/index.d.ts.map +1 -0
  124. package/package.json +89 -0
@@ -0,0 +1,518 @@
1
+ "use strict";
2
+ /**
3
+ * NostrClient - Main entry point for Nostr protocol operations.
4
+ * Handles relay connections, event publishing, and subscriptions.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.NostrClient = void 0;
41
+ const Event_js_1 = require("../protocol/Event.js");
42
+ const EventKinds = __importStar(require("../protocol/EventKinds.js"));
43
+ const WebSocketAdapter_js_1 = require("./WebSocketAdapter.js");
44
+ /** Connection timeout in milliseconds */
45
+ const CONNECTION_TIMEOUT_MS = 30000;
46
+ /** Reconnection delay in milliseconds */
47
+ const RECONNECT_DELAY_MS = 5000;
48
+ /** Query timeout in milliseconds */
49
+ const QUERY_TIMEOUT_MS = 5000;
50
+ /**
51
+ * NostrClient provides the main interface for Nostr protocol operations.
52
+ */
53
+ class NostrClient {
54
+ keyManager;
55
+ relays = new Map();
56
+ subscriptions = new Map();
57
+ eventQueue = [];
58
+ pendingOks = new Map();
59
+ subscriptionCounter = 0;
60
+ closed = false;
61
+ /**
62
+ * Create a NostrClient instance.
63
+ * @param keyManager Key manager with signing keys
64
+ */
65
+ constructor(keyManager) {
66
+ this.keyManager = keyManager;
67
+ }
68
+ /**
69
+ * Get the key manager.
70
+ * @returns The key manager instance
71
+ */
72
+ getKeyManager() {
73
+ return this.keyManager;
74
+ }
75
+ /**
76
+ * Connect to one or more relay WebSocket URLs.
77
+ * @param relayUrls Relay URLs to connect to
78
+ * @returns Promise that resolves when all connections are established
79
+ */
80
+ async connect(...relayUrls) {
81
+ if (this.closed) {
82
+ throw new Error('Client has been disconnected');
83
+ }
84
+ const connectionPromises = relayUrls.map((url) => this.connectToRelay(url));
85
+ await Promise.all(connectionPromises);
86
+ }
87
+ /**
88
+ * Connect to a single relay.
89
+ */
90
+ async connectToRelay(url) {
91
+ if (this.relays.has(url)) {
92
+ const relay = this.relays.get(url);
93
+ if (relay.connected) {
94
+ return;
95
+ }
96
+ }
97
+ return new Promise((resolve, reject) => {
98
+ const timeoutId = setTimeout(() => {
99
+ reject(new Error(`Connection to ${url} timed out`));
100
+ }, CONNECTION_TIMEOUT_MS);
101
+ (0, WebSocketAdapter_js_1.createWebSocket)(url)
102
+ .then((socket) => {
103
+ const relay = {
104
+ url,
105
+ socket,
106
+ connected: false,
107
+ reconnecting: false,
108
+ };
109
+ socket.onopen = () => {
110
+ clearTimeout(timeoutId);
111
+ relay.connected = true;
112
+ this.relays.set(url, relay);
113
+ // Re-establish subscriptions
114
+ this.resubscribeAll(url);
115
+ // Flush queued events
116
+ this.flushEventQueue();
117
+ resolve();
118
+ };
119
+ socket.onmessage = (event) => {
120
+ try {
121
+ const data = (0, WebSocketAdapter_js_1.extractMessageData)(event);
122
+ this.handleRelayMessage(url, data);
123
+ }
124
+ catch (error) {
125
+ console.error(`Error handling message from ${url}:`, error);
126
+ }
127
+ };
128
+ socket.onclose = () => {
129
+ relay.connected = false;
130
+ if (!this.closed && !relay.reconnecting) {
131
+ this.scheduleReconnect(url);
132
+ }
133
+ };
134
+ socket.onerror = (error) => {
135
+ if (!relay.connected) {
136
+ clearTimeout(timeoutId);
137
+ reject(new Error(`Failed to connect to ${url}: ${error.message || 'Unknown error'}`));
138
+ }
139
+ };
140
+ this.relays.set(url, relay);
141
+ })
142
+ .catch((error) => {
143
+ clearTimeout(timeoutId);
144
+ reject(error);
145
+ });
146
+ });
147
+ }
148
+ /**
149
+ * Schedule a reconnection attempt for a relay.
150
+ */
151
+ scheduleReconnect(url) {
152
+ const relay = this.relays.get(url);
153
+ if (!relay || this.closed)
154
+ return;
155
+ relay.reconnecting = true;
156
+ setTimeout(async () => {
157
+ if (this.closed)
158
+ return;
159
+ try {
160
+ relay.reconnecting = false;
161
+ await this.connectToRelay(url);
162
+ }
163
+ catch {
164
+ // Will trigger another reconnect via onclose
165
+ }
166
+ }, RECONNECT_DELAY_MS);
167
+ }
168
+ /**
169
+ * Re-establish all subscriptions for a relay.
170
+ */
171
+ resubscribeAll(url) {
172
+ const relay = this.relays.get(url);
173
+ if (!relay?.socket || !relay.connected)
174
+ return;
175
+ for (const [subId, info] of this.subscriptions) {
176
+ const message = JSON.stringify(['REQ', subId, info.filter.toJSON()]);
177
+ relay.socket.send(message);
178
+ }
179
+ }
180
+ /**
181
+ * Flush queued events to connected relays.
182
+ */
183
+ flushEventQueue() {
184
+ const queue = [...this.eventQueue];
185
+ this.eventQueue = [];
186
+ for (const item of queue) {
187
+ this.broadcastEvent(item.event)
188
+ .then(() => item.resolve(item.event.id))
189
+ .catch(item.reject);
190
+ }
191
+ }
192
+ /**
193
+ * Handle a message from a relay.
194
+ */
195
+ handleRelayMessage(_url, message) {
196
+ try {
197
+ const json = JSON.parse(message);
198
+ if (!Array.isArray(json) || json.length < 2)
199
+ return;
200
+ const messageType = json[0];
201
+ switch (messageType) {
202
+ case 'EVENT':
203
+ this.handleEventMessage(json);
204
+ break;
205
+ case 'OK':
206
+ this.handleOkMessage(json);
207
+ break;
208
+ case 'EOSE':
209
+ this.handleEOSEMessage(json);
210
+ break;
211
+ case 'NOTICE':
212
+ this.handleNoticeMessage(json);
213
+ break;
214
+ case 'CLOSED':
215
+ this.handleClosedMessage(json);
216
+ break;
217
+ }
218
+ }
219
+ catch {
220
+ // Ignore malformed messages
221
+ }
222
+ }
223
+ /**
224
+ * Handle EVENT message from relay.
225
+ */
226
+ handleEventMessage(json) {
227
+ if (json.length < 3)
228
+ return;
229
+ const subscriptionId = json[1];
230
+ const eventData = json[2];
231
+ const subscription = this.subscriptions.get(subscriptionId);
232
+ if (!subscription)
233
+ return;
234
+ try {
235
+ const event = Event_js_1.Event.fromJSON(eventData);
236
+ subscription.listener.onEvent(event);
237
+ }
238
+ catch {
239
+ // Ignore invalid events
240
+ }
241
+ }
242
+ /**
243
+ * Handle OK message from relay.
244
+ */
245
+ handleOkMessage(json) {
246
+ if (json.length < 4)
247
+ return;
248
+ const eventId = json[1];
249
+ const accepted = json[2];
250
+ const message = json[3];
251
+ const pending = this.pendingOks.get(eventId);
252
+ if (!pending)
253
+ return;
254
+ clearTimeout(pending.timer);
255
+ this.pendingOks.delete(eventId);
256
+ if (accepted) {
257
+ pending.resolve(eventId);
258
+ }
259
+ else {
260
+ pending.reject(new Error(`Event rejected: ${message}`));
261
+ }
262
+ }
263
+ /**
264
+ * Handle EOSE (End of Stored Events) message from relay.
265
+ */
266
+ handleEOSEMessage(json) {
267
+ if (json.length < 2)
268
+ return;
269
+ const subscriptionId = json[1];
270
+ const subscription = this.subscriptions.get(subscriptionId);
271
+ if (subscription?.listener.onEndOfStoredEvents) {
272
+ subscription.listener.onEndOfStoredEvents(subscriptionId);
273
+ }
274
+ }
275
+ /**
276
+ * Handle NOTICE message from relay.
277
+ */
278
+ handleNoticeMessage(json) {
279
+ if (json.length < 2)
280
+ return;
281
+ const message = json[1];
282
+ console.warn('Relay notice:', message);
283
+ }
284
+ /**
285
+ * Handle CLOSED message from relay (subscription closed by relay).
286
+ */
287
+ handleClosedMessage(json) {
288
+ if (json.length < 3)
289
+ return;
290
+ const subscriptionId = json[1];
291
+ const message = json[2];
292
+ const subscription = this.subscriptions.get(subscriptionId);
293
+ if (subscription?.listener.onError) {
294
+ subscription.listener.onError(subscriptionId, `Subscription closed: ${message}`);
295
+ }
296
+ }
297
+ /**
298
+ * Disconnect from all relays.
299
+ */
300
+ disconnect() {
301
+ this.closed = true;
302
+ // Clear pending OKs
303
+ for (const [, pending] of this.pendingOks) {
304
+ clearTimeout(pending.timer);
305
+ pending.reject(new Error('Client disconnected'));
306
+ }
307
+ this.pendingOks.clear();
308
+ // Clear queued events
309
+ for (const item of this.eventQueue) {
310
+ item.reject(new Error('Client disconnected'));
311
+ }
312
+ this.eventQueue = [];
313
+ // Close all relay connections
314
+ for (const [, relay] of this.relays) {
315
+ if (relay.socket && relay.socket.readyState !== WebSocketAdapter_js_1.CLOSED) {
316
+ relay.socket.close(1000, 'Client disconnected');
317
+ }
318
+ }
319
+ this.relays.clear();
320
+ this.subscriptions.clear();
321
+ }
322
+ /**
323
+ * Check if connected to at least one relay.
324
+ * @returns true if connected to at least one relay
325
+ */
326
+ isConnected() {
327
+ for (const [, relay] of this.relays) {
328
+ if (relay.connected)
329
+ return true;
330
+ }
331
+ return false;
332
+ }
333
+ /**
334
+ * Get the set of connected relay URLs.
335
+ * @returns Set of connected relay URLs
336
+ */
337
+ getConnectedRelays() {
338
+ const connected = new Set();
339
+ for (const [url, relay] of this.relays) {
340
+ if (relay.connected) {
341
+ connected.add(url);
342
+ }
343
+ }
344
+ return connected;
345
+ }
346
+ /**
347
+ * Publish an event to all connected relays.
348
+ * @param event Event to publish
349
+ * @returns Promise that resolves with the event ID
350
+ */
351
+ async publishEvent(event) {
352
+ if (this.closed) {
353
+ throw new Error('Client has been disconnected');
354
+ }
355
+ if (!this.isConnected()) {
356
+ // Queue the event for later
357
+ return new Promise((resolve, reject) => {
358
+ this.eventQueue.push({
359
+ event,
360
+ timestamp: Date.now(),
361
+ resolve,
362
+ reject,
363
+ });
364
+ });
365
+ }
366
+ return this.broadcastEvent(event);
367
+ }
368
+ /**
369
+ * Broadcast an event to all connected relays.
370
+ */
371
+ async broadcastEvent(event) {
372
+ const message = JSON.stringify(['EVENT', event.toJSON()]);
373
+ let sent = false;
374
+ for (const [, relay] of this.relays) {
375
+ if (relay.connected && relay.socket?.readyState === WebSocketAdapter_js_1.OPEN) {
376
+ relay.socket.send(message);
377
+ sent = true;
378
+ }
379
+ }
380
+ if (!sent) {
381
+ throw new Error('No connected relays');
382
+ }
383
+ // Wait for at least one OK response
384
+ return new Promise((resolve, reject) => {
385
+ const timer = setTimeout(() => {
386
+ this.pendingOks.delete(event.id);
387
+ // Consider it successful if we sent it (some relays don't send OK)
388
+ resolve(event.id);
389
+ }, 5000);
390
+ this.pendingOks.set(event.id, { resolve, reject, timer });
391
+ });
392
+ }
393
+ /**
394
+ * Publish an encrypted direct message (NIP-04).
395
+ * @param recipientPubkeyHex Recipient's public key (hex)
396
+ * @param message Message to send
397
+ * @returns Promise that resolves with the event ID
398
+ */
399
+ async publishEncryptedMessage(recipientPubkeyHex, message) {
400
+ const encryptedContent = await this.keyManager.encryptHex(message, recipientPubkeyHex);
401
+ const event = Event_js_1.Event.create(this.keyManager, {
402
+ kind: EventKinds.ENCRYPTED_DM,
403
+ tags: [['p', recipientPubkeyHex]],
404
+ content: encryptedContent,
405
+ });
406
+ return this.publishEvent(event);
407
+ }
408
+ /**
409
+ * Send a token transfer (encrypted).
410
+ * @param recipientPubkeyHex Recipient's public key (hex)
411
+ * @param tokenJson Token JSON string
412
+ * @returns Promise that resolves with the event ID
413
+ */
414
+ async sendTokenTransfer(recipientPubkeyHex, tokenJson) {
415
+ const TokenTransferProtocol = await Promise.resolve().then(() => __importStar(require('../token/TokenTransferProtocol.js')));
416
+ const event = await TokenTransferProtocol.createTokenTransferEvent(this.keyManager, recipientPubkeyHex, tokenJson);
417
+ return this.publishEvent(event);
418
+ }
419
+ /**
420
+ * Publish a nametag binding.
421
+ * @param nametagId Nametag identifier
422
+ * @param unicityAddress Unicity address
423
+ * @returns Promise that resolves with success status
424
+ */
425
+ async publishNametagBinding(nametagId, unicityAddress) {
426
+ const NametagBinding = await Promise.resolve().then(() => __importStar(require('../nametag/NametagBinding.js')));
427
+ const event = await NametagBinding.createBindingEvent(this.keyManager, nametagId, unicityAddress);
428
+ try {
429
+ await this.publishEvent(event);
430
+ return true;
431
+ }
432
+ catch {
433
+ return false;
434
+ }
435
+ }
436
+ subscribe(filterOrSubId, listenerOrFilter, maybeListener) {
437
+ let subscriptionId;
438
+ let filter;
439
+ let listener;
440
+ if (typeof filterOrSubId === 'string') {
441
+ subscriptionId = filterOrSubId;
442
+ filter = listenerOrFilter;
443
+ listener = maybeListener;
444
+ }
445
+ else {
446
+ subscriptionId = `sub_${++this.subscriptionCounter}`;
447
+ filter = filterOrSubId;
448
+ listener = listenerOrFilter;
449
+ }
450
+ this.subscriptions.set(subscriptionId, { filter, listener });
451
+ // Send subscription request to all connected relays
452
+ const message = JSON.stringify(['REQ', subscriptionId, filter.toJSON()]);
453
+ for (const [, relay] of this.relays) {
454
+ if (relay.connected && relay.socket?.readyState === WebSocketAdapter_js_1.OPEN) {
455
+ relay.socket.send(message);
456
+ }
457
+ }
458
+ return subscriptionId;
459
+ }
460
+ /**
461
+ * Unsubscribe from a subscription.
462
+ * @param subscriptionId Subscription ID to unsubscribe
463
+ */
464
+ unsubscribe(subscriptionId) {
465
+ if (!this.subscriptions.has(subscriptionId))
466
+ return;
467
+ this.subscriptions.delete(subscriptionId);
468
+ // Send CLOSE to all connected relays
469
+ const message = JSON.stringify(['CLOSE', subscriptionId]);
470
+ for (const [, relay] of this.relays) {
471
+ if (relay.connected && relay.socket?.readyState === WebSocketAdapter_js_1.OPEN) {
472
+ relay.socket.send(message);
473
+ }
474
+ }
475
+ }
476
+ /**
477
+ * Query for a public key by nametag.
478
+ * @param nametagId Nametag identifier
479
+ * @returns Promise that resolves with the public key hex, or null if not found
480
+ */
481
+ async queryPubkeyByNametag(nametagId) {
482
+ const NametagBinding = await Promise.resolve().then(() => __importStar(require('../nametag/NametagBinding.js')));
483
+ const filter = NametagBinding.createNametagToPubkeyFilter(nametagId);
484
+ return new Promise((resolve) => {
485
+ const timeoutId = setTimeout(() => {
486
+ this.unsubscribe(subscriptionId);
487
+ resolve(null);
488
+ }, QUERY_TIMEOUT_MS);
489
+ let result = null;
490
+ let latestCreatedAt = 0;
491
+ const subscriptionId = this.subscribe(filter, {
492
+ onEvent: (event) => {
493
+ // Keep the most recent binding
494
+ if (event.created_at > latestCreatedAt) {
495
+ latestCreatedAt = event.created_at;
496
+ result = event.pubkey;
497
+ }
498
+ },
499
+ onEndOfStoredEvents: () => {
500
+ clearTimeout(timeoutId);
501
+ this.unsubscribe(subscriptionId);
502
+ resolve(result);
503
+ },
504
+ });
505
+ });
506
+ }
507
+ /**
508
+ * Create and publish a signed event.
509
+ * @param data Unsigned event data
510
+ * @returns Promise that resolves with the event ID
511
+ */
512
+ async createAndPublishEvent(data) {
513
+ const event = Event_js_1.Event.create(this.keyManager, data);
514
+ return this.publishEvent(event);
515
+ }
516
+ }
517
+ exports.NostrClient = NostrClient;
518
+ //# sourceMappingURL=NostrClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NostrClient.js","sourceRoot":"","sources":["../../../src/client/NostrClient.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGH,mDAAgE;AAEhE,sEAAwD;AAExD,+DAM+B;AAE/B,yCAAyC;AACzC,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAEpC,yCAAyC;AACzC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC,oCAAoC;AACpC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAuC9B;;GAEG;AACH,MAAa,WAAW;IACd,UAAU,CAAkB;IAC5B,MAAM,GAAiC,IAAI,GAAG,EAAE,CAAC;IACjD,aAAa,GAAkC,IAAI,GAAG,EAAE,CAAC;IACzD,UAAU,GAAkB,EAAE,CAAC;IAC/B,UAAU,GAA2B,IAAI,GAAG,EAAE,CAAC;IAC/C,mBAAmB,GAAG,CAAC,CAAC;IACxB,MAAM,GAAG,KAAK,CAAC;IAEvB;;;OAGG;IACH,YAAY,UAA2B;QACrC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;;OAGG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,GAAG,SAAmB;QAClC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,MAAM,kBAAkB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5E,MAAM,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,GAAW;QACtC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC;YACpC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,OAAO;YACT,CAAC;QACH,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC;YACtD,CAAC,EAAE,qBAAqB,CAAC,CAAC;YAE1B,IAAA,qCAAe,EAAC,GAAG,CAAC;iBACjB,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBACf,MAAM,KAAK,GAAoB;oBAC7B,GAAG;oBACH,MAAM;oBACN,SAAS,EAAE,KAAK;oBAChB,YAAY,EAAE,KAAK;iBACpB,CAAC;gBAEF,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE;oBACnB,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;oBACvB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;oBAE5B,6BAA6B;oBAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;oBAEzB,sBAAsB;oBACtB,IAAI,CAAC,eAAe,EAAE,CAAC;oBAEvB,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC;gBAEF,MAAM,CAAC,SAAS,GAAG,CAAC,KAAK,EAAE,EAAE;oBAC3B,IAAI,CAAC;wBACH,MAAM,IAAI,GAAG,IAAA,wCAAkB,EAAC,KAAK,CAAC,CAAC;wBACvC,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;oBACrC,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;oBAC9D,CAAC;gBACH,CAAC,CAAC;gBAEF,MAAM,CAAC,OAAO,GAAG,GAAG,EAAE;oBACpB,KAAK,CAAC,SAAS,GAAG,KAAK,CAAC;oBACxB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;wBACxC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;oBAC9B,CAAC;gBACH,CAAC,CAAC;gBAEF,MAAM,CAAC,OAAO,GAAG,CAAC,KAAK,EAAE,EAAE;oBACzB,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;wBACrB,YAAY,CAAC,SAAS,CAAC,CAAC;wBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,wBAAwB,GAAG,KAAK,KAAK,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC,CAAC,CAAC;oBACxF,CAAC;gBACH,CAAC,CAAC;gBAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAC9B,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,YAAY,CAAC,SAAS,CAAC,CAAC;gBACxB,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACP,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,GAAW;QACnC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QAElC,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC;QAE1B,UAAU,CAAC,KAAK,IAAI,EAAE;YACpB,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YAExB,IAAI,CAAC;gBACH,KAAK,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC3B,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACjC,CAAC;YAAC,MAAM,CAAC;gBACP,6CAA6C;YAC/C,CAAC;QACH,CAAC,EAAE,kBAAkB,CAAC,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,GAAW;QAChC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS;YAAE,OAAO;QAE/C,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACrE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe;QACrB,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QAErB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC;iBAC5B,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;iBACvC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,IAAY,EAAE,OAAe;QACtD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;YAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO;YAEpD,MAAM,WAAW,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAE5B,QAAQ,WAAW,EAAE,CAAC;gBACpB,KAAK,OAAO;oBACV,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;oBAC9B,MAAM;gBACR,KAAK,IAAI;oBACP,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;oBAC3B,MAAM;gBACR,KAAK,MAAM;oBACT,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;oBAC7B,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAC/B,MAAM;gBACR,KAAK,QAAQ;oBACX,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAC/B,MAAM;YACV,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,kBAAkB,CAAC,IAAe;QACxC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QAE5B,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAE1B,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5D,IAAI,CAAC,YAAY;YAAE,OAAO;QAE1B,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,gBAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACxC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,IAAe;QACrC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAY,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAElC,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEhC,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,OAAO,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,IAAe;QACvC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QAE5B,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QACzC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAE5D,IAAI,YAAY,EAAE,QAAQ,CAAC,mBAAmB,EAAE,CAAC;YAC/C,YAAY,CAAC,QAAQ,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,IAAe;QACzC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IAED;;OAEG;IACK,mBAAmB,CAAC,IAAe;QACzC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO;QAE5B,MAAM,cAAc,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAW,CAAC;QAElC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5D,IAAI,YAAY,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnC,YAAY,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,wBAAwB,OAAO,EAAE,CAAC,CAAC;QACnF,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QAEnB,oBAAoB;QACpB,KAAK,MAAM,CAAC,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YAC1C,YAAY,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5B,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QAExB,sBAAsB;QACtB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QAErB,8BAA8B;QAC9B,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,UAAU,KAAK,4BAAM,EAAE,CAAC;gBACvD,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACH,WAAW;QACT,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;QACnC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,kBAAkB;QAChB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAC;QACpC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACvC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;gBACpB,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY,CAAC,KAAY;QAC7B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,4BAA4B;YAC5B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;oBACnB,KAAK;oBACL,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;oBACrB,OAAO;oBACP,MAAM;iBACP,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,KAAY;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC1D,IAAI,IAAI,GAAG,KAAK,CAAC;QAEjB,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,0BAAI,EAAE,CAAC;gBACzD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBAC3B,IAAI,GAAG,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACzC,CAAC;QAED,oCAAoC;QACpC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACjC,mEAAmE;gBACnE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpB,CAAC,EAAE,IAAI,CAAC,CAAC;YAET,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5D,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,uBAAuB,CAC3B,kBAA0B,EAC1B,OAAe;QAEf,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,CACvD,OAAO,EACP,kBAAkB,CACnB,CAAC;QAEF,MAAM,KAAK,GAAG,gBAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE;YAC1C,IAAI,EAAE,UAAU,CAAC,YAAY;YAC7B,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;YACjC,OAAO,EAAE,gBAAgB;SAC1B,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,iBAAiB,CACrB,kBAA0B,EAC1B,SAAiB;QAEjB,MAAM,qBAAqB,GAAG,wDAAa,mCAAmC,GAAC,CAAC;QAChF,MAAM,KAAK,GAAG,MAAM,qBAAqB,CAAC,wBAAwB,CAChE,IAAI,CAAC,UAAU,EACf,kBAAkB,EAClB,SAAS,CACV,CAAC;QACF,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,qBAAqB,CACzB,SAAiB,EACjB,cAAsB;QAEtB,MAAM,cAAc,GAAG,wDAAa,8BAA8B,GAAC,CAAC;QACpE,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,kBAAkB,CACnD,IAAI,CAAC,UAAU,EACf,SAAS,EACT,cAAc,CACf,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAqBD,SAAS,CACP,aAA8B,EAC9B,gBAA6C,EAC7C,aAAkC;QAElC,IAAI,cAAsB,CAAC;QAC3B,IAAI,MAAc,CAAC;QACnB,IAAI,QAA4B,CAAC;QAEjC,IAAI,OAAO,aAAa,KAAK,QAAQ,EAAE,CAAC;YACtC,cAAc,GAAG,aAAa,CAAC;YAC/B,MAAM,GAAG,gBAA0B,CAAC;YACpC,QAAQ,GAAG,aAAc,CAAC;QAC5B,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,OAAO,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACrD,MAAM,GAAG,aAAa,CAAC;YACvB,QAAQ,GAAG,gBAAsC,CAAC;QACpD,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE7D,oDAAoD;QACpD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QACzE,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,0BAAI,EAAE,CAAC;gBACzD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,OAAO,cAAc,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,WAAW,CAAC,cAAsB;QAChC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,cAAc,CAAC;YAAE,OAAO;QAEpD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAE1C,qCAAqC;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK,0BAAI,EAAE,CAAC;gBACzD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,oBAAoB,CAAC,SAAiB;QAC1C,MAAM,cAAc,GAAG,wDAAa,8BAA8B,GAAC,CAAC;QACpE,MAAM,MAAM,GAAG,cAAc,CAAC,2BAA2B,CAAC,SAAS,CAAC,CAAC;QAErE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAChC,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,EAAE,gBAAgB,CAAC,CAAC;YAErB,IAAI,MAAM,GAAkB,IAAI,CAAC;YACjC,IAAI,eAAe,GAAG,CAAC,CAAC;YAExB,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE;gBAC5C,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;oBACjB,+BAA+B;oBAC/B,IAAI,KAAK,CAAC,UAAU,GAAG,eAAe,EAAE,CAAC;wBACvC,eAAe,GAAG,KAAK,CAAC,UAAU,CAAC;wBACnC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;oBACxB,CAAC;gBACH,CAAC;gBACD,mBAAmB,EAAE,GAAG,EAAE;oBACxB,YAAY,CAAC,SAAS,CAAC,CAAC;oBACxB,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;oBACjC,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClB,CAAC;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,qBAAqB,CAAC,IAAuB;QACjD,MAAM,KAAK,GAAG,gBAAK,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;CACF;AAjjBD,kCAijBC"}
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ /**
3
+ * NostrEventListener - Callback interface for receiving events and subscription status.
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CallbackEventListener = void 0;
7
+ /**
8
+ * Simple callback-based event listener.
9
+ * Useful for creating listeners from callback functions.
10
+ */
11
+ class CallbackEventListener {
12
+ eventCallback;
13
+ eoseCallback;
14
+ errorCallback;
15
+ constructor(onEvent, onEndOfStoredEvents, onError) {
16
+ this.eventCallback = onEvent;
17
+ this.eoseCallback = onEndOfStoredEvents;
18
+ this.errorCallback = onError;
19
+ }
20
+ onEvent(event) {
21
+ this.eventCallback(event);
22
+ }
23
+ onEndOfStoredEvents(subscriptionId) {
24
+ this.eoseCallback?.(subscriptionId);
25
+ }
26
+ onError(subscriptionId, error) {
27
+ this.errorCallback?.(subscriptionId, error);
28
+ }
29
+ }
30
+ exports.CallbackEventListener = CallbackEventListener;
31
+ //# sourceMappingURL=NostrEventListener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NostrEventListener.js","sourceRoot":"","sources":["../../../src/client/NostrEventListener.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AA6BH;;;GAGG;AACH,MAAa,qBAAqB;IACxB,aAAa,CAAyB;IACtC,YAAY,CAAoC;IAChD,aAAa,CAAmD;IAExE,YACE,OAA+B,EAC/B,mBAAsD,EACtD,OAAyD;QAEzD,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;QAC7B,IAAI,CAAC,YAAY,GAAG,mBAAmB,CAAC;QACxC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC;IAC/B,CAAC;IAED,OAAO,CAAC,KAAY;QAClB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED,mBAAmB,CAAC,cAAsB;QACxC,IAAI,CAAC,YAAY,EAAE,CAAC,cAAc,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,CAAC,cAAsB,EAAE,KAAa;QAC3C,IAAI,CAAC,aAAa,EAAE,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;IAC9C,CAAC;CACF;AA1BD,sDA0BC"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ /**
3
+ * WebSocketAdapter - Cross-platform WebSocket implementation.
4
+ * Provides a unified interface for WebSocket connections in Node.js and browsers.
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.CLOSED = exports.CLOSING = exports.OPEN = exports.CONNECTING = void 0;
41
+ exports.createWebSocket = createWebSocket;
42
+ exports.extractMessageData = extractMessageData;
43
+ /** WebSocket ready state constants */
44
+ exports.CONNECTING = 0;
45
+ exports.OPEN = 1;
46
+ exports.CLOSING = 2;
47
+ exports.CLOSED = 3;
48
+ /**
49
+ * Create a WebSocket connection that works in both Node.js and browsers.
50
+ * @param url WebSocket URL (ws:// or wss://)
51
+ * @returns WebSocket instance
52
+ */
53
+ async function createWebSocket(url) {
54
+ // Check if we're in a browser environment
55
+ if (typeof WebSocket !== 'undefined') {
56
+ return new WebSocket(url);
57
+ }
58
+ // Node.js environment - dynamically import ws
59
+ try {
60
+ const { default: WS } = await Promise.resolve().then(() => __importStar(require('ws')));
61
+ return new WS(url);
62
+ }
63
+ catch {
64
+ throw new Error('WebSocket not available. In Node.js, install the "ws" package: npm install ws');
65
+ }
66
+ }
67
+ /**
68
+ * Extract string data from WebSocket message event.
69
+ * Handles different message types across platforms.
70
+ * @param event WebSocket message event
71
+ * @returns String message data
72
+ */
73
+ function extractMessageData(event) {
74
+ if (typeof event.data === 'string') {
75
+ return event.data;
76
+ }
77
+ if (event.data instanceof ArrayBuffer) {
78
+ return new TextDecoder().decode(event.data);
79
+ }
80
+ if (typeof Blob !== 'undefined' && event.data instanceof Blob) {
81
+ // This shouldn't happen in normal Nostr relay communication
82
+ throw new Error('Blob messages are not supported');
83
+ }
84
+ // Node.js Buffer case
85
+ if (Buffer && Buffer.isBuffer(event.data)) {
86
+ return event.data.toString('utf-8');
87
+ }
88
+ return String(event.data);
89
+ }
90
+ //# sourceMappingURL=WebSocketAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebSocketAdapter.js","sourceRoot":"","sources":["../../../src/client/WebSocketAdapter.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiDH,0CAeC;AAQD,gDAgBC;AAlDD,sCAAsC;AACzB,QAAA,UAAU,GAAG,CAAC,CAAC;AACf,QAAA,IAAI,GAAG,CAAC,CAAC;AACT,QAAA,OAAO,GAAG,CAAC,CAAC;AACZ,QAAA,MAAM,GAAG,CAAC,CAAC;AAExB;;;;GAIG;AACI,KAAK,UAAU,eAAe,CAAC,GAAW;IAC/C,0CAA0C;IAC1C,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE,CAAC;QACrC,OAAO,IAAI,SAAS,CAAC,GAAG,CAA0B,CAAC;IACrD,CAAC;IAED,8CAA8C;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,wDAAa,IAAI,GAAC,CAAC;QAC3C,OAAO,IAAI,EAAE,CAAC,GAAG,CAA0B,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,KAA4B;IAC7D,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,IAAI,CAAC;IACpB,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,YAAY,WAAW,EAAE,CAAC;QACtC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,IAAI,YAAY,IAAI,EAAE,CAAC;QAC9D,4DAA4D;QAC5D,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,sBAAsB;IACtB,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAQ,KAAK,CAAC,IAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}