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 +17 -1
- package/index.ts +1 -0
- package/lib/nostr.bundle.js +42 -5
- package/lib/nostr.bundle.js.map +3 -3
- package/lib/nostr.cjs.js +42 -6
- package/lib/nostr.cjs.js.map +3 -3
- package/lib/nostr.esm.js +40 -4
- package/lib/nostr.esm.js.map +3 -3
- package/nip05.ts +1 -1
- package/package.json +1 -1
- package/pool.ts +27 -0
- package/relay.ts +4 -4
- package/utils.ts +14 -0
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',
|
|
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
package/lib/nostr.bundle.js
CHANGED
|
@@ -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 !==
|
|
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(/^[
|
|
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])
|