nostr-tools 2.23.11 → 2.24.0
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/lib/cjs/abstract-pool.js +11 -21
- package/lib/cjs/abstract-pool.js.map +3 -3
- package/lib/cjs/abstract-relay.js +1 -1
- package/lib/cjs/abstract-relay.js.map +2 -2
- package/lib/cjs/core.js +17 -1
- package/lib/cjs/core.js.map +3 -3
- package/lib/cjs/filter.js.map +1 -1
- package/lib/cjs/index.js +124 -123
- package/lib/cjs/index.js.map +4 -4
- package/lib/cjs/kinds.js +17 -1
- package/lib/cjs/kinds.js.map +3 -3
- package/lib/cjs/nip04.js.map +1 -1
- package/lib/cjs/nip10.js +20 -5
- package/lib/cjs/nip10.js.map +3 -3
- package/lib/cjs/nip13.js.map +1 -1
- package/lib/cjs/nip17.js +30 -23
- package/lib/cjs/nip17.js.map +4 -4
- package/lib/cjs/nip18.js +21 -14
- package/lib/cjs/nip18.js.map +4 -4
- package/lib/cjs/nip19.js.map +1 -1
- package/lib/cjs/nip21.js.map +1 -1
- package/lib/cjs/nip22.js +22 -7
- package/lib/cjs/nip22.js.map +3 -3
- package/lib/cjs/nip25.js +21 -14
- package/lib/cjs/nip25.js.map +4 -4
- package/lib/cjs/nip27.js.map +1 -1
- package/lib/cjs/nip28.js +21 -14
- package/lib/cjs/nip28.js.map +4 -4
- package/lib/cjs/nip29.js.map +1 -1
- package/lib/cjs/nip30.js.map +2 -2
- package/lib/cjs/nip42.js.map +2 -2
- package/lib/cjs/nip44.js.map +1 -1
- package/lib/cjs/nip45.js +22 -9
- package/lib/cjs/nip45.js.map +4 -4
- package/lib/cjs/nip46.js +63 -63
- package/lib/cjs/nip46.js.map +4 -4
- package/lib/cjs/nip47.js +25 -18
- package/lib/cjs/nip47.js.map +4 -4
- package/lib/cjs/nip57.js +23 -16
- package/lib/cjs/nip57.js.map +4 -4
- package/lib/cjs/nip58.js.map +2 -2
- package/lib/cjs/nip59.js +16 -7
- package/lib/cjs/nip59.js.map +3 -3
- package/lib/cjs/nip75.js.map +1 -1
- package/lib/cjs/nip94.js.map +1 -1
- package/lib/cjs/nip98.js +23 -16
- package/lib/cjs/nip98.js.map +4 -4
- package/lib/cjs/nip99.js.map +2 -2
- package/lib/cjs/nipb0.js +38 -17
- package/lib/cjs/nipb0.js.map +4 -4
- package/lib/cjs/nipb7.js +13 -7
- package/lib/cjs/nipb7.js.map +2 -2
- package/lib/cjs/pool.js +54 -54
- package/lib/cjs/pool.js.map +4 -4
- package/lib/cjs/pure.js +21 -14
- package/lib/cjs/pure.js.map +4 -4
- package/lib/cjs/references.js.map +1 -1
- package/lib/cjs/relay.js +43 -36
- package/lib/cjs/relay.js.map +4 -4
- package/lib/cjs/signer.js +21 -14
- package/lib/cjs/signer.js.map +4 -4
- package/lib/cjs/utils.js +10 -0
- package/lib/cjs/utils.js.map +2 -2
- package/lib/cjs/wasm.js +16 -2
- package/lib/cjs/wasm.js.map +4 -4
- package/lib/esm/abstract-pool.js +11 -21
- package/lib/esm/abstract-pool.js.map +3 -3
- package/lib/esm/abstract-relay.js +1 -1
- package/lib/esm/abstract-relay.js.map +2 -2
- package/lib/esm/core.js +15 -1
- package/lib/esm/core.js.map +3 -3
- package/lib/esm/filter.js.map +1 -1
- package/lib/esm/index.js +74 -73
- package/lib/esm/index.js.map +4 -4
- package/lib/esm/kinds.js +17 -1
- package/lib/esm/kinds.js.map +3 -3
- package/lib/esm/nip04.js.map +1 -1
- package/lib/esm/nip10.js +18 -5
- package/lib/esm/nip10.js.map +3 -3
- package/lib/esm/nip13.js.map +1 -1
- package/lib/esm/nip17.js +15 -8
- package/lib/esm/nip17.js.map +4 -4
- package/lib/esm/nip18.js +15 -8
- package/lib/esm/nip18.js.map +4 -4
- package/lib/esm/nip19.js.map +1 -1
- package/lib/esm/nip21.js.map +1 -1
- package/lib/esm/nip22.js +20 -7
- package/lib/esm/nip22.js.map +3 -3
- package/lib/esm/nip25.js +15 -8
- package/lib/esm/nip25.js.map +4 -4
- package/lib/esm/nip27.js.map +1 -1
- package/lib/esm/nip28.js +15 -8
- package/lib/esm/nip28.js.map +4 -4
- package/lib/esm/nip29.js.map +1 -1
- package/lib/esm/nip30.js.map +2 -2
- package/lib/esm/nip42.js.map +2 -2
- package/lib/esm/nip44.js.map +1 -1
- package/lib/esm/nip45.js +23 -10
- package/lib/esm/nip45.js.map +4 -4
- package/lib/esm/nip46.js +47 -47
- package/lib/esm/nip46.js.map +4 -4
- package/lib/esm/nip47.js +15 -8
- package/lib/esm/nip47.js.map +4 -4
- package/lib/esm/nip57.js +17 -10
- package/lib/esm/nip57.js.map +4 -4
- package/lib/esm/nip58.js.map +2 -2
- package/lib/esm/nip59.js +10 -1
- package/lib/esm/nip59.js.map +3 -3
- package/lib/esm/nip75.js.map +1 -1
- package/lib/esm/nip94.js.map +1 -1
- package/lib/esm/nip98.js +15 -8
- package/lib/esm/nip98.js.map +4 -4
- package/lib/esm/nip99.js.map +2 -2
- package/lib/esm/nipb0.js +39 -18
- package/lib/esm/nipb0.js.map +4 -4
- package/lib/esm/nipb7.js +13 -7
- package/lib/esm/nipb7.js.map +2 -2
- package/lib/esm/pool.js +47 -47
- package/lib/esm/pool.js.map +4 -4
- package/lib/esm/pure.js +15 -8
- package/lib/esm/pure.js.map +4 -4
- package/lib/esm/references.js.map +1 -1
- package/lib/esm/relay.js +37 -30
- package/lib/esm/relay.js.map +4 -4
- package/lib/esm/signer.js +15 -8
- package/lib/esm/signer.js.map +4 -4
- package/lib/esm/utils.js +10 -0
- package/lib/esm/utils.js.map +2 -2
- package/lib/esm/wasm.js +17 -3
- package/lib/esm/wasm.js.map +4 -4
- package/lib/nostr.bundle.js +73 -70
- package/lib/nostr.bundle.js.map +4 -4
- package/lib/types/abstract-pool.d.ts +6 -4
- package/lib/types/abstract-relay.d.ts +2 -2
- package/lib/types/kinds.d.ts +2 -0
- package/lib/types/nipb0.d.ts +0 -1
- package/lib/types/nipb0.test.d.ts +1 -0
- package/lib/types/nipb7.d.ts +0 -1
- package/lib/types/utils.d.ts +4 -0
- package/package.json +1 -1
- package/lib/types/helpers.d.ts +0 -2
package/lib/esm/pool.js
CHANGED
|
@@ -2,6 +2,41 @@
|
|
|
2
2
|
import { schnorr } from "@noble/curves/secp256k1.js";
|
|
3
3
|
import { bytesToHex as bytesToHex2, hexToBytes as hexToBytes2 } from "@noble/hashes/utils.js";
|
|
4
4
|
|
|
5
|
+
// utils.ts
|
|
6
|
+
import { bytesToHex, hexToBytes } from "@noble/hashes/utils.js";
|
|
7
|
+
var utf8Decoder = new TextDecoder("utf-8");
|
|
8
|
+
var utf8Encoder = new TextEncoder();
|
|
9
|
+
function normalizeURL(url) {
|
|
10
|
+
try {
|
|
11
|
+
if (url.indexOf("://") === -1)
|
|
12
|
+
url = "wss://" + url;
|
|
13
|
+
let p = new URL(url);
|
|
14
|
+
if (p.protocol === "http:")
|
|
15
|
+
p.protocol = "ws:";
|
|
16
|
+
else if (p.protocol === "https:")
|
|
17
|
+
p.protocol = "wss:";
|
|
18
|
+
p.pathname = p.pathname.replace(/\/+/g, "/");
|
|
19
|
+
if (p.pathname.endsWith("/"))
|
|
20
|
+
p.pathname = p.pathname.slice(0, -1);
|
|
21
|
+
if (p.port === "80" && p.protocol === "ws:" || p.port === "443" && p.protocol === "wss:")
|
|
22
|
+
p.port = "";
|
|
23
|
+
p.searchParams.sort();
|
|
24
|
+
p.hash = "";
|
|
25
|
+
return p.toString();
|
|
26
|
+
} catch (e) {
|
|
27
|
+
throw new Error(`Invalid URL: ${url}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function isHex32(input) {
|
|
31
|
+
for (let i2 = 0; i2 < 64; i2++) {
|
|
32
|
+
let cc = input.charCodeAt(i2);
|
|
33
|
+
if (isNaN(cc) || cc < 48 || cc > 102 || cc > 57 && cc < 97) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
|
|
5
40
|
// core.ts
|
|
6
41
|
var verifiedSymbol = Symbol("verified");
|
|
7
42
|
var isRecord = (obj) => obj instanceof Object;
|
|
@@ -16,7 +51,7 @@ function validateEvent(event) {
|
|
|
16
51
|
return false;
|
|
17
52
|
if (typeof event.pubkey !== "string")
|
|
18
53
|
return false;
|
|
19
|
-
if (!event.pubkey
|
|
54
|
+
if (!isHex32(event.pubkey))
|
|
20
55
|
return false;
|
|
21
56
|
if (!Array.isArray(event.tags))
|
|
22
57
|
return false;
|
|
@@ -34,34 +69,6 @@ function validateEvent(event) {
|
|
|
34
69
|
|
|
35
70
|
// pure.ts
|
|
36
71
|
import { sha256 } from "@noble/hashes/sha2.js";
|
|
37
|
-
|
|
38
|
-
// utils.ts
|
|
39
|
-
import { bytesToHex, hexToBytes } from "@noble/hashes/utils.js";
|
|
40
|
-
var utf8Decoder = new TextDecoder("utf-8");
|
|
41
|
-
var utf8Encoder = new TextEncoder();
|
|
42
|
-
function normalizeURL(url) {
|
|
43
|
-
try {
|
|
44
|
-
if (url.indexOf("://") === -1)
|
|
45
|
-
url = "wss://" + url;
|
|
46
|
-
let p = new URL(url);
|
|
47
|
-
if (p.protocol === "http:")
|
|
48
|
-
p.protocol = "ws:";
|
|
49
|
-
else if (p.protocol === "https:")
|
|
50
|
-
p.protocol = "wss:";
|
|
51
|
-
p.pathname = p.pathname.replace(/\/+/g, "/");
|
|
52
|
-
if (p.pathname.endsWith("/"))
|
|
53
|
-
p.pathname = p.pathname.slice(0, -1);
|
|
54
|
-
if (p.port === "80" && p.protocol === "ws:" || p.port === "443" && p.protocol === "wss:")
|
|
55
|
-
p.port = "";
|
|
56
|
-
p.searchParams.sort();
|
|
57
|
-
p.hash = "";
|
|
58
|
-
return p.toString();
|
|
59
|
-
} catch (e) {
|
|
60
|
-
throw new Error(`Invalid URL: ${url}`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// pure.ts
|
|
65
72
|
var JS = class {
|
|
66
73
|
generateSecretKey() {
|
|
67
74
|
return schnorr.utils.randomSecretKey();
|
|
@@ -554,7 +561,7 @@ var AbstractRelay = class {
|
|
|
554
561
|
case "EVENT": {
|
|
555
562
|
const so = this.openSubs.get(data[1]);
|
|
556
563
|
const event = data[2];
|
|
557
|
-
if (
|
|
564
|
+
if (matchFilters(so.filters, event) && this.verifyEvent(event, this.url)) {
|
|
558
565
|
so.onevent(event);
|
|
559
566
|
} else {
|
|
560
567
|
so.oninvalidevent?.(event);
|
|
@@ -710,12 +717,6 @@ var Subscription = class {
|
|
|
710
717
|
}
|
|
711
718
|
};
|
|
712
719
|
|
|
713
|
-
// helpers.ts
|
|
714
|
-
var alwaysTrue = (t) => {
|
|
715
|
-
t[verifiedSymbol] = true;
|
|
716
|
-
return true;
|
|
717
|
-
};
|
|
718
|
-
|
|
719
720
|
// nip45.ts
|
|
720
721
|
import { sha256 as sha2562 } from "@noble/hashes/sha2.js";
|
|
721
722
|
import { bytesToHex as bytesToHex3 } from "@noble/hashes/utils.js";
|
|
@@ -742,7 +743,7 @@ function newHll() {
|
|
|
742
743
|
return new Uint8Array(M);
|
|
743
744
|
}
|
|
744
745
|
function hllDecode(hex) {
|
|
745
|
-
if (hex.length !== HLL_HEX_LENGTH || !/^[0-9a-
|
|
746
|
+
if (hex.length !== HLL_HEX_LENGTH || !/^[0-9a-f]+$/.test(hex))
|
|
746
747
|
return void 0;
|
|
747
748
|
const registers = new Uint8Array(M);
|
|
748
749
|
for (let i2 = 0; i2 < M; i2++) {
|
|
@@ -783,7 +784,6 @@ var AbstractSimplePool = class {
|
|
|
783
784
|
enableReconnect;
|
|
784
785
|
idleTimeout = 2e4;
|
|
785
786
|
automaticallyAuth;
|
|
786
|
-
trustedRelayURLs = /* @__PURE__ */ new Set();
|
|
787
787
|
onRelayConnectionFailure;
|
|
788
788
|
onRelayConnectionSuccess;
|
|
789
789
|
allowConnectingToRelay;
|
|
@@ -807,7 +807,7 @@ var AbstractSimplePool = class {
|
|
|
807
807
|
let relay = this.relays.get(url);
|
|
808
808
|
if (!relay) {
|
|
809
809
|
relay = new AbstractRelay(url, {
|
|
810
|
-
verifyEvent: this.
|
|
810
|
+
verifyEvent: this.verifyEvent,
|
|
811
811
|
websocketImplementation: this._WebSocket,
|
|
812
812
|
enablePing: this.enablePing,
|
|
813
813
|
enableReconnect: this.enableReconnect,
|
|
@@ -891,11 +891,11 @@ var AbstractSimplePool = class {
|
|
|
891
891
|
}
|
|
892
892
|
};
|
|
893
893
|
const closesReceived = [];
|
|
894
|
-
let handleClose = (i2, reason) => {
|
|
894
|
+
let handleClose = (i2, url, reason) => {
|
|
895
895
|
if (closesReceived[i2])
|
|
896
896
|
return;
|
|
897
897
|
handleEose(i2);
|
|
898
|
-
closesReceived[i2] = reason;
|
|
898
|
+
closesReceived[i2] = { url, reason };
|
|
899
899
|
if (closesReceived.filter((a) => a).length === groupedRequests.length) {
|
|
900
900
|
params.onclose?.(closesReceived);
|
|
901
901
|
handleClose = () => {
|
|
@@ -913,7 +913,7 @@ var AbstractSimplePool = class {
|
|
|
913
913
|
const allOpened = Promise.all(
|
|
914
914
|
groupedRequests.map(async ({ url, filters }, i2) => {
|
|
915
915
|
if (this.allowConnectingToRelay?.(url, ["read", filters]) === false) {
|
|
916
|
-
handleClose(i2, "connection skipped by allowConnectingToRelay");
|
|
916
|
+
handleClose(i2, url, "connection skipped by allowConnectingToRelay");
|
|
917
917
|
return;
|
|
918
918
|
}
|
|
919
919
|
let relay;
|
|
@@ -924,7 +924,7 @@ var AbstractSimplePool = class {
|
|
|
924
924
|
});
|
|
925
925
|
} catch (err) {
|
|
926
926
|
this.onRelayConnectionFailure?.(url);
|
|
927
|
-
handleClose(i2, err?.message || String(err));
|
|
927
|
+
handleClose(i2, url, err?.message || String(err));
|
|
928
928
|
return;
|
|
929
929
|
}
|
|
930
930
|
this.onRelayConnectionSuccess?.(url);
|
|
@@ -938,17 +938,17 @@ var AbstractSimplePool = class {
|
|
|
938
938
|
...params,
|
|
939
939
|
oneose: () => handleEose(i2),
|
|
940
940
|
onclose: (reason2) => {
|
|
941
|
-
handleClose(i2, reason2);
|
|
941
|
+
handleClose(i2, url, reason2);
|
|
942
942
|
},
|
|
943
943
|
alreadyHaveEvent: localAlreadyHaveEventHandler,
|
|
944
944
|
eoseTimeout: params.maxWait,
|
|
945
945
|
abort: params.abort
|
|
946
946
|
});
|
|
947
947
|
}).catch((err) => {
|
|
948
|
-
handleClose(i2, `auth was required and attempted, but failed with: ${err}`);
|
|
948
|
+
handleClose(i2, url, `auth was required and attempted, but failed with: ${err}`);
|
|
949
949
|
});
|
|
950
950
|
} else {
|
|
951
|
-
handleClose(i2, reason);
|
|
951
|
+
handleClose(i2, url, reason);
|
|
952
952
|
}
|
|
953
953
|
},
|
|
954
954
|
alreadyHaveEvent: localAlreadyHaveEventHandler,
|
|
@@ -976,7 +976,7 @@ var AbstractSimplePool = class {
|
|
|
976
976
|
if (subcloser)
|
|
977
977
|
subcloser.close(reason);
|
|
978
978
|
else
|
|
979
|
-
params.onclose?.(relays.map((
|
|
979
|
+
params.onclose?.(relays.map((url) => ({ url, reason })));
|
|
980
980
|
}
|
|
981
981
|
});
|
|
982
982
|
return subcloser;
|