@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.
- package/build/src/collection.cjs +53 -0
- package/build/src/collection.cjs.map +1 -0
- package/build/src/collection.d.ts +15 -0
- package/build/src/collection.mjs +49 -0
- package/build/src/collection.mjs.map +1 -0
- package/build/src/context.cjs +38 -0
- package/build/src/context.cjs.map +1 -0
- package/build/src/context.d.ts +30 -0
- package/build/src/context.mjs +33 -0
- package/build/src/context.mjs.map +1 -0
- package/build/src/core.cjs +54 -0
- package/build/src/core.cjs.map +1 -0
- package/build/src/core.d.ts +14 -0
- package/build/src/core.mjs +49 -0
- package/build/src/core.mjs.map +1 -0
- package/build/src/follows.cjs +27 -0
- package/build/src/follows.cjs.map +1 -0
- package/build/src/follows.d.ts +9 -0
- package/build/src/follows.mjs +23 -0
- package/build/src/follows.mjs.map +1 -0
- package/build/src/freshness.cjs +21 -0
- package/build/src/freshness.cjs.map +1 -0
- package/build/src/freshness.d.ts +8 -0
- package/build/src/freshness.mjs +14 -0
- package/build/src/freshness.mjs.map +1 -0
- package/build/src/handles.cjs +85 -0
- package/build/src/handles.cjs.map +1 -0
- package/build/src/handles.d.ts +24 -0
- package/build/src/handles.mjs +77 -0
- package/build/src/handles.mjs.map +1 -0
- package/build/src/index.cjs +17 -2
- package/build/src/index.cjs.map +1 -1
- package/build/src/index.d.ts +17 -2
- package/build/src/index.mjs +17 -2
- package/build/src/mutes.cjs +27 -0
- package/build/src/mutes.cjs.map +1 -0
- package/build/src/mutes.d.ts +9 -0
- package/build/src/mutes.mjs +23 -0
- package/build/src/mutes.mjs.map +1 -0
- package/build/src/plaintext.cjs +24 -0
- package/build/src/plaintext.cjs.map +1 -0
- package/build/src/plaintext.d.ts +8 -0
- package/build/src/plaintext.mjs +18 -0
- package/build/src/plaintext.mjs.map +1 -0
- package/build/src/profiles.cjs +40 -0
- package/build/src/profiles.cjs.map +1 -0
- package/build/src/profiles.d.ts +12 -0
- package/build/src/profiles.mjs +34 -0
- package/build/src/profiles.mjs.map +1 -0
- package/build/src/relaySelections.cjs +34 -0
- package/build/src/relaySelections.cjs.map +1 -0
- package/build/src/relaySelections.d.ts +18 -0
- package/build/src/relaySelections.mjs +27 -0
- package/build/src/relaySelections.mjs.map +1 -0
- package/build/src/relays.cjs +116 -0
- package/build/src/relays.cjs.map +1 -0
- package/build/src/relays.d.ts +28 -0
- package/build/src/relays.mjs +109 -0
- package/build/src/relays.mjs.map +1 -0
- package/build/src/router.cjs +375 -0
- package/build/src/router.cjs.map +1 -0
- package/build/src/router.d.ts +197 -0
- package/build/src/router.mjs +355 -0
- package/build/src/router.mjs.map +1 -0
- package/build/src/session.cjs +27 -19
- package/build/src/session.cjs.map +1 -1
- package/build/src/session.d.ts +13 -1
- package/build/src/session.mjs +23 -19
- package/build/src/session.mjs.map +1 -1
- package/build/src/storage.cjs +101 -0
- package/build/src/storage.cjs.map +1 -0
- package/build/src/storage.d.ts +45 -0
- package/build/src/storage.mjs +92 -0
- package/build/src/storage.mjs.map +1 -0
- package/build/src/thunk.cjs +44 -0
- package/build/src/thunk.cjs.map +1 -0
- package/build/src/thunk.d.ts +37 -0
- package/build/src/thunk.mjs +39 -0
- package/build/src/thunk.mjs.map +1 -0
- package/build/src/topics.cjs +30 -0
- package/build/src/topics.cjs.map +1 -0
- package/build/src/topics.d.ts +10 -0
- package/build/src/topics.mjs +27 -0
- package/build/src/topics.mjs.map +1 -0
- package/build/src/util.cjs +62 -0
- package/build/src/util.cjs.map +1 -0
- package/build/src/util.d.ts +22 -0
- package/build/src/util.mjs +47 -0
- package/build/src/util.mjs.map +1 -0
- package/build/src/zappers.cjs +64 -0
- package/build/src/zappers.cjs.map +1 -0
- package/build/src/zappers.d.ts +11 -0
- package/build/src/zappers.mjs +58 -0
- package/build/src/zappers.mjs.map +1 -0
- package/package.json +10 -4
- package/build/src/relay.cjs +0 -13
- package/build/src/relay.cjs.map +0 -1
- package/build/src/relay.d.ts +0 -6
- package/build/src/relay.mjs +0 -10
- package/build/src/relay.mjs.map +0 -1
- package/build/src/types.cjs +0 -3
- package/build/src/types.cjs.map +0 -1
- package/build/src/types.d.ts +0 -15
- package/build/src/types.mjs +0 -2
- 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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"}
|
package/build/src/session.cjs
CHANGED
|
@@ -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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|