@welshman/app 0.0.34 → 0.0.35

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 (161) hide show
  1. package/build/src/collection.d.ts +3 -4
  2. package/build/src/{collection.mjs → collection.js} +5 -5
  3. package/build/src/collection.js.map +1 -0
  4. package/build/src/commands.d.ts +12 -13
  5. package/build/src/{commands.mjs → commands.js} +7 -7
  6. package/build/src/commands.js.map +1 -0
  7. package/build/src/context.d.ts +1 -1
  8. package/build/src/{context.mjs → context.js} +6 -6
  9. package/build/src/context.js.map +1 -0
  10. package/build/src/core.d.ts +0 -1
  11. package/build/src/{core.mjs → core.js} +6 -6
  12. package/build/src/core.js.map +1 -0
  13. package/build/src/feeds.d.ts +3 -3
  14. package/build/src/{feeds.mjs → feeds.js} +26 -22
  15. package/build/src/feeds.js.map +1 -0
  16. package/build/src/follows.d.ts +1 -2
  17. package/build/src/{follows.mjs → follows.js} +7 -7
  18. package/build/src/follows.js.map +1 -0
  19. package/build/src/{freshness.mjs → freshness.js} +4 -4
  20. package/build/src/freshness.js.map +1 -0
  21. package/build/src/handles.d.ts +0 -1
  22. package/build/src/{handles.mjs → handles.js} +14 -11
  23. package/build/src/handles.js.map +1 -0
  24. package/build/src/index.d.ts +34 -26
  25. package/build/src/index.js +27 -0
  26. package/build/src/index.js.map +1 -0
  27. package/build/src/mutes.d.ts +1 -2
  28. package/build/src/{mutes.mjs → mutes.js} +8 -8
  29. package/build/src/mutes.js.map +1 -0
  30. package/build/src/plaintext.d.ts +1 -1
  31. package/build/src/{plaintext.mjs → plaintext.js} +5 -5
  32. package/build/src/plaintext.js.map +1 -0
  33. package/build/src/profiles.d.ts +0 -1
  34. package/build/src/{profiles.mjs → profiles.js} +9 -11
  35. package/build/src/profiles.js.map +1 -0
  36. package/build/src/relaySelections.d.ts +1 -2
  37. package/build/src/{relaySelections.mjs → relaySelections.js} +7 -7
  38. package/build/src/relaySelections.js.map +1 -0
  39. package/build/src/relays.d.ts +1 -2
  40. package/build/src/{relays.mjs → relays.js} +67 -37
  41. package/build/src/relays.js.map +1 -0
  42. package/build/src/router.d.ts +30 -30
  43. package/build/src/router.js +244 -0
  44. package/build/src/router.js.map +1 -0
  45. package/build/src/search.d.ts +3 -4
  46. package/build/src/{search.mjs → search.js} +15 -18
  47. package/build/src/search.js.map +1 -0
  48. package/build/src/session.d.ts +9 -9
  49. package/build/src/{session.mjs → session.js} +3 -3
  50. package/build/src/session.js.map +1 -0
  51. package/build/src/storage.d.ts +7 -38
  52. package/build/src/{storage.mjs → storage.js} +17 -15
  53. package/build/src/storage.js.map +1 -0
  54. package/build/src/{subscribe.mjs → subscribe.js} +2 -2
  55. package/build/src/subscribe.js.map +1 -0
  56. package/build/src/sync.d.ts +1 -1
  57. package/build/src/{sync.mjs → sync.js} +8 -9
  58. package/build/src/sync.js.map +1 -0
  59. package/build/src/tags.d.ts +1 -1
  60. package/build/src/{tags.mjs → tags.js} +5 -5
  61. package/build/src/tags.js.map +1 -0
  62. package/build/src/thunk.d.ts +4 -5
  63. package/build/src/{thunk.mjs → thunk.js} +11 -11
  64. package/build/src/thunk.js.map +1 -0
  65. package/build/src/{topics.mjs → topics.js} +4 -4
  66. package/build/src/topics.js.map +1 -0
  67. package/build/src/user.d.ts +0 -1
  68. package/build/src/{user.mjs → user.js} +8 -8
  69. package/build/src/user.js.map +1 -0
  70. package/build/src/{util.mjs → util.js} +1 -1
  71. package/build/src/util.js.map +1 -0
  72. package/build/src/{wot.mjs → wot.js} +8 -8
  73. package/build/src/wot.js.map +1 -0
  74. package/build/src/zappers.d.ts +1 -2
  75. package/build/src/{zappers.mjs → zappers.js} +7 -7
  76. package/build/src/zappers.js.map +1 -0
  77. package/build/tsconfig.tsbuildinfo +1 -0
  78. package/package.json +11 -16
  79. package/build/src/collection.cjs +0 -56
  80. package/build/src/collection.cjs.map +0 -1
  81. package/build/src/collection.mjs.map +0 -1
  82. package/build/src/commands.cjs +0 -34
  83. package/build/src/commands.cjs.map +0 -1
  84. package/build/src/commands.mjs.map +0 -1
  85. package/build/src/context.cjs +0 -43
  86. package/build/src/context.cjs.map +0 -1
  87. package/build/src/context.mjs.map +0 -1
  88. package/build/src/core.cjs +0 -36
  89. package/build/src/core.cjs.map +0 -1
  90. package/build/src/core.mjs.map +0 -1
  91. package/build/src/feeds.cjs +0 -93
  92. package/build/src/feeds.cjs.map +0 -1
  93. package/build/src/feeds.mjs.map +0 -1
  94. package/build/src/follows.cjs +0 -25
  95. package/build/src/follows.cjs.map +0 -1
  96. package/build/src/follows.mjs.map +0 -1
  97. package/build/src/freshness.cjs +0 -20
  98. package/build/src/freshness.cjs.map +0 -1
  99. package/build/src/freshness.mjs.map +0 -1
  100. package/build/src/handles.cjs +0 -84
  101. package/build/src/handles.cjs.map +0 -1
  102. package/build/src/handles.mjs.map +0 -1
  103. package/build/src/index.cjs +0 -43
  104. package/build/src/index.cjs.map +0 -1
  105. package/build/src/index.mjs +0 -27
  106. package/build/src/index.mjs.map +0 -1
  107. package/build/src/mutes.cjs +0 -28
  108. package/build/src/mutes.cjs.map +0 -1
  109. package/build/src/mutes.mjs.map +0 -1
  110. package/build/src/plaintext.cjs +0 -38
  111. package/build/src/plaintext.cjs.map +0 -1
  112. package/build/src/plaintext.mjs.map +0 -1
  113. package/build/src/profiles.cjs +0 -45
  114. package/build/src/profiles.cjs.map +0 -1
  115. package/build/src/profiles.mjs.map +0 -1
  116. package/build/src/relaySelections.cjs +0 -43
  117. package/build/src/relaySelections.cjs.map +0 -1
  118. package/build/src/relaySelections.mjs.map +0 -1
  119. package/build/src/relays.cjs +0 -178
  120. package/build/src/relays.cjs.map +0 -1
  121. package/build/src/relays.mjs.map +0 -1
  122. package/build/src/router.cjs +0 -259
  123. package/build/src/router.cjs.map +0 -1
  124. package/build/src/router.mjs +0 -241
  125. package/build/src/router.mjs.map +0 -1
  126. package/build/src/search.cjs +0 -84
  127. package/build/src/search.cjs.map +0 -1
  128. package/build/src/search.mjs.map +0 -1
  129. package/build/src/session.cjs +0 -61
  130. package/build/src/session.cjs.map +0 -1
  131. package/build/src/session.mjs.map +0 -1
  132. package/build/src/storage.cjs +0 -177
  133. package/build/src/storage.cjs.map +0 -1
  134. package/build/src/storage.mjs.map +0 -1
  135. package/build/src/subscribe.cjs +0 -47
  136. package/build/src/subscribe.cjs.map +0 -1
  137. package/build/src/subscribe.mjs.map +0 -1
  138. package/build/src/sync.cjs +0 -45
  139. package/build/src/sync.cjs.map +0 -1
  140. package/build/src/sync.mjs.map +0 -1
  141. package/build/src/tags.cjs +0 -94
  142. package/build/src/tags.cjs.map +0 -1
  143. package/build/src/tags.mjs.map +0 -1
  144. package/build/src/thunk.cjs +0 -153
  145. package/build/src/thunk.cjs.map +0 -1
  146. package/build/src/thunk.mjs.map +0 -1
  147. package/build/src/topics.cjs +0 -23
  148. package/build/src/topics.cjs.map +0 -1
  149. package/build/src/topics.mjs.map +0 -1
  150. package/build/src/user.cjs +0 -45
  151. package/build/src/user.cjs.map +0 -1
  152. package/build/src/user.mjs.map +0 -1
  153. package/build/src/util.cjs +0 -56
  154. package/build/src/util.cjs.map +0 -1
  155. package/build/src/util.mjs.map +0 -1
  156. package/build/src/wot.cjs +0 -79
  157. package/build/src/wot.cjs.map +0 -1
  158. package/build/src/wot.mjs.map +0 -1
  159. package/build/src/zappers.cjs +0 -63
  160. package/build/src/zappers.cjs.map +0 -1
  161. package/build/src/zappers.mjs.map +0 -1
@@ -1,10 +1,10 @@
1
- import { derived, readable } from 'svelte/store';
2
- import { readProfile, displayProfile, displayPubkey, PROFILE } from '@welshman/util';
3
- import { deriveEventsMapped, withGetter } from '@welshman/store';
4
- import { repository } from "./core.mjs";
5
- import { load } from "./subscribe.mjs";
6
- import { collection } from "./collection.mjs";
7
- import { loadRelaySelections } from "./relaySelections.mjs";
1
+ import { derived, readable } from "svelte/store";
2
+ import { readProfile, displayProfile, displayPubkey, PROFILE } from "@welshman/util";
3
+ import { deriveEventsMapped, withGetter } from "@welshman/store";
4
+ import { repository } from "./core.js";
5
+ import { load } from "./subscribe.js";
6
+ import { collection } from "./collection.js";
7
+ import { loadRelaySelections } from "./relaySelections.js";
8
8
  export const profiles = withGetter(deriveEventsMapped(repository, {
9
9
  filters: [{ kinds: [PROFILE] }],
10
10
  eventToItem: readProfile,
@@ -30,10 +30,8 @@ export const { indexStore: profilesByPubkey, deriveItem: deriveProfile, loadItem
30
30
  await load({ ...request, filters });
31
31
  },
32
32
  });
33
- export const displayProfileByPubkey = (pubkey) => pubkey
34
- ? displayProfile(profilesByPubkey.get().get(pubkey), displayPubkey(pubkey))
35
- : "";
33
+ export const displayProfileByPubkey = (pubkey) => pubkey ? displayProfile(profilesByPubkey.get().get(pubkey), displayPubkey(pubkey)) : "";
36
34
  export const deriveProfileDisplay = (pubkey) => pubkey
37
35
  ? derived(deriveProfile(pubkey), $profile => displayProfile($profile, displayPubkey(pubkey)))
38
36
  : readable("");
39
- //# sourceMappingURL=profiles.mjs.map
37
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../../src/profiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAE,QAAQ,EAAC,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAC,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAC,MAAM,gBAAgB,CAAA;AAGlF,OAAO,EAAC,kBAAkB,EAAE,UAAU,EAAC,MAAM,iBAAiB,CAAA;AAC9D,OAAO,EAAC,UAAU,EAAC,MAAM,WAAW,CAAA;AACpC,OAAO,EAAC,IAAI,EAAC,MAAM,gBAAgB,CAAA;AACnC,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAC,mBAAmB,EAAC,MAAM,sBAAsB,CAAA;AAExD,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAChC,kBAAkB,CAAmB,UAAU,EAAE;IAC/C,OAAO,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAC,CAAC;IAC7B,WAAW,EAAE,WAAW;IACxB,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;CAChC,CAAC,CACH,CAAA;AAED,MAAM,CAAC,MAAM,EACX,UAAU,EAAE,gBAAgB,EAC5B,UAAU,EAAE,aAAa,EACzB,QAAQ,EAAE,WAAW,GACtB,GAAG,UAAU,CAAC;IACb,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM;IACvC,IAAI,EAAE,KAAK,EAAE,MAAc,EAAE,UAAiD,EAAE,EAAE,EAAE;QAClF,MAAM,OAAO,GAAG,CAAC,EAAC,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAC,CAAC,CAAA;QAEvD,qFAAqF;QACrF,mCAAmC;QACnC,IAAI,CAAC,EAAC,GAAG,OAAO,EAAE,OAAO,EAAC,CAAC,CAAA;QAE3B,oFAAoF;QACpF,uEAAuE;QACvE,MAAM,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE;YAChC,mBAAmB,CAAC,MAAM,EAAE;gBAC1B,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE;gBACxB,UAAU,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE;aAC5B,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,MAAM,IAAI,CAAC,EAAC,GAAG,OAAO,EAAE,OAAO,EAAC,CAAC,CAAA;IACnC,CAAC;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,MAA0B,EAAE,EAAE,CACnE,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;AAEzF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,MAA0B,EAAE,EAAE,CACjE,MAAM;IACJ,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA"}
@@ -1,5 +1,4 @@
1
- /// <reference types="svelte" />
2
- import type { PublishedList, List } from '@welshman/util';
1
+ import type { PublishedList, List } from "@welshman/util";
3
2
  import type { SubscribeRequestWithHandlers } from "@welshman/net";
4
3
  export declare const getRelayUrls: (list?: List) => string[];
5
4
  export declare const getReadRelayUrls: (list?: List) => string[];
@@ -1,9 +1,9 @@
1
- import { uniq } from '@welshman/lib';
2
- import { INBOX_RELAYS, RELAYS, normalizeRelayUrl, asDecryptedEvent, readList, getListTags, getRelayTags, getRelayTagValues } from '@welshman/util';
3
- import { deriveEventsMapped } from '@welshman/store';
4
- import { repository } from "./core.mjs";
5
- import { load } from "./subscribe.mjs";
6
- import { collection } from "./collection.mjs";
1
+ import { uniq } from "@welshman/lib";
2
+ import { INBOX_RELAYS, RELAYS, normalizeRelayUrl, asDecryptedEvent, readList, getListTags, getRelayTags, getRelayTagValues, } from "@welshman/util";
3
+ import { deriveEventsMapped } from "@welshman/store";
4
+ import { repository } from "./core.js";
5
+ import { load } from "./subscribe.js";
6
+ import { collection } from "./collection.js";
7
7
  export const getRelayUrls = (list) => uniq(getRelayTagValues(getListTags(list)).map(normalizeRelayUrl));
8
8
  export const getReadRelayUrls = (list) => uniq(getRelayTags(getListTags(list))
9
9
  .filter((t) => !t[2] || t[2] === "read")
@@ -33,4 +33,4 @@ export const { indexStore: inboxRelaySelectionsByPubkey, deriveItem: deriveInbox
33
33
  getKey: inboxRelaySelections => inboxRelaySelections.event.pubkey,
34
34
  load: (pubkey, request = {}) => load({ ...request, filters: [{ kinds: [INBOX_RELAYS], authors: [pubkey] }] }),
35
35
  });
36
- //# sourceMappingURL=relaySelections.mjs.map
36
+ //# sourceMappingURL=relaySelections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relaySelections.js","sourceRoot":"","sources":["../../src/relaySelections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,eAAe,CAAA;AAClC,OAAO,EACL,YAAY,EACZ,MAAM,EACN,iBAAiB,EACjB,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,iBAAiB,GAClB,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EAAC,kBAAkB,EAAC,MAAM,iBAAiB,CAAA;AAClD,OAAO,EAAC,UAAU,EAAC,MAAM,WAAW,CAAA;AACpC,OAAO,EAAC,IAAI,EAAC,MAAM,gBAAgB,CAAA;AACnC,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAA;AAE1C,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,IAAW,EAAY,EAAE,CACpD,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAA;AAEnE,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,IAAW,EAAY,EAAE,CACxD,IAAI,CACF,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;KAC5B,MAAM,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;KACjD,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjD,CAAA;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAAW,EAAY,EAAE,CACzD,IAAI,CACF,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;KAC5B,MAAM,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC;KAClD,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjD,CAAA;AAEH,MAAM,CAAC,MAAM,eAAe,GAAG,kBAAkB,CAAgB,UAAU,EAAE;IAC3E,OAAO,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAC,CAAC;IAC5B,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;IAC/B,WAAW,EAAE,CAAC,KAAmB,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;CACxE,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,EACX,UAAU,EAAE,uBAAuB,EACnC,UAAU,EAAE,qBAAqB,EACjC,QAAQ,EAAE,mBAAmB,GAC9B,GAAG,UAAU,CAAC;IACb,IAAI,EAAE,iBAAiB;IACvB,KAAK,EAAE,eAAe;IACtB,MAAM,EAAE,eAAe,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,MAAM;IACvD,IAAI,EAAE,CAAC,MAAc,EAAE,UAAiD,EAAE,EAAE,EAAE,CAC5E,IAAI,CAAC,EAAC,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC;CACtE,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAgB,UAAU,EAAE;IAChF,OAAO,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,YAAY,CAAC,EAAC,CAAC;IAClC,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK;IAC/B,WAAW,EAAE,CAAC,KAAmB,EAAE,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;CACxE,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,EACX,UAAU,EAAE,4BAA4B,EACxC,UAAU,EAAE,0BAA0B,EACtC,QAAQ,EAAE,wBAAwB,GACnC,GAAG,UAAU,CAAC;IACb,IAAI,EAAE,sBAAsB;IAC5B,KAAK,EAAE,oBAAoB;IAC3B,MAAM,EAAE,oBAAoB,CAAC,EAAE,CAAC,oBAAoB,CAAC,KAAK,CAAC,MAAM;IACjE,IAAI,EAAE,CAAC,MAAc,EAAE,UAAiD,EAAE,EAAE,EAAE,CAC5E,IAAI,CAAC,EAAC,GAAG,OAAO,EAAE,OAAO,EAAE,CAAC,EAAC,KAAK,EAAE,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAC,CAAC,EAAC,CAAC;CAC5E,CAAC,CAAA"}
@@ -1,6 +1,5 @@
1
- /// <reference types="svelte" />
2
1
  import type { RelayProfile } from "@welshman/util";
3
- import type { Connection } from '@welshman/net';
2
+ import type { Connection } from "@welshman/net";
4
3
  export type RelayStats = {
5
4
  first_seen: number;
6
5
  recent_errors: number[];
@@ -1,9 +1,9 @@
1
- import { writable, derived } from 'svelte/store';
2
- import { withGetter } from '@welshman/store';
3
- import { ctx, groupBy, indexBy, batch, now, ago, uniq, batcher, postJson } from '@welshman/lib';
1
+ import { writable, derived } from "svelte/store";
2
+ import { withGetter } from "@welshman/store";
3
+ import { ctx, groupBy, indexBy, batch, now, ago, uniq, batcher, postJson } from "@welshman/lib";
4
4
  import { normalizeRelayUrl, displayRelayUrl, displayRelayProfile } from "@welshman/util";
5
- import { ConnectionEvent } from '@welshman/net';
6
- import { collection } from "./collection.mjs";
5
+ import { ConnectionEvent } from "@welshman/net";
6
+ import { collection } from "./collection.js";
7
7
  export const makeRelayStats = () => ({
8
8
  first_seen: now(),
9
9
  recent_errors: [],
@@ -27,7 +27,7 @@ export const makeRelayStats = () => ({
27
27
  notice_count: 0,
28
28
  });
29
29
  export const relays = withGetter(writable([]));
30
- export const relaysByPubkey = derived(relays, $relays => groupBy($relay => { var _a; return (_a = $relay.profile) === null || _a === void 0 ? void 0 : _a.pubkey; }, $relays.filter($relay => { var _a; return (_a = $relay.profile) === null || _a === void 0 ? void 0 : _a.pubkey; })));
30
+ export const relaysByPubkey = derived(relays, $relays => groupBy($relay => $relay.profile?.pubkey, $relays.filter($relay => $relay.profile?.pubkey)));
31
31
  export const fetchRelayProfiles = async (urls) => {
32
32
  const base = ctx.app.dufflepudUrl;
33
33
  if (!base) {
@@ -35,7 +35,7 @@ export const fetchRelayProfiles = async (urls) => {
35
35
  }
36
36
  const res = await postJson(`${base}/relay/info`, { urls });
37
37
  const profilesByUrl = new Map();
38
- for (const { url, info } of (res === null || res === void 0 ? void 0 : res.data) || []) {
38
+ for (const { url, info } of res?.data || []) {
39
39
  profilesByUrl.set(url, info);
40
40
  }
41
41
  return profilesByUrl;
@@ -59,8 +59,8 @@ export const { indexStore: relaysByUrl, deriveItem: deriveRelay, loadItem: loadR
59
59
  return urls;
60
60
  }),
61
61
  });
62
- export const displayRelayByPubkey = (url) => { var _a; return displayRelayProfile((_a = relaysByUrl.get().get(url)) === null || _a === void 0 ? void 0 : _a.profile, displayRelayUrl(url)); };
63
- export const deriveRelayDisplay = (url) => derived(deriveRelay(url), $relay => displayRelayProfile($relay === null || $relay === void 0 ? void 0 : $relay.profile, displayRelayUrl(url)));
62
+ export const displayRelayByPubkey = (url) => displayRelayProfile(relaysByUrl.get().get(url)?.profile, displayRelayUrl(url));
63
+ export const deriveRelayDisplay = (url) => derived(deriveRelay(url), $relay => displayRelayProfile($relay?.profile, displayRelayUrl(url)));
64
64
  const updateRelayStats = batch(500, (updates) => {
65
65
  relays.update($relays => {
66
66
  const $relaysByUrl = indexBy(r => r.url, $relays);
@@ -83,33 +83,47 @@ const updateRelayStats = batch(500, (updates) => {
83
83
  return Array.from($relaysByUrl.values());
84
84
  });
85
85
  });
86
- const onConnectionOpen = ({ url }) => updateRelayStats([url, stats => {
86
+ const onConnectionOpen = ({ url }) => updateRelayStats([
87
+ url,
88
+ stats => {
87
89
  stats.last_open = now();
88
90
  stats.open_count++;
89
- }]);
90
- const onConnectionClose = ({ url }) => updateRelayStats([url, stats => {
91
+ },
92
+ ]);
93
+ const onConnectionClose = ({ url }) => updateRelayStats([
94
+ url,
95
+ stats => {
91
96
  stats.last_close = now();
92
97
  stats.close_count++;
93
- }]);
98
+ },
99
+ ]);
94
100
  const onConnectionSend = ({ url }, [verb]) => {
95
- if (verb === 'REQ') {
96
- updateRelayStats([url, stats => {
101
+ if (verb === "REQ") {
102
+ updateRelayStats([
103
+ url,
104
+ stats => {
97
105
  stats.request_count++;
98
106
  stats.last_request = now();
99
- }]);
107
+ },
108
+ ]);
100
109
  }
101
- else if (verb === 'EVENT') {
102
- updateRelayStats([url, stats => {
110
+ else if (verb === "EVENT") {
111
+ updateRelayStats([
112
+ url,
113
+ stats => {
103
114
  stats.publish_count++;
104
115
  stats.last_publish = now();
105
- }]);
116
+ },
117
+ ]);
106
118
  }
107
119
  };
108
120
  const onConnectionReceive = ({ url, state }, [verb, ...extra]) => {
109
- if (verb === 'OK') {
121
+ if (verb === "OK") {
110
122
  const [eventId, ok] = extra;
111
123
  const pub = state.pendingPublishes.get(eventId);
112
- updateRelayStats([url, stats => {
124
+ updateRelayStats([
125
+ url,
126
+ stats => {
113
127
  if (pub) {
114
128
  stats.publish_timer += ago(pub.sent);
115
129
  }
@@ -119,39 +133,55 @@ const onConnectionReceive = ({ url, state }, [verb, ...extra]) => {
119
133
  else {
120
134
  stats.publish_failure_count++;
121
135
  }
122
- }]);
136
+ },
137
+ ]);
123
138
  }
124
- else if (verb === 'AUTH') {
125
- updateRelayStats([url, stats => {
139
+ else if (verb === "AUTH") {
140
+ updateRelayStats([
141
+ url,
142
+ stats => {
126
143
  stats.last_auth = now();
127
- }]);
144
+ },
145
+ ]);
128
146
  }
129
- else if (verb === 'EVENT') {
130
- updateRelayStats([url, stats => {
147
+ else if (verb === "EVENT") {
148
+ updateRelayStats([
149
+ url,
150
+ stats => {
131
151
  stats.event_count++;
132
152
  stats.last_event = now();
133
- }]);
153
+ },
154
+ ]);
134
155
  }
135
- else if (verb === 'EOSE') {
156
+ else if (verb === "EOSE") {
136
157
  const request = state.pendingRequests.get(extra[0]);
137
158
  // Only count the first eose
138
159
  if (request && !request.eose) {
139
- updateRelayStats([url, stats => {
160
+ updateRelayStats([
161
+ url,
162
+ stats => {
140
163
  stats.eose_count++;
141
164
  stats.eose_timer += now() - request.sent;
142
- }]);
165
+ },
166
+ ]);
143
167
  }
144
168
  }
145
- else if (verb === 'NOTICE') {
146
- updateRelayStats([url, stats => {
169
+ else if (verb === "NOTICE") {
170
+ updateRelayStats([
171
+ url,
172
+ stats => {
147
173
  stats.notice_count++;
148
- }]);
174
+ },
175
+ ]);
149
176
  }
150
177
  };
151
- const onConnectionError = ({ url }) => updateRelayStats([url, stats => {
178
+ const onConnectionError = ({ url }) => updateRelayStats([
179
+ url,
180
+ stats => {
152
181
  stats.last_error = now();
153
182
  stats.recent_errors = uniq(stats.recent_errors.concat(now())).slice(-10);
154
- }]);
183
+ },
184
+ ]);
155
185
  export const trackRelayStats = (connection) => {
156
186
  connection.on(ConnectionEvent.Open, onConnectionOpen);
157
187
  connection.on(ConnectionEvent.Close, onConnectionClose);
@@ -166,4 +196,4 @@ export const trackRelayStats = (connection) => {
166
196
  connection.off(ConnectionEvent.Error, onConnectionError);
167
197
  };
168
198
  };
169
- //# sourceMappingURL=relays.mjs.map
199
+ //# sourceMappingURL=relays.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relays.js","sourceRoot":"","sources":["../../src/relays.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,OAAO,EAAC,MAAM,cAAc,CAAA;AAC9C,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAA;AAC1C,OAAO,EAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAC,MAAM,eAAe,CAAA;AAE7F,OAAO,EAAC,iBAAiB,EAAE,eAAe,EAAE,mBAAmB,EAAC,MAAM,gBAAgB,CAAA;AACtF,OAAO,EAAC,eAAe,EAAC,MAAM,eAAe,CAAA;AAE7C,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAA;AAyB1C,MAAM,CAAC,MAAM,cAAc,GAAG,GAAe,EAAE,CAAC,CAAC;IAC/C,UAAU,EAAE,GAAG,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,UAAU,EAAE,CAAC;IACb,WAAW,EAAE,CAAC;IACd,aAAa,EAAE,CAAC;IAChB,aAAa,EAAE,CAAC;IAChB,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,CAAC;IACZ,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,CAAC;IACf,YAAY,EAAE,CAAC;IACf,UAAU,EAAE,CAAC;IACb,SAAS,EAAE,CAAC;IACZ,aAAa,EAAE,CAAC;IAChB,qBAAqB,EAAE,CAAC;IACxB,qBAAqB,EAAE,CAAC;IACxB,UAAU,EAAE,CAAC;IACb,UAAU,EAAE,CAAC;IACb,YAAY,EAAE,CAAC;CAChB,CAAC,CAAA;AAQF,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAU,EAAE,CAAC,CAAC,CAAA;AAEvD,MAAM,CAAC,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CACtD,OAAO,CACL,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,EAChC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CACjD,CACF,CAAA;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,EAAE,IAAc,EAAE,EAAE;IACzD,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,YAAa,CAAA;IAElC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAA;IAC7E,CAAC;IAED,MAAM,GAAG,GAAQ,MAAM,QAAQ,CAAC,GAAG,IAAI,aAAa,EAAE,EAAC,IAAI,EAAC,CAAC,CAAA;IAC7D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAwB,CAAA;IAErD,KAAK,MAAM,EAAC,GAAG,EAAE,IAAI,EAAC,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QAC1C,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;IAC9B,CAAC;IAED,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,EACX,UAAU,EAAE,WAAW,EACvB,UAAU,EAAE,WAAW,EACvB,QAAQ,EAAE,SAAS,GACpB,GAAG,UAAU,CAAC;IACb,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,CAAC,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG;IACnC,IAAI,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,OAAiB,EAAE,EAAE;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;QAC3C,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;QAClD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;QAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC5B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAE9B,IAAI,OAAO,EAAE,CAAC;gBACZ,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAC,GAAG,KAAK,EAAE,OAAO,EAAE,GAAG,EAAC,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAA;QAEtC,OAAO,IAAI,CAAA;IACb,CAAC,CAAC;CACH,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,GAAW,EAAE,EAAE,CAClD,mBAAmB,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAA;AAEhF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAE,EAAE,CAChD,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;AAMjG,MAAM,gBAAgB,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAA2B,EAAE,EAAE;IAClE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QACtB,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QACjD,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;QAEpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;YACjD,MAAM,MAAM,GAAU,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAC,GAAG,EAAC,CAAA;YAEpD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClB,MAAM,CAAC,KAAK,GAAG,cAAc,EAAE,CAAA;YACjC,CAAC;iBAAM,IAAI,MAAM,CAAC,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;gBACnD,yBAAyB;gBACzB,MAAM,CAAC,KAAK,GAAG,EAAC,GAAG,cAAc,EAAE,EAAE,GAAG,MAAM,CAAC,KAAK,EAAC,CAAA;YACvD,CAAC;YAED,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBAChC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACtB,CAAC;YAED,qEAAqE;YACrE,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,EAAC,GAAG,MAAM,EAAC,CAAC,CAAA;QACpC,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAA;IAC1C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,MAAM,gBAAgB,GAAG,CAAC,EAAC,GAAG,EAAa,EAAE,EAAE,CAC7C,gBAAgB,CAAC;IACf,GAAG;IACH,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE,CAAA;QACvB,KAAK,CAAC,UAAU,EAAE,CAAA;IACpB,CAAC;CACF,CAAC,CAAA;AAEJ,MAAM,iBAAiB,GAAG,CAAC,EAAC,GAAG,EAAa,EAAE,EAAE,CAC9C,gBAAgB,CAAC;IACf,GAAG;IACH,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAA;QACxB,KAAK,CAAC,WAAW,EAAE,CAAA;IACrB,CAAC;CACF,CAAC,CAAA;AAEJ,MAAM,gBAAgB,GAAG,CAAC,EAAC,GAAG,EAAa,EAAE,CAAC,IAAI,CAAU,EAAE,EAAE;IAC9D,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,gBAAgB,CAAC;YACf,GAAG;YACH,KAAK,CAAC,EAAE;gBACN,KAAK,CAAC,aAAa,EAAE,CAAA;gBACrB,KAAK,CAAC,YAAY,GAAG,GAAG,EAAE,CAAA;YAC5B,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;SAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,gBAAgB,CAAC;YACf,GAAG;YACH,KAAK,CAAC,EAAE;gBACN,KAAK,CAAC,aAAa,EAAE,CAAA;gBACrB,KAAK,CAAC,YAAY,GAAG,GAAG,EAAE,CAAA;YAC5B,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAA;AAED,MAAM,mBAAmB,GAAG,CAAC,EAAC,GAAG,EAAE,KAAK,EAAa,EAAE,CAAC,IAAI,EAAE,GAAG,KAAK,CAAU,EAAE,EAAE;IAClF,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAClB,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,KAAK,CAAA;QAC3B,MAAM,GAAG,GAAG,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;QAE/C,gBAAgB,CAAC;YACf,GAAG;YACH,KAAK,CAAC,EAAE;gBACN,IAAI,GAAG,EAAE,CAAC;oBACR,KAAK,CAAC,aAAa,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;gBACtC,CAAC;gBAED,IAAI,EAAE,EAAE,CAAC;oBACP,KAAK,CAAC,qBAAqB,EAAE,CAAA;gBAC/B,CAAC;qBAAM,CAAC;oBACN,KAAK,CAAC,qBAAqB,EAAE,CAAA;gBAC/B,CAAC;YACH,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,gBAAgB,CAAC;YACf,GAAG;YACH,KAAK,CAAC,EAAE;gBACN,KAAK,CAAC,SAAS,GAAG,GAAG,EAAE,CAAA;YACzB,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;SAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,gBAAgB,CAAC;YACf,GAAG;YACH,KAAK,CAAC,EAAE;gBACN,KAAK,CAAC,WAAW,EAAE,CAAA;gBACnB,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAA;YAC1B,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAEnD,4BAA4B;QAC5B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC7B,gBAAgB,CAAC;gBACf,GAAG;gBACH,KAAK,CAAC,EAAE;oBACN,KAAK,CAAC,UAAU,EAAE,CAAA;oBAClB,KAAK,CAAC,UAAU,IAAI,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAA;gBAC1C,CAAC;aACF,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,gBAAgB,CAAC;YACf,GAAG;YACH,KAAK,CAAC,EAAE;gBACN,KAAK,CAAC,YAAY,EAAE,CAAA;YACtB,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;AACH,CAAC,CAAA;AAED,MAAM,iBAAiB,GAAG,CAAC,EAAC,GAAG,EAAa,EAAE,EAAE,CAC9C,gBAAgB,CAAC;IACf,GAAG;IACH,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,UAAU,GAAG,GAAG,EAAE,CAAA;QACxB,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;IAC1E,CAAC;CACF,CAAC,CAAA;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,UAAsB,EAAE,EAAE;IACxD,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IACrD,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;IACvD,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;IACrD,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAA;IAC3D,UAAU,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;IAEvD,OAAO,GAAG,EAAE;QACV,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;QACtD,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;QACxD,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAA;QACtD,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,OAAO,EAAE,mBAAmB,CAAC,CAAA;QAC5D,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,EAAE,iBAAiB,CAAC,CAAA;IAC1D,CAAC,CAAA;AACH,CAAC,CAAA"}
@@ -120,36 +120,36 @@ export declare const getFilterSelectionsForSearch: (filter: Filter) => {
120
120
  export declare const getFilterSelectionsForWraps: (filter: Filter) => {
121
121
  filter: {
122
122
  kinds: number[];
123
- ids?: string[] | undefined;
124
- authors?: string[] | undefined;
125
- since?: number | undefined;
126
- until?: number | undefined;
127
- limit?: number | undefined;
128
- search?: string | undefined;
123
+ ids?: string[];
124
+ authors?: string[];
125
+ since?: number;
126
+ until?: number;
127
+ limit?: number;
128
+ search?: string;
129
129
  };
130
130
  scenario: RouterScenario;
131
131
  }[];
132
132
  export declare const getFilterSelectionsForIndexedKinds: (filter: Filter) => {
133
133
  filter: {
134
134
  kinds: number[];
135
- ids?: string[] | undefined;
136
- authors?: string[] | undefined;
137
- since?: number | undefined;
138
- until?: number | undefined;
139
- limit?: number | undefined;
140
- search?: string | undefined;
135
+ ids?: string[];
136
+ authors?: string[];
137
+ since?: number;
138
+ until?: number;
139
+ limit?: number;
140
+ search?: string;
141
141
  };
142
142
  scenario: RouterScenario;
143
143
  }[];
144
144
  export declare const getFilterSelectionsForAuthors: (filter: Filter) => {
145
145
  filter: {
146
146
  authors: string[];
147
- ids?: string[] | undefined;
148
- kinds?: number[] | undefined;
149
- since?: number | undefined;
150
- until?: number | undefined;
151
- limit?: number | undefined;
152
- search?: string | undefined;
147
+ ids?: string[];
148
+ kinds?: number[];
149
+ since?: number;
150
+ until?: number;
151
+ limit?: number;
152
+ search?: string;
153
153
  };
154
154
  scenario: RouterScenario;
155
155
  }[];
@@ -163,23 +163,23 @@ export declare const defaultFilterSelectionRules: (((filter: Filter) => {
163
163
  }[]) | ((filter: Filter) => {
164
164
  filter: {
165
165
  kinds: number[];
166
- ids?: string[] | undefined;
167
- authors?: string[] | undefined;
168
- since?: number | undefined;
169
- until?: number | undefined;
170
- limit?: number | undefined;
171
- search?: string | undefined;
166
+ ids?: string[];
167
+ authors?: string[];
168
+ since?: number;
169
+ until?: number;
170
+ limit?: number;
171
+ search?: string;
172
172
  };
173
173
  scenario: RouterScenario;
174
174
  }[]) | ((filter: Filter) => {
175
175
  filter: {
176
176
  authors: string[];
177
- ids?: string[] | undefined;
178
- kinds?: number[] | undefined;
179
- since?: number | undefined;
180
- until?: number | undefined;
181
- limit?: number | undefined;
182
- search?: string | undefined;
177
+ ids?: string[];
178
+ kinds?: number[];
179
+ since?: number;
180
+ until?: number;
181
+ limit?: number;
182
+ search?: string;
183
183
  };
184
184
  scenario: RouterScenario;
185
185
  }[]))[];
@@ -0,0 +1,244 @@
1
+ import { intersection, first, throttleWithValue, clamp, sortBy, shuffle, pushToMapKey, ctx, always, inc, add, ago, take, chunks, MINUTE, HOUR, DAY, WEEK, } from "@welshman/lib";
2
+ import { getFilterId, isShareableRelayUrl, PROFILE, RELAYS, INBOX_RELAYS, FOLLOWS, WRAP, getAncestorTags, getPubkeyTagValues, normalizeRelayUrl, } from "@welshman/util";
3
+ import { pubkey } from "./session.js";
4
+ import { relaySelectionsByPubkey, inboxRelaySelectionsByPubkey, getReadRelayUrls, getWriteRelayUrls, getRelayUrls, } from "./relaySelections.js";
5
+ import { relays, relaysByUrl } from "./relays.js";
6
+ export const INDEXED_KINDS = [PROFILE, RELAYS, INBOX_RELAYS, FOLLOWS];
7
+ export var RelayMode;
8
+ (function (RelayMode) {
9
+ RelayMode["Read"] = "read";
10
+ RelayMode["Write"] = "write";
11
+ RelayMode["Inbox"] = "inbox";
12
+ })(RelayMode || (RelayMode = {}));
13
+ const makeSelection = (relays, weight = 1) => ({
14
+ relays: relays.map(normalizeRelayUrl),
15
+ weight,
16
+ });
17
+ export const addNoFallbacks = (count, limit) => 0;
18
+ export const addMinimalFallbacks = (count, limit) => (count > 0 ? 0 : 1);
19
+ export const addMaximalFallbacks = (count, limit) => limit - count;
20
+ export class Router {
21
+ options;
22
+ constructor(options) {
23
+ this.options = options;
24
+ }
25
+ // Utilities derived from options
26
+ getRelaysForPubkey = (pubkey, mode) => this.options.getPubkeyRelays?.(pubkey, mode) || [];
27
+ getRelaysForPubkeys = (pubkeys, mode) => pubkeys.map(pubkey => this.getRelaysForPubkey(pubkey, mode));
28
+ getRelaysForUser = (mode) => {
29
+ const pubkey = this.options.getUserPubkey?.();
30
+ return pubkey ? this.getRelaysForPubkey(pubkey, mode) : [];
31
+ };
32
+ // Utilities for creating scenarios
33
+ scenario = (selections) => new RouterScenario(this, selections);
34
+ merge = (scenarios) => this.scenario(scenarios.flatMap((scenario) => scenario.selections));
35
+ // Routing scenarios
36
+ FromRelays = (relays) => this.scenario([makeSelection(relays)]);
37
+ ForUser = () => this.FromRelays(this.getRelaysForUser(RelayMode.Read));
38
+ FromUser = () => this.FromRelays(this.getRelaysForUser(RelayMode.Write));
39
+ UserInbox = () => this.FromRelays(this.getRelaysForUser(RelayMode.Inbox)).policy(addNoFallbacks);
40
+ ForPubkey = (pubkey) => this.FromRelays(this.getRelaysForPubkey(pubkey, RelayMode.Read));
41
+ FromPubkey = (pubkey) => this.FromRelays(this.getRelaysForPubkey(pubkey, RelayMode.Write));
42
+ PubkeyInbox = (pubkey) => this.FromRelays(this.getRelaysForPubkey(pubkey, RelayMode.Inbox)).policy(addNoFallbacks);
43
+ ForPubkeys = (pubkeys) => this.merge(pubkeys.map(pubkey => this.ForPubkey(pubkey)));
44
+ FromPubkeys = (pubkeys) => this.merge(pubkeys.map(pubkey => this.FromPubkey(pubkey)));
45
+ PubkeyInboxes = (pubkeys) => this.merge(pubkeys.map(pubkey => this.PubkeyInbox(pubkey)));
46
+ Event = (event) => this.FromRelays(this.getRelaysForPubkey(event.pubkey, RelayMode.Write));
47
+ Replies = (event) => this.FromRelays(this.getRelaysForPubkey(event.pubkey, RelayMode.Read));
48
+ Quote = (event, value, relays = []) => {
49
+ const tag = event.tags.find(t => t[1] === value);
50
+ const scenarios = [this.ForPubkey(event.pubkey), this.FromPubkey(event.pubkey)];
51
+ if (tag?.[2] && isShareableRelayUrl(tag[2])) {
52
+ scenarios.push(this.FromRelays([tag[2]]));
53
+ }
54
+ if (tag?.[3]?.length === 64) {
55
+ scenarios.push(this.FromPubkeys([tag[3]]));
56
+ }
57
+ return this.merge(scenarios);
58
+ };
59
+ EventAncestors = (event, type) => {
60
+ return this.scenario(getAncestorTags(event.tags)[type].flatMap(([_, value, relay, pubkey]) => {
61
+ const selections = [makeSelection(this.ForUser().getUrls(), 0.5)];
62
+ if (pubkey) {
63
+ selections.push(makeSelection(this.FromPubkey(pubkey).getUrls()));
64
+ }
65
+ if (relay) {
66
+ selections.push(makeSelection([relay], 0.9));
67
+ }
68
+ return selections;
69
+ }));
70
+ };
71
+ EventMentions = (event) => this.EventAncestors(event, "mentions");
72
+ EventParents = (event) => this.EventAncestors(event, "replies");
73
+ EventRoots = (event) => this.EventAncestors(event, "roots");
74
+ PublishEvent = (event) => {
75
+ const pubkeys = getPubkeyTagValues(event.tags);
76
+ return this.merge([
77
+ this.FromPubkey(event.pubkey),
78
+ ...pubkeys.map(pubkey => this.ForPubkey(pubkey).weight(0.5)),
79
+ ]);
80
+ };
81
+ }
82
+ export class RouterScenario {
83
+ router;
84
+ selections;
85
+ options;
86
+ constructor(router, selections, options = {}) {
87
+ this.router = router;
88
+ this.selections = selections;
89
+ this.options = options;
90
+ }
91
+ clone = (options) => new RouterScenario(this.router, this.selections, { ...this.options, ...options });
92
+ filter = (f) => new RouterScenario(this.router, this.selections.filter(selection => f(selection)), this.options);
93
+ update = (f) => new RouterScenario(this.router, this.selections.map(selection => f(selection)), this.options);
94
+ policy = (policy) => this.clone({ policy });
95
+ limit = (limit) => this.clone({ limit });
96
+ weight = (scale) => this.update(selection => ({ ...selection, weight: selection.weight * scale }));
97
+ getPolicy = () => this.options.policy || addMaximalFallbacks;
98
+ getLimit = () => this.options.limit || this.router.options.getLimit?.() || 3;
99
+ getUrls = () => {
100
+ const limit = this.getLimit();
101
+ const fallbackPolicy = this.getPolicy();
102
+ const relayWeights = new Map();
103
+ for (const { weight, relays } of this.selections) {
104
+ for (const relay of relays) {
105
+ if (!isShareableRelayUrl(relay)) {
106
+ continue;
107
+ }
108
+ relayWeights.set(relay, add(weight, relayWeights.get(relay)));
109
+ }
110
+ }
111
+ const scoreRelay = (relay) => {
112
+ const { getRelayQuality = always(1) } = this.router.options;
113
+ const quality = getRelayQuality(relay);
114
+ const weight = relayWeights.get(relay);
115
+ // Log the weight, since it's a straight count which ends up over-weighting hubs.
116
+ // Also add some random noise so that we'll occasionally pick lower quality/less
117
+ // popular relays.
118
+ return -(quality * inc(Math.log(weight)) * Math.random());
119
+ };
120
+ const relays = take(limit, sortBy(scoreRelay, Array.from(relayWeights.keys()).filter(scoreRelay)));
121
+ const fallbacksNeeded = fallbackPolicy(relays.length, limit);
122
+ const allFallbackRelays = this.router.options.getFallbackRelays();
123
+ const fallbackRelays = shuffle(allFallbackRelays).slice(0, fallbacksNeeded);
124
+ for (const fallbackRelay of fallbackRelays) {
125
+ relays.push(fallbackRelay);
126
+ }
127
+ return relays;
128
+ };
129
+ getUrl = () => first(this.getUrls());
130
+ }
131
+ // Default router options
132
+ export const getRelayQuality = (url) => {
133
+ const relay = relaysByUrl.get().get(url);
134
+ if (relay?.stats) {
135
+ if (relay.stats.recent_errors.filter(n => n > ago(5)).length > 0)
136
+ return 0;
137
+ if (relay.stats.recent_errors.filter(n => n > ago(MINUTE)).length > 1)
138
+ return 0;
139
+ if (relay.stats.recent_errors.filter(n => n > ago(HOUR)).length > 5)
140
+ return 0;
141
+ if (relay.stats.recent_errors.filter(n => n > ago(DAY)).length > 20)
142
+ return 0;
143
+ if (relay.stats.recent_errors.filter(n => n > ago(WEEK)).length > 100)
144
+ return 0;
145
+ }
146
+ return 1;
147
+ };
148
+ export const getPubkeyRelays = (pubkey, mode) => {
149
+ const $relaySelections = relaySelectionsByPubkey.get();
150
+ const $inboxSelections = inboxRelaySelectionsByPubkey.get();
151
+ switch (mode) {
152
+ case RelayMode.Read:
153
+ return getReadRelayUrls($relaySelections.get(pubkey));
154
+ case RelayMode.Write:
155
+ return getWriteRelayUrls($relaySelections.get(pubkey));
156
+ case RelayMode.Inbox:
157
+ return getRelayUrls($inboxSelections.get(pubkey));
158
+ default:
159
+ return getRelayUrls($relaySelections.get(pubkey));
160
+ }
161
+ };
162
+ export const getIndexerRelays = () => ctx.app.indexerRelays || getFallbackRelays();
163
+ export const getFallbackRelays = throttleWithValue(300, () => sortBy(r => -getRelayQuality(r.url), relays.get())
164
+ .slice(0, 30)
165
+ .map(r => r.url));
166
+ export const getSearchRelays = throttleWithValue(300, () => sortBy(r => -getRelayQuality(r.url), relays.get())
167
+ .filter(r => r.profile?.supported_nips?.includes(50))
168
+ .slice(0, 30)
169
+ .map(r => r.url));
170
+ export const makeRouter = (options = {}) => new Router({
171
+ getPubkeyRelays,
172
+ getIndexerRelays,
173
+ getFallbackRelays,
174
+ getSearchRelays,
175
+ getRelayQuality,
176
+ getUserPubkey: () => pubkey.get(),
177
+ getLimit: () => 3,
178
+ ...options,
179
+ });
180
+ export const getFilterSelectionsForSearch = (filter) => {
181
+ if (!filter.search)
182
+ return [];
183
+ const relays = ctx.app.router.options.getSearchRelays?.() || [];
184
+ return [{ filter, scenario: ctx.app.router.FromRelays(relays).weight(10) }];
185
+ };
186
+ export const getFilterSelectionsForWraps = (filter) => {
187
+ if (!filter.kinds?.includes(WRAP) || filter.authors)
188
+ return [];
189
+ return [
190
+ {
191
+ filter: { ...filter, kinds: [WRAP] },
192
+ scenario: ctx.app.router.UserInbox(),
193
+ },
194
+ ];
195
+ };
196
+ export const getFilterSelectionsForIndexedKinds = (filter) => {
197
+ const kinds = intersection(INDEXED_KINDS, filter.kinds || []);
198
+ if (kinds.length === 0)
199
+ return [];
200
+ const relays = ctx.app.router.options.getIndexerRelays?.() || [];
201
+ return [
202
+ {
203
+ filter: { ...filter, kinds },
204
+ scenario: ctx.app.router.FromRelays(relays),
205
+ },
206
+ ];
207
+ };
208
+ export const getFilterSelectionsForAuthors = (filter) => {
209
+ if (!filter.authors)
210
+ return [];
211
+ const chunkCount = clamp([1, 30], Math.round(filter.authors.length / 30));
212
+ return chunks(chunkCount, filter.authors).map(authors => ({
213
+ filter: { ...filter, authors },
214
+ scenario: ctx.app.router.FromPubkeys(authors),
215
+ }));
216
+ };
217
+ export const getFilterSelectionsForUser = (filter) => [
218
+ { filter, scenario: ctx.app.router.ForUser().weight(0.2) },
219
+ ];
220
+ export const defaultFilterSelectionRules = [
221
+ getFilterSelectionsForSearch,
222
+ getFilterSelectionsForWraps,
223
+ getFilterSelectionsForIndexedKinds,
224
+ getFilterSelectionsForAuthors,
225
+ getFilterSelectionsForUser,
226
+ ];
227
+ export const getFilterSelections = (filters, rules = defaultFilterSelectionRules) => {
228
+ const filtersById = new Map();
229
+ const scenariosById = new Map();
230
+ for (const filter of filters) {
231
+ for (const filterScenario of rules.flatMap(rule => rule(filter))) {
232
+ const id = getFilterId(filterScenario.filter);
233
+ filtersById.set(id, filterScenario.filter);
234
+ pushToMapKey(scenariosById, id, filterScenario.scenario);
235
+ }
236
+ }
237
+ const result = [];
238
+ for (const [id, filter] of filtersById.entries()) {
239
+ const scenario = ctx.app.router.merge(scenariosById.get(id) || []);
240
+ result.push({ filters: [filter], relays: scenario.getUrls() });
241
+ }
242
+ return result;
243
+ };
244
+ //# sourceMappingURL=router.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"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"}