@welshman/net 0.0.20 → 0.0.21
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/Connection.cjs +1 -1
- package/build/src/Connection.cjs.map +1 -1
- package/build/src/Connection.d.ts +1 -1
- package/build/src/Connection.mjs +1 -1
- package/build/src/Connection.mjs.map +1 -1
- package/build/src/Context.cjs +22 -20
- package/build/src/Context.cjs.map +1 -1
- package/build/src/Context.d.ts +25 -10
- package/build/src/Context.mjs +20 -19
- package/build/src/Context.mjs.map +1 -1
- package/build/src/Executor.cjs +5 -5
- package/build/src/Executor.cjs.map +1 -1
- package/build/src/Executor.mjs +5 -5
- package/build/src/Executor.mjs.map +1 -1
- package/build/src/Publish.cjs +1 -2
- package/build/src/Publish.cjs.map +1 -1
- package/build/src/Publish.mjs +2 -3
- package/build/src/Publish.mjs.map +1 -1
- package/build/src/Socket.cjs +3 -3
- package/build/src/Socket.cjs.map +1 -1
- package/build/src/Socket.d.ts +1 -1
- package/build/src/Socket.mjs +3 -3
- package/build/src/Socket.mjs.map +1 -1
- package/build/src/Subscribe.cjs +115 -71
- package/build/src/Subscribe.cjs.map +1 -1
- package/build/src/Subscribe.d.ts +20 -3
- package/build/src/Subscribe.mjs +113 -70
- package/build/src/Subscribe.mjs.map +1 -1
- package/build/src/Tracker.cjs +2 -1
- package/build/src/Tracker.cjs.map +1 -1
- package/build/src/Tracker.d.ts +1 -0
- package/build/src/Tracker.mjs +2 -1
- package/build/src/Tracker.mjs.map +1 -1
- package/package.json +3 -3
package/build/src/Subscribe.cjs
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.subscribe = exports.executeSubscriptionBatched = exports.executeSubscriptions = exports.executeSubscription = exports.mergeSubscriptions = exports.calculateSubscriptionGroup = exports.makeSubscription = exports.SubscriptionEvent = void 0;
|
|
3
|
+
exports.subscribe = exports.executeSubscriptionBatched = exports.executeSubscriptions = exports.executeSubscription = exports.optimizeSubscriptions = exports.mergeSubscriptions = exports.calculateSubscriptionGroup = exports.makeSubscription = exports.SubscriptionEvent = void 0;
|
|
4
4
|
const lib_1 = require("@welshman/lib");
|
|
5
5
|
const util_1 = require("@welshman/util");
|
|
6
6
|
const Tracker_1 = require("./Tracker.cjs");
|
|
7
|
-
const Context_1 = require("./Context.cjs");
|
|
8
7
|
// `subscribe` is a super function that handles batching subscriptions by merging
|
|
9
8
|
// them based on parameters (filters and subscribe opts), then splits them by relay.
|
|
10
9
|
// This results in fewer REQs being opened per connection, fewer duplicate events
|
|
11
10
|
// being downloaded, and therefore less signature validation.
|
|
12
11
|
//
|
|
13
|
-
// Behavior can be further configured using
|
|
12
|
+
// Behavior can be further configured using ctx.net. This can be useful for
|
|
14
13
|
// adding support for querying a local cache like a relay, tracking deleted events,
|
|
15
14
|
// and bypassing validation for trusted relays.
|
|
16
15
|
//
|
|
@@ -27,7 +26,7 @@ var SubscriptionEvent;
|
|
|
27
26
|
SubscriptionEvent["Duplicate"] = "duplicate";
|
|
28
27
|
SubscriptionEvent["DeletedEvent"] = "deleted-event";
|
|
29
28
|
SubscriptionEvent["FailedFilter"] = "failed-filter";
|
|
30
|
-
SubscriptionEvent["
|
|
29
|
+
SubscriptionEvent["Invalid"] = "invalid";
|
|
31
30
|
})(SubscriptionEvent || (exports.SubscriptionEvent = SubscriptionEvent = {}));
|
|
32
31
|
const makeSubscription = (request) => {
|
|
33
32
|
const id = (0, lib_1.randomId)();
|
|
@@ -43,31 +42,78 @@ const calculateSubscriptionGroup = (sub) => {
|
|
|
43
42
|
const parts = [];
|
|
44
43
|
if (sub.request.timeout)
|
|
45
44
|
parts.push(`timeout:${sub.request.timeout}`);
|
|
45
|
+
if (sub.request.authTimeout)
|
|
46
|
+
parts.push(`authTimeout:${sub.request.authTimeout}`);
|
|
46
47
|
if (sub.request.closeOnEose)
|
|
47
48
|
parts.push('closeOnEose');
|
|
48
49
|
return parts.join('|');
|
|
49
50
|
};
|
|
50
51
|
exports.calculateSubscriptionGroup = calculateSubscriptionGroup;
|
|
51
52
|
const mergeSubscriptions = (subs) => {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
53
|
+
const mergedSub = (0, exports.makeSubscription)({
|
|
54
|
+
relays: (0, lib_1.uniq)(subs.flatMap(sub => sub.request.relays)),
|
|
55
|
+
filters: (0, util_1.unionFilters)(subs.flatMap(sub => sub.request.filters)),
|
|
56
|
+
timeout: (0, lib_1.max)(subs.map(sub => sub.request.timeout || 0)),
|
|
57
|
+
authTimeout: (0, lib_1.max)(subs.map(sub => sub.request.authTimeout || 0)),
|
|
58
|
+
closeOnEose: subs.every(sub => sub.request.closeOnEose),
|
|
59
|
+
});
|
|
60
|
+
mergedSub.controller.signal.addEventListener('abort', () => {
|
|
61
|
+
for (const sub of subs) {
|
|
62
|
+
sub.close();
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
const completedSubs = new Set();
|
|
66
|
+
for (const sub of subs) {
|
|
67
|
+
// Propagate events, but avoid duplicates
|
|
68
|
+
sub.emitter.on(SubscriptionEvent.Event, (url, event) => {
|
|
69
|
+
if (!mergedSub.tracker.track(event.id, url)) {
|
|
70
|
+
mergedSub.emitter.emit(SubscriptionEvent.Event, url, event);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
// Propagate subscription completion. Since we split subs by relay, we need to wait
|
|
74
|
+
// until all relays are completed before we notify
|
|
75
|
+
sub.emitter.on(SubscriptionEvent.Complete, () => {
|
|
76
|
+
completedSubs.add(sub.id);
|
|
77
|
+
if (completedSubs.size === subs.length) {
|
|
78
|
+
mergedSub.emitter.emit(SubscriptionEvent.Complete);
|
|
79
|
+
}
|
|
80
|
+
sub.emitter.removeAllListeners();
|
|
81
|
+
});
|
|
82
|
+
// Propagate everything else too
|
|
83
|
+
const propagateEvent = (type) => sub.emitter.on(type, (...args) => mergedSub.emitter.emit(type, ...args));
|
|
84
|
+
propagateEvent(SubscriptionEvent.Duplicate);
|
|
85
|
+
propagateEvent(SubscriptionEvent.DeletedEvent);
|
|
86
|
+
propagateEvent(SubscriptionEvent.FailedFilter);
|
|
87
|
+
propagateEvent(SubscriptionEvent.Invalid);
|
|
88
|
+
propagateEvent(SubscriptionEvent.Eose);
|
|
89
|
+
propagateEvent(SubscriptionEvent.Close);
|
|
90
|
+
}
|
|
91
|
+
return mergedSub;
|
|
92
|
+
};
|
|
93
|
+
exports.mergeSubscriptions = mergeSubscriptions;
|
|
94
|
+
const optimizeSubscriptions = (subs) => {
|
|
95
|
+
return Array.from((0, lib_1.groupBy)(exports.calculateSubscriptionGroup, subs).values())
|
|
96
|
+
.flatMap(group => {
|
|
97
|
+
var _a;
|
|
98
|
+
const timeout = (0, lib_1.max)(group.map(sub => sub.request.timeout || 0));
|
|
99
|
+
const authTimeout = (0, lib_1.max)(group.map(sub => sub.request.authTimeout || 0));
|
|
100
|
+
const closeOnEose = group.every(sub => sub.request.closeOnEose);
|
|
101
|
+
const completedSubs = new Set();
|
|
102
|
+
const abortedSubs = new Set();
|
|
103
|
+
const closedSubs = new Set();
|
|
104
|
+
const eosedSubs = new Set();
|
|
105
|
+
const mergedSubs = [];
|
|
106
|
+
for (const { relays, filters } of lib_1.ctx.net.optimizeSubscriptions(group)) {
|
|
107
|
+
const mergedSub = (0, exports.makeSubscription)({ filters,
|
|
108
|
+
relays,
|
|
109
|
+
timeout,
|
|
110
|
+
authTimeout,
|
|
111
|
+
closeOnEose
|
|
66
112
|
});
|
|
67
|
-
for (const { id, controller, request } of
|
|
113
|
+
for (const { id, controller, request } of group) {
|
|
68
114
|
const onAbort = () => {
|
|
69
115
|
abortedSubs.add(id);
|
|
70
|
-
if (abortedSubs.size ===
|
|
116
|
+
if (abortedSubs.size === group.length) {
|
|
71
117
|
mergedSub.close();
|
|
72
118
|
}
|
|
73
119
|
};
|
|
@@ -75,62 +121,51 @@ const mergeSubscriptions = (subs) => {
|
|
|
75
121
|
controller.signal.addEventListener('abort', onAbort);
|
|
76
122
|
}
|
|
77
123
|
mergedSub.emitter.on(SubscriptionEvent.Event, (url, event) => {
|
|
78
|
-
for (const sub of
|
|
79
|
-
if (sub.tracker.track(event.id, url)) {
|
|
80
|
-
|
|
81
|
-
}
|
|
82
|
-
if (!(0, util_1.matchFilters)(sub.request.filters, event)) {
|
|
83
|
-
continue;
|
|
124
|
+
for (const sub of group) {
|
|
125
|
+
if (!sub.tracker.track(event.id, url) && (0, util_1.matchFilters)(sub.request.filters, event)) {
|
|
126
|
+
sub.emitter.emit(SubscriptionEvent.Event, url, event);
|
|
84
127
|
}
|
|
85
|
-
sub.emitter.emit(SubscriptionEvent.Event, url, event);
|
|
86
128
|
}
|
|
87
129
|
});
|
|
88
130
|
// Pass events back to caller
|
|
89
|
-
const propagateEvent = (type
|
|
90
|
-
for (const sub of
|
|
91
|
-
if (
|
|
131
|
+
const propagateEvent = (type) => mergedSub.emitter.on(type, (url, event) => {
|
|
132
|
+
for (const sub of group) {
|
|
133
|
+
if ((0, util_1.matchFilters)(sub.request.filters, event)) {
|
|
92
134
|
sub.emitter.emit(type, url, event);
|
|
93
135
|
}
|
|
94
136
|
}
|
|
95
137
|
});
|
|
96
|
-
propagateEvent(SubscriptionEvent.Duplicate
|
|
97
|
-
propagateEvent(SubscriptionEvent.DeletedEvent
|
|
98
|
-
propagateEvent(SubscriptionEvent.
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
for (const sub of callerSubs) {
|
|
109
|
-
sub.emitter.emit(SubscriptionEvent.Close, url);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
// Propagate subscription completion. Since we split subs by relay, we need to wait
|
|
113
|
-
// until all relays are completed before we notify
|
|
114
|
-
mergedSub.emitter.on(SubscriptionEvent.Complete, () => {
|
|
115
|
-
completedRelays.add(relay);
|
|
116
|
-
for (const sub of callerSubs) {
|
|
117
|
-
if (sub.request.relays.every(url => completedRelays.has(url))) {
|
|
118
|
-
sub.emitter.emit(SubscriptionEvent.Complete);
|
|
138
|
+
propagateEvent(SubscriptionEvent.Duplicate);
|
|
139
|
+
propagateEvent(SubscriptionEvent.DeletedEvent);
|
|
140
|
+
propagateEvent(SubscriptionEvent.Invalid);
|
|
141
|
+
const propagateFinality = (type, subIds) => mergedSub.emitter.on(type, (...args) => {
|
|
142
|
+
subIds.add(mergedSub.id);
|
|
143
|
+
// Wait for all subscriptions to complete before reporting finality to the caller.
|
|
144
|
+
// This is sub-optimal, but because we're outsourcing filter/relay optimization
|
|
145
|
+
// we can't make any assumptions about which caller subscriptions have completed
|
|
146
|
+
// at any given time.
|
|
147
|
+
if (subIds.size === mergedSubs.length) {
|
|
148
|
+
for (const sub of group) {
|
|
149
|
+
sub.emitter.emit(type, ...args);
|
|
119
150
|
}
|
|
120
151
|
}
|
|
121
|
-
|
|
152
|
+
if (type === SubscriptionEvent.Complete) {
|
|
153
|
+
mergedSub.emitter.removeAllListeners();
|
|
154
|
+
}
|
|
122
155
|
});
|
|
123
|
-
|
|
124
|
-
|
|
156
|
+
propagateFinality(SubscriptionEvent.Eose, eosedSubs);
|
|
157
|
+
propagateFinality(SubscriptionEvent.Close, closedSubs);
|
|
158
|
+
propagateFinality(SubscriptionEvent.Complete, completedSubs);
|
|
159
|
+
mergedSubs.push(mergedSub);
|
|
125
160
|
}
|
|
126
|
-
|
|
127
|
-
|
|
161
|
+
return mergedSubs;
|
|
162
|
+
});
|
|
128
163
|
};
|
|
129
|
-
exports.
|
|
164
|
+
exports.optimizeSubscriptions = optimizeSubscriptions;
|
|
130
165
|
const executeSubscription = (sub) => {
|
|
131
166
|
const { request, emitter, tracker, controller } = sub;
|
|
132
|
-
const {
|
|
133
|
-
const executor =
|
|
167
|
+
const { filters, closeOnEose, relays, signal, timeout, authTimeout = 0 } = request;
|
|
168
|
+
const executor = lib_1.ctx.net.getExecutor(relays);
|
|
134
169
|
const subs = [];
|
|
135
170
|
const completedRelays = new Set();
|
|
136
171
|
const events = [];
|
|
@@ -161,14 +196,14 @@ const executeSubscription = (sub) => {
|
|
|
161
196
|
if (tracker.track(event.id, url)) {
|
|
162
197
|
emitter.emit(SubscriptionEvent.Duplicate, url, event);
|
|
163
198
|
}
|
|
164
|
-
else if (
|
|
199
|
+
else if (lib_1.ctx.net.isDeleted(url, event)) {
|
|
165
200
|
emitter.emit(SubscriptionEvent.DeletedEvent, url, event);
|
|
166
201
|
}
|
|
167
|
-
else if (!
|
|
202
|
+
else if (!lib_1.ctx.net.matchFilters(url, filters, event)) {
|
|
168
203
|
emitter.emit(SubscriptionEvent.FailedFilter, url, event);
|
|
169
204
|
}
|
|
170
|
-
else if (!
|
|
171
|
-
emitter.emit(SubscriptionEvent.
|
|
205
|
+
else if (!lib_1.ctx.net.isValid(url, event)) {
|
|
206
|
+
emitter.emit(SubscriptionEvent.Invalid, url, event);
|
|
172
207
|
}
|
|
173
208
|
else {
|
|
174
209
|
emitter.emit(SubscriptionEvent.Event, url, event);
|
|
@@ -206,7 +241,7 @@ const executeSubscription = (sub) => {
|
|
|
206
241
|
}
|
|
207
242
|
};
|
|
208
243
|
exports.executeSubscription = executeSubscription;
|
|
209
|
-
const executeSubscriptions = (subs) => (0, exports.
|
|
244
|
+
const executeSubscriptions = (subs) => (0, exports.optimizeSubscriptions)(subs).forEach(exports.executeSubscription);
|
|
210
245
|
exports.executeSubscriptions = executeSubscriptions;
|
|
211
246
|
exports.executeSubscriptionBatched = (() => {
|
|
212
247
|
const subs = [];
|
|
@@ -222,15 +257,24 @@ exports.executeSubscriptionBatched = (() => {
|
|
|
222
257
|
timeouts.push(setTimeout(executeAll, Math.max(16, sub.request.delay)));
|
|
223
258
|
};
|
|
224
259
|
})();
|
|
225
|
-
const subscribe = (request) => {
|
|
226
|
-
const
|
|
260
|
+
const subscribe = ({ onEvent, onEose, onClose, onComplete, ...request }) => {
|
|
261
|
+
const sub = (0, exports.makeSubscription)({ delay: 50, ...request });
|
|
227
262
|
if (request.delay === 0) {
|
|
228
|
-
(0, exports.executeSubscription)(
|
|
263
|
+
(0, exports.executeSubscription)(sub);
|
|
229
264
|
}
|
|
230
265
|
else {
|
|
231
|
-
(0, exports.executeSubscriptionBatched)(
|
|
266
|
+
(0, exports.executeSubscriptionBatched)(sub);
|
|
232
267
|
}
|
|
233
|
-
|
|
268
|
+
// Signature for onEvent is different from emitter signature for historical reasons and convenience
|
|
269
|
+
if (onEvent)
|
|
270
|
+
sub.emitter.on(SubscriptionEvent.Event, (url, event) => onEvent(event));
|
|
271
|
+
if (onEose)
|
|
272
|
+
sub.emitter.on(SubscriptionEvent.Eose, onEose);
|
|
273
|
+
if (onClose)
|
|
274
|
+
sub.emitter.on(SubscriptionEvent.Close, onClose);
|
|
275
|
+
if (onComplete)
|
|
276
|
+
sub.emitter.on(SubscriptionEvent.Complete, onComplete);
|
|
277
|
+
return sub;
|
|
234
278
|
};
|
|
235
279
|
exports.subscribe = subscribe;
|
|
236
280
|
//# sourceMappingURL=Subscribe.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Subscribe.cjs","sourceRoot":"","sources":["../../src/Subscribe.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Subscribe.cjs","sourceRoot":"","sources":["../../src/Subscribe.ts"],"names":[],"mappings":"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"}
|
package/build/src/Subscribe.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Emitter } from '@welshman/lib';
|
|
2
|
+
import { TrustedEvent } from '@welshman/util';
|
|
2
3
|
import type { Filter } from '@welshman/util';
|
|
3
4
|
import { Tracker } from "./Tracker";
|
|
4
5
|
export declare enum SubscriptionEvent {
|
|
@@ -9,11 +10,13 @@ export declare enum SubscriptionEvent {
|
|
|
9
10
|
Duplicate = "duplicate",
|
|
10
11
|
DeletedEvent = "deleted-event",
|
|
11
12
|
FailedFilter = "failed-filter",
|
|
12
|
-
|
|
13
|
+
Invalid = "invalid"
|
|
13
14
|
}
|
|
14
|
-
export type
|
|
15
|
+
export type RelaysAndFilters = {
|
|
15
16
|
relays: string[];
|
|
16
17
|
filters: Filter[];
|
|
18
|
+
};
|
|
19
|
+
export type SubscribeRequest = RelaysAndFilters & {
|
|
17
20
|
delay?: number;
|
|
18
21
|
signal?: AbortSignal;
|
|
19
22
|
timeout?: number;
|
|
@@ -45,8 +48,22 @@ export declare const mergeSubscriptions: (subs: Subscription[]) => {
|
|
|
45
48
|
tracker: Tracker;
|
|
46
49
|
controller: AbortController;
|
|
47
50
|
close: () => void;
|
|
51
|
+
};
|
|
52
|
+
export declare const optimizeSubscriptions: (subs: Subscription[]) => {
|
|
53
|
+
id: string;
|
|
54
|
+
request: SubscribeRequest;
|
|
55
|
+
emitter: Emitter;
|
|
56
|
+
tracker: Tracker;
|
|
57
|
+
controller: AbortController;
|
|
58
|
+
close: () => void;
|
|
48
59
|
}[];
|
|
49
60
|
export declare const executeSubscription: (sub: Subscription) => void;
|
|
50
61
|
export declare const executeSubscriptions: (subs: Subscription[]) => void;
|
|
51
62
|
export declare const executeSubscriptionBatched: (sub: Subscription) => void;
|
|
52
|
-
export
|
|
63
|
+
export type SubscribeRequestWithHandlers = SubscribeRequest & {
|
|
64
|
+
onEvent?: (event: TrustedEvent) => void;
|
|
65
|
+
onEose?: (url: string) => void;
|
|
66
|
+
onClose?: (url: string) => void;
|
|
67
|
+
onComplete?: () => void;
|
|
68
|
+
};
|
|
69
|
+
export declare const subscribe: ({ onEvent, onEose, onClose, onComplete, ...request }: SubscribeRequestWithHandlers) => Subscription;
|
package/build/src/Subscribe.mjs
CHANGED
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ctx, Emitter, max, chunk, randomId, once, groupBy, uniq } from '@welshman/lib';
|
|
2
2
|
import { matchFilters, unionFilters } from '@welshman/util';
|
|
3
3
|
import { Tracker } from "./Tracker.mjs";
|
|
4
|
-
import { NetworkContext } from "./Context.mjs";
|
|
5
4
|
// `subscribe` is a super function that handles batching subscriptions by merging
|
|
6
5
|
// them based on parameters (filters and subscribe opts), then splits them by relay.
|
|
7
6
|
// This results in fewer REQs being opened per connection, fewer duplicate events
|
|
8
7
|
// being downloaded, and therefore less signature validation.
|
|
9
8
|
//
|
|
10
|
-
// Behavior can be further configured using
|
|
9
|
+
// Behavior can be further configured using ctx.net. This can be useful for
|
|
11
10
|
// adding support for querying a local cache like a relay, tracking deleted events,
|
|
12
11
|
// and bypassing validation for trusted relays.
|
|
13
12
|
//
|
|
@@ -24,7 +23,7 @@ export var SubscriptionEvent;
|
|
|
24
23
|
SubscriptionEvent["Duplicate"] = "duplicate";
|
|
25
24
|
SubscriptionEvent["DeletedEvent"] = "deleted-event";
|
|
26
25
|
SubscriptionEvent["FailedFilter"] = "failed-filter";
|
|
27
|
-
SubscriptionEvent["
|
|
26
|
+
SubscriptionEvent["Invalid"] = "invalid";
|
|
28
27
|
})(SubscriptionEvent || (SubscriptionEvent = {}));
|
|
29
28
|
export const makeSubscription = (request) => {
|
|
30
29
|
const id = randomId();
|
|
@@ -39,30 +38,76 @@ export const calculateSubscriptionGroup = (sub) => {
|
|
|
39
38
|
const parts = [];
|
|
40
39
|
if (sub.request.timeout)
|
|
41
40
|
parts.push(`timeout:${sub.request.timeout}`);
|
|
41
|
+
if (sub.request.authTimeout)
|
|
42
|
+
parts.push(`authTimeout:${sub.request.authTimeout}`);
|
|
42
43
|
if (sub.request.closeOnEose)
|
|
43
44
|
parts.push('closeOnEose');
|
|
44
45
|
return parts.join('|');
|
|
45
46
|
};
|
|
46
47
|
export const mergeSubscriptions = (subs) => {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
48
|
+
const mergedSub = makeSubscription({
|
|
49
|
+
relays: uniq(subs.flatMap(sub => sub.request.relays)),
|
|
50
|
+
filters: unionFilters(subs.flatMap(sub => sub.request.filters)),
|
|
51
|
+
timeout: max(subs.map(sub => sub.request.timeout || 0)),
|
|
52
|
+
authTimeout: max(subs.map(sub => sub.request.authTimeout || 0)),
|
|
53
|
+
closeOnEose: subs.every(sub => sub.request.closeOnEose),
|
|
54
|
+
});
|
|
55
|
+
mergedSub.controller.signal.addEventListener('abort', () => {
|
|
56
|
+
for (const sub of subs) {
|
|
57
|
+
sub.close();
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
const completedSubs = new Set();
|
|
61
|
+
for (const sub of subs) {
|
|
62
|
+
// Propagate events, but avoid duplicates
|
|
63
|
+
sub.emitter.on(SubscriptionEvent.Event, (url, event) => {
|
|
64
|
+
if (!mergedSub.tracker.track(event.id, url)) {
|
|
65
|
+
mergedSub.emitter.emit(SubscriptionEvent.Event, url, event);
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
// Propagate subscription completion. Since we split subs by relay, we need to wait
|
|
69
|
+
// until all relays are completed before we notify
|
|
70
|
+
sub.emitter.on(SubscriptionEvent.Complete, () => {
|
|
71
|
+
completedSubs.add(sub.id);
|
|
72
|
+
if (completedSubs.size === subs.length) {
|
|
73
|
+
mergedSub.emitter.emit(SubscriptionEvent.Complete);
|
|
74
|
+
}
|
|
75
|
+
sub.emitter.removeAllListeners();
|
|
76
|
+
});
|
|
77
|
+
// Propagate everything else too
|
|
78
|
+
const propagateEvent = (type) => sub.emitter.on(type, (...args) => mergedSub.emitter.emit(type, ...args));
|
|
79
|
+
propagateEvent(SubscriptionEvent.Duplicate);
|
|
80
|
+
propagateEvent(SubscriptionEvent.DeletedEvent);
|
|
81
|
+
propagateEvent(SubscriptionEvent.FailedFilter);
|
|
82
|
+
propagateEvent(SubscriptionEvent.Invalid);
|
|
83
|
+
propagateEvent(SubscriptionEvent.Eose);
|
|
84
|
+
propagateEvent(SubscriptionEvent.Close);
|
|
85
|
+
}
|
|
86
|
+
return mergedSub;
|
|
87
|
+
};
|
|
88
|
+
export const optimizeSubscriptions = (subs) => {
|
|
89
|
+
return Array.from(groupBy(calculateSubscriptionGroup, subs).values())
|
|
90
|
+
.flatMap(group => {
|
|
91
|
+
var _a;
|
|
92
|
+
const timeout = max(group.map(sub => sub.request.timeout || 0));
|
|
93
|
+
const authTimeout = max(group.map(sub => sub.request.authTimeout || 0));
|
|
94
|
+
const closeOnEose = group.every(sub => sub.request.closeOnEose);
|
|
95
|
+
const completedSubs = new Set();
|
|
96
|
+
const abortedSubs = new Set();
|
|
97
|
+
const closedSubs = new Set();
|
|
98
|
+
const eosedSubs = new Set();
|
|
99
|
+
const mergedSubs = [];
|
|
100
|
+
for (const { relays, filters } of ctx.net.optimizeSubscriptions(group)) {
|
|
101
|
+
const mergedSub = makeSubscription({ filters,
|
|
102
|
+
relays,
|
|
103
|
+
timeout,
|
|
104
|
+
authTimeout,
|
|
105
|
+
closeOnEose
|
|
61
106
|
});
|
|
62
|
-
for (const { id, controller, request } of
|
|
107
|
+
for (const { id, controller, request } of group) {
|
|
63
108
|
const onAbort = () => {
|
|
64
109
|
abortedSubs.add(id);
|
|
65
|
-
if (abortedSubs.size ===
|
|
110
|
+
if (abortedSubs.size === group.length) {
|
|
66
111
|
mergedSub.close();
|
|
67
112
|
}
|
|
68
113
|
};
|
|
@@ -70,61 +115,50 @@ export const mergeSubscriptions = (subs) => {
|
|
|
70
115
|
controller.signal.addEventListener('abort', onAbort);
|
|
71
116
|
}
|
|
72
117
|
mergedSub.emitter.on(SubscriptionEvent.Event, (url, event) => {
|
|
73
|
-
for (const sub of
|
|
74
|
-
if (sub.tracker.track(event.id, url)) {
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
if (!matchFilters(sub.request.filters, event)) {
|
|
78
|
-
continue;
|
|
118
|
+
for (const sub of group) {
|
|
119
|
+
if (!sub.tracker.track(event.id, url) && matchFilters(sub.request.filters, event)) {
|
|
120
|
+
sub.emitter.emit(SubscriptionEvent.Event, url, event);
|
|
79
121
|
}
|
|
80
|
-
sub.emitter.emit(SubscriptionEvent.Event, url, event);
|
|
81
122
|
}
|
|
82
123
|
});
|
|
83
124
|
// Pass events back to caller
|
|
84
|
-
const propagateEvent = (type
|
|
85
|
-
for (const sub of
|
|
86
|
-
if (
|
|
125
|
+
const propagateEvent = (type) => mergedSub.emitter.on(type, (url, event) => {
|
|
126
|
+
for (const sub of group) {
|
|
127
|
+
if (matchFilters(sub.request.filters, event)) {
|
|
87
128
|
sub.emitter.emit(type, url, event);
|
|
88
129
|
}
|
|
89
130
|
}
|
|
90
131
|
});
|
|
91
|
-
propagateEvent(SubscriptionEvent.Duplicate
|
|
92
|
-
propagateEvent(SubscriptionEvent.DeletedEvent
|
|
93
|
-
propagateEvent(SubscriptionEvent.
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
for (const sub of callerSubs) {
|
|
104
|
-
sub.emitter.emit(SubscriptionEvent.Close, url);
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
// Propagate subscription completion. Since we split subs by relay, we need to wait
|
|
108
|
-
// until all relays are completed before we notify
|
|
109
|
-
mergedSub.emitter.on(SubscriptionEvent.Complete, () => {
|
|
110
|
-
completedRelays.add(relay);
|
|
111
|
-
for (const sub of callerSubs) {
|
|
112
|
-
if (sub.request.relays.every(url => completedRelays.has(url))) {
|
|
113
|
-
sub.emitter.emit(SubscriptionEvent.Complete);
|
|
132
|
+
propagateEvent(SubscriptionEvent.Duplicate);
|
|
133
|
+
propagateEvent(SubscriptionEvent.DeletedEvent);
|
|
134
|
+
propagateEvent(SubscriptionEvent.Invalid);
|
|
135
|
+
const propagateFinality = (type, subIds) => mergedSub.emitter.on(type, (...args) => {
|
|
136
|
+
subIds.add(mergedSub.id);
|
|
137
|
+
// Wait for all subscriptions to complete before reporting finality to the caller.
|
|
138
|
+
// This is sub-optimal, but because we're outsourcing filter/relay optimization
|
|
139
|
+
// we can't make any assumptions about which caller subscriptions have completed
|
|
140
|
+
// at any given time.
|
|
141
|
+
if (subIds.size === mergedSubs.length) {
|
|
142
|
+
for (const sub of group) {
|
|
143
|
+
sub.emitter.emit(type, ...args);
|
|
114
144
|
}
|
|
115
145
|
}
|
|
116
|
-
|
|
146
|
+
if (type === SubscriptionEvent.Complete) {
|
|
147
|
+
mergedSub.emitter.removeAllListeners();
|
|
148
|
+
}
|
|
117
149
|
});
|
|
118
|
-
|
|
119
|
-
|
|
150
|
+
propagateFinality(SubscriptionEvent.Eose, eosedSubs);
|
|
151
|
+
propagateFinality(SubscriptionEvent.Close, closedSubs);
|
|
152
|
+
propagateFinality(SubscriptionEvent.Complete, completedSubs);
|
|
153
|
+
mergedSubs.push(mergedSub);
|
|
120
154
|
}
|
|
121
|
-
|
|
122
|
-
|
|
155
|
+
return mergedSubs;
|
|
156
|
+
});
|
|
123
157
|
};
|
|
124
158
|
export const executeSubscription = (sub) => {
|
|
125
159
|
const { request, emitter, tracker, controller } = sub;
|
|
126
|
-
const {
|
|
127
|
-
const executor =
|
|
160
|
+
const { filters, closeOnEose, relays, signal, timeout, authTimeout = 0 } = request;
|
|
161
|
+
const executor = ctx.net.getExecutor(relays);
|
|
128
162
|
const subs = [];
|
|
129
163
|
const completedRelays = new Set();
|
|
130
164
|
const events = [];
|
|
@@ -155,14 +189,14 @@ export const executeSubscription = (sub) => {
|
|
|
155
189
|
if (tracker.track(event.id, url)) {
|
|
156
190
|
emitter.emit(SubscriptionEvent.Duplicate, url, event);
|
|
157
191
|
}
|
|
158
|
-
else if (
|
|
192
|
+
else if (ctx.net.isDeleted(url, event)) {
|
|
159
193
|
emitter.emit(SubscriptionEvent.DeletedEvent, url, event);
|
|
160
194
|
}
|
|
161
|
-
else if (!
|
|
195
|
+
else if (!ctx.net.matchFilters(url, filters, event)) {
|
|
162
196
|
emitter.emit(SubscriptionEvent.FailedFilter, url, event);
|
|
163
197
|
}
|
|
164
|
-
else if (!
|
|
165
|
-
emitter.emit(SubscriptionEvent.
|
|
198
|
+
else if (!ctx.net.isValid(url, event)) {
|
|
199
|
+
emitter.emit(SubscriptionEvent.Invalid, url, event);
|
|
166
200
|
}
|
|
167
201
|
else {
|
|
168
202
|
emitter.emit(SubscriptionEvent.Event, url, event);
|
|
@@ -199,7 +233,7 @@ export const executeSubscription = (sub) => {
|
|
|
199
233
|
onComplete();
|
|
200
234
|
}
|
|
201
235
|
};
|
|
202
|
-
export const executeSubscriptions = (subs) =>
|
|
236
|
+
export const executeSubscriptions = (subs) => optimizeSubscriptions(subs).forEach(executeSubscription);
|
|
203
237
|
export const executeSubscriptionBatched = (() => {
|
|
204
238
|
const subs = [];
|
|
205
239
|
const timeouts = [];
|
|
@@ -214,14 +248,23 @@ export const executeSubscriptionBatched = (() => {
|
|
|
214
248
|
timeouts.push(setTimeout(executeAll, Math.max(16, sub.request.delay)));
|
|
215
249
|
};
|
|
216
250
|
})();
|
|
217
|
-
export const subscribe = (request) => {
|
|
218
|
-
const
|
|
251
|
+
export const subscribe = ({ onEvent, onEose, onClose, onComplete, ...request }) => {
|
|
252
|
+
const sub = makeSubscription({ delay: 50, ...request });
|
|
219
253
|
if (request.delay === 0) {
|
|
220
|
-
executeSubscription(
|
|
254
|
+
executeSubscription(sub);
|
|
221
255
|
}
|
|
222
256
|
else {
|
|
223
|
-
executeSubscriptionBatched(
|
|
257
|
+
executeSubscriptionBatched(sub);
|
|
224
258
|
}
|
|
225
|
-
|
|
259
|
+
// Signature for onEvent is different from emitter signature for historical reasons and convenience
|
|
260
|
+
if (onEvent)
|
|
261
|
+
sub.emitter.on(SubscriptionEvent.Event, (url, event) => onEvent(event));
|
|
262
|
+
if (onEose)
|
|
263
|
+
sub.emitter.on(SubscriptionEvent.Eose, onEose);
|
|
264
|
+
if (onClose)
|
|
265
|
+
sub.emitter.on(SubscriptionEvent.Close, onClose);
|
|
266
|
+
if (onComplete)
|
|
267
|
+
sub.emitter.on(SubscriptionEvent.Complete, onComplete);
|
|
268
|
+
return sub;
|
|
226
269
|
};
|
|
227
270
|
//# sourceMappingURL=Subscribe.mjs.map
|