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.
Files changed (141) hide show
  1. package/lib/cjs/abstract-pool.js +11 -21
  2. package/lib/cjs/abstract-pool.js.map +3 -3
  3. package/lib/cjs/abstract-relay.js +1 -1
  4. package/lib/cjs/abstract-relay.js.map +2 -2
  5. package/lib/cjs/core.js +17 -1
  6. package/lib/cjs/core.js.map +3 -3
  7. package/lib/cjs/filter.js.map +1 -1
  8. package/lib/cjs/index.js +124 -123
  9. package/lib/cjs/index.js.map +4 -4
  10. package/lib/cjs/kinds.js +17 -1
  11. package/lib/cjs/kinds.js.map +3 -3
  12. package/lib/cjs/nip04.js.map +1 -1
  13. package/lib/cjs/nip10.js +20 -5
  14. package/lib/cjs/nip10.js.map +3 -3
  15. package/lib/cjs/nip13.js.map +1 -1
  16. package/lib/cjs/nip17.js +30 -23
  17. package/lib/cjs/nip17.js.map +4 -4
  18. package/lib/cjs/nip18.js +21 -14
  19. package/lib/cjs/nip18.js.map +4 -4
  20. package/lib/cjs/nip19.js.map +1 -1
  21. package/lib/cjs/nip21.js.map +1 -1
  22. package/lib/cjs/nip22.js +22 -7
  23. package/lib/cjs/nip22.js.map +3 -3
  24. package/lib/cjs/nip25.js +21 -14
  25. package/lib/cjs/nip25.js.map +4 -4
  26. package/lib/cjs/nip27.js.map +1 -1
  27. package/lib/cjs/nip28.js +21 -14
  28. package/lib/cjs/nip28.js.map +4 -4
  29. package/lib/cjs/nip29.js.map +1 -1
  30. package/lib/cjs/nip30.js.map +2 -2
  31. package/lib/cjs/nip42.js.map +2 -2
  32. package/lib/cjs/nip44.js.map +1 -1
  33. package/lib/cjs/nip45.js +22 -9
  34. package/lib/cjs/nip45.js.map +4 -4
  35. package/lib/cjs/nip46.js +63 -63
  36. package/lib/cjs/nip46.js.map +4 -4
  37. package/lib/cjs/nip47.js +25 -18
  38. package/lib/cjs/nip47.js.map +4 -4
  39. package/lib/cjs/nip57.js +23 -16
  40. package/lib/cjs/nip57.js.map +4 -4
  41. package/lib/cjs/nip58.js.map +2 -2
  42. package/lib/cjs/nip59.js +16 -7
  43. package/lib/cjs/nip59.js.map +3 -3
  44. package/lib/cjs/nip75.js.map +1 -1
  45. package/lib/cjs/nip94.js.map +1 -1
  46. package/lib/cjs/nip98.js +23 -16
  47. package/lib/cjs/nip98.js.map +4 -4
  48. package/lib/cjs/nip99.js.map +2 -2
  49. package/lib/cjs/nipb0.js +38 -17
  50. package/lib/cjs/nipb0.js.map +4 -4
  51. package/lib/cjs/nipb7.js +13 -7
  52. package/lib/cjs/nipb7.js.map +2 -2
  53. package/lib/cjs/pool.js +54 -54
  54. package/lib/cjs/pool.js.map +4 -4
  55. package/lib/cjs/pure.js +21 -14
  56. package/lib/cjs/pure.js.map +4 -4
  57. package/lib/cjs/references.js.map +1 -1
  58. package/lib/cjs/relay.js +43 -36
  59. package/lib/cjs/relay.js.map +4 -4
  60. package/lib/cjs/signer.js +21 -14
  61. package/lib/cjs/signer.js.map +4 -4
  62. package/lib/cjs/utils.js +10 -0
  63. package/lib/cjs/utils.js.map +2 -2
  64. package/lib/cjs/wasm.js +16 -2
  65. package/lib/cjs/wasm.js.map +4 -4
  66. package/lib/esm/abstract-pool.js +11 -21
  67. package/lib/esm/abstract-pool.js.map +3 -3
  68. package/lib/esm/abstract-relay.js +1 -1
  69. package/lib/esm/abstract-relay.js.map +2 -2
  70. package/lib/esm/core.js +15 -1
  71. package/lib/esm/core.js.map +3 -3
  72. package/lib/esm/filter.js.map +1 -1
  73. package/lib/esm/index.js +74 -73
  74. package/lib/esm/index.js.map +4 -4
  75. package/lib/esm/kinds.js +17 -1
  76. package/lib/esm/kinds.js.map +3 -3
  77. package/lib/esm/nip04.js.map +1 -1
  78. package/lib/esm/nip10.js +18 -5
  79. package/lib/esm/nip10.js.map +3 -3
  80. package/lib/esm/nip13.js.map +1 -1
  81. package/lib/esm/nip17.js +15 -8
  82. package/lib/esm/nip17.js.map +4 -4
  83. package/lib/esm/nip18.js +15 -8
  84. package/lib/esm/nip18.js.map +4 -4
  85. package/lib/esm/nip19.js.map +1 -1
  86. package/lib/esm/nip21.js.map +1 -1
  87. package/lib/esm/nip22.js +20 -7
  88. package/lib/esm/nip22.js.map +3 -3
  89. package/lib/esm/nip25.js +15 -8
  90. package/lib/esm/nip25.js.map +4 -4
  91. package/lib/esm/nip27.js.map +1 -1
  92. package/lib/esm/nip28.js +15 -8
  93. package/lib/esm/nip28.js.map +4 -4
  94. package/lib/esm/nip29.js.map +1 -1
  95. package/lib/esm/nip30.js.map +2 -2
  96. package/lib/esm/nip42.js.map +2 -2
  97. package/lib/esm/nip44.js.map +1 -1
  98. package/lib/esm/nip45.js +23 -10
  99. package/lib/esm/nip45.js.map +4 -4
  100. package/lib/esm/nip46.js +47 -47
  101. package/lib/esm/nip46.js.map +4 -4
  102. package/lib/esm/nip47.js +15 -8
  103. package/lib/esm/nip47.js.map +4 -4
  104. package/lib/esm/nip57.js +17 -10
  105. package/lib/esm/nip57.js.map +4 -4
  106. package/lib/esm/nip58.js.map +2 -2
  107. package/lib/esm/nip59.js +10 -1
  108. package/lib/esm/nip59.js.map +3 -3
  109. package/lib/esm/nip75.js.map +1 -1
  110. package/lib/esm/nip94.js.map +1 -1
  111. package/lib/esm/nip98.js +15 -8
  112. package/lib/esm/nip98.js.map +4 -4
  113. package/lib/esm/nip99.js.map +2 -2
  114. package/lib/esm/nipb0.js +39 -18
  115. package/lib/esm/nipb0.js.map +4 -4
  116. package/lib/esm/nipb7.js +13 -7
  117. package/lib/esm/nipb7.js.map +2 -2
  118. package/lib/esm/pool.js +47 -47
  119. package/lib/esm/pool.js.map +4 -4
  120. package/lib/esm/pure.js +15 -8
  121. package/lib/esm/pure.js.map +4 -4
  122. package/lib/esm/references.js.map +1 -1
  123. package/lib/esm/relay.js +37 -30
  124. package/lib/esm/relay.js.map +4 -4
  125. package/lib/esm/signer.js +15 -8
  126. package/lib/esm/signer.js.map +4 -4
  127. package/lib/esm/utils.js +10 -0
  128. package/lib/esm/utils.js.map +2 -2
  129. package/lib/esm/wasm.js +17 -3
  130. package/lib/esm/wasm.js.map +4 -4
  131. package/lib/nostr.bundle.js +73 -70
  132. package/lib/nostr.bundle.js.map +4 -4
  133. package/lib/types/abstract-pool.d.ts +6 -4
  134. package/lib/types/abstract-relay.d.ts +2 -2
  135. package/lib/types/kinds.d.ts +2 -0
  136. package/lib/types/nipb0.d.ts +0 -1
  137. package/lib/types/nipb0.test.d.ts +1 -0
  138. package/lib/types/nipb7.d.ts +0 -1
  139. package/lib/types/utils.d.ts +4 -0
  140. package/package.json +1 -1
  141. 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.match(/^[a-f0-9]{64}$/))
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 (this.verifyEvent(event) && matchFilters(so.filters, event)) {
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-fA-F]+$/.test(hex))
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.trustedRelayURLs.has(url) ? alwaysTrue : this.verifyEvent,
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((_) => reason));
979
+ params.onclose?.(relays.map((url) => ({ url, reason })));
980
980
  }
981
981
  });
982
982
  return subcloser;