@welshman/app 0.0.1 → 0.0.3

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 (105) hide show
  1. package/build/src/collection.cjs +53 -0
  2. package/build/src/collection.cjs.map +1 -0
  3. package/build/src/collection.d.ts +15 -0
  4. package/build/src/collection.mjs +49 -0
  5. package/build/src/collection.mjs.map +1 -0
  6. package/build/src/context.cjs +38 -0
  7. package/build/src/context.cjs.map +1 -0
  8. package/build/src/context.d.ts +30 -0
  9. package/build/src/context.mjs +33 -0
  10. package/build/src/context.mjs.map +1 -0
  11. package/build/src/core.cjs +54 -0
  12. package/build/src/core.cjs.map +1 -0
  13. package/build/src/core.d.ts +14 -0
  14. package/build/src/core.mjs +49 -0
  15. package/build/src/core.mjs.map +1 -0
  16. package/build/src/follows.cjs +27 -0
  17. package/build/src/follows.cjs.map +1 -0
  18. package/build/src/follows.d.ts +9 -0
  19. package/build/src/follows.mjs +23 -0
  20. package/build/src/follows.mjs.map +1 -0
  21. package/build/src/freshness.cjs +21 -0
  22. package/build/src/freshness.cjs.map +1 -0
  23. package/build/src/freshness.d.ts +8 -0
  24. package/build/src/freshness.mjs +14 -0
  25. package/build/src/freshness.mjs.map +1 -0
  26. package/build/src/handles.cjs +85 -0
  27. package/build/src/handles.cjs.map +1 -0
  28. package/build/src/handles.d.ts +24 -0
  29. package/build/src/handles.mjs +77 -0
  30. package/build/src/handles.mjs.map +1 -0
  31. package/build/src/index.cjs +17 -2
  32. package/build/src/index.cjs.map +1 -1
  33. package/build/src/index.d.ts +17 -2
  34. package/build/src/index.mjs +17 -2
  35. package/build/src/mutes.cjs +27 -0
  36. package/build/src/mutes.cjs.map +1 -0
  37. package/build/src/mutes.d.ts +9 -0
  38. package/build/src/mutes.mjs +23 -0
  39. package/build/src/mutes.mjs.map +1 -0
  40. package/build/src/plaintext.cjs +24 -0
  41. package/build/src/plaintext.cjs.map +1 -0
  42. package/build/src/plaintext.d.ts +8 -0
  43. package/build/src/plaintext.mjs +18 -0
  44. package/build/src/plaintext.mjs.map +1 -0
  45. package/build/src/profiles.cjs +40 -0
  46. package/build/src/profiles.cjs.map +1 -0
  47. package/build/src/profiles.d.ts +12 -0
  48. package/build/src/profiles.mjs +34 -0
  49. package/build/src/profiles.mjs.map +1 -0
  50. package/build/src/relaySelections.cjs +34 -0
  51. package/build/src/relaySelections.cjs.map +1 -0
  52. package/build/src/relaySelections.d.ts +18 -0
  53. package/build/src/relaySelections.mjs +27 -0
  54. package/build/src/relaySelections.mjs.map +1 -0
  55. package/build/src/relays.cjs +116 -0
  56. package/build/src/relays.cjs.map +1 -0
  57. package/build/src/relays.d.ts +28 -0
  58. package/build/src/relays.mjs +109 -0
  59. package/build/src/relays.mjs.map +1 -0
  60. package/build/src/router.cjs +375 -0
  61. package/build/src/router.cjs.map +1 -0
  62. package/build/src/router.d.ts +197 -0
  63. package/build/src/router.mjs +355 -0
  64. package/build/src/router.mjs.map +1 -0
  65. package/build/src/session.cjs +27 -19
  66. package/build/src/session.cjs.map +1 -1
  67. package/build/src/session.d.ts +13 -1
  68. package/build/src/session.mjs +23 -19
  69. package/build/src/session.mjs.map +1 -1
  70. package/build/src/storage.cjs +101 -0
  71. package/build/src/storage.cjs.map +1 -0
  72. package/build/src/storage.d.ts +45 -0
  73. package/build/src/storage.mjs +92 -0
  74. package/build/src/storage.mjs.map +1 -0
  75. package/build/src/thunk.cjs +44 -0
  76. package/build/src/thunk.cjs.map +1 -0
  77. package/build/src/thunk.d.ts +37 -0
  78. package/build/src/thunk.mjs +39 -0
  79. package/build/src/thunk.mjs.map +1 -0
  80. package/build/src/topics.cjs +30 -0
  81. package/build/src/topics.cjs.map +1 -0
  82. package/build/src/topics.d.ts +10 -0
  83. package/build/src/topics.mjs +27 -0
  84. package/build/src/topics.mjs.map +1 -0
  85. package/build/src/util.cjs +62 -0
  86. package/build/src/util.cjs.map +1 -0
  87. package/build/src/util.d.ts +22 -0
  88. package/build/src/util.mjs +47 -0
  89. package/build/src/util.mjs.map +1 -0
  90. package/build/src/zappers.cjs +64 -0
  91. package/build/src/zappers.cjs.map +1 -0
  92. package/build/src/zappers.d.ts +11 -0
  93. package/build/src/zappers.mjs +58 -0
  94. package/build/src/zappers.mjs.map +1 -0
  95. package/package.json +10 -4
  96. package/build/src/relay.cjs +0 -13
  97. package/build/src/relay.cjs.map +0 -1
  98. package/build/src/relay.d.ts +0 -6
  99. package/build/src/relay.mjs +0 -10
  100. package/build/src/relay.mjs.map +0 -1
  101. package/build/src/types.cjs +0 -3
  102. package/build/src/types.cjs.map +0 -1
  103. package/build/src/types.d.ts +0 -15
  104. package/build/src/types.mjs +0 -2
  105. package/build/src/types.mjs.map +0 -1
@@ -0,0 +1,197 @@
1
+ import { Tags } from '@welshman/util';
2
+ import type { TrustedEvent, Filter } from '@welshman/util';
3
+ import type { RelaysAndFilters } from '@welshman/net';
4
+ export declare const INDEXED_KINDS: number[];
5
+ export declare enum RelayMode {
6
+ Read = "read",
7
+ Write = "write",
8
+ Inbox = "inbox"
9
+ }
10
+ export type RouterOptions = {
11
+ /**
12
+ * Retrieves the user's public key.
13
+ * @returns The user's public key as a string, or null if not available.
14
+ */
15
+ getUserPubkey?: () => string | null;
16
+ /**
17
+ * Retrieves group relays for the specified community.
18
+ * @param address - The address to retrieve group relays for.
19
+ * @returns An array of group relay URLs as strings.
20
+ */
21
+ getGroupRelays?: (address: string) => string[];
22
+ /**
23
+ * Retrieves relays for the specified community.
24
+ * @param address - The address to retrieve community relays for.
25
+ * @returns An array of community relay URLs as strings.
26
+ */
27
+ getCommunityRelays?: (address: string) => string[];
28
+ /**
29
+ * Retrieves relays for the specified public key and mode.
30
+ * @param pubkey - The public key to retrieve relays for.
31
+ * @param mode - The relay mode (optional). May be "read", "write", or "inbox".
32
+ * @returns An array of relay URLs as strings.
33
+ */
34
+ getPubkeyRelays?: (pubkey: string, mode?: RelayMode) => string[];
35
+ /**
36
+ * Retrieves fallback relays, for use when no other relays can be selected.
37
+ * @returns An array of relay URLs as strings.
38
+ */
39
+ getFallbackRelays: () => string[];
40
+ /**
41
+ * Retrieves relays that index profiles and relay selections.
42
+ * @returns An array of relay URLs as strings.
43
+ */
44
+ getIndexerRelays?: () => string[];
45
+ /**
46
+ * Retrieves relays likely to support NIP-50 search.
47
+ * @returns An array of relay URLs as strings.
48
+ */
49
+ getSearchRelays?: () => string[];
50
+ /**
51
+ * Retrieves the quality of the specified relay.
52
+ * @param url - The URL of the relay to retrieve quality for.
53
+ * @returns The quality of the relay as a number between 0 and 1 inclusive.
54
+ */
55
+ getRelayQuality?: (url: string) => number;
56
+ /**
57
+ * Retrieves the redundancy setting, which is how many relays to use per selection value.
58
+ * @returns The redundancy setting as a number.
59
+ */
60
+ getRedundancy?: () => number;
61
+ /**
62
+ * Retrieves the limit setting, which is the maximum number of relays that should be
63
+ * returned from getUrls and getSelections.
64
+ * @returns The limit setting as a number.
65
+ */
66
+ getLimit?: () => number;
67
+ };
68
+ export type ValuesByRelay = Map<string, string[]>;
69
+ export type RelayValues = {
70
+ relay: string;
71
+ values: string[];
72
+ };
73
+ export type ValueRelays = {
74
+ value: string;
75
+ relays: string[];
76
+ };
77
+ export type FallbackPolicy = (count: number, limit: number) => number;
78
+ export declare const addNoFallbacks: (count: number, redundancy: number) => number;
79
+ export declare const addMinimalFallbacks: (count: number, redundancy: number) => 0 | 1;
80
+ export declare const addMaximalFallbacks: (count: number, redundancy: number) => number;
81
+ export declare class Router {
82
+ readonly options: RouterOptions;
83
+ constructor(options: RouterOptions);
84
+ getPubkeySelection: (pubkey: string, mode?: RelayMode) => {
85
+ value: string;
86
+ relays: string[];
87
+ };
88
+ getPubkeySelections: (pubkeys: string[], mode?: RelayMode) => {
89
+ value: string;
90
+ relays: string[];
91
+ }[];
92
+ getUserSelections: (mode?: RelayMode) => {
93
+ value: string;
94
+ relays: string[];
95
+ }[];
96
+ getContextSelections: (tags: Tags) => {
97
+ value: string;
98
+ relays: string[];
99
+ }[];
100
+ selection: (value: string, relays: Iterable<string>) => {
101
+ value: string;
102
+ relays: string[];
103
+ };
104
+ selections: (values: string[], relays: string[]) => {
105
+ value: string;
106
+ relays: string[];
107
+ }[];
108
+ forceValue: (value: string, selections: ValueRelays[]) => {
109
+ value: string;
110
+ relays: string[];
111
+ }[];
112
+ relaySelectionsFromMap: (valuesByRelay: ValuesByRelay) => {
113
+ relay: string;
114
+ values: string[];
115
+ }[];
116
+ scoreRelaySelection: ({ values, relay }: RelayValues) => number;
117
+ sortRelaySelections: (relaySelections: RelayValues[]) => RelayValues[];
118
+ scenario: (selections: ValueRelays[]) => RouterScenario;
119
+ merge: (scenarios: RouterScenario[]) => RouterScenario;
120
+ product: (values: string[], relays: string[]) => RouterScenario;
121
+ fromRelays: (relays: string[]) => RouterScenario;
122
+ User: () => RouterScenario;
123
+ ReadRelays: () => RouterScenario;
124
+ WriteRelays: () => RouterScenario;
125
+ Messages: (pubkeys: string[]) => RouterScenario;
126
+ PublishMessage: (pubkey: string) => RouterScenario;
127
+ Event: (event: TrustedEvent) => RouterScenario;
128
+ EventChildren: (event: TrustedEvent) => RouterScenario;
129
+ EventAncestors: (event: TrustedEvent, type: "mentions" | "replies" | "roots") => RouterScenario;
130
+ EventMentions: (event: TrustedEvent) => RouterScenario;
131
+ EventParents: (event: TrustedEvent) => RouterScenario;
132
+ EventRoots: (event: TrustedEvent) => RouterScenario;
133
+ PublishEvent: (event: TrustedEvent) => RouterScenario;
134
+ FromPubkeys: (pubkeys: string[]) => RouterScenario;
135
+ ForPubkeys: (pubkeys: string[]) => RouterScenario;
136
+ WithinGroup: (address: string, relays?: string) => RouterScenario;
137
+ WithinCommunity: (address: string) => RouterScenario;
138
+ WithinContext: (address: string) => RouterScenario;
139
+ WithinMultipleContexts: (addresses: string[]) => RouterScenario;
140
+ Search: (term: string, relays?: string[]) => RouterScenario;
141
+ }
142
+ export type RouterScenarioOptions = {
143
+ redundancy?: number;
144
+ policy?: FallbackPolicy;
145
+ limit?: number;
146
+ };
147
+ export declare class RouterScenario {
148
+ readonly router: Router;
149
+ readonly selections: ValueRelays[];
150
+ readonly options: RouterScenarioOptions;
151
+ constructor(router: Router, selections: ValueRelays[], options?: RouterScenarioOptions);
152
+ clone: (options: RouterScenarioOptions) => RouterScenario;
153
+ filter: (f: (selection: ValueRelays) => boolean) => RouterScenario;
154
+ update: (f: (selection: ValueRelays) => ValueRelays) => RouterScenario;
155
+ redundancy: (redundancy: number) => RouterScenario;
156
+ policy: (policy: FallbackPolicy) => RouterScenario;
157
+ limit: (limit: number) => RouterScenario;
158
+ getRedundancy: () => number;
159
+ getPolicy: () => (count: number, redundancy: number) => number;
160
+ getLimit: () => number;
161
+ getSelections: () => {
162
+ relay: string;
163
+ values: string[];
164
+ }[];
165
+ getUrls: () => string[];
166
+ getUrl: () => string;
167
+ }
168
+ export declare const getRelayQuality: (url: string) => number;
169
+ export declare const getPubkeyRelays: (pubkey: string, mode?: string) => string[];
170
+ export declare const getIndexerRelays: () => string[];
171
+ export declare const getFallbackRelays: () => string[];
172
+ export declare const getSearchRelays: () => string[];
173
+ export declare const makeRouter: (options?: Partial<RouterOptions>) => Router;
174
+ export type FilterSelection = {
175
+ id: string;
176
+ filter: Filter;
177
+ scenario: RouterScenario;
178
+ };
179
+ type FilterSelectionRuleState = {
180
+ filter: Filter;
181
+ selections: FilterSelection[];
182
+ };
183
+ type FilterSelectionRule = (state: FilterSelectionRuleState) => boolean;
184
+ export declare const makeFilterSelection: (id: string, filter: Filter, scenario: RouterScenario) => {
185
+ id: string;
186
+ filter: Filter;
187
+ scenario: RouterScenario;
188
+ };
189
+ export declare const getFilterSelectionsForLocalRelay: (state: FilterSelectionRuleState) => boolean;
190
+ export declare const getFilterSelectionsForSearch: (state: FilterSelectionRuleState) => boolean;
191
+ export declare const getFilterSelectionsForContext: (state: FilterSelectionRuleState) => boolean;
192
+ export declare const getFilterSelectionsForIndexedKinds: (state: FilterSelectionRuleState) => boolean;
193
+ export declare const getFilterSelectionsForAuthors: (state: FilterSelectionRuleState) => boolean;
194
+ export declare const getFilterSelectionsForUser: (state: FilterSelectionRuleState) => boolean;
195
+ export declare const defaultFilterSelectionRules: ((state: FilterSelectionRuleState) => boolean)[];
196
+ export declare const getFilterSelections: (filters: Filter[], rules?: FilterSelectionRule[]) => RelaysAndFilters[];
197
+ export {};
@@ -0,0 +1,355 @@
1
+ import { intersection, first, switcher, throttleWithValue, clamp, last, splitAt, identity, sortBy, uniq, shuffle, pushToMapKey, now, assoc, ctx, } from '@welshman/lib';
2
+ import { Tags, getFilterId, unionFilters, isShareableRelayUrl, isCommunityAddress, isGroupAddress, isContextAddress, PROFILE, RELAYS, INBOX_RELAYS, FOLLOWS, LOCAL_RELAY_URL, } from '@welshman/util';
3
+ import { ConnectionStatus } from '@welshman/net';
4
+ import { pubkey } from "./session.mjs";
5
+ import { relaySelectionsByPubkey, getReadRelayUrls, getWriteRelayUrls, getRelayUrls } from "./relaySelections.mjs";
6
+ import { relays, relaysByUrl } from "./relays.mjs";
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
+ export const addNoFallbacks = (count, redundancy) => 0;
15
+ export const addMinimalFallbacks = (count, redundancy) => count > 0 ? 0 : 1;
16
+ export const addMaximalFallbacks = (count, redundancy) => redundancy - count;
17
+ export class Router {
18
+ constructor(options) {
19
+ this.options = options;
20
+ // Utilities derived from options
21
+ this.getPubkeySelection = (pubkey, mode) => { var _a, _b; return this.selection(pubkey, ((_b = (_a = this.options).getPubkeyRelays) === null || _b === void 0 ? void 0 : _b.call(_a, pubkey, mode)) || []); };
22
+ this.getPubkeySelections = (pubkeys, mode) => pubkeys.map(pubkey => this.getPubkeySelection(pubkey, mode));
23
+ this.getUserSelections = (mode) => { var _a, _b; return this.getPubkeySelections([(_b = (_a = this.options).getUserPubkey) === null || _b === void 0 ? void 0 : _b.call(_a)].filter(identity), mode); };
24
+ this.getContextSelections = (tags) => {
25
+ return [
26
+ ...tags.communities().mapTo(t => { var _a, _b; return this.selection(t.value(), ((_b = (_a = this.options).getCommunityRelays) === null || _b === void 0 ? void 0 : _b.call(_a, t.value())) || []); }).valueOf(),
27
+ ...tags.groups().mapTo(t => { var _a, _b; return this.selection(t.value(), ((_b = (_a = this.options).getGroupRelays) === null || _b === void 0 ? void 0 : _b.call(_a, t.value())) || []); }).valueOf(),
28
+ ];
29
+ };
30
+ // Utilities for creating ValueRelays
31
+ this.selection = (value, relays) => ({ value, relays: Array.from(relays) });
32
+ this.selections = (values, relays) => values.map(value => this.selection(value, relays));
33
+ this.forceValue = (value, selections) => selections.map(({ relays }) => this.selection(value, relays));
34
+ // Utilities for processing hints
35
+ this.relaySelectionsFromMap = (valuesByRelay) => sortBy(({ values }) => -values.length, Array.from(valuesByRelay)
36
+ .map(([relay, values]) => ({ relay, values: uniq(values) })));
37
+ this.scoreRelaySelection = ({ values, relay }) => { var _a, _b; return values.length * (((_b = (_a = this.options).getRelayQuality) === null || _b === void 0 ? void 0 : _b.call(_a, relay)) || 1); };
38
+ this.sortRelaySelections = (relaySelections) => {
39
+ const scores = new Map();
40
+ const getScore = (relayValues) => -(scores.get(relayValues.relay) || 0);
41
+ for (const relayValues of relaySelections) {
42
+ scores.set(relayValues.relay, this.scoreRelaySelection(relayValues));
43
+ }
44
+ return sortBy(getScore, relaySelections.filter(getScore));
45
+ };
46
+ // Utilities for creating scenarios
47
+ this.scenario = (selections) => new RouterScenario(this, selections);
48
+ this.merge = (scenarios) => this.scenario(scenarios.flatMap((scenario) => scenario.selections));
49
+ this.product = (values, relays) => this.scenario(this.selections(values, relays));
50
+ this.fromRelays = (relays) => this.scenario([this.selection("", relays)]);
51
+ // Routing scenarios
52
+ this.User = () => this.scenario(this.getUserSelections());
53
+ this.ReadRelays = () => this.scenario(this.getUserSelections(RelayMode.Read));
54
+ this.WriteRelays = () => this.scenario(this.getUserSelections(RelayMode.Write));
55
+ this.Messages = (pubkeys) => this.scenario([
56
+ ...this.getUserSelections(),
57
+ ...this.getPubkeySelections(pubkeys),
58
+ ]);
59
+ this.PublishMessage = (pubkey) => this.scenario([
60
+ ...this.getUserSelections(RelayMode.Inbox),
61
+ this.getPubkeySelection(pubkey, RelayMode.Inbox),
62
+ ]).policy(addMinimalFallbacks);
63
+ this.Event = (event) => this.scenario(this.forceValue(event.id, [
64
+ this.getPubkeySelection(event.pubkey, RelayMode.Write),
65
+ ...this.getContextSelections(Tags.fromEvent(event).context()),
66
+ ]));
67
+ this.EventChildren = (event) => this.scenario(this.forceValue(event.id, [
68
+ this.getPubkeySelection(event.pubkey, RelayMode.Read),
69
+ ...this.getContextSelections(Tags.fromEvent(event).context()),
70
+ ]));
71
+ this.EventAncestors = (event, type) => {
72
+ var _a, _b;
73
+ const tags = Tags.fromEvent(event);
74
+ const ancestors = tags.ancestors()[type];
75
+ const pubkeys = tags.values("p").valueOf();
76
+ const communities = tags.communities().values().valueOf();
77
+ const groups = tags.groups().values().valueOf();
78
+ const relays = uniq([
79
+ ...((_b = (_a = this.options).getPubkeyRelays) === null || _b === void 0 ? void 0 : _b.call(_a, event.pubkey, RelayMode.Read)) || [],
80
+ ...pubkeys.flatMap((k) => { var _a, _b; return ((_b = (_a = this.options).getPubkeyRelays) === null || _b === void 0 ? void 0 : _b.call(_a, k, RelayMode.Write)) || []; }),
81
+ ...communities.flatMap((a) => { var _a, _b; return ((_b = (_a = this.options).getCommunityRelays) === null || _b === void 0 ? void 0 : _b.call(_a, a)) || []; }),
82
+ ...groups.flatMap((a) => { var _a, _b; return ((_b = (_a = this.options).getGroupRelays) === null || _b === void 0 ? void 0 : _b.call(_a, a)) || []; }),
83
+ ...ancestors.relays().valueOf(),
84
+ ]);
85
+ return this.product(ancestors.values().valueOf(), relays);
86
+ };
87
+ this.EventMentions = (event) => this.EventAncestors(event, "mentions");
88
+ this.EventParents = (event) => this.EventAncestors(event, "replies");
89
+ this.EventRoots = (event) => this.EventAncestors(event, "roots");
90
+ this.PublishEvent = (event) => {
91
+ const tags = Tags.fromEvent(event);
92
+ const mentions = tags.values("p").valueOf();
93
+ // If we're publishing to private groups, only publish to those groups' relays
94
+ if (tags.groups().exists()) {
95
+ return this
96
+ .scenario(this.getContextSelections(tags.groups()))
97
+ .policy(addNoFallbacks);
98
+ }
99
+ return this.scenario(this.forceValue(event.id, [
100
+ this.getPubkeySelection(event.pubkey, RelayMode.Write),
101
+ ...this.getContextSelections(tags.context()),
102
+ ...this.getPubkeySelections(mentions, RelayMode.Read),
103
+ ]));
104
+ };
105
+ this.FromPubkeys = (pubkeys) => this.scenario(this.getPubkeySelections(pubkeys, RelayMode.Write));
106
+ this.ForPubkeys = (pubkeys) => this.scenario(this.getPubkeySelections(pubkeys, RelayMode.Read));
107
+ this.WithinGroup = (address, relays) => this
108
+ .scenario(this.getContextSelections(Tags.wrap([["a", address]])))
109
+ .policy(addNoFallbacks);
110
+ this.WithinCommunity = (address) => this.scenario(this.getContextSelections(Tags.wrap([["a", address]])));
111
+ this.WithinContext = (address) => {
112
+ if (isGroupAddress(address)) {
113
+ return this.WithinGroup(address);
114
+ }
115
+ if (isCommunityAddress(address)) {
116
+ return this.WithinCommunity(address);
117
+ }
118
+ throw new Error(`Unknown context ${address}`);
119
+ };
120
+ this.WithinMultipleContexts = (addresses) => this.merge(addresses.map(this.WithinContext));
121
+ this.Search = (term, relays = []) => { var _a, _b; return this.product([term], uniq(relays.concat(((_b = (_a = this.options).getSearchRelays) === null || _b === void 0 ? void 0 : _b.call(_a)) || []))); };
122
+ }
123
+ }
124
+ export class RouterScenario {
125
+ constructor(router, selections, options = {}) {
126
+ this.router = router;
127
+ this.selections = selections;
128
+ this.options = options;
129
+ this.clone = (options) => new RouterScenario(this.router, this.selections, { ...this.options, ...options });
130
+ this.filter = (f) => new RouterScenario(this.router, this.selections.filter(selection => f(selection)), this.options);
131
+ this.update = (f) => new RouterScenario(this.router, this.selections.map(selection => f(selection)), this.options);
132
+ this.redundancy = (redundancy) => this.clone({ redundancy });
133
+ this.policy = (policy) => this.clone({ policy });
134
+ this.limit = (limit) => this.clone({ limit });
135
+ this.getRedundancy = () => { var _a, _b; return this.options.redundancy || ((_b = (_a = this.router.options).getRedundancy) === null || _b === void 0 ? void 0 : _b.call(_a)) || 3; };
136
+ this.getPolicy = () => this.options.policy || addMaximalFallbacks;
137
+ this.getLimit = () => { var _a, _b; return this.options.limit || ((_b = (_a = this.router.options).getLimit) === null || _b === void 0 ? void 0 : _b.call(_a)) || 10; };
138
+ this.getSelections = () => {
139
+ const allValues = new Set();
140
+ const valuesByRelay = new Map();
141
+ for (const { value, relays } of this.selections) {
142
+ allValues.add(value);
143
+ for (const relay of relays) {
144
+ if (isShareableRelayUrl(relay)) {
145
+ pushToMapKey(valuesByRelay, relay, value);
146
+ }
147
+ }
148
+ }
149
+ // Adjust redundancy by limit, since if we're looking for very specific values odds
150
+ // are we're less tolerant of failure. Add more redundancy to fill our relay limit.
151
+ const limit = this.getLimit();
152
+ const redundancy = this.getRedundancy();
153
+ const adjustedRedundancy = Math.max(redundancy, redundancy * (limit / (allValues.size * redundancy)));
154
+ const seen = new Map();
155
+ const result = new Map();
156
+ const relaySelections = this.router.relaySelectionsFromMap(valuesByRelay);
157
+ for (const { relay } of this.router.sortRelaySelections(relaySelections)) {
158
+ const values = new Set();
159
+ for (const value of uniq(valuesByRelay.get(relay) || [])) {
160
+ const timesSeen = seen.get(value) || 0;
161
+ if (timesSeen < adjustedRedundancy) {
162
+ seen.set(value, timesSeen + 1);
163
+ values.add(value);
164
+ }
165
+ }
166
+ if (values.size > 0) {
167
+ result.set(relay, Array.from(values));
168
+ }
169
+ }
170
+ const fallbacks = shuffle(this.router.options.getFallbackRelays());
171
+ const fallbackPolicy = this.getPolicy();
172
+ for (const { value } of this.selections) {
173
+ const timesSeen = seen.get(value) || 0;
174
+ const fallbacksNeeded = fallbackPolicy(timesSeen, adjustedRedundancy);
175
+ if (fallbacksNeeded > 0) {
176
+ for (const relay of fallbacks.slice(0, fallbacksNeeded)) {
177
+ pushToMapKey(result, relay, value);
178
+ }
179
+ }
180
+ }
181
+ const [keep, discard] = splitAt(limit, this.router.relaySelectionsFromMap(result));
182
+ for (const target of keep.slice(0, redundancy)) {
183
+ target.values = uniq(discard.concat(target).flatMap((selection) => selection.values));
184
+ }
185
+ return keep;
186
+ };
187
+ this.getUrls = () => this.getSelections().map((selection) => selection.relay);
188
+ this.getUrl = () => first(this.getUrls());
189
+ }
190
+ }
191
+ // Default router options
192
+ export const getRelayQuality = (url) => {
193
+ var _a, _b;
194
+ const oneMinute = 60 * 1000;
195
+ const oneHour = 60 * oneMinute;
196
+ const oneDay = 24 * oneHour;
197
+ const oneWeek = 7 * oneDay;
198
+ const relay = relaysByUrl.get().get(url);
199
+ const connect_count = ((_a = relay === null || relay === void 0 ? void 0 : relay.stats) === null || _a === void 0 ? void 0 : _a.connect_count) || 0;
200
+ const recent_errors = ((_b = relay === null || relay === void 0 ? void 0 : relay.stats) === null || _b === void 0 ? void 0 : _b.recent_errors) || [];
201
+ const connection = ctx.net.pool.get(url, { autoConnect: false });
202
+ // If we haven't connected, consult our relay record and see if there has
203
+ // been a recent fault. If there has been, penalize the relay. If there have been several,
204
+ // don't use the relay.
205
+ if (!connection) {
206
+ const lastFault = last(recent_errors) || 0;
207
+ if (recent_errors.filter(n => n > now() - oneHour).length > 10) {
208
+ return 0;
209
+ }
210
+ if (recent_errors.filter(n => n > now() - oneDay).length > 50) {
211
+ return 0;
212
+ }
213
+ if (recent_errors.filter(n => n > now() - oneWeek).length > 100) {
214
+ return 0;
215
+ }
216
+ return Math.max(0, Math.min(0.5, (now() - oneMinute - lastFault) / oneHour));
217
+ }
218
+ return switcher(connection.meta.getStatus(), {
219
+ [ConnectionStatus.Unauthorized]: 0.5,
220
+ [ConnectionStatus.Forbidden]: 0,
221
+ [ConnectionStatus.Error]: 0,
222
+ [ConnectionStatus.Closed]: 0.6,
223
+ [ConnectionStatus.Slow]: 0.5,
224
+ [ConnectionStatus.Ok]: 1,
225
+ default: clamp([0.5, 1], connect_count / 1000),
226
+ });
227
+ };
228
+ export const getPubkeyRelays = (pubkey, mode) => {
229
+ const $relaySelections = relaySelectionsByPubkey.get();
230
+ const $inboxSelections = relaySelectionsByPubkey.get();
231
+ switch (mode) {
232
+ case RelayMode.Read: return getReadRelayUrls($relaySelections.get(pubkey));
233
+ case RelayMode.Write: return getWriteRelayUrls($relaySelections.get(pubkey));
234
+ case RelayMode.Inbox: return getRelayUrls($inboxSelections.get(pubkey));
235
+ default: return getRelayUrls($relaySelections.get(pubkey));
236
+ }
237
+ };
238
+ export const getIndexerRelays = () => ctx.app.indexerRelays || getFallbackRelays();
239
+ export const getFallbackRelays = throttleWithValue(300, () => sortBy(r => -getRelayQuality(r.url), relays.get()).slice(0, 30).map(r => r.url));
240
+ export const getSearchRelays = throttleWithValue(300, () => sortBy(r => -getRelayQuality(r.url), relays.get())
241
+ .filter(r => { var _a, _b; return (_b = (_a = r.profile) === null || _a === void 0 ? void 0 : _a.supported_nips) === null || _b === void 0 ? void 0 : _b.includes(50); })
242
+ .slice(0, 30).map(r => r.url));
243
+ export const makeRouter = (options = {}) => new Router({
244
+ getPubkeyRelays,
245
+ getIndexerRelays,
246
+ getFallbackRelays,
247
+ getSearchRelays,
248
+ getRelayQuality,
249
+ getUserPubkey: () => pubkey.get(),
250
+ getRedundancy: () => 2,
251
+ getLimit: () => 5,
252
+ ...options,
253
+ });
254
+ export const makeFilterSelection = (id, filter, scenario) => ({ id, filter, scenario });
255
+ export const getFilterSelectionsForLocalRelay = (state) => {
256
+ const id = getFilterId(state.filter);
257
+ const scenario = ctx.app.router.product([id], [LOCAL_RELAY_URL]);
258
+ state.selections.push(makeFilterSelection(id, state.filter, scenario));
259
+ return false;
260
+ };
261
+ export const getFilterSelectionsForSearch = (state) => {
262
+ var _a, _b;
263
+ if (!state.filter.search)
264
+ return false;
265
+ const id = getFilterId(state.filter);
266
+ const relays = ((_b = (_a = ctx.app.router.options).getSearchRelays) === null || _b === void 0 ? void 0 : _b.call(_a)) || [];
267
+ const scenario = ctx.app.router.product([id], relays);
268
+ state.selections.push(makeFilterSelection(id, state.filter, scenario));
269
+ return true;
270
+ };
271
+ export const getFilterSelectionsForContext = (state) => {
272
+ var _a;
273
+ const contexts = ((_a = state.filter["#a"]) === null || _a === void 0 ? void 0 : _a.filter(isContextAddress)) || [];
274
+ if (contexts.length === 0)
275
+ return false;
276
+ const scenario = ctx.app.router.WithinMultipleContexts(contexts);
277
+ for (const { relay, values } of scenario.getSelections()) {
278
+ const contextFilter = { ...state.filter, "#a": Array.from(values) };
279
+ const id = getFilterId(contextFilter);
280
+ const scenario = ctx.app.router.product([id], [relay]);
281
+ state.selections.push(makeFilterSelection(id, contextFilter, scenario));
282
+ }
283
+ return true;
284
+ };
285
+ export const getFilterSelectionsForIndexedKinds = (state) => {
286
+ var _a, _b;
287
+ const kinds = intersection(INDEXED_KINDS, state.filter.kinds || []);
288
+ if (kinds.length === 0)
289
+ return false;
290
+ const id = getFilterId({ ...state.filter, kinds });
291
+ const relays = ((_b = (_a = ctx.app.router.options).getIndexerRelays) === null || _b === void 0 ? void 0 : _b.call(_a)) || [];
292
+ const scenario = ctx.app.router.product([id], relays);
293
+ state.selections.push(makeFilterSelection(id, state.filter, scenario));
294
+ return false;
295
+ };
296
+ export const getFilterSelectionsForAuthors = (state) => {
297
+ // If we have a ton of authors, just use our indexers
298
+ if (!state.filter.authors || state.filter.authors.length > 30)
299
+ return false;
300
+ const id = getFilterId(state.filter);
301
+ const scenario = ctx.app.router.FromPubkeys(state.filter.authors).update(assoc('value', id));
302
+ state.selections.push(makeFilterSelection(id, state.filter, scenario));
303
+ return false;
304
+ };
305
+ export const getFilterSelectionsForUser = (state) => {
306
+ const id = getFilterId(state.filter);
307
+ const relays = ctx.app.router.ReadRelays().getUrls();
308
+ const scenario = ctx.app.router.product([id], relays);
309
+ state.selections.push(makeFilterSelection(id, state.filter, scenario));
310
+ return false;
311
+ };
312
+ export const defaultFilterSelectionRules = [
313
+ getFilterSelectionsForLocalRelay,
314
+ getFilterSelectionsForSearch,
315
+ getFilterSelectionsForContext,
316
+ getFilterSelectionsForIndexedKinds,
317
+ getFilterSelectionsForAuthors,
318
+ getFilterSelectionsForUser,
319
+ ];
320
+ export const getFilterSelections = (filters, rules = defaultFilterSelectionRules) => {
321
+ var _a, _b, _c, _d;
322
+ const scenarios = [];
323
+ const filtersById = new Map();
324
+ for (const filter of filters) {
325
+ const state = { filter, selections: [] };
326
+ for (const rule of rules) {
327
+ const done = rule(state);
328
+ if (done) {
329
+ break;
330
+ }
331
+ }
332
+ for (const { id, filter, scenario } of state.selections) {
333
+ filtersById.set(id, filter);
334
+ scenarios.push(scenario.policy(addNoFallbacks));
335
+ }
336
+ }
337
+ // Use low redundancy because filters will be very low cardinality
338
+ const selections = ctx.app.router
339
+ .merge(scenarios)
340
+ .redundancy(1)
341
+ .getSelections()
342
+ .map(({ values, relay }) => ({
343
+ filters: values.map(id => filtersById.get(id)),
344
+ relays: [relay],
345
+ }));
346
+ // Pubkey-based selections can get really big. Use the most popular relays for the long tail
347
+ const limit = ((_b = (_a = ctx.app.router.options).getLimit) === null || _b === void 0 ? void 0 : _b.call(_a)) || 8;
348
+ const redundancy = ((_d = (_c = ctx.app.router.options).getRedundancy) === null || _d === void 0 ? void 0 : _d.call(_c)) || 3;
349
+ const [keep, discard] = splitAt(limit, selections);
350
+ for (const target of keep.slice(0, redundancy)) {
351
+ target.filters = unionFilters([...discard, target].flatMap(s => s.filters));
352
+ }
353
+ return keep;
354
+ };
355
+ //# sourceMappingURL=router.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"router.mjs","sourceRoot":"","sources":["../../src/router.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.signer = exports.getSigner = exports.nip46Perms = exports.addSession = exports.getSession = exports.session = exports.sessions = exports.pubkey = void 0;
3
+ exports.onAuth = exports.authChallenges = exports.signer = exports.getSigner = exports.nip46Perms = exports.dropSession = exports.updateSession = exports.putSession = exports.addSession = exports.getSession = exports.session = exports.sessions = exports.pubkey = void 0;
4
4
  const store_1 = require("svelte/store");
5
5
  const lib_1 = require("@welshman/lib");
6
6
  const util_1 = require("@welshman/util");
7
7
  const store_2 = require("@welshman/store");
8
- const net_1 = require("@welshman/net");
9
8
  const signer_1 = require("@welshman/signer");
10
9
  exports.pubkey = (0, store_2.withGetter)((0, store_2.synced)("pubkey", null));
11
10
  exports.sessions = (0, store_2.withGetter)((0, store_2.synced)("sessions", {}));
@@ -17,6 +16,16 @@ const addSession = (session) => {
17
16
  exports.pubkey.set(session.pubkey);
18
17
  };
19
18
  exports.addSession = addSession;
19
+ const putSession = (session) => {
20
+ if (!(0, lib_1.equals)((0, exports.getSession)(session.pubkey), session)) {
21
+ exports.sessions.update((0, lib_1.assoc)(session.pubkey, session));
22
+ }
23
+ };
24
+ exports.putSession = putSession;
25
+ const updateSession = (pubkey, f) => (0, exports.putSession)(f((0, exports.getSession)(pubkey)));
26
+ exports.updateSession = updateSession;
27
+ const dropSession = (pubkey) => exports.sessions.update($sessions => (0, lib_1.omit)([pubkey], $sessions));
28
+ exports.dropSession = dropSession;
20
29
  exports.nip46Perms = "sign_event:22242,nip04_encrypt,nip04_decrypt,nip44_encrypt,nip44_decrypt";
21
30
  exports.getSigner = (0, lib_1.memoize)((session) => {
22
31
  switch (session === null || session === void 0 ? void 0 : session.method) {
@@ -31,21 +40,20 @@ exports.getSigner = (0, lib_1.memoize)((session) => {
31
40
  }
32
41
  });
33
42
  exports.signer = (0, store_2.withGetter)((0, store_1.derived)(exports.session, exports.getSigner));
34
- const seenChallenges = new Set();
35
- Object.assign(net_1.NetworkContext, {
36
- onAuth: async (url, challenge) => {
37
- if (seenChallenges.has(challenge) || !exports.signer.get()) {
38
- return;
39
- }
40
- seenChallenges.add(challenge);
41
- const event = await exports.signer.get().sign((0, util_1.createEvent)(22242, {
42
- tags: [
43
- ["relay", url],
44
- ["challenge", challenge],
45
- ],
46
- }));
47
- net_1.NetworkContext.pool.get(url).send(["AUTH", event]);
48
- return event;
49
- },
50
- });
43
+ exports.authChallenges = new Set();
44
+ const onAuth = async (url, challenge) => {
45
+ if (exports.authChallenges.has(challenge) || !exports.signer.get()) {
46
+ return;
47
+ }
48
+ exports.authChallenges.add(challenge);
49
+ const event = await exports.signer.get().sign((0, util_1.createEvent)(22242, {
50
+ tags: [
51
+ ["relay", url],
52
+ ["challenge", challenge],
53
+ ],
54
+ }));
55
+ lib_1.ctx.net.pool.get(url).send(["AUTH", event]);
56
+ return event;
57
+ };
58
+ exports.onAuth = onAuth;
51
59
  //# sourceMappingURL=session.cjs.map