@welshman/app 0.1.2 → 0.2.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 (202) hide show
  1. package/dist/app/src/commands.d.ts +6 -42
  2. package/dist/app/src/commands.d.ts.map +1 -1
  3. package/dist/app/src/commands.js +1 -1
  4. package/dist/app/src/commands.js.map +1 -1
  5. package/dist/app/src/core.d.ts.map +1 -1
  6. package/dist/app/src/core.js +2 -17
  7. package/dist/app/src/core.js.map +1 -1
  8. package/dist/app/src/feeds.d.ts +3 -5
  9. package/dist/app/src/feeds.d.ts.map +1 -1
  10. package/dist/app/src/feeds.js +4 -55
  11. package/dist/app/src/feeds.js.map +1 -1
  12. package/dist/app/src/follows.d.ts.map +1 -1
  13. package/dist/app/src/follows.js +3 -4
  14. package/dist/app/src/follows.js.map +1 -1
  15. package/dist/app/src/handles.d.ts.map +1 -1
  16. package/dist/app/src/handles.js +4 -2
  17. package/dist/app/src/handles.js.map +1 -1
  18. package/dist/app/src/index.d.ts +1 -4
  19. package/dist/app/src/index.d.ts.map +1 -1
  20. package/dist/app/src/index.js +39 -4
  21. package/dist/app/src/index.js.map +1 -1
  22. package/dist/app/src/mutes.d.ts.map +1 -1
  23. package/dist/app/src/mutes.js +3 -4
  24. package/dist/app/src/mutes.js.map +1 -1
  25. package/dist/app/src/pins.d.ts.map +1 -1
  26. package/dist/app/src/pins.js +3 -4
  27. package/dist/app/src/pins.js.map +1 -1
  28. package/dist/app/src/profiles.d.ts +1 -1
  29. package/dist/app/src/profiles.d.ts.map +1 -1
  30. package/dist/app/src/profiles.js +5 -6
  31. package/dist/app/src/profiles.js.map +1 -1
  32. package/dist/app/src/relaySelections.d.ts +10 -5
  33. package/dist/app/src/relaySelections.d.ts.map +1 -1
  34. package/dist/app/src/relaySelections.js +31 -41
  35. package/dist/app/src/relaySelections.js.map +1 -1
  36. package/dist/app/src/relays.d.ts +1 -0
  37. package/dist/app/src/relays.d.ts.map +1 -1
  38. package/dist/app/src/relays.js +31 -4
  39. package/dist/app/src/relays.js.map +1 -1
  40. package/dist/app/src/search.d.ts.map +1 -1
  41. package/dist/app/src/search.js +1 -1
  42. package/dist/app/src/search.js.map +1 -1
  43. package/dist/app/src/session.d.ts +25 -7
  44. package/dist/app/src/session.d.ts.map +1 -1
  45. package/dist/app/src/session.js +50 -3
  46. package/dist/app/src/session.js.map +1 -1
  47. package/dist/app/src/storage.d.ts +1 -0
  48. package/dist/app/src/storage.d.ts.map +1 -1
  49. package/dist/app/src/storage.js +6 -1
  50. package/dist/app/src/storage.js.map +1 -1
  51. package/dist/app/src/storageAdapters.d.ts +88 -0
  52. package/dist/app/src/storageAdapters.d.ts.map +1 -0
  53. package/dist/app/src/storageAdapters.js +174 -0
  54. package/dist/app/src/storageAdapters.js.map +1 -0
  55. package/dist/app/src/sync.d.ts.map +1 -1
  56. package/dist/app/src/sync.js +7 -9
  57. package/dist/app/src/sync.js.map +1 -1
  58. package/dist/app/src/tags.js +1 -1
  59. package/dist/app/src/tags.js.map +1 -1
  60. package/dist/app/src/thunk.d.ts +38 -53
  61. package/dist/app/src/thunk.d.ts.map +1 -1
  62. package/dist/app/src/thunk.js +182 -132
  63. package/dist/app/src/thunk.js.map +1 -1
  64. package/dist/app/src/zappers.js +1 -1
  65. package/dist/dvm/src/handler.d.ts.map +1 -1
  66. package/dist/dvm/src/handler.js +9 -7
  67. package/dist/dvm/src/handler.js.map +1 -1
  68. package/dist/dvm/src/request.d.ts +6 -15
  69. package/dist/dvm/src/request.d.ts.map +1 -1
  70. package/dist/dvm/src/request.js +23 -23
  71. package/dist/dvm/src/request.js.map +1 -1
  72. package/dist/feeds/src/compiler.d.ts +15 -4
  73. package/dist/feeds/src/compiler.d.ts.map +1 -1
  74. package/dist/feeds/src/compiler.js +11 -6
  75. package/dist/feeds/src/compiler.js.map +1 -1
  76. package/dist/feeds/src/controller.d.ts +16 -9
  77. package/dist/feeds/src/controller.d.ts.map +1 -1
  78. package/dist/feeds/src/controller.js +23 -24
  79. package/dist/feeds/src/controller.js.map +1 -1
  80. package/dist/feeds/src/core.d.ts +1 -23
  81. package/dist/feeds/src/core.d.ts.map +1 -1
  82. package/dist/feeds/src/display.d.ts +21 -0
  83. package/dist/feeds/src/display.d.ts.map +1 -0
  84. package/dist/feeds/src/display.js +136 -0
  85. package/dist/feeds/src/display.js.map +1 -0
  86. package/dist/feeds/src/index.d.ts +2 -0
  87. package/dist/feeds/src/index.d.ts.map +1 -1
  88. package/dist/feeds/src/index.js +2 -0
  89. package/dist/feeds/src/index.js.map +1 -1
  90. package/dist/feeds/src/request.d.ts +22 -0
  91. package/dist/feeds/src/request.d.ts.map +1 -0
  92. package/dist/feeds/src/request.js +61 -0
  93. package/dist/feeds/src/request.js.map +1 -0
  94. package/dist/feeds/src/utils.d.ts +1 -1
  95. package/dist/feeds/src/utils.d.ts.map +1 -1
  96. package/dist/feeds/src/utils.js +2 -1
  97. package/dist/feeds/src/utils.js.map +1 -1
  98. package/dist/feeds/src/validate.d.ts +24 -0
  99. package/dist/feeds/src/validate.d.ts.map +1 -0
  100. package/dist/feeds/src/validate.js +137 -0
  101. package/dist/feeds/src/validate.js.map +1 -0
  102. package/dist/lib/src/TaskQueue.d.ts +2 -0
  103. package/dist/lib/src/TaskQueue.d.ts.map +1 -1
  104. package/dist/lib/src/TaskQueue.js +10 -0
  105. package/dist/lib/src/TaskQueue.js.map +1 -1
  106. package/dist/lib/src/Tools.d.ts +100 -3
  107. package/dist/lib/src/Tools.d.ts.map +1 -1
  108. package/dist/lib/src/Tools.js +166 -3
  109. package/dist/lib/src/Tools.js.map +1 -1
  110. package/dist/net/src/auth.d.ts +2 -1
  111. package/dist/net/src/auth.d.ts.map +1 -1
  112. package/dist/net/src/auth.js +16 -2
  113. package/dist/net/src/auth.js.map +1 -1
  114. package/dist/net/src/context.d.ts.map +1 -1
  115. package/dist/net/src/context.js +3 -3
  116. package/dist/net/src/context.js.map +1 -1
  117. package/dist/net/src/diff.d.ts.map +1 -1
  118. package/dist/net/src/diff.js +11 -12
  119. package/dist/net/src/diff.js.map +1 -1
  120. package/dist/net/src/policy.js +3 -3
  121. package/dist/net/src/policy.js.map +1 -1
  122. package/dist/net/src/pool.d.ts +1 -1
  123. package/dist/net/src/pool.d.ts.map +1 -1
  124. package/dist/net/src/pool.js +1 -1
  125. package/dist/net/src/pool.js.map +1 -1
  126. package/dist/net/src/publish.d.ts +29 -30
  127. package/dist/net/src/publish.d.ts.map +1 -1
  128. package/dist/net/src/publish.js +79 -108
  129. package/dist/net/src/publish.js.map +1 -1
  130. package/dist/net/src/request.d.ts +26 -60
  131. package/dist/net/src/request.d.ts.map +1 -1
  132. package/dist/net/src/request.js +170 -158
  133. package/dist/net/src/request.js.map +1 -1
  134. package/dist/relay/src/repository.d.ts +1 -1
  135. package/dist/relay/src/repository.d.ts.map +1 -1
  136. package/dist/relay/src/repository.js +1 -1
  137. package/dist/relay/src/repository.js.map +1 -1
  138. package/dist/signer/src/signers/nip46.d.ts +3 -3
  139. package/dist/signer/src/signers/nip46.d.ts.map +1 -1
  140. package/dist/signer/src/signers/nip46.js +26 -20
  141. package/dist/signer/src/signers/nip46.js.map +1 -1
  142. package/dist/store/src/collection.d.ts +32 -0
  143. package/dist/store/src/collection.d.ts.map +1 -0
  144. package/dist/{app → store}/src/collection.js +20 -8
  145. package/dist/store/src/collection.js.map +1 -0
  146. package/dist/store/src/custom.d.ts +10 -0
  147. package/dist/store/src/custom.d.ts.map +1 -0
  148. package/dist/store/src/custom.js +41 -0
  149. package/dist/store/src/custom.js.map +1 -0
  150. package/dist/store/src/getter.d.ts +11 -0
  151. package/dist/store/src/getter.d.ts.map +1 -0
  152. package/dist/store/src/getter.js +11 -0
  153. package/dist/store/src/getter.js.map +1 -0
  154. package/dist/store/src/index.d.ts +6 -34
  155. package/dist/store/src/index.d.ts.map +1 -1
  156. package/dist/store/src/index.js +6 -163
  157. package/dist/store/src/index.js.map +1 -1
  158. package/dist/store/src/repository.d.ts +16 -0
  159. package/dist/store/src/repository.d.ts.map +1 -0
  160. package/dist/store/src/repository.js +100 -0
  161. package/dist/store/src/repository.js.map +1 -0
  162. package/dist/store/src/synced.d.ts +2 -0
  163. package/dist/store/src/synced.d.ts.map +1 -0
  164. package/dist/store/src/synced.js +9 -0
  165. package/dist/store/src/synced.js.map +1 -0
  166. package/dist/store/src/throttle.d.ts +3 -0
  167. package/dist/store/src/throttle.d.ts.map +1 -0
  168. package/dist/store/src/throttle.js +9 -0
  169. package/dist/store/src/throttle.js.map +1 -0
  170. package/dist/tsconfig.build.tsbuildinfo +1 -1
  171. package/dist/util/src/Events.d.ts +1 -1
  172. package/dist/util/src/Events.d.ts.map +1 -1
  173. package/dist/util/src/Events.js +6 -5
  174. package/dist/util/src/Events.js.map +1 -1
  175. package/dist/util/src/List.d.ts +2 -0
  176. package/dist/util/src/List.d.ts.map +1 -1
  177. package/dist/util/src/List.js +10 -3
  178. package/dist/util/src/List.js.map +1 -1
  179. package/dist/util/src/Profile.d.ts +3 -10
  180. package/dist/util/src/Profile.d.ts.map +1 -1
  181. package/dist/util/src/Profile.js +1 -0
  182. package/dist/util/src/Profile.js.map +1 -1
  183. package/dist/util/src/Relay.d.ts +6 -0
  184. package/dist/util/src/Relay.d.ts.map +1 -1
  185. package/dist/util/src/Relay.js +9 -2
  186. package/dist/util/src/Relay.js.map +1 -1
  187. package/package.json +10 -9
  188. package/dist/app/src/adapters.d.ts +0 -33
  189. package/dist/app/src/adapters.d.ts.map +0 -1
  190. package/dist/app/src/adapters.js +0 -84
  191. package/dist/app/src/adapters.js.map +0 -1
  192. package/dist/app/src/collection.d.ts +0 -13
  193. package/dist/app/src/collection.d.ts.map +0 -1
  194. package/dist/app/src/collection.js.map +0 -1
  195. package/dist/app/src/freshness.d.ts +0 -11
  196. package/dist/app/src/freshness.d.ts.map +0 -1
  197. package/dist/app/src/freshness.js +0 -14
  198. package/dist/app/src/freshness.js.map +0 -1
  199. package/dist/app/src/router.d.ts +0 -199
  200. package/dist/app/src/router.d.ts.map +0 -1
  201. package/dist/app/src/router.js +0 -273
  202. package/dist/app/src/router.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"collection.js","sourceRoot":"","sources":["../../../src/collection.ts"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- export type FreshnessUpdate = {
2
- ns: string;
3
- key: string;
4
- ts: number;
5
- };
6
- export declare const freshness: import("@welshman/store").WritableWithGetter<Record<string, number>>;
7
- export declare const getFreshnessKey: (ns: string, key: string) => string;
8
- export declare const getFreshness: (ns: string, key: string) => number;
9
- export declare const setFreshnessImmediate: ({ ns, key, ts }: FreshnessUpdate) => void;
10
- export declare const setFreshnessThrottled: (x: FreshnessUpdate) => void;
11
- //# sourceMappingURL=freshness.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"freshness.d.ts","sourceRoot":"","sources":["../../../src/freshness.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,eAAO,MAAM,SAAS,sEAAmD,CAAA;AAEzE,eAAO,MAAM,eAAe,GAAI,IAAI,MAAM,EAAE,KAAK,MAAM,WAAmB,CAAA;AAE1E,eAAO,MAAM,YAAY,GAAI,IAAI,MAAM,EAAE,KAAK,MAAM,WACJ,CAAA;AAEhD,eAAO,MAAM,qBAAqB,GAAI,iBAAe,eAAe,SACb,CAAA;AAEvD,eAAO,MAAM,qBAAqB,8BAQjC,CAAA"}
@@ -1,14 +0,0 @@
1
- import { writable } from "svelte/store";
2
- import { assoc, batch } from "@welshman/lib";
3
- import { withGetter } from "@welshman/store";
4
- export const freshness = withGetter(writable({}));
5
- export const getFreshnessKey = (ns, key) => `${ns}:${key}`;
6
- export const getFreshness = (ns, key) => freshness.get()[getFreshnessKey(ns, key)] || 0;
7
- export const setFreshnessImmediate = ({ ns, key, ts }) => freshness.update(assoc(getFreshnessKey(ns, key), ts));
8
- export const setFreshnessThrottled = batch(100, (updates) => freshness.update($freshness => {
9
- for (const { ns, key, ts } of updates) {
10
- $freshness[getFreshnessKey(ns, key)] = ts;
11
- }
12
- return $freshness;
13
- }));
14
- //# sourceMappingURL=freshness.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"freshness.js","sourceRoot":"","sources":["../../../src/freshness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,cAAc,CAAA;AACrC,OAAO,EAAC,KAAK,EAAE,KAAK,EAAC,MAAM,eAAe,CAAA;AAC1C,OAAO,EAAC,UAAU,EAAC,MAAM,iBAAiB,CAAA;AAQ1C,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAyB,EAAE,CAAC,CAAC,CAAA;AAEzE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAU,EAAE,GAAW,EAAE,EAAE,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE,CAAA;AAE1E,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAU,EAAE,GAAW,EAAE,EAAE,CACtD,SAAS,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,CAAA;AAEhD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAkB,EAAE,EAAE,CACtE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,CAAA;AAEvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,OAA0B,EAAE,EAAE,CAC7E,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE;IAC5B,KAAK,MAAM,EAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAC,IAAI,OAAO,EAAE,CAAC;QACpC,UAAU,CAAC,eAAe,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;IAC3C,CAAC;IAED,OAAO,UAAU,CAAA;AACnB,CAAC,CAAC,CACH,CAAA"}
@@ -1,199 +0,0 @@
1
- import { TrustedEvent, Filter } from "@welshman/util";
2
- export declare const INDEXED_KINDS: number[];
3
- export type RelaysAndFilters = {
4
- relays: string[];
5
- filters: Filter[];
6
- };
7
- export declare enum RelayMode {
8
- Read = "read",
9
- Write = "write",
10
- Inbox = "inbox"
11
- }
12
- export type RouterOptions = {
13
- /**
14
- * Retrieves the user's public key.
15
- * @returns The user's public key as a string, or null if not available.
16
- */
17
- getUserPubkey?: () => string | null;
18
- /**
19
- * Retrieves relays for the specified public key and mode.
20
- * @param pubkey - The public key to retrieve relays for.
21
- * @param mode - The relay mode (optional). May be "read", "write", or "inbox".
22
- * @returns An array of relay URLs as strings.
23
- */
24
- getPubkeyRelays?: (pubkey: string, mode?: RelayMode) => string[];
25
- /**
26
- * Retrieves default relays, for use as fallbacks when no other relays can be selected.
27
- * @returns An array of relay URLs as strings.
28
- */
29
- getDefaultRelays?: () => string[];
30
- /**
31
- * Retrieves relays that index profiles and relay selections.
32
- * @returns An array of relay URLs as strings.
33
- */
34
- getIndexerRelays?: () => string[];
35
- /**
36
- * Retrieves relays likely to support NIP-50 search.
37
- * @returns An array of relay URLs as strings.
38
- */
39
- getSearchRelays?: () => string[];
40
- /**
41
- * Retrieves the quality of the specified relay.
42
- * @param url - The URL of the relay to retrieve quality for.
43
- * @returns The quality of the relay as a number between 0 and 1 inclusive.
44
- */
45
- getRelayQuality?: (url: string) => number;
46
- /**
47
- * Retrieves the limit setting, which is the maximum number of relays that should be
48
- * returned from getUrls and getSelections.
49
- * @returns The limit setting as a number.
50
- */
51
- getLimit?: () => number;
52
- };
53
- export type Selection = {
54
- weight: number;
55
- relays: string[];
56
- };
57
- export type FallbackPolicy = (count: number, limit: number) => number;
58
- export declare const addNoFallbacks: (count: number, limit: number) => number;
59
- export declare const addMinimalFallbacks: (count: number, limit: number) => 1 | 0;
60
- export declare const addMaximalFallbacks: (count: number, limit: number) => number;
61
- export declare const getRelayQuality: (url: string) => 1 | 0 | 0.9 | 0.8 | 0.7;
62
- export declare const getPubkeyRelays: (pubkey: string, mode?: string) => string[];
63
- export declare const routerContext: RouterOptions;
64
- export declare class Router {
65
- readonly options: RouterOptions;
66
- static configure(options: RouterOptions): void;
67
- static get(): Router;
68
- constructor(options: RouterOptions);
69
- getRelaysForPubkey: (pubkey: string, mode?: RelayMode) => string[];
70
- getRelaysForPubkeys: (pubkeys: string[], mode?: RelayMode) => string[][];
71
- getRelaysForUser: (mode?: RelayMode) => string[];
72
- scenario: (selections: Selection[]) => RouterScenario;
73
- merge: (scenarios: RouterScenario[]) => RouterScenario;
74
- FromRelays: (relays: string[]) => RouterScenario;
75
- Search: () => RouterScenario;
76
- Index: () => RouterScenario;
77
- Default: () => RouterScenario;
78
- ForUser: () => RouterScenario;
79
- FromUser: () => RouterScenario;
80
- UserInbox: () => RouterScenario;
81
- ForPubkey: (pubkey: string) => RouterScenario;
82
- FromPubkey: (pubkey: string) => RouterScenario;
83
- PubkeyInbox: (pubkey: string) => RouterScenario;
84
- ForPubkeys: (pubkeys: string[]) => RouterScenario;
85
- FromPubkeys: (pubkeys: string[]) => RouterScenario;
86
- PubkeyInboxes: (pubkeys: string[]) => RouterScenario;
87
- Event: (event: TrustedEvent) => RouterScenario;
88
- Replies: (event: TrustedEvent) => RouterScenario;
89
- Quote: (event: TrustedEvent, value: string, relays?: string[]) => RouterScenario;
90
- EventAncestors: (event: TrustedEvent, type: "mentions" | "replies" | "roots") => RouterScenario;
91
- EventMentions: (event: TrustedEvent) => RouterScenario;
92
- EventParents: (event: TrustedEvent) => RouterScenario;
93
- EventRoots: (event: TrustedEvent) => RouterScenario;
94
- PublishEvent: (event: TrustedEvent) => RouterScenario;
95
- }
96
- export type RouterScenarioOptions = {
97
- policy?: FallbackPolicy;
98
- limit?: number;
99
- allowLocal?: boolean;
100
- allowOnion?: boolean;
101
- allowInsecure?: boolean;
102
- };
103
- export declare class RouterScenario {
104
- readonly router: Router;
105
- readonly selections: Selection[];
106
- readonly options: RouterScenarioOptions;
107
- constructor(router: Router, selections: Selection[], options?: RouterScenarioOptions);
108
- clone: (options: RouterScenarioOptions) => RouterScenario;
109
- filter: (f: (selection: Selection) => boolean) => RouterScenario;
110
- update: (f: (selection: Selection) => Selection) => RouterScenario;
111
- policy: (policy: FallbackPolicy) => RouterScenario;
112
- limit: (limit: number) => RouterScenario;
113
- allowLocal: (allowLocal: boolean) => RouterScenario;
114
- allowOnion: (allowOnion: boolean) => RouterScenario;
115
- allowInsecure: (allowInsecure: boolean) => RouterScenario;
116
- weight: (scale: number) => RouterScenario;
117
- getPolicy: () => (count: number, limit: number) => number;
118
- getLimit: () => number;
119
- getUrls: () => string[];
120
- getUrl: () => string | undefined;
121
- }
122
- type FilterScenario = {
123
- filter: Filter;
124
- scenario: RouterScenario;
125
- };
126
- type FilterSelectionRule = (filter: Filter) => FilterScenario[];
127
- export declare const getFilterSelectionsForSearch: (filter: Filter) => {
128
- filter: Filter;
129
- scenario: RouterScenario;
130
- }[];
131
- export declare const getFilterSelectionsForWraps: (filter: Filter) => {
132
- filter: {
133
- kinds: number[];
134
- ids?: string[];
135
- authors?: string[];
136
- since?: number;
137
- until?: number;
138
- limit?: number;
139
- search?: string;
140
- };
141
- scenario: RouterScenario;
142
- }[];
143
- export declare const getFilterSelectionsForIndexedKinds: (filter: Filter) => {
144
- filter: {
145
- kinds: number[];
146
- ids?: string[];
147
- authors?: string[];
148
- since?: number;
149
- until?: number;
150
- limit?: number;
151
- search?: string;
152
- };
153
- scenario: RouterScenario;
154
- }[];
155
- export declare const getFilterSelectionsForAuthors: (filter: Filter) => {
156
- filter: {
157
- authors: string[];
158
- ids?: string[];
159
- kinds?: number[];
160
- since?: number;
161
- until?: number;
162
- limit?: number;
163
- search?: string;
164
- };
165
- scenario: RouterScenario;
166
- }[];
167
- export declare const getFilterSelectionsForUser: (filter: Filter) => {
168
- filter: Filter;
169
- scenario: RouterScenario;
170
- }[];
171
- export declare const defaultFilterSelectionRules: (((filter: Filter) => {
172
- filter: Filter;
173
- scenario: RouterScenario;
174
- }[]) | ((filter: Filter) => {
175
- filter: {
176
- kinds: number[];
177
- ids?: string[];
178
- authors?: string[];
179
- since?: number;
180
- until?: number;
181
- limit?: number;
182
- search?: string;
183
- };
184
- scenario: RouterScenario;
185
- }[]) | ((filter: Filter) => {
186
- filter: {
187
- authors: string[];
188
- ids?: string[];
189
- kinds?: number[];
190
- since?: number;
191
- until?: number;
192
- limit?: number;
193
- search?: string;
194
- };
195
- scenario: RouterScenario;
196
- }[]))[];
197
- export declare const getFilterSelections: (filters: Filter[], rules?: FilterSelectionRule[]) => RelaysAndFilters[];
198
- export {};
199
- //# sourceMappingURL=router.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/router.ts"],"names":[],"mappings":"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"}
@@ -1,273 +0,0 @@
1
- import { intersection, mergeLeft, first, clamp, sortBy, shuffle, pushToMapKey, inc, add, ago, take, chunks, MINUTE, HOUR, DAY, } from "@welshman/lib";
2
- import { getFilterId, isRelayUrl, isOnionUrl, isLocalUrl, isIPAddress, isShareableRelayUrl, COMMENT, PROFILE, RELAYS, INBOX_RELAYS, FOLLOWS, WRAP, getReplyTags, getCommentTags, getPubkeyTagValues, normalizeRelayUrl, } from "@welshman/util";
3
- import { Pool } from "@welshman/net";
4
- import { pubkey } from "./session.js";
5
- import { relaySelectionsByPubkey, inboxRelaySelectionsByPubkey, getReadRelayUrls, getWriteRelayUrls, getRelayUrls, } from "./relaySelections.js";
6
- import { relaysByUrl } from "./relays.js";
7
- export const INDEXED_KINDS = [PROFILE, RELAYS, INBOX_RELAYS, FOLLOWS];
8
- export var RelayMode;
9
- (function (RelayMode) {
10
- RelayMode["Read"] = "read";
11
- RelayMode["Write"] = "write";
12
- RelayMode["Inbox"] = "inbox";
13
- })(RelayMode || (RelayMode = {}));
14
- const makeSelection = (relays, weight = 1) => ({
15
- relays: relays.filter(isRelayUrl).map(normalizeRelayUrl),
16
- weight,
17
- });
18
- export const addNoFallbacks = (count, limit) => 0;
19
- export const addMinimalFallbacks = (count, limit) => (count > 0 ? 0 : 1);
20
- export const addMaximalFallbacks = (count, limit) => limit - count;
21
- // Default router options
22
- export const getRelayQuality = (url) => {
23
- const relay = relaysByUrl.get().get(url);
24
- // Skip non-relays entirely
25
- if (!isRelayUrl(url))
26
- return 0;
27
- // If we have recent errors, skip it
28
- if (relay?.stats) {
29
- if (relay.stats.recent_errors.filter(n => n > ago(MINUTE)).length > 0)
30
- return 0;
31
- if (relay.stats.recent_errors.filter(n => n > ago(HOUR)).length > 3)
32
- return 0;
33
- if (relay.stats.recent_errors.filter(n => n > ago(DAY)).length > 10)
34
- return 0;
35
- }
36
- // Prefer stuff we're connected to
37
- if (Pool.getSingleton().has(url))
38
- return 1;
39
- // Prefer stuff we've connected to in the past
40
- if (relay?.stats)
41
- return 0.9;
42
- // If it's not weird url give it an ok score
43
- if (!isIPAddress(url) && !isLocalUrl(url) && !isOnionUrl(url) && !url.startsWith("ws://")) {
44
- return 0.8;
45
- }
46
- // Default to a "meh" score
47
- return 0.7;
48
- };
49
- export const getPubkeyRelays = (pubkey, mode) => {
50
- const $relaySelections = relaySelectionsByPubkey.get();
51
- const $inboxSelections = inboxRelaySelectionsByPubkey.get();
52
- switch (mode) {
53
- case RelayMode.Read:
54
- return getReadRelayUrls($relaySelections.get(pubkey));
55
- case RelayMode.Write:
56
- return getWriteRelayUrls($relaySelections.get(pubkey));
57
- case RelayMode.Inbox:
58
- return getRelayUrls($inboxSelections.get(pubkey));
59
- default:
60
- return getRelayUrls($relaySelections.get(pubkey));
61
- }
62
- };
63
- export const routerContext = {
64
- getRelayQuality,
65
- getPubkeyRelays,
66
- getDefaultRelays: () => ["wss://relay.damus.io/", "wss://nos.lol/"],
67
- getIndexerRelays: () => ["wss://purplepag.es/", "wss://relay.nostr.band/"],
68
- getSearchRelays: () => ["wss://relay.nostr.band/", "wss://nostr.wine/"],
69
- getUserPubkey: () => pubkey.get(),
70
- getLimit: () => 3,
71
- };
72
- // Router class
73
- export class Router {
74
- options;
75
- static configure(options) {
76
- Object.assign(routerContext, options);
77
- }
78
- static get() {
79
- return new Router(routerContext);
80
- }
81
- constructor(options) {
82
- this.options = mergeLeft(options, routerContext);
83
- }
84
- // Utilities derived from options
85
- getRelaysForPubkey = (pubkey, mode) => this.options.getPubkeyRelays?.(pubkey, mode) || [];
86
- getRelaysForPubkeys = (pubkeys, mode) => pubkeys.map(pubkey => this.getRelaysForPubkey(pubkey, mode));
87
- getRelaysForUser = (mode) => {
88
- const pubkey = this.options.getUserPubkey?.();
89
- return pubkey ? this.getRelaysForPubkey(pubkey, mode) : [];
90
- };
91
- // Utilities for creating scenarios
92
- scenario = (selections) => new RouterScenario(this, selections);
93
- merge = (scenarios) => this.scenario(scenarios.flatMap((scenario) => scenario.selections));
94
- // Routing scenarios
95
- FromRelays = (relays) => this.scenario([makeSelection(relays)]);
96
- Search = () => this.FromRelays(this.options.getSearchRelays?.() || []);
97
- Index = () => this.FromRelays(this.options.getIndexerRelays?.() || []);
98
- Default = () => this.FromRelays(this.options.getDefaultRelays?.() || []);
99
- ForUser = () => this.FromRelays(this.getRelaysForUser(RelayMode.Read));
100
- FromUser = () => this.FromRelays(this.getRelaysForUser(RelayMode.Write));
101
- UserInbox = () => this.FromRelays(this.getRelaysForUser(RelayMode.Inbox));
102
- ForPubkey = (pubkey) => this.FromRelays(this.getRelaysForPubkey(pubkey, RelayMode.Read));
103
- FromPubkey = (pubkey) => this.FromRelays(this.getRelaysForPubkey(pubkey, RelayMode.Write));
104
- PubkeyInbox = (pubkey) => this.FromRelays(this.getRelaysForPubkey(pubkey, RelayMode.Inbox));
105
- ForPubkeys = (pubkeys) => this.merge(pubkeys.map(pubkey => this.ForPubkey(pubkey)));
106
- FromPubkeys = (pubkeys) => this.merge(pubkeys.map(pubkey => this.FromPubkey(pubkey)));
107
- PubkeyInboxes = (pubkeys) => this.merge(pubkeys.map(pubkey => this.PubkeyInbox(pubkey)));
108
- Event = (event) => this.FromRelays(this.getRelaysForPubkey(event.pubkey, RelayMode.Write));
109
- Replies = (event) => this.FromRelays(this.getRelaysForPubkey(event.pubkey, RelayMode.Read));
110
- Quote = (event, value, relays = []) => {
111
- const tag = event.tags.find(t => t[1] === value);
112
- const scenarios = [
113
- this.FromRelays(relays),
114
- this.ForPubkey(event.pubkey),
115
- this.FromPubkey(event.pubkey),
116
- ];
117
- if (tag?.[2] && isShareableRelayUrl(tag[2])) {
118
- scenarios.push(this.FromRelays([tag[2]]));
119
- }
120
- if (tag?.[3]?.length === 64) {
121
- scenarios.push(this.FromPubkeys([tag[3]]));
122
- }
123
- return this.merge(scenarios);
124
- };
125
- EventAncestors = (event, type) => {
126
- const ancestorTags = event.kind === COMMENT ? getCommentTags(event.tags) : getReplyTags(event.tags);
127
- const tags = ancestorTags[type] || [];
128
- return this.scenario(tags.flatMap(([_, value, relay, pubkey]) => {
129
- const selections = [makeSelection(this.ForUser().getUrls(), 0.5)];
130
- if (pubkey) {
131
- selections.push(makeSelection(this.FromPubkey(pubkey).getUrls()));
132
- }
133
- if (relay) {
134
- selections.push(makeSelection([relay], 0.9));
135
- }
136
- return selections;
137
- }));
138
- };
139
- EventMentions = (event) => this.EventAncestors(event, "mentions");
140
- EventParents = (event) => this.EventAncestors(event, "replies");
141
- EventRoots = (event) => this.EventAncestors(event, "roots");
142
- PublishEvent = (event) => {
143
- const pubkeys = getPubkeyTagValues(event.tags);
144
- return this.merge([
145
- this.FromPubkey(event.pubkey),
146
- ...pubkeys.map(pubkey => this.ForPubkey(pubkey).weight(0.5)),
147
- ]);
148
- };
149
- }
150
- export class RouterScenario {
151
- router;
152
- selections;
153
- options;
154
- constructor(router, selections, options = {}) {
155
- this.router = router;
156
- this.selections = selections;
157
- this.options = options;
158
- }
159
- clone = (options) => new RouterScenario(this.router, this.selections, { ...this.options, ...options });
160
- filter = (f) => new RouterScenario(this.router, this.selections.filter(selection => f(selection)), this.options);
161
- update = (f) => new RouterScenario(this.router, this.selections.map(selection => f(selection)), this.options);
162
- policy = (policy) => this.clone({ policy });
163
- limit = (limit) => this.clone({ limit });
164
- allowLocal = (allowLocal) => this.clone({ allowLocal });
165
- allowOnion = (allowOnion) => this.clone({ allowOnion });
166
- allowInsecure = (allowInsecure) => this.clone({ allowInsecure });
167
- weight = (scale) => this.update(selection => ({ ...selection, weight: selection.weight * scale }));
168
- getPolicy = () => this.options.policy || addNoFallbacks;
169
- getLimit = () => this.options.limit || this.router.options.getLimit?.() || 3;
170
- getUrls = () => {
171
- const limit = this.getLimit();
172
- const fallbackPolicy = this.getPolicy();
173
- const relayWeights = new Map();
174
- const { allowOnion, allowLocal, allowInsecure } = this.options;
175
- for (const { weight, relays } of this.selections) {
176
- for (const relay of relays) {
177
- if (!isRelayUrl(relay))
178
- continue;
179
- if (!allowOnion && isOnionUrl(relay))
180
- continue;
181
- if (!allowLocal && isLocalUrl(relay))
182
- continue;
183
- if (!allowInsecure && relay.startsWith("ws://") && !isOnionUrl(relay))
184
- continue;
185
- relayWeights.set(relay, add(weight, relayWeights.get(relay)));
186
- }
187
- }
188
- const scoreRelay = (relay) => {
189
- const quality = this.router.options.getRelayQuality?.(relay);
190
- const weight = relayWeights.get(relay);
191
- // Log the weight, since it's a straight count which ends up over-weighting hubs.
192
- // Also add some random noise so that we'll occasionally pick lower quality/less
193
- // popular relays.
194
- return quality ? -(quality * inc(Math.log(weight)) * Math.random()) : 0;
195
- };
196
- const relays = take(limit, sortBy(scoreRelay, Array.from(relayWeights.keys()).filter(scoreRelay)));
197
- const fallbacksNeeded = fallbackPolicy(relays.length, limit);
198
- const allFallbackRelays = this.router.options.getDefaultRelays?.() || [];
199
- const fallbackRelays = shuffle(allFallbackRelays).slice(0, fallbacksNeeded);
200
- for (const fallbackRelay of fallbackRelays) {
201
- relays.push(fallbackRelay);
202
- }
203
- return relays;
204
- };
205
- getUrl = () => first(this.getUrls());
206
- }
207
- export const getFilterSelectionsForSearch = (filter) => {
208
- if (!filter.search)
209
- return [];
210
- const relays = routerContext.getSearchRelays?.() || [];
211
- return [{ filter, scenario: Router.get().FromRelays(relays).weight(10) }];
212
- };
213
- export const getFilterSelectionsForWraps = (filter) => {
214
- if (!filter.kinds?.includes(WRAP) || filter.authors)
215
- return [];
216
- return [
217
- {
218
- filter: { ...filter, kinds: [WRAP] },
219
- scenario: Router.get().UserInbox(),
220
- },
221
- ];
222
- };
223
- export const getFilterSelectionsForIndexedKinds = (filter) => {
224
- const kinds = intersection(INDEXED_KINDS, filter.kinds || []);
225
- if (kinds.length === 0)
226
- return [];
227
- const relays = routerContext.getIndexerRelays?.() || [];
228
- return [
229
- {
230
- filter: { ...filter, kinds },
231
- scenario: Router.get().FromRelays(relays),
232
- },
233
- ];
234
- };
235
- export const getFilterSelectionsForAuthors = (filter) => {
236
- if (!filter.authors)
237
- return [];
238
- const chunkCount = clamp([1, 30], Math.round(filter.authors.length / 30));
239
- return chunks(chunkCount, filter.authors).map(authors => ({
240
- filter: { ...filter, authors },
241
- scenario: Router.get().FromPubkeys(authors),
242
- }));
243
- };
244
- export const getFilterSelectionsForUser = (filter) => [
245
- { filter, scenario: Router.get().ForUser().weight(0.2) },
246
- ];
247
- export const defaultFilterSelectionRules = [
248
- getFilterSelectionsForSearch,
249
- getFilterSelectionsForWraps,
250
- getFilterSelectionsForIndexedKinds,
251
- getFilterSelectionsForAuthors,
252
- getFilterSelectionsForUser,
253
- ];
254
- export const getFilterSelections = (filters, rules = defaultFilterSelectionRules) => {
255
- const filtersById = new Map();
256
- const scenariosById = new Map();
257
- for (const filter of filters) {
258
- for (const filterScenario of rules.flatMap(rule => rule(filter))) {
259
- const id = getFilterId(filterScenario.filter);
260
- filtersById.set(id, filterScenario.filter);
261
- pushToMapKey(scenariosById, id, filterScenario.scenario);
262
- }
263
- }
264
- const result = [];
265
- for (const [id, filter] of filtersById.entries()) {
266
- const scenario = Router.get()
267
- .merge(scenariosById.get(id) || [])
268
- .policy(addMinimalFallbacks);
269
- result.push({ filters: [filter], relays: scenario.getUrls() });
270
- }
271
- return result;
272
- };
273
- //# sourceMappingURL=router.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/router.ts"],"names":[],"mappings":"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"}