nostr-tools 1.2.1 → 1.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/README.md CHANGED
@@ -120,6 +120,22 @@ To use this on Node.js you first must install `websocket-polyfill` and import it
120
120
  import 'websocket-polyfill'
121
121
  ```
122
122
 
123
+ ### Interacting with multiple relays
124
+
125
+ ```js
126
+ import {pool} from 'nostr-tools'
127
+
128
+ const p = pool()
129
+
130
+ ["wss://relay.example.com", "wss://relay.example2.com"].forEach(async url => {
131
+ let relay = pool.ensureRelay(url)
132
+ await relay.connect()
133
+
134
+ relay.sub(...) // same as above
135
+ relay.publish(...) // etc
136
+ })
137
+ ```
138
+
123
139
  ### Querying profile data from a NIP-05 address
124
140
 
125
141
  ```js
@@ -195,7 +211,7 @@ let event = {
195
211
  sendEvent(event)
196
212
 
197
213
  // on the receiver side
198
- sub.on('event', (event) => {
214
+ sub.on('event', event => {
199
215
  let sender = event.tags.find(([k, v]) => k === 'p' && v && v !== '')[1]
200
216
  pk1 === sender
201
217
  let plaintext = await nip04.decrypt(sk2, pk1, event.content)
package/index.ts CHANGED
@@ -2,6 +2,7 @@ export * from './keys'
2
2
  export * from './relay'
3
3
  export * from './event'
4
4
  export * from './filter'
5
+ export * from './pool'
5
6
 
6
7
  export * as nip04 from './nip04'
7
8
  export * as nip05 from './nip05'
@@ -3558,7 +3558,7 @@ zoo`.split("\n");
3558
3558
  return new Uint8Array([(0, sha256_1.sha256)(entropy)[0] >> bitsLeft << bitsLeft]);
3559
3559
  };
3560
3560
  function getCoder(wordlist2) {
3561
- if (!Array.isArray(wordlist2) || wordlist2.length !== 2 ** 11 || typeof wordlist2[0] !== "string")
3561
+ if (!Array.isArray(wordlist2) || wordlist2.length !== 2048 || typeof wordlist2[0] !== "string")
3562
3562
  throw new Error("Worlist: expected array of 2048 strings");
3563
3563
  wordlist2.forEach((i) => {
3564
3564
  if (typeof i !== "string")
@@ -3616,6 +3616,7 @@ zoo`.split("\n");
3616
3616
  nip06: () => nip06_exports,
3617
3617
  nip19: () => nip19_exports,
3618
3618
  nip26: () => nip26_exports,
3619
+ pool: () => pool,
3619
3620
  relayInit: () => relayInit,
3620
3621
  serializeEvent: () => serializeEvent,
3621
3622
  signEvent: () => signEvent,
@@ -5164,12 +5165,24 @@ zoo`.split("\n");
5164
5165
  __export(utils_exports, {
5165
5166
  insertEventIntoAscendingList: () => insertEventIntoAscendingList,
5166
5167
  insertEventIntoDescendingList: () => insertEventIntoDescendingList,
5168
+ normalizeURL: () => normalizeURL,
5167
5169
  utf8Decoder: () => utf8Decoder,
5168
5170
  utf8Encoder: () => utf8Encoder
5169
5171
  });
5170
5172
  init_define_process();
5171
5173
  var utf8Decoder = new TextDecoder("utf-8");
5172
5174
  var utf8Encoder = new TextEncoder();
5175
+ function normalizeURL(url) {
5176
+ let p = new URL(url);
5177
+ p.pathname = p.pathname.replace(/\/+/g, "/");
5178
+ if (p.pathname.endsWith("/"))
5179
+ p.pathname = p.pathname.slice(0, -1);
5180
+ if (p.port === "80" && p.protocol === "ws:" || p.port === "443" && p.protocol === "wss:")
5181
+ p.port = "";
5182
+ p.searchParams.sort();
5183
+ p.hash = "";
5184
+ return p.toString();
5185
+ }
5173
5186
  function insertEventIntoDescendingList(sortedArray, event) {
5174
5187
  let start = 0;
5175
5188
  let end = sortedArray.length - 1;
@@ -5410,9 +5423,9 @@ zoo`.split("\n");
5410
5423
  setOpen();
5411
5424
  resolve();
5412
5425
  };
5413
- ws.onerror = () => {
5414
- listeners.error.forEach((cb) => cb());
5415
- reject();
5426
+ ws.onerror = (e) => {
5427
+ listeners.error.forEach((cb) => cb(e));
5428
+ reject(e);
5416
5429
  };
5417
5430
  ws.onclose = async () => {
5418
5431
  listeners.disconnect.forEach((cb) => cb());
@@ -5605,6 +5618,30 @@ zoo`.split("\n");
5605
5618
  };
5606
5619
  }
5607
5620
 
5621
+ // pool.ts
5622
+ init_define_process();
5623
+ function pool(defaultRelays = []) {
5624
+ return new SimplePool(defaultRelays);
5625
+ }
5626
+ var SimplePool = class {
5627
+ _conn;
5628
+ _knownIds = /* @__PURE__ */ new Set();
5629
+ constructor(defaultRelays) {
5630
+ this._conn = {};
5631
+ defaultRelays.forEach(this.ensureRelay);
5632
+ }
5633
+ ensureRelay(url) {
5634
+ const nm = normalizeURL(url);
5635
+ const existing = this._conn[nm];
5636
+ if (existing)
5637
+ return existing;
5638
+ const hasEventId = (id) => this._knownIds.has(id);
5639
+ const relay = relayInit(nm, hasEventId);
5640
+ this._conn[nm] = relay;
5641
+ return relay;
5642
+ }
5643
+ };
5644
+
5608
5645
  // nip04.ts
5609
5646
  var nip04_exports = {};
5610
5647
  __export(nip04_exports, {
@@ -6072,7 +6109,7 @@ zoo`.split("\n");
6072
6109
  domain = name;
6073
6110
  name = "_";
6074
6111
  }
6075
- if (!name.match(/^[a-z0-9-_]+$/))
6112
+ if (!name.match(/^[A-Za-z0-9-_]+$/))
6076
6113
  return null;
6077
6114
  let res = await (await _fetch(`https://${domain}/.well-known/nostr.json?name=${name}`)).json();
6078
6115
  if (!res?.names?.[name])