nostr-tools 2.23.8 → 2.23.11

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 (74) hide show
  1. package/lib/cjs/abstract-pool.js +163 -7
  2. package/lib/cjs/abstract-pool.js.map +4 -4
  3. package/lib/cjs/abstract-relay.js +59 -6
  4. package/lib/cjs/abstract-relay.js.map +2 -2
  5. package/lib/cjs/filter.js.map +1 -1
  6. package/lib/cjs/index.js +412 -64
  7. package/lib/cjs/index.js.map +4 -4
  8. package/lib/cjs/kinds.js +196 -4
  9. package/lib/cjs/kinds.js.map +2 -2
  10. package/lib/cjs/nip17.js.map +2 -2
  11. package/lib/cjs/nip18.js.map +2 -2
  12. package/lib/cjs/nip25.js.map +1 -1
  13. package/lib/cjs/nip28.js.map +2 -2
  14. package/lib/cjs/nip42.js.map +2 -2
  15. package/lib/cjs/nip45.js +183 -0
  16. package/lib/cjs/nip45.js.map +7 -0
  17. package/lib/cjs/nip46.js +163 -7
  18. package/lib/cjs/nip46.js.map +4 -4
  19. package/lib/cjs/nip47.js.map +2 -2
  20. package/lib/cjs/nip57.js.map +1 -1
  21. package/lib/cjs/nip58.js.map +2 -2
  22. package/lib/cjs/nip59.js.map +2 -2
  23. package/lib/cjs/nip75.js.map +2 -2
  24. package/lib/cjs/nip94.js.map +2 -2
  25. package/lib/cjs/nip98.js.map +2 -2
  26. package/lib/cjs/nip99.js.map +2 -2
  27. package/lib/cjs/nipb0.js +1064 -0
  28. package/lib/cjs/nipb0.js.map +7 -0
  29. package/lib/cjs/pool.js +163 -7
  30. package/lib/cjs/pool.js.map +4 -4
  31. package/lib/cjs/relay.js +59 -6
  32. package/lib/cjs/relay.js.map +2 -2
  33. package/lib/esm/abstract-pool.js +163 -7
  34. package/lib/esm/abstract-pool.js.map +4 -4
  35. package/lib/esm/abstract-relay.js +59 -6
  36. package/lib/esm/abstract-relay.js.map +2 -2
  37. package/lib/esm/filter.js.map +1 -1
  38. package/lib/esm/index.js +388 -40
  39. package/lib/esm/index.js.map +4 -4
  40. package/lib/esm/kinds.js +196 -4
  41. package/lib/esm/kinds.js.map +2 -2
  42. package/lib/esm/nip17.js.map +2 -2
  43. package/lib/esm/nip18.js.map +2 -2
  44. package/lib/esm/nip25.js.map +1 -1
  45. package/lib/esm/nip28.js.map +2 -2
  46. package/lib/esm/nip42.js.map +2 -2
  47. package/lib/esm/nip45.js +162 -0
  48. package/lib/esm/nip45.js.map +7 -0
  49. package/lib/esm/nip46.js +163 -7
  50. package/lib/esm/nip46.js.map +4 -4
  51. package/lib/esm/nip47.js.map +2 -2
  52. package/lib/esm/nip57.js.map +1 -1
  53. package/lib/esm/nip58.js.map +2 -2
  54. package/lib/esm/nip59.js.map +2 -2
  55. package/lib/esm/nip75.js.map +2 -2
  56. package/lib/esm/nip94.js.map +2 -2
  57. package/lib/esm/nip98.js.map +2 -2
  58. package/lib/esm/nip99.js.map +2 -2
  59. package/lib/esm/nipb0.js +1049 -0
  60. package/lib/esm/nipb0.js.map +7 -0
  61. package/lib/esm/pool.js +163 -7
  62. package/lib/esm/pool.js.map +4 -4
  63. package/lib/esm/relay.js +59 -6
  64. package/lib/esm/relay.js.map +2 -2
  65. package/lib/nostr.bundle.js +361 -15
  66. package/lib/nostr.bundle.js.map +4 -4
  67. package/lib/types/abstract-pool.d.ts +10 -0
  68. package/lib/types/abstract-relay.d.ts +15 -1
  69. package/lib/types/kinds.d.ts +200 -8
  70. package/lib/types/nip45.d.ts +13 -0
  71. package/lib/types/nip45.test.d.ts +1 -0
  72. package/lib/types/nipb0.d.ts +129 -0
  73. package/lib/types/relay.d.ts +2 -2
  74. package/package.json +13 -1
package/lib/esm/index.js CHANGED
@@ -232,39 +232,61 @@ var verifyEvent = i.verifyEvent;
232
232
  // kinds.ts
233
233
  var kinds_exports = {};
234
234
  __export(kinds_exports, {
235
+ AIEmbeddings: () => AIEmbeddings,
236
+ AppCurationSet: () => AppCurationSet,
235
237
  Application: () => Application,
238
+ AuthoredPodcasts: () => AuthoredPodcasts,
236
239
  BadgeAward: () => BadgeAward,
237
240
  BadgeDefinition: () => BadgeDefinition,
241
+ Bid: () => Bid,
242
+ BidConfirmation: () => BidConfirmation,
243
+ BlobsAuth: () => BlobsAuth,
238
244
  BlockedRelaysList: () => BlockedRelaysList,
239
245
  BlossomServerList: () => BlossomServerList,
240
246
  BookmarkList: () => BookmarkList,
241
247
  Bookmarksets: () => Bookmarksets,
242
248
  Calendar: () => Calendar,
243
249
  CalendarEventRSVP: () => CalendarEventRSVP,
250
+ CashuMintAnnouncement: () => CashuMintAnnouncement,
251
+ CashuWalletEvent: () => CashuWalletEvent,
252
+ CashuWalletHistory: () => CashuWalletHistory,
253
+ CashuWalletTokens: () => CashuWalletTokens,
244
254
  ChannelCreation: () => ChannelCreation,
245
255
  ChannelHideMessage: () => ChannelHideMessage,
246
256
  ChannelMessage: () => ChannelMessage,
247
257
  ChannelMetadata: () => ChannelMetadata,
248
258
  ChannelMuteUser: () => ChannelMuteUser,
249
259
  ChatMessage: () => ChatMessage,
260
+ Chess: () => Chess,
250
261
  ClassifiedListing: () => ClassifiedListing,
251
262
  ClientAuth: () => ClientAuth,
263
+ CodeSnippet: () => CodeSnippet,
264
+ CoinjoinPool: () => CoinjoinPool,
252
265
  Comment: () => Comment,
253
266
  CommunitiesList: () => CommunitiesList,
254
267
  CommunityDefinition: () => CommunityDefinition,
255
268
  CommunityPostApproval: () => CommunityPostApproval,
269
+ ConferenceEvent: () => ConferenceEvent,
256
270
  Contacts: () => Contacts,
257
271
  CreateOrUpdateProduct: () => CreateOrUpdateProduct,
258
272
  CreateOrUpdateStall: () => CreateOrUpdateStall,
273
+ CuratedVideoSets: () => CuratedVideoSets,
259
274
  Curationsets: () => Curationsets,
260
275
  Date: () => Date2,
276
+ DecoupledEncryptionKeyDistribution: () => DecoupledEncryptionKeyDistribution,
277
+ DecoupledKeyAnnouncement: () => DecoupledKeyAnnouncement,
278
+ DecoupledKeyClientAnnouncement: () => DecoupledKeyClientAnnouncement,
261
279
  DirectMessageRelaysList: () => DirectMessageRelaysList,
262
280
  DraftClassifiedListing: () => DraftClassifiedListing,
281
+ DraftEvent: () => DraftEvent,
263
282
  DraftLong: () => DraftLong,
264
283
  Emojisets: () => Emojisets,
265
284
  EncryptedDirectMessage: () => EncryptedDirectMessage,
266
285
  EventDeletion: () => EventDeletion,
286
+ FavoritePodcasts: () => FavoritePodcasts,
267
287
  FavoriteRelays: () => FavoriteRelays,
288
+ FedimintAnnouncement: () => FedimintAnnouncement,
289
+ Feed: () => Feed,
268
290
  FileMessage: () => FileMessage,
269
291
  FileMetadata: () => FileMetadata,
270
292
  FileServerPreference: () => FileServerPreference,
@@ -272,55 +294,129 @@ __export(kinds_exports, {
272
294
  ForumThread: () => ForumThread,
273
295
  GenericRepost: () => GenericRepost,
274
296
  Genericlists: () => Genericlists,
297
+ GeocacheListing: () => GeocacheListing,
298
+ GeocacheLog: () => GeocacheLog,
299
+ GeocacheLogEntry: () => GeocacheLogEntry,
300
+ GeocacheProofOfFind: () => GeocacheProofOfFind,
275
301
  GiftWrap: () => GiftWrap,
302
+ GitPullRequest: () => GitPullRequest,
303
+ GitPullRequestUpdate: () => GitPullRequestUpdate,
304
+ GoodWikiAuthorList: () => GoodWikiAuthorList,
305
+ GoodWikiRelayList: () => GoodWikiRelayList,
276
306
  GroupMetadata: () => GroupMetadata,
277
307
  HTTPAuth: () => HTTPAuth,
278
308
  Handlerinformation: () => Handlerinformation,
279
309
  Handlerrecommendation: () => Handlerrecommendation,
280
310
  Highlights: () => Highlights,
311
+ InteractiveRoom: () => InteractiveRoom,
281
312
  InterestsList: () => InterestsList,
282
313
  Interestsets: () => Interestsets,
314
+ Issue: () => Issue,
283
315
  JobFeedback: () => JobFeedback,
284
316
  JobRequest: () => JobRequest,
285
317
  JobResult: () => JobResult,
286
318
  Label: () => Label,
319
+ LegacyNsiteFile: () => LegacyNsiteFile,
287
320
  LightningPubRPC: () => LightningPubRPC,
321
+ LinkSet: () => LinkSet,
288
322
  LiveChatMessage: () => LiveChatMessage,
289
323
  LiveEvent: () => LiveEvent,
290
324
  LongFormArticle: () => LongFormArticle,
325
+ MarketplaceUI: () => MarketplaceUI,
326
+ MediaFollows: () => MediaFollows,
327
+ MediaStarterPacks: () => MediaStarterPacks,
328
+ MergeRequests: () => MergeRequests,
291
329
  Metadata: () => Metadata,
330
+ ModularArticleContent: () => ModularArticleContent,
331
+ ModularArticleHeader: () => ModularArticleHeader,
332
+ MuteSets: () => MuteSets,
292
333
  Mutelist: () => Mutelist,
293
334
  NWCWalletInfo: () => NWCWalletInfo,
294
335
  NWCWalletRequest: () => NWCWalletRequest,
295
336
  NWCWalletResponse: () => NWCWalletResponse,
296
337
  NormalVideo: () => NormalVideo,
297
338
  NostrConnect: () => NostrConnect,
339
+ NsiteNamed: () => NsiteNamed,
340
+ NsiteRoot: () => NsiteRoot,
341
+ NutZap: () => NutZap,
342
+ NutZapInfo: () => NutZapInfo,
298
343
  OpenTimestamps: () => OpenTimestamps,
344
+ Patch: () => Patch,
345
+ PeerToPeerOrderEvents: () => PeerToPeerOrderEvents,
299
346
  Photo: () => Photo,
300
347
  Pinlist: () => Pinlist,
348
+ PodcastEpisode: () => PodcastEpisode,
349
+ PodcastMetadata: () => PodcastMetadata,
301
350
  Poll: () => Poll,
302
351
  PollResponse: () => PollResponse,
303
352
  PrivateDirectMessage: () => PrivateDirectMessage,
353
+ PrivateEventRelayList: () => PrivateEventRelayList,
304
354
  ProblemTracker: () => ProblemTracker,
355
+ ProductSoldAsAuction: () => ProductSoldAsAuction,
305
356
  ProfileBadges: () => ProfileBadges,
357
+ ProxyAnnouncement: () => ProxyAnnouncement,
306
358
  PublicChatsList: () => PublicChatsList,
359
+ PublicMessage: () => PublicMessage,
307
360
  Reaction: () => Reaction,
361
+ ReactionToWebsite: () => ReactionToWebsite,
308
362
  RecommendRelay: () => RecommendRelay,
363
+ Redirects: () => Redirects,
364
+ RelayDiscovery: () => RelayDiscovery,
309
365
  RelayList: () => RelayList,
366
+ RelayMonitorAnnouncement: () => RelayMonitorAnnouncement,
310
367
  RelayReview: () => RelayReview,
368
+ RelayReviews: () => RelayReviews,
311
369
  Relaysets: () => Relaysets,
370
+ ReleaseArtifactSets: () => ReleaseArtifactSets,
371
+ Reply: () => Reply,
312
372
  Report: () => Report,
313
373
  Reporting: () => Reporting,
374
+ RepositoryAnnouncement: () => RepositoryAnnouncement,
375
+ RepositoryState: () => RepositoryState,
314
376
  Repost: () => Repost,
377
+ ReservedCashuWalletTokens: () => ReservedCashuWalletTokens,
378
+ RoomPresence: () => RoomPresence,
379
+ Scroll: () => Scroll,
315
380
  Seal: () => Seal,
316
381
  SearchRelaysList: () => SearchRelaysList,
317
382
  ShortTextNote: () => ShortTextNote,
318
383
  ShortVideo: () => ShortVideo,
384
+ SimpleGroupAdmins: () => SimpleGroupAdmins,
385
+ SimpleGroupCreateGroup: () => SimpleGroupCreateGroup,
386
+ SimpleGroupCreateInvite: () => SimpleGroupCreateInvite,
387
+ SimpleGroupDeleteEvent: () => SimpleGroupDeleteEvent,
388
+ SimpleGroupDeleteGroup: () => SimpleGroupDeleteGroup,
389
+ SimpleGroupEditMetadata: () => SimpleGroupEditMetadata,
390
+ SimpleGroupJoinRequest: () => SimpleGroupJoinRequest,
391
+ SimpleGroupLeaveRequest: () => SimpleGroupLeaveRequest,
392
+ SimpleGroupList: () => SimpleGroupList,
393
+ SimpleGroupLiveKitParticipants: () => SimpleGroupLiveKitParticipants,
394
+ SimpleGroupMembers: () => SimpleGroupMembers,
395
+ SimpleGroupPutUser: () => SimpleGroupPutUser,
396
+ SimpleGroupRemoveUser: () => SimpleGroupRemoveUser,
397
+ SimpleGroupReply: () => SimpleGroupReply,
398
+ SimpleGroupRoles: () => SimpleGroupRoles,
399
+ SimpleGroupThreadedReply: () => SimpleGroupThreadedReply,
400
+ SlideSet: () => SlideSet,
401
+ SoftwareApplication: () => SoftwareApplication,
402
+ StarterPacks: () => StarterPacks,
403
+ StatusApplied: () => StatusApplied,
404
+ StatusClosed: () => StatusClosed,
405
+ StatusDraft: () => StatusDraft,
406
+ StatusOpen: () => StatusOpen,
407
+ TidalLogin: () => TidalLogin,
319
408
  Time: () => Time,
409
+ Torrent: () => Torrent,
410
+ TorrentComment: () => TorrentComment,
411
+ TransportMethodAnnouncement: () => TransportMethodAnnouncement,
320
412
  UserEmojiList: () => UserEmojiList,
413
+ UserGraspList: () => UserGraspList,
321
414
  UserStatuses: () => UserStatuses,
415
+ VideoViewEvent: () => VideoViewEvent,
322
416
  Voice: () => Voice,
323
417
  VoiceComment: () => VoiceComment,
418
+ WebBookmarks: () => WebBookmarks,
419
+ WikiArticle: () => WikiArticle,
324
420
  Zap: () => Zap,
325
421
  ZapGoal: () => ZapGoal,
326
422
  ZapRequest: () => ZapRequest,
@@ -368,40 +464,83 @@ var Repost = 6;
368
464
  var Reaction = 7;
369
465
  var BadgeAward = 8;
370
466
  var ChatMessage = 9;
467
+ var SimpleGroupThreadedReply = 10;
371
468
  var ForumThread = 11;
469
+ var SimpleGroupReply = 12;
372
470
  var Seal = 13;
373
471
  var PrivateDirectMessage = 14;
374
472
  var FileMessage = 15;
375
473
  var GenericRepost = 16;
474
+ var ReactionToWebsite = 17;
376
475
  var Photo = 20;
377
476
  var NormalVideo = 21;
378
477
  var ShortVideo = 22;
478
+ var PublicMessage = 24;
379
479
  var ChannelCreation = 40;
380
480
  var ChannelMetadata = 41;
381
481
  var ChannelMessage = 42;
382
482
  var ChannelHideMessage = 43;
383
483
  var ChannelMuteUser = 44;
484
+ var PodcastEpisode = 54;
485
+ var Chess = 64;
486
+ var MergeRequests = 818;
487
+ var PollResponse = 1018;
488
+ var Bid = 1021;
489
+ var BidConfirmation = 1022;
384
490
  var OpenTimestamps = 1040;
385
491
  var GiftWrap = 1059;
386
- var Poll = 1068;
387
492
  var FileMetadata = 1063;
493
+ var Poll = 1068;
388
494
  var Comment = 1111;
389
- var LiveChatMessage = 1311;
390
495
  var Voice = 1222;
496
+ var Scroll = 1227;
391
497
  var VoiceComment = 1244;
498
+ var LiveChatMessage = 1311;
499
+ var CodeSnippet = 1337;
500
+ var Patch = 1617;
501
+ var GitPullRequest = 1618;
502
+ var GitPullRequestUpdate = 1619;
503
+ var Issue = 1621;
504
+ var Reply = 1622;
505
+ var StatusOpen = 1630;
506
+ var StatusApplied = 1631;
507
+ var StatusClosed = 1632;
508
+ var StatusDraft = 1633;
392
509
  var ProblemTracker = 1971;
393
510
  var Report = 1984;
394
511
  var Reporting = 1984;
395
512
  var Label = 1985;
513
+ var RelayReviews = 1986;
514
+ var AIEmbeddings = 1987;
515
+ var Torrent = 2003;
516
+ var TorrentComment = 2004;
517
+ var CoinjoinPool = 2022;
518
+ var DecoupledKeyClientAnnouncement = 4454;
519
+ var DecoupledEncryptionKeyDistribution = 4455;
396
520
  var CommunityPostApproval = 4550;
397
521
  var JobRequest = 5999;
398
522
  var JobResult = 6999;
399
523
  var JobFeedback = 7e3;
524
+ var ReservedCashuWalletTokens = 7374;
525
+ var CashuWalletTokens = 7375;
526
+ var CashuWalletHistory = 7376;
527
+ var GeocacheLog = 7516;
528
+ var GeocacheProofOfFind = 7517;
529
+ var SimpleGroupPutUser = 9e3;
530
+ var SimpleGroupRemoveUser = 9001;
531
+ var SimpleGroupEditMetadata = 9002;
532
+ var SimpleGroupDeleteEvent = 9005;
533
+ var SimpleGroupCreateGroup = 9007;
534
+ var SimpleGroupDeleteGroup = 9008;
535
+ var SimpleGroupCreateInvite = 9009;
536
+ var SimpleGroupJoinRequest = 9021;
537
+ var SimpleGroupLeaveRequest = 9022;
400
538
  var ZapGoal = 9041;
539
+ var NutZap = 9321;
540
+ var TidalLogin = 9467;
401
541
  var ZapRequest = 9734;
402
542
  var Zap = 9735;
403
543
  var Highlights = 9802;
404
- var PollResponse = 1018;
405
544
  var Mutelist = 1e4;
406
545
  var Pinlist = 10001;
407
546
  var RelayList = 10002;
@@ -410,37 +549,74 @@ var CommunitiesList = 10004;
410
549
  var PublicChatsList = 10005;
411
550
  var BlockedRelaysList = 10006;
412
551
  var SearchRelaysList = 10007;
552
+ var SimpleGroupList = 10009;
413
553
  var FavoriteRelays = 10012;
554
+ var PrivateEventRelayList = 10013;
414
555
  var InterestsList = 10015;
556
+ var NutZapInfo = 10019;
557
+ var MediaFollows = 10020;
415
558
  var UserEmojiList = 10030;
559
+ var DecoupledKeyAnnouncement = 10044;
416
560
  var DirectMessageRelaysList = 10050;
417
- var FileServerPreference = 10096;
561
+ var FavoritePodcasts = 10054;
418
562
  var BlossomServerList = 10063;
563
+ var FileServerPreference = 10096;
564
+ var GoodWikiAuthorList = 10101;
565
+ var GoodWikiRelayList = 10102;
566
+ var PodcastMetadata = 10154;
567
+ var AuthoredPodcasts = 10164;
568
+ var RelayMonitorAnnouncement = 10166;
569
+ var RoomPresence = 10312;
570
+ var UserGraspList = 10317;
571
+ var ProxyAnnouncement = 10377;
572
+ var TransportMethodAnnouncement = 11111;
419
573
  var NWCWalletInfo = 13194;
574
+ var NsiteRoot = 15128;
575
+ var CashuWalletEvent = 17375;
420
576
  var LightningPubRPC = 21e3;
421
577
  var ClientAuth = 22242;
422
578
  var NWCWalletRequest = 23194;
423
579
  var NWCWalletResponse = 23195;
424
580
  var NostrConnect = 24133;
581
+ var BlobsAuth = 24242;
425
582
  var HTTPAuth = 27235;
426
583
  var Followsets = 3e4;
427
584
  var Genericlists = 30001;
428
585
  var Relaysets = 30002;
429
586
  var Bookmarksets = 30003;
430
587
  var Curationsets = 30004;
588
+ var CuratedVideoSets = 30005;
589
+ var MuteSets = 30007;
431
590
  var ProfileBadges = 30008;
432
591
  var BadgeDefinition = 30009;
433
592
  var Interestsets = 30015;
434
593
  var CreateOrUpdateStall = 30017;
435
594
  var CreateOrUpdateProduct = 30018;
595
+ var MarketplaceUI = 30019;
596
+ var ProductSoldAsAuction = 30020;
436
597
  var LongFormArticle = 30023;
437
598
  var DraftLong = 30024;
438
599
  var Emojisets = 30030;
600
+ var ModularArticleHeader = 30040;
601
+ var ModularArticleContent = 30041;
602
+ var ReleaseArtifactSets = 30063;
439
603
  var Application = 30078;
604
+ var RelayDiscovery = 30166;
605
+ var AppCurationSet = 30267;
440
606
  var LiveEvent = 30311;
607
+ var InteractiveRoom = 30312;
608
+ var ConferenceEvent = 30313;
441
609
  var UserStatuses = 30315;
610
+ var SlideSet = 30388;
442
611
  var ClassifiedListing = 30402;
443
612
  var DraftClassifiedListing = 30403;
613
+ var RepositoryAnnouncement = 30617;
614
+ var RepositoryState = 30618;
615
+ var WikiArticle = 30818;
616
+ var Redirects = 30819;
617
+ var DraftEvent = 31234;
618
+ var LinkSet = 31388;
619
+ var Feed = 31890;
444
620
  var Date2 = 31922;
445
621
  var Time = 31923;
446
622
  var Calendar = 31924;
@@ -448,8 +624,24 @@ var CalendarEventRSVP = 31925;
448
624
  var RelayReview = 31987;
449
625
  var Handlerrecommendation = 31989;
450
626
  var Handlerinformation = 31990;
627
+ var SoftwareApplication = 32267;
628
+ var LegacyNsiteFile = 34128;
629
+ var VideoViewEvent = 34237;
451
630
  var CommunityDefinition = 34550;
631
+ var NsiteNamed = 35128;
632
+ var GeocacheListing = 37515;
633
+ var GeocacheLogEntry = 37516;
634
+ var CashuMintAnnouncement = 38172;
635
+ var FedimintAnnouncement = 38173;
636
+ var PeerToPeerOrderEvents = 38383;
452
637
  var GroupMetadata = 39e3;
638
+ var SimpleGroupAdmins = 39001;
639
+ var SimpleGroupMembers = 39002;
640
+ var SimpleGroupRoles = 39003;
641
+ var SimpleGroupLiveKitParticipants = 39004;
642
+ var StarterPacks = 39089;
643
+ var MediaStarterPacks = 39092;
644
+ var WebBookmarks = 39701;
453
645
 
454
646
  // filter.ts
455
647
  function matchFilter(filter, event) {
@@ -611,12 +803,14 @@ var AbstractRelay = class {
611
803
  openSubs = /* @__PURE__ */ new Map();
612
804
  enablePing;
613
805
  enableReconnect;
806
+ idleTimeout = 0;
614
807
  idleSince = Date.now();
615
808
  ongoingOperations = 0;
616
809
  reconnectTimeoutHandle;
617
810
  pingIntervalHandle;
618
811
  reconnectAttempts = 0;
619
812
  skipReconnection = false;
813
+ idleTimeoutHandle;
620
814
  connectionPromise;
621
815
  openCountRequests = /* @__PURE__ */ new Map();
622
816
  openEventPublishes = /* @__PURE__ */ new Map();
@@ -632,6 +826,8 @@ var AbstractRelay = class {
632
826
  this._WebSocket = opts.websocketImplementation || WebSocket;
633
827
  this.enablePing = opts.enablePing;
634
828
  this.enableReconnect = opts.enableReconnect || false;
829
+ if (opts.idleTimeout)
830
+ this.idleTimeout = opts.idleTimeout;
635
831
  }
636
832
  static async connect(url, opts) {
637
833
  const relay = new AbstractRelay(url, opts);
@@ -655,6 +851,22 @@ var AbstractRelay = class {
655
851
  get connected() {
656
852
  return this._connected;
657
853
  }
854
+ clearIdleTimeout() {
855
+ if (this.idleTimeoutHandle) {
856
+ clearTimeout(this.idleTimeoutHandle);
857
+ this.idleTimeoutHandle = void 0;
858
+ }
859
+ }
860
+ scheduleIdleClose() {
861
+ this.clearIdleTimeout();
862
+ if (this.idleTimeout > 0) {
863
+ this.idleTimeoutHandle = setTimeout(() => {
864
+ if (this.ongoingOperations === 0 && this.idleSince) {
865
+ this.close();
866
+ }
867
+ }, this.idleTimeout);
868
+ }
869
+ }
658
870
  async reconnect() {
659
871
  const backoff = this.resubscribeBackoff[Math.min(this.reconnectAttempts, this.resubscribeBackoff.length - 1)];
660
872
  this.reconnectAttempts++;
@@ -673,6 +885,7 @@ var AbstractRelay = class {
673
885
  this._connected = false;
674
886
  this.connectionPromise = void 0;
675
887
  this.idleSince = void 0;
888
+ this.clearIdleTimeout();
676
889
  if (this.enableReconnect && !this.skipReconnection) {
677
890
  this.reconnect();
678
891
  } else {
@@ -830,6 +1043,7 @@ var AbstractRelay = class {
830
1043
  }
831
1044
  async publish(event) {
832
1045
  this.idleSince = void 0;
1046
+ this.clearIdleTimeout();
833
1047
  this.ongoingOperations++;
834
1048
  const ret = new Promise((resolve, reject) => {
835
1049
  const timeout = setTimeout(() => {
@@ -841,24 +1055,46 @@ var AbstractRelay = class {
841
1055
  }, this.publishTimeout);
842
1056
  this.openEventPublishes.set(event.id, { resolve, reject, timeout });
843
1057
  });
844
- this.send('["EVENT",' + JSON.stringify(event) + "]");
1058
+ try {
1059
+ await this.send('["EVENT",' + JSON.stringify(event) + "]");
1060
+ } catch (err) {
1061
+ const ep = this.openEventPublishes.get(event.id);
1062
+ if (ep) {
1063
+ ep.reject(err);
1064
+ this.openEventPublishes.delete(event.id);
1065
+ }
1066
+ }
845
1067
  this.ongoingOperations--;
846
- if (this.ongoingOperations === 0)
1068
+ if (this.ongoingOperations === 0) {
847
1069
  this.idleSince = Date.now();
1070
+ this.scheduleIdleClose();
1071
+ }
848
1072
  return ret;
849
1073
  }
850
1074
  async count(filters, params) {
1075
+ return (await this.countWithHLL(filters, params)).count;
1076
+ }
1077
+ async countWithHLL(filters, params) {
851
1078
  this.serial++;
852
1079
  const id = params?.id || "count:" + this.serial;
853
1080
  const ret = new Promise((resolve, reject) => {
854
1081
  this.openCountRequests.set(id, { resolve, reject });
855
1082
  });
856
- this.send('["COUNT","' + id + '",' + JSON.stringify(filters).substring(1));
1083
+ try {
1084
+ await this.send('["COUNT","' + id + '",' + JSON.stringify(filters).substring(1));
1085
+ } catch (err) {
1086
+ const cr = this.openCountRequests.get(id);
1087
+ if (cr) {
1088
+ cr.reject(err);
1089
+ this.openCountRequests.delete(id);
1090
+ }
1091
+ }
857
1092
  return ret;
858
1093
  }
859
1094
  subscribe(filters, params) {
860
1095
  if (params.label !== "<forced-ping>") {
861
1096
  this.idleSince = void 0;
1097
+ this.clearIdleTimeout();
862
1098
  this.ongoingOperations++;
863
1099
  }
864
1100
  const sub = this.prepareSubscription(filters, params);
@@ -888,6 +1124,7 @@ var AbstractRelay = class {
888
1124
  this.closeAllSubscriptions("relay connection closed by us");
889
1125
  this._connected = false;
890
1126
  this.idleSince = void 0;
1127
+ this.clearIdleTimeout();
891
1128
  this.onclose?.();
892
1129
  if (this.ws?.readyState === this._WebSocket.OPEN) {
893
1130
  this.ws?.close();
@@ -931,7 +1168,7 @@ var AbstractRelay = class {
931
1168
  const payload = data[2];
932
1169
  const cr = this.openCountRequests.get(id);
933
1170
  if (cr) {
934
- cr.resolve(payload.count);
1171
+ cr.resolve(payload);
935
1172
  this.openCountRequests.delete(id);
936
1173
  }
937
1174
  return;
@@ -961,8 +1198,14 @@ var AbstractRelay = class {
961
1198
  case "CLOSED": {
962
1199
  const id = data[1];
963
1200
  const so = this.openSubs.get(id);
964
- if (!so)
1201
+ if (!so) {
1202
+ const cr = this.openCountRequests.get(id);
1203
+ if (cr) {
1204
+ cr.reject(new Error(data[2]));
1205
+ this.openCountRequests.delete(id);
1206
+ }
965
1207
  return;
1208
+ }
966
1209
  so.closed = true;
967
1210
  so.close(data[2]);
968
1211
  return;
@@ -1059,8 +1302,10 @@ var Subscription = class {
1059
1302
  }
1060
1303
  this.relay.openSubs.delete(this.id);
1061
1304
  this.relay.ongoingOperations--;
1062
- if (this.relay.ongoingOperations === 0)
1305
+ if (this.relay.ongoingOperations === 0) {
1063
1306
  this.relay.idleSince = Date.now();
1307
+ this.relay.scheduleIdleClose();
1308
+ }
1064
1309
  this.onclose?.(reason);
1065
1310
  }
1066
1311
  };
@@ -1088,6 +1333,63 @@ var alwaysTrue = (t) => {
1088
1333
  return true;
1089
1334
  };
1090
1335
 
1336
+ // nip45.ts
1337
+ import { sha256 as sha2562 } from "@noble/hashes/sha2.js";
1338
+ import { bytesToHex as bytesToHex3 } from "@noble/hashes/utils.js";
1339
+ var M = 256;
1340
+ var HLL_HEX_LENGTH = M * 2;
1341
+ var utf8Encoder2 = new TextEncoder();
1342
+ function getCountManyFilter(target, directive) {
1343
+ switch (directive) {
1344
+ case "reactions":
1345
+ return { "#e": [target], kinds: [7] };
1346
+ case "reposts":
1347
+ return { "#e": [target], kinds: [6] };
1348
+ case "quotes":
1349
+ return { "#q": [target], kinds: [1, 1111] };
1350
+ case "replies":
1351
+ return { "#e": [target], kinds: [1] };
1352
+ case "comments":
1353
+ return { "#E": [target], kinds: [1111] };
1354
+ case "followers":
1355
+ return { "#p": [target], kinds: [3] };
1356
+ }
1357
+ }
1358
+ function newHll() {
1359
+ return new Uint8Array(M);
1360
+ }
1361
+ function hllDecode(hex) {
1362
+ if (hex.length !== HLL_HEX_LENGTH || !/^[0-9a-fA-F]+$/.test(hex))
1363
+ return void 0;
1364
+ const registers = new Uint8Array(M);
1365
+ for (let i2 = 0; i2 < M; i2++) {
1366
+ registers[i2] = parseInt(hex.slice(i2 * 2, i2 * 2 + 2), 16);
1367
+ }
1368
+ return registers;
1369
+ }
1370
+ function hllEncode(registers) {
1371
+ if (registers.length !== M)
1372
+ throw new Error(`invalid number of registers ${registers.length}`);
1373
+ let hex = "";
1374
+ for (let i2 = 0; i2 < M; i2++) {
1375
+ hex += registers[i2].toString(16).padStart(2, "0");
1376
+ }
1377
+ return hex;
1378
+ }
1379
+ function mergeHll(target, source) {
1380
+ if (target.length === 0)
1381
+ target = newHll();
1382
+ if (target.length !== M)
1383
+ throw new Error(`invalid number of registers ${target.length}`);
1384
+ if (source.length !== M)
1385
+ throw new Error(`invalid number of registers ${source.length}`);
1386
+ for (let i2 = 0; i2 < M; i2++) {
1387
+ if (source[i2] > target[i2])
1388
+ target[i2] = source[i2];
1389
+ }
1390
+ return target;
1391
+ }
1392
+
1091
1393
  // abstract-pool.ts
1092
1394
  var AbstractSimplePool = class {
1093
1395
  relays = /* @__PURE__ */ new Map();
@@ -1096,6 +1398,7 @@ var AbstractSimplePool = class {
1096
1398
  verifyEvent;
1097
1399
  enablePing;
1098
1400
  enableReconnect;
1401
+ idleTimeout = 2e4;
1099
1402
  automaticallyAuth;
1100
1403
  trustedRelayURLs = /* @__PURE__ */ new Set();
1101
1404
  onRelayConnectionFailure;
@@ -1108,6 +1411,8 @@ var AbstractSimplePool = class {
1108
1411
  this._WebSocket = opts.websocketImplementation;
1109
1412
  this.enablePing = opts.enablePing;
1110
1413
  this.enableReconnect = opts.enableReconnect || false;
1414
+ if (opts.idleTimeout)
1415
+ this.idleTimeout = opts.idleTimeout;
1111
1416
  this.automaticallyAuth = opts.automaticallyAuth;
1112
1417
  this.onRelayConnectionFailure = opts.onRelayConnectionFailure;
1113
1418
  this.onRelayConnectionSuccess = opts.onRelayConnectionSuccess;
@@ -1122,7 +1427,8 @@ var AbstractSimplePool = class {
1122
1427
  verifyEvent: this.trustedRelayURLs.has(url) ? alwaysTrue : this.verifyEvent,
1123
1428
  websocketImplementation: this._WebSocket,
1124
1429
  enablePing: this.enablePing,
1125
- enableReconnect: this.enableReconnect
1430
+ enableReconnect: this.enableReconnect,
1431
+ idleTimeout: this.idleTimeout
1126
1432
  });
1127
1433
  relay.onclose = () => {
1128
1434
  this.relays.delete(url);
@@ -1315,6 +1621,48 @@ var AbstractSimplePool = class {
1315
1621
  events.sort((a, b) => b.created_at - a.created_at);
1316
1622
  return events[0] || null;
1317
1623
  }
1624
+ async countMany(relays, target, directive, params) {
1625
+ const filter = getCountManyFilter(target, directive);
1626
+ const urls = [];
1627
+ for (let i2 = 0; i2 < relays.length; i2++) {
1628
+ const url = normalizeURL(relays[i2]);
1629
+ if (urls.indexOf(url) === -1)
1630
+ urls.push(url);
1631
+ }
1632
+ const responses = await Promise.all(
1633
+ urls.map(async (url) => {
1634
+ if (this.allowConnectingToRelay?.(url, ["read", [filter]]) === false)
1635
+ return null;
1636
+ let relay;
1637
+ try {
1638
+ relay = await this.ensureRelay(url, {
1639
+ connectionTimeout: this.maxWaitForConnection < (params?.maxWait || 0) ? Math.max(params.maxWait * 0.8, params.maxWait - 1e3) : this.maxWaitForConnection,
1640
+ abort: params?.abort
1641
+ });
1642
+ } catch (err) {
1643
+ this.onRelayConnectionFailure?.(url);
1644
+ return null;
1645
+ }
1646
+ this.onRelayConnectionSuccess?.(url);
1647
+ return relay.countWithHLL([filter], { id: params?.id }).catch(() => null);
1648
+ })
1649
+ );
1650
+ let count = 0;
1651
+ let hll;
1652
+ for (const response of responses) {
1653
+ if (!response)
1654
+ continue;
1655
+ if (response.count > count)
1656
+ count = response.count;
1657
+ if (!response.hll || response.hll.length !== 512)
1658
+ continue;
1659
+ const registers = hllDecode(response.hll);
1660
+ if (!registers)
1661
+ continue;
1662
+ hll = mergeHll(hll || new Uint8Array(0), registers);
1663
+ }
1664
+ return hll ? { count, hll: hllEncode(hll) } : { count };
1665
+ }
1318
1666
  publish(relays, event, params) {
1319
1667
  return relays.map(normalizeURL).map(async (url, i2, arr) => {
1320
1668
  if (arr.indexOf(url) !== i2) {
@@ -1402,7 +1750,7 @@ __export(nip19_exports, {
1402
1750
  npubEncode: () => npubEncode,
1403
1751
  nsecEncode: () => nsecEncode
1404
1752
  });
1405
- import { bytesToHex as bytesToHex3, concatBytes, hexToBytes as hexToBytes3 } from "@noble/hashes/utils.js";
1753
+ import { bytesToHex as bytesToHex4, concatBytes, hexToBytes as hexToBytes3 } from "@noble/hashes/utils.js";
1406
1754
  import { bech32 } from "@scure/base";
1407
1755
  var NostrTypeGuard = {
1408
1756
  isNProfile: (value) => /^nprofile1[a-z\d]+$/.test(value || ""),
@@ -1445,7 +1793,7 @@ function decode(code) {
1445
1793
  return {
1446
1794
  type: "nprofile",
1447
1795
  data: {
1448
- pubkey: bytesToHex3(tlv[0][0]),
1796
+ pubkey: bytesToHex4(tlv[0][0]),
1449
1797
  relays: tlv[1] ? tlv[1].map((d) => utf8Decoder.decode(d)) : []
1450
1798
  }
1451
1799
  };
@@ -1463,10 +1811,10 @@ function decode(code) {
1463
1811
  return {
1464
1812
  type: "nevent",
1465
1813
  data: {
1466
- id: bytesToHex3(tlv[0][0]),
1814
+ id: bytesToHex4(tlv[0][0]),
1467
1815
  relays: tlv[1] ? tlv[1].map((d) => utf8Decoder.decode(d)) : [],
1468
- author: tlv[2]?.[0] ? bytesToHex3(tlv[2][0]) : void 0,
1469
- kind: tlv[3]?.[0] ? parseInt(bytesToHex3(tlv[3][0]), 16) : void 0
1816
+ author: tlv[2]?.[0] ? bytesToHex4(tlv[2][0]) : void 0,
1817
+ kind: tlv[3]?.[0] ? parseInt(bytesToHex4(tlv[3][0]), 16) : void 0
1470
1818
  }
1471
1819
  };
1472
1820
  }
@@ -1486,8 +1834,8 @@ function decode(code) {
1486
1834
  type: "naddr",
1487
1835
  data: {
1488
1836
  identifier: utf8Decoder.decode(tlv[0][0]),
1489
- pubkey: bytesToHex3(tlv[2][0]),
1490
- kind: parseInt(bytesToHex3(tlv[3][0]), 16),
1837
+ pubkey: bytesToHex4(tlv[2][0]),
1838
+ kind: parseInt(bytesToHex4(tlv[3][0]), 16),
1491
1839
  relays: tlv[1] ? tlv[1].map((d) => utf8Decoder.decode(d)) : []
1492
1840
  }
1493
1841
  };
@@ -1496,7 +1844,7 @@ function decode(code) {
1496
1844
  return { type: prefix, data };
1497
1845
  case "npub":
1498
1846
  case "note":
1499
- return { type: prefix, data: bytesToHex3(data) };
1847
+ return { type: prefix, data: bytesToHex4(data) };
1500
1848
  default:
1501
1849
  throw new Error(`unknown prefix ${prefix}`);
1502
1850
  }
@@ -1892,8 +2240,8 @@ __export(nip13_exports, {
1892
2240
  getPow: () => getPow,
1893
2241
  minePow: () => minePow
1894
2242
  });
1895
- import { bytesToHex as bytesToHex4 } from "@noble/hashes/utils.js";
1896
- import { sha256 as sha2562 } from "@noble/hashes/sha2.js";
2243
+ import { bytesToHex as bytesToHex5 } from "@noble/hashes/utils.js";
2244
+ import { sha256 as sha2563 } from "@noble/hashes/sha2.js";
1897
2245
  function getPow(hex) {
1898
2246
  let count = 0;
1899
2247
  for (let i2 = 0; i2 < 64; i2 += 8) {
@@ -1932,11 +2280,11 @@ function minePow(unsigned, difficulty) {
1932
2280
  event.created_at = now2;
1933
2281
  }
1934
2282
  tag[1] = (++count).toString();
1935
- const hash = sha2562(
2283
+ const hash = sha2563(
1936
2284
  utf8Encoder.encode(JSON.stringify([0, event.pubkey, event.created_at, event.kind, event.tags, event.content]))
1937
2285
  );
1938
2286
  if (getPowFromBytes(hash) >= difficulty) {
1939
- event.id = bytesToHex4(hash);
2287
+ event.id = bytesToHex5(hash);
1940
2288
  break;
1941
2289
  }
1942
2290
  }
@@ -1977,7 +2325,7 @@ import { equalBytes } from "@noble/ciphers/utils.js";
1977
2325
  import { secp256k1 as secp256k12 } from "@noble/curves/secp256k1.js";
1978
2326
  import { extract as hkdf_extract, expand as hkdf_expand } from "@noble/hashes/hkdf.js";
1979
2327
  import { hmac } from "@noble/hashes/hmac.js";
1980
- import { sha256 as sha2563 } from "@noble/hashes/sha2.js";
2328
+ import { sha256 as sha2564 } from "@noble/hashes/sha2.js";
1981
2329
  import { concatBytes as concatBytes2, hexToBytes as hexToBytes5, randomBytes as randomBytes2 } from "@noble/hashes/utils.js";
1982
2330
  import { base64 as base642 } from "@scure/base";
1983
2331
  var minPlaintextSize = 1;
@@ -1985,10 +2333,10 @@ var maxPlaintextSize = 4294967295;
1985
2333
  var extendedPrefixThreshold = 65536;
1986
2334
  function getConversationKey(privkeyA, pubkeyB) {
1987
2335
  const sharedX = secp256k12.getSharedSecret(privkeyA, hexToBytes5("02" + pubkeyB)).subarray(1, 33);
1988
- return hkdf_extract(sha2563, sharedX, utf8Encoder.encode("nip44-v2"));
2336
+ return hkdf_extract(sha2564, sharedX, utf8Encoder.encode("nip44-v2"));
1989
2337
  }
1990
2338
  function getMessageKeys(conversationKey, nonce) {
1991
- const keys = hkdf_expand(sha2563, conversationKey, nonce, 76);
2339
+ const keys = hkdf_expand(sha2564, conversationKey, nonce, 76);
1992
2340
  return {
1993
2341
  chacha_key: keys.subarray(0, 32),
1994
2342
  chacha_nonce: keys.subarray(32, 44),
@@ -2050,7 +2398,7 @@ function hmacAad(key, message, aad) {
2050
2398
  if (aad.length !== 32)
2051
2399
  throw new Error("AAD associated data must be 32 bytes");
2052
2400
  const combined = concatBytes2(aad, message);
2053
- return hmac(sha2563, key, combined);
2401
+ return hmac(sha2564, key, combined);
2054
2402
  }
2055
2403
  function decodePayload(payload) {
2056
2404
  if (typeof payload !== "string")
@@ -3009,8 +3357,8 @@ __export(nip77_exports, {
3009
3357
  NegentropyStorageVector: () => NegentropyStorageVector,
3010
3358
  NegentropySync: () => NegentropySync
3011
3359
  });
3012
- import { bytesToHex as bytesToHex5, hexToBytes as hexToBytes6 } from "@noble/hashes/utils.js";
3013
- import { sha256 as sha2564 } from "@noble/hashes/sha2.js";
3360
+ import { bytesToHex as bytesToHex6, hexToBytes as hexToBytes6 } from "@noble/hashes/utils.js";
3361
+ import { sha256 as sha2565 } from "@noble/hashes/sha2.js";
3014
3362
  var PROTOCOL_VERSION = 97;
3015
3363
  var ID_SIZE = 32;
3016
3364
  var FINGERPRINT_SIZE = 16;
@@ -3141,7 +3489,7 @@ var Accumulator = class {
3141
3489
  let input = new WrappedBuffer();
3142
3490
  input.extend(this.buf);
3143
3491
  input.extend(encodeVarInt(n));
3144
- let hash = sha2564(input.unwrap());
3492
+ let hash = sha2565(input.unwrap());
3145
3493
  return hash.subarray(0, FINGERPRINT_SIZE);
3146
3494
  }
3147
3495
  };
@@ -3249,7 +3597,7 @@ var Negentropy = class {
3249
3597
  let output = new WrappedBuffer();
3250
3598
  output.extend(new Uint8Array([PROTOCOL_VERSION]));
3251
3599
  this.splitRange(0, this.storage.size(), this._bound(Number.MAX_VALUE), output);
3252
- return bytesToHex5(output.unwrap());
3600
+ return bytesToHex6(output.unwrap());
3253
3601
  }
3254
3602
  reconcile(queryMsg, onhave, onneed) {
3255
3603
  const query = new WrappedBuffer(hexToBytes6(queryMsg));
@@ -3295,22 +3643,22 @@ var Negentropy = class {
3295
3643
  let theirElems = {};
3296
3644
  for (let i2 = 0; i2 < numIds; i2++) {
3297
3645
  let e = getBytes(query, ID_SIZE);
3298
- theirElems[bytesToHex5(e)] = e;
3646
+ theirElems[bytesToHex6(e)] = e;
3299
3647
  }
3300
3648
  skip = true;
3301
3649
  this.storage.iterate(lower, upper, (item) => {
3302
3650
  let k = item.id;
3303
- const id = bytesToHex5(k);
3651
+ const id = bytesToHex6(k);
3304
3652
  if (!theirElems[id]) {
3305
3653
  onhave?.(id);
3306
3654
  } else {
3307
- delete theirElems[bytesToHex5(k)];
3655
+ delete theirElems[bytesToHex6(k)];
3308
3656
  }
3309
3657
  return true;
3310
3658
  });
3311
3659
  if (onneed) {
3312
3660
  for (let v of Object.values(theirElems)) {
3313
- onneed(bytesToHex5(v));
3661
+ onneed(bytesToHex6(v));
3314
3662
  }
3315
3663
  }
3316
3664
  } else {
@@ -3328,7 +3676,7 @@ var Negentropy = class {
3328
3676
  prevIndex = upper;
3329
3677
  prevBound = currBound;
3330
3678
  }
3331
- return fullOutput.length === 1 ? null : bytesToHex5(fullOutput.unwrap());
3679
+ return fullOutput.length === 1 ? null : bytesToHex6(fullOutput.unwrap());
3332
3680
  }
3333
3681
  splitRange(lower, upper, upperBound, o) {
3334
3682
  let numElems = upper - lower;
@@ -3516,8 +3864,8 @@ __export(nip98_exports, {
3516
3864
  validateEventUrlTag: () => validateEventUrlTag,
3517
3865
  validateToken: () => validateToken
3518
3866
  });
3519
- import { sha256 as sha2565 } from "@noble/hashes/sha2.js";
3520
- import { bytesToHex as bytesToHex6 } from "@noble/hashes/utils.js";
3867
+ import { sha256 as sha2566 } from "@noble/hashes/sha2.js";
3868
+ import { bytesToHex as bytesToHex7 } from "@noble/hashes/utils.js";
3521
3869
  import { base64 as base643 } from "@scure/base";
3522
3870
  var _authorizationScheme = "Nostr ";
3523
3871
  async function getToken(loginUrl, httpMethod, sign, includeAuthorizationScheme = false, payload) {
@@ -3582,8 +3930,8 @@ function validateEventMethodTag(event, method) {
3582
3930
  return methodTag.length > 0 && methodTag[1].toLowerCase() === method.toLowerCase();
3583
3931
  }
3584
3932
  function hashPayload(payload) {
3585
- const hash = sha2565(utf8Encoder.encode(JSON.stringify(payload)));
3586
- return bytesToHex6(hash);
3933
+ const hash = sha2566(utf8Encoder.encode(JSON.stringify(payload)));
3934
+ return bytesToHex7(hash);
3587
3935
  }
3588
3936
  function validateEventPayloadTag(event, payload) {
3589
3937
  const payloadTag = event.tags.find((t) => t[0] === "payload");