nostr-tools 2.23.3 → 2.23.5

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 (53) hide show
  1. package/lib/cjs/abstract-pool.js +5 -1
  2. package/lib/cjs/abstract-pool.js.map +2 -2
  3. package/lib/cjs/abstract-relay.js +5 -1
  4. package/lib/cjs/abstract-relay.js.map +2 -2
  5. package/lib/cjs/index.js +180 -16
  6. package/lib/cjs/index.js.map +4 -4
  7. package/lib/cjs/nip17.js +31 -9
  8. package/lib/cjs/nip17.js.map +2 -2
  9. package/lib/cjs/nip22.js +154 -0
  10. package/lib/cjs/nip22.js.map +7 -0
  11. package/lib/cjs/nip44.js +34 -10
  12. package/lib/cjs/nip44.js.map +2 -2
  13. package/lib/cjs/nip46.js +39 -11
  14. package/lib/cjs/nip46.js.map +2 -2
  15. package/lib/cjs/nip47.js +3 -3
  16. package/lib/cjs/nip47.js.map +2 -2
  17. package/lib/cjs/nip59.js +31 -9
  18. package/lib/cjs/nip59.js.map +2 -2
  19. package/lib/cjs/pool.js +5 -1
  20. package/lib/cjs/pool.js.map +2 -2
  21. package/lib/cjs/relay.js +5 -1
  22. package/lib/cjs/relay.js.map +2 -2
  23. package/lib/esm/abstract-pool.js +5 -1
  24. package/lib/esm/abstract-pool.js.map +2 -2
  25. package/lib/esm/abstract-relay.js +5 -1
  26. package/lib/esm/abstract-relay.js.map +2 -2
  27. package/lib/esm/index.js +180 -16
  28. package/lib/esm/index.js.map +4 -4
  29. package/lib/esm/nip17.js +31 -9
  30. package/lib/esm/nip17.js.map +2 -2
  31. package/lib/esm/nip22.js +133 -0
  32. package/lib/esm/nip22.js.map +7 -0
  33. package/lib/esm/nip44.js +34 -10
  34. package/lib/esm/nip44.js.map +2 -2
  35. package/lib/esm/nip46.js +39 -11
  36. package/lib/esm/nip46.js.map +2 -2
  37. package/lib/esm/nip47.js +3 -3
  38. package/lib/esm/nip47.js.map +2 -2
  39. package/lib/esm/nip59.js +31 -9
  40. package/lib/esm/nip59.js.map +2 -2
  41. package/lib/esm/pool.js +5 -1
  42. package/lib/esm/pool.js.map +2 -2
  43. package/lib/esm/relay.js +5 -1
  44. package/lib/esm/relay.js.map +2 -2
  45. package/lib/nostr.bundle.js +180 -16
  46. package/lib/nostr.bundle.js.map +4 -4
  47. package/lib/types/index.d.ts +1 -0
  48. package/lib/types/nip22.d.ts +36 -0
  49. package/lib/types/nip22.test.d.ts +1 -0
  50. package/lib/types/nip44.d.ts +5 -0
  51. package/lib/types/nip46.d.ts +2 -0
  52. package/lib/types/nip47.d.ts +2 -0
  53. package/package.json +8 -2
package/lib/cjs/nip46.js CHANGED
@@ -154,7 +154,8 @@ var import_sha22 = require("@noble/hashes/sha2.js");
154
154
  var import_utils5 = require("@noble/hashes/utils.js");
155
155
  var import_base = require("@scure/base");
156
156
  var minPlaintextSize = 1;
157
- var maxPlaintextSize = 65535;
157
+ var maxPlaintextSize = 4294967295;
158
+ var extendedPrefixThreshold = 65536;
158
159
  function getConversationKey(privkeyA, pubkeyB) {
159
160
  const sharedX = import_secp256k12.secp256k1.getSharedSecret(privkeyA, (0, import_utils5.hexToBytes)("02" + pubkeyB)).subarray(1, 33);
160
161
  return (0, import_hkdf.extract)(import_sha22.sha256, sharedX, utf8Encoder.encode("nip44-v2"));
@@ -172,28 +173,49 @@ function calcPaddedLen(len) {
172
173
  throw new Error("expected positive integer");
173
174
  if (len <= 32)
174
175
  return 32;
175
- const nextPower = 1 << Math.floor(Math.log2(len - 1)) + 1;
176
+ const nextPower = 2 ** (Math.floor(Math.log2(len - 1)) + 1);
176
177
  const chunk = nextPower <= 256 ? 32 : nextPower / 8;
177
178
  return chunk * (Math.floor((len - 1) / chunk) + 1);
178
179
  }
179
180
  function writeU16BE(num) {
180
- if (!Number.isSafeInteger(num) || num < minPlaintextSize || num > maxPlaintextSize)
181
+ if (!Number.isSafeInteger(num) || num < minPlaintextSize || num > 65535)
181
182
  throw new Error("invalid plaintext size: must be between 1 and 65535 bytes");
182
183
  const arr = new Uint8Array(2);
183
184
  new DataView(arr.buffer).setUint16(0, num, false);
184
185
  return arr;
185
186
  }
187
+ function writeU32BE(num) {
188
+ if (!Number.isSafeInteger(num) || num < extendedPrefixThreshold || num > maxPlaintextSize)
189
+ throw new Error("invalid plaintext size: must be between 65536 and 4294967295 bytes");
190
+ const arr = new Uint8Array(4);
191
+ new DataView(arr.buffer).setUint32(0, num, false);
192
+ return arr;
193
+ }
186
194
  function pad(plaintext) {
187
195
  const unpadded = utf8Encoder.encode(plaintext);
188
196
  const unpaddedLen = unpadded.length;
189
- const prefix = writeU16BE(unpaddedLen);
197
+ if (unpaddedLen < minPlaintextSize || unpaddedLen > maxPlaintextSize)
198
+ throw new Error("invalid plaintext size: must be between 1 and 4294967295 bytes");
199
+ const prefix = unpaddedLen >= extendedPrefixThreshold ? (0, import_utils5.concatBytes)(new Uint8Array([0, 0]), writeU32BE(unpaddedLen)) : writeU16BE(unpaddedLen);
190
200
  const suffix = new Uint8Array(calcPaddedLen(unpaddedLen) - unpaddedLen);
191
201
  return (0, import_utils5.concatBytes)(prefix, unpadded, suffix);
192
202
  }
193
203
  function unpad(padded) {
194
- const unpaddedLen = new DataView(padded.buffer).getUint16(0);
195
- const unpadded = padded.subarray(2, 2 + unpaddedLen);
196
- if (unpaddedLen < minPlaintextSize || unpaddedLen > maxPlaintextSize || unpadded.length !== unpaddedLen || padded.length !== 2 + calcPaddedLen(unpaddedLen))
204
+ const dv = new DataView(padded.buffer, padded.byteOffset, padded.byteLength);
205
+ const firstTwo = dv.getUint16(0);
206
+ let unpaddedLen;
207
+ let prefixLen;
208
+ if (firstTwo === 0) {
209
+ unpaddedLen = dv.getUint32(2);
210
+ if (unpaddedLen < extendedPrefixThreshold)
211
+ throw new Error("invalid padding");
212
+ prefixLen = 6;
213
+ } else {
214
+ unpaddedLen = firstTwo;
215
+ prefixLen = 2;
216
+ }
217
+ const unpadded = padded.subarray(prefixLen, prefixLen + unpaddedLen);
218
+ if (unpaddedLen < minPlaintextSize || unpaddedLen > maxPlaintextSize || unpadded.length !== unpaddedLen || padded.length !== prefixLen + calcPaddedLen(unpaddedLen))
197
219
  throw new Error("invalid padding");
198
220
  return utf8Decoder.decode(unpadded);
199
221
  }
@@ -207,7 +229,7 @@ function decodePayload(payload) {
207
229
  if (typeof payload !== "string")
208
230
  throw new Error("payload must be a valid string");
209
231
  const plen = payload.length;
210
- if (plen < 132 || plen > 87472)
232
+ if (plen < 132)
211
233
  throw new Error("invalid payload length: " + plen);
212
234
  if (payload[0] === "#")
213
235
  throw new Error("unknown encryption version");
@@ -218,7 +240,7 @@ function decodePayload(payload) {
218
240
  throw new Error("invalid base64: " + error.message);
219
241
  }
220
242
  const dlen = data.length;
221
- if (dlen < 99 || dlen > 65603)
243
+ if (dlen < 99)
222
244
  throw new Error("invalid data length: " + dlen);
223
245
  const vers = data[0];
224
246
  if (vers !== 2)
@@ -709,7 +731,11 @@ var AbstractRelay = class {
709
731
  case "AUTH": {
710
732
  this.challenge = data[1];
711
733
  if (this.onauth) {
712
- this.auth(this.onauth);
734
+ this.auth(this.onauth).catch((err) => {
735
+ if (!(err instanceof SendingOnClosedConnection)) {
736
+ throw err;
737
+ }
738
+ });
713
739
  }
714
740
  return;
715
741
  }
@@ -1234,7 +1260,9 @@ var BunkerSigner = class {
1234
1260
  signer.conversationKey = getConversationKey(clientSecretKey, event.pubkey);
1235
1261
  signer.setupSubscription();
1236
1262
  success = true;
1237
- await Promise.race([new Promise((resolve2) => setTimeout(resolve2, 1e3)), signer.switchRelays()]);
1263
+ if (!bunkerParams.skipSwitchRelays) {
1264
+ await Promise.race([new Promise((resolve2) => setTimeout(resolve2, 1e3)), signer.switchRelays()]);
1265
+ }
1238
1266
  resolve(signer);
1239
1267
  }
1240
1268
  } catch (e) {