@welshman/net 0.0.20 → 0.0.22
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 +117 -71
- package/build/src/Subscribe.cjs.map +1 -1
- package/build/src/Subscribe.d.ts +20 -3
- package/build/src/Subscribe.mjs +115 -70
- package/build/src/Subscribe.mjs.map +1 -1
- package/build/src/Tracker.cjs +6 -1
- package/build/src/Tracker.cjs.map +1 -1
- package/build/src/Tracker.d.ts +2 -0
- package/build/src/Tracker.mjs +6 -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,79 @@ 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
|
-
|
|
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)) {
|
|
60
107
|
const mergedSub = (0, exports.makeSubscription)({
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
authTimeout
|
|
65
|
-
|
|
108
|
+
filters,
|
|
109
|
+
relays,
|
|
110
|
+
timeout,
|
|
111
|
+
authTimeout,
|
|
112
|
+
closeOnEose
|
|
66
113
|
});
|
|
67
|
-
for (const { id, controller, request } of
|
|
114
|
+
for (const { id, controller, request } of group) {
|
|
68
115
|
const onAbort = () => {
|
|
69
116
|
abortedSubs.add(id);
|
|
70
|
-
if (abortedSubs.size ===
|
|
117
|
+
if (abortedSubs.size === group.length) {
|
|
71
118
|
mergedSub.close();
|
|
72
119
|
}
|
|
73
120
|
};
|
|
@@ -75,62 +122,51 @@ const mergeSubscriptions = (subs) => {
|
|
|
75
122
|
controller.signal.addEventListener('abort', onAbort);
|
|
76
123
|
}
|
|
77
124
|
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;
|
|
125
|
+
for (const sub of group) {
|
|
126
|
+
if (!sub.tracker.track(event.id, url) && (0, util_1.matchFilters)(sub.request.filters, event)) {
|
|
127
|
+
sub.emitter.emit(SubscriptionEvent.Event, url, event);
|
|
84
128
|
}
|
|
85
|
-
sub.emitter.emit(SubscriptionEvent.Event, url, event);
|
|
86
129
|
}
|
|
87
130
|
});
|
|
88
131
|
// Pass events back to caller
|
|
89
|
-
const propagateEvent = (type
|
|
90
|
-
for (const sub of
|
|
91
|
-
if (
|
|
132
|
+
const propagateEvent = (type) => mergedSub.emitter.on(type, (url, event) => {
|
|
133
|
+
for (const sub of group) {
|
|
134
|
+
if ((0, util_1.matchFilters)(sub.request.filters, event)) {
|
|
92
135
|
sub.emitter.emit(type, url, event);
|
|
93
136
|
}
|
|
94
137
|
}
|
|
95
138
|
});
|
|
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);
|
|
139
|
+
propagateEvent(SubscriptionEvent.Duplicate);
|
|
140
|
+
propagateEvent(SubscriptionEvent.DeletedEvent);
|
|
141
|
+
propagateEvent(SubscriptionEvent.Invalid);
|
|
142
|
+
const propagateFinality = (type, subIds) => mergedSub.emitter.on(type, (...args) => {
|
|
143
|
+
subIds.add(mergedSub.id);
|
|
144
|
+
// Wait for all subscriptions to complete before reporting finality to the caller.
|
|
145
|
+
// This is sub-optimal, but because we're outsourcing filter/relay optimization
|
|
146
|
+
// we can't make any assumptions about which caller subscriptions have completed
|
|
147
|
+
// at any given time.
|
|
148
|
+
if (subIds.size === mergedSubs.length) {
|
|
149
|
+
for (const sub of group) {
|
|
150
|
+
sub.emitter.emit(type, ...args);
|
|
119
151
|
}
|
|
120
152
|
}
|
|
121
|
-
|
|
153
|
+
if (type === SubscriptionEvent.Complete) {
|
|
154
|
+
mergedSub.emitter.removeAllListeners();
|
|
155
|
+
}
|
|
122
156
|
});
|
|
123
|
-
|
|
124
|
-
|
|
157
|
+
propagateFinality(SubscriptionEvent.Eose, eosedSubs);
|
|
158
|
+
propagateFinality(SubscriptionEvent.Close, closedSubs);
|
|
159
|
+
propagateFinality(SubscriptionEvent.Complete, completedSubs);
|
|
160
|
+
mergedSubs.push(mergedSub);
|
|
125
161
|
}
|
|
126
|
-
|
|
127
|
-
|
|
162
|
+
return mergedSubs;
|
|
163
|
+
});
|
|
128
164
|
};
|
|
129
|
-
exports.
|
|
130
|
-
const
|
|
165
|
+
exports.optimizeSubscriptions = optimizeSubscriptions;
|
|
166
|
+
const _executeSubscription = (sub) => {
|
|
131
167
|
const { request, emitter, tracker, controller } = sub;
|
|
132
|
-
const {
|
|
133
|
-
const executor =
|
|
168
|
+
const { filters, closeOnEose, relays, signal, timeout, authTimeout = 0 } = request;
|
|
169
|
+
const executor = lib_1.ctx.net.getExecutor(relays);
|
|
134
170
|
const subs = [];
|
|
135
171
|
const completedRelays = new Set();
|
|
136
172
|
const events = [];
|
|
@@ -161,14 +197,14 @@ const executeSubscription = (sub) => {
|
|
|
161
197
|
if (tracker.track(event.id, url)) {
|
|
162
198
|
emitter.emit(SubscriptionEvent.Duplicate, url, event);
|
|
163
199
|
}
|
|
164
|
-
else if (
|
|
200
|
+
else if (lib_1.ctx.net.isDeleted(url, event)) {
|
|
165
201
|
emitter.emit(SubscriptionEvent.DeletedEvent, url, event);
|
|
166
202
|
}
|
|
167
|
-
else if (!
|
|
203
|
+
else if (!lib_1.ctx.net.matchFilters(url, filters, event)) {
|
|
168
204
|
emitter.emit(SubscriptionEvent.FailedFilter, url, event);
|
|
169
205
|
}
|
|
170
|
-
else if (!
|
|
171
|
-
emitter.emit(SubscriptionEvent.
|
|
206
|
+
else if (!lib_1.ctx.net.isValid(url, event)) {
|
|
207
|
+
emitter.emit(SubscriptionEvent.Invalid, url, event);
|
|
172
208
|
}
|
|
173
209
|
else {
|
|
174
210
|
emitter.emit(SubscriptionEvent.Event, url, event);
|
|
@@ -205,8 +241,9 @@ const executeSubscription = (sub) => {
|
|
|
205
241
|
onComplete();
|
|
206
242
|
}
|
|
207
243
|
};
|
|
244
|
+
const executeSubscription = (sub) => (0, exports.optimizeSubscriptions)([sub]).forEach(_executeSubscription);
|
|
208
245
|
exports.executeSubscription = executeSubscription;
|
|
209
|
-
const executeSubscriptions = (subs) => (0, exports.
|
|
246
|
+
const executeSubscriptions = (subs) => (0, exports.optimizeSubscriptions)(subs).forEach(_executeSubscription);
|
|
210
247
|
exports.executeSubscriptions = executeSubscriptions;
|
|
211
248
|
exports.executeSubscriptionBatched = (() => {
|
|
212
249
|
const subs = [];
|
|
@@ -222,15 +259,24 @@ exports.executeSubscriptionBatched = (() => {
|
|
|
222
259
|
timeouts.push(setTimeout(executeAll, Math.max(16, sub.request.delay)));
|
|
223
260
|
};
|
|
224
261
|
})();
|
|
225
|
-
const subscribe = (request) => {
|
|
226
|
-
const
|
|
262
|
+
const subscribe = ({ onEvent, onEose, onClose, onComplete, ...request }) => {
|
|
263
|
+
const sub = (0, exports.makeSubscription)({ delay: 50, ...request });
|
|
227
264
|
if (request.delay === 0) {
|
|
228
|
-
(0, exports.executeSubscription)(
|
|
265
|
+
(0, exports.executeSubscription)(sub);
|
|
229
266
|
}
|
|
230
267
|
else {
|
|
231
|
-
(0, exports.executeSubscriptionBatched)(
|
|
268
|
+
(0, exports.executeSubscriptionBatched)(sub);
|
|
232
269
|
}
|
|
233
|
-
|
|
270
|
+
// Signature for onEvent is different from emitter signature for historical reasons and convenience
|
|
271
|
+
if (onEvent)
|
|
272
|
+
sub.emitter.on(SubscriptionEvent.Event, (url, event) => onEvent(event));
|
|
273
|
+
if (onEose)
|
|
274
|
+
sub.emitter.on(SubscriptionEvent.Eose, onEose);
|
|
275
|
+
if (onClose)
|
|
276
|
+
sub.emitter.on(SubscriptionEvent.Close, onClose);
|
|
277
|
+
if (onComplete)
|
|
278
|
+
sub.emitter.on(SubscriptionEvent.Complete, onComplete);
|
|
279
|
+
return sub;
|
|
234
280
|
};
|
|
235
281
|
exports.subscribe = subscribe;
|
|
236
282
|
//# 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":";;;AAAA,uCAAqF;AACrF,yCAAuE;AAEvE,2CAAiC;AAGjC,iFAAiF;AACjF,oFAAoF;AACpF,iFAAiF;AACjF,6DAA6D;AAC7D,EAAE;AACF,2EAA2E;AAC3E,mFAAmF;AACnF,+CAA+C;AAC/C,EAAE;AACF,2FAA2F;AAC3F,yFAAyF;AACzF,4FAA4F;AAC5F,iBAAiB;AAEjB,IAAY,iBASX;AATD,WAAY,iBAAiB;IAC3B,kCAAa,CAAA;IACb,oCAAe,CAAA;IACf,oCAAe,CAAA;IACf,0CAAqB,CAAA;IACrB,4CAAuB,CAAA;IACvB,mDAA8B,CAAA;IAC9B,mDAA8B,CAAA;IAC9B,wCAAmB,CAAA;AACrB,CAAC,EATW,iBAAiB,iCAAjB,iBAAiB,QAS5B;AAyBM,MAAM,gBAAgB,GAAG,CAAC,OAAyB,EAAE,EAAE;IAC5D,MAAM,EAAE,GAAG,IAAA,cAAQ,GAAE,CAAA;IACrB,MAAM,OAAO,GAAG,IAAI,aAAO,EAAE,CAAA;IAC7B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,iBAAO,EAAE,CAAA;IAChD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;IAEtC,OAAO,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;IAE5B,OAAO,EAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,KAAK,EAAC,CAAA;AAC3D,CAAC,CAAA;AAVY,QAAA,gBAAgB,oBAU5B;AAEM,MAAM,0BAA0B,GAAG,CAAC,GAAiB,EAAE,EAAE;IAC9D,MAAM,KAAK,GAAa,EAAE,CAAA;IAE1B,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;IACrE,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;IACjF,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAEtD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACxB,CAAC,CAAA;AARY,QAAA,0BAA0B,8BAQtC;AAEM,MAAM,kBAAkB,GAAG,CAAC,IAAoB,EAAE,EAAE;IACzD,MAAM,SAAS,GAAG,IAAA,wBAAgB,EAAC;QACjC,MAAM,EAAE,IAAA,UAAI,EAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO,EAAE,IAAA,mBAAY,EAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/D,OAAO,EAAE,IAAA,SAAG,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QACvD,WAAW,EAAE,IAAA,SAAG,EAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC;QAC/D,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC;KACxD,CAAC,CAAA;IAEF,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;QACzD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,GAAG,CAAC,KAAK,EAAE,CAAA;SACZ;IACH,CAAC,CAAC,CAAA;IAEF,MAAM,aAAa,GAAG,IAAI,GAAG,EAAE,CAAA;IAE/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACtB,yCAAyC;QACzC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE;YAC3E,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE;gBAC3C,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;aAC5D;QACH,CAAC,CAAC,CAAA;QAEF,mFAAmF;QACnF,kDAAkD;QAClD,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE;YAC9C,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;YAEzB,IAAI,aAAa,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,EAAE;gBACtC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAA;aACnD;YAED,GAAG,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAA;QAClC,CAAC,CAAC,CAAA;QAEF,gCAAgC;QAChC,MAAM,cAAc,GAAG,CAAC,IAAuB,EAAE,EAAE,CACjD,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;QAE1E,cAAc,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;QAC3C,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAA;QAC9C,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAA;QAC9C,cAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;QACzC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAA;QACtC,cAAc,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAA;KACxC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAlDY,QAAA,kBAAkB,sBAkD9B;AAEM,MAAM,qBAAqB,GAAG,CAAC,IAAoB,EAAE,EAAE;IAC5D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAA,aAAO,EAAC,kCAA0B,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;SAClE,OAAO,CAAC,KAAK,CAAC,EAAE;;QACf,MAAM,OAAO,GAAG,IAAA,SAAG,EAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAA;QAC/D,MAAM,WAAW,GAAG,IAAA,SAAG,EAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,CAAA;QACvE,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;QAC/D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;QACvC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAA;QACrC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;QACpC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAU,CAAA;QACnC,MAAM,UAAU,GAAG,EAAE,CAAA;QAErB,KAAK,MAAM,EAAC,MAAM,EAAE,OAAO,EAAC,IAAI,SAAG,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE;YACpE,MAAM,SAAS,GAAG,IAAA,wBAAgB,EAAC;gBACjC,OAAO;gBACP,MAAM;gBACN,OAAO;gBACP,WAAW;gBACX,WAAW;aACZ,CAAC,CAAA;YAEF,KAAK,MAAM,EAAC,EAAE,EAAE,UAAU,EAAE,OAAO,EAAC,IAAI,KAAK,EAAE;gBAC7C,MAAM,OAAO,GAAG,GAAG,EAAE;oBACnB,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;oBAEnB,IAAI,WAAW,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE;wBACrC,SAAS,CAAC,KAAK,EAAE,CAAA;qBAClB;gBACH,CAAC,CAAA;gBAED,MAAA,OAAO,CAAC,MAAM,0CAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;gBAClD,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;aACrD;YAED,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE;gBACjF,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;oBACvB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,IAAI,IAAA,mBAAY,EAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;wBACjF,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;qBACtD;iBACF;YACH,CAAC,CAAC,CAAA;YAEF,6BAA6B;YAC7B,MAAM,cAAc,GAAG,CAAC,IAAuB,EAAE,EAAE,CACjD,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAG,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE;gBAC/D,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;oBACvB,IAAI,IAAA,mBAAY,EAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;wBAC5C,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;qBACnC;iBACF;YACH,CAAC,CAAC,CAAA;YAEJ,cAAc,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAA;YAC3C,cAAc,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAA;YAC9C,cAAc,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAA;YAEzC,MAAM,iBAAiB,GAAG,CAAC,IAAuB,EAAE,MAAmB,EAAE,EAAE,CACzE,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,IAAW,EAAE,EAAE;gBAC5C,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;gBAExB,kFAAkF;gBAClF,+EAA+E;gBAC/E,gFAAgF;gBAChF,qBAAqB;gBACrB,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU,CAAC,MAAM,EAAE;oBACrC,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;wBACvB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAA;qBAChC;iBACF;gBAED,IAAI,IAAI,KAAK,iBAAiB,CAAC,QAAQ,EAAE;oBACvC,SAAS,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAA;iBACvC;YACH,CAAC,CAAC,CAAA;YAEJ,iBAAiB,CAAC,iBAAiB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;YACpD,iBAAiB,CAAC,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;YACtD,iBAAiB,CAAC,iBAAiB,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAA;YAE5D,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;SAC3B;QAED,OAAO,UAAU,CAAA;IACnB,CAAC,CAAC,CAAA;AACN,CAAC,CAAA;AApFY,QAAA,qBAAqB,yBAoFjC;AAED,MAAM,oBAAoB,GAAG,CAAC,GAAiB,EAAE,EAAE;IACjD,MAAM,EAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAC,GAAG,GAAG,CAAA;IACnD,MAAM,EAAC,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC,EAAC,GAAG,OAAO,CAAA;IAChF,MAAM,QAAQ,GAAG,SAAG,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAgC,EAAE,CAAA;IAC5C,MAAM,eAAe,GAAG,IAAI,GAAG,EAAE,CAAA;IACjC,MAAM,MAAM,GAAmB,EAAE,CAAA;IAEjC,qBAAqB;IAErB,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE;QACvE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACpB,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE;QACjD,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAExB,IAAI,WAAW,IAAI,eAAe,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE;YAC9E,UAAU,EAAE,CAAA;SACb;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,GAAW,EAAE,EAAE;QAClD,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAExB,IAAI,eAAe,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE;YAC/D,UAAU,EAAE,CAAA;SACb;IACH,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,GAAG,EAAE;QAC1C,OAAO,CAAC,kBAAkB,EAAE,CAAA;QAC5B,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAA;QACtC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;QAC/E,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,gCAAgC;IAEhC,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE;QACnD,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE;YAChC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;SACtD;aAAM,IAAI,SAAG,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;YACxC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;SACzD;aAAM,IAAI,CAAC,SAAG,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE;YACrD,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;SACzD;aAAM,IAAI,CAAC,SAAG,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE;YACvC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;SACpD;aAAM;YACL,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,CAAC,CAAA;SAClD;IACH,CAAC,CAAA;IAED,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE,CAC7B,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAE3C,MAAM,OAAO,GAAG,CAAC,UAAsB,EAAE,EAAE,CACzC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,UAAU,CAAC,GAAG,CAAC,CAAA;IAEvD,MAAM,UAAU,GAAG,IAAA,UAAI,EAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAA;IAEvE,qCAAqC;IACrC,MAAM,aAAN,MAAM,uBAAN,MAAM,CAAE,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAE7C,+CAA+C;IAC/C,UAAU,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAA;IAEvD,gEAAgE;IAChE,IAAI,OAAO;QAAE,UAAU,CAAC,UAAU,EAAE,OAAO,GAAG,WAAW,CAAC,CAAA;IAE1D,kEAAkE;IAClE,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAa,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAA;IAE9E,qFAAqF;IACrF,yFAAyF;IACzF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;QACtB,OAAO,CAAC,GAAG,CACT,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,UAAsB,EAAE,EAAE;YAC/D,IAAI,WAAW,EAAE;gBACf,MAAM,UAAU,CAAC,UAAU,CAAC,EAAC,OAAO,EAAE,WAAW,EAAC,CAAC,CAAA;aACpD;QACH,CAAC,CAAC,CACH,CAAC,IAAI,CAAC,GAAG,EAAE;YACV,wFAAwF;YACxF,gFAAgF;YAChF,KAAK,MAAM,YAAY,IAAI,IAAA,WAAK,EAAC,CAAC,EAAE,OAAO,CAAC,EAAE;gBAC5C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,YAAY,EAAE,EAAC,OAAO,EAAE,MAAM,EAAC,CAAC,CAAC,CAAA;aAC/D;QACH,CAAC,CAAC,CAAA;KACH;SAAM;QACL,UAAU,EAAE,CAAA;KACb;AACH,CAAC,CAAA;AAEM,MAAM,mBAAmB,GAAG,CAAC,GAAiB,EAAE,EAAE,CACvD,IAAA,6BAAqB,EAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAD/C,QAAA,mBAAmB,uBAC4B;AAErD,MAAM,oBAAoB,GAAG,CAAC,IAAoB,EAAE,EAAE,CAC3D,IAAA,6BAAqB,EAAC,IAAI,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAA;AAD9C,QAAA,oBAAoB,wBAC0B;AAE9C,QAAA,0BAA0B,GAAG,CAAC,GAAG,EAAE;IAC9C,MAAM,IAAI,GAAmB,EAAE,CAAA;IAC/B,MAAM,QAAQ,GAAa,EAAE,CAAA;IAE7B,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAA,4BAAoB,EAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAA;QAEpC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;YACxC,YAAY,CAAC,OAAO,CAAC,CAAA;SACtB;IACH,CAAC,CAAA;IAED,OAAO,CAAC,GAAiB,EAAE,EAAE;QAC3B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACd,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,OAAO,CAAC,KAAM,CAAC,CAAC,CAAC,CAAA;IACzE,CAAC,CAAA;AACH,CAAC,CAAC,EAAE,CAAA;AASG,MAAM,SAAS,GAAG,CAAC,EAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,OAAO,EAA+B,EAAE,EAAE;IAC5G,MAAM,GAAG,GAAiB,IAAA,wBAAgB,EAAC,EAAC,KAAK,EAAE,EAAE,EAAE,GAAG,OAAO,EAAC,CAAC,CAAA;IAEnE,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC,EAAE;QACvB,IAAA,2BAAmB,EAAC,GAAG,CAAC,CAAA;KACzB;SAAM;QACL,IAAA,kCAA0B,EAAC,GAAG,CAAC,CAAA;KAChC;IAED,mGAAmG;IACnG,IAAI,OAAO;QAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,CAAC,GAAW,EAAE,KAAmB,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IAC1G,IAAI,MAAM;QAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAC1D,IAAI,OAAO;QAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IAC7D,IAAI,UAAU;QAAE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,iBAAiB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAA;IAEtE,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA;AAhBY,QAAA,SAAS,aAgBrB"}
|
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,77 @@ 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
|
-
|
|
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)) {
|
|
55
101
|
const mergedSub = makeSubscription({
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
authTimeout
|
|
60
|
-
|
|
102
|
+
filters,
|
|
103
|
+
relays,
|
|
104
|
+
timeout,
|
|
105
|
+
authTimeout,
|
|
106
|
+
closeOnEose
|
|
61
107
|
});
|
|
62
|
-
for (const { id, controller, request } of
|
|
108
|
+
for (const { id, controller, request } of group) {
|
|
63
109
|
const onAbort = () => {
|
|
64
110
|
abortedSubs.add(id);
|
|
65
|
-
if (abortedSubs.size ===
|
|
111
|
+
if (abortedSubs.size === group.length) {
|
|
66
112
|
mergedSub.close();
|
|
67
113
|
}
|
|
68
114
|
};
|
|
@@ -70,61 +116,50 @@ export const mergeSubscriptions = (subs) => {
|
|
|
70
116
|
controller.signal.addEventListener('abort', onAbort);
|
|
71
117
|
}
|
|
72
118
|
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;
|
|
119
|
+
for (const sub of group) {
|
|
120
|
+
if (!sub.tracker.track(event.id, url) && matchFilters(sub.request.filters, event)) {
|
|
121
|
+
sub.emitter.emit(SubscriptionEvent.Event, url, event);
|
|
79
122
|
}
|
|
80
|
-
sub.emitter.emit(SubscriptionEvent.Event, url, event);
|
|
81
123
|
}
|
|
82
124
|
});
|
|
83
125
|
// Pass events back to caller
|
|
84
|
-
const propagateEvent = (type
|
|
85
|
-
for (const sub of
|
|
86
|
-
if (
|
|
126
|
+
const propagateEvent = (type) => mergedSub.emitter.on(type, (url, event) => {
|
|
127
|
+
for (const sub of group) {
|
|
128
|
+
if (matchFilters(sub.request.filters, event)) {
|
|
87
129
|
sub.emitter.emit(type, url, event);
|
|
88
130
|
}
|
|
89
131
|
}
|
|
90
132
|
});
|
|
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);
|
|
133
|
+
propagateEvent(SubscriptionEvent.Duplicate);
|
|
134
|
+
propagateEvent(SubscriptionEvent.DeletedEvent);
|
|
135
|
+
propagateEvent(SubscriptionEvent.Invalid);
|
|
136
|
+
const propagateFinality = (type, subIds) => mergedSub.emitter.on(type, (...args) => {
|
|
137
|
+
subIds.add(mergedSub.id);
|
|
138
|
+
// Wait for all subscriptions to complete before reporting finality to the caller.
|
|
139
|
+
// This is sub-optimal, but because we're outsourcing filter/relay optimization
|
|
140
|
+
// we can't make any assumptions about which caller subscriptions have completed
|
|
141
|
+
// at any given time.
|
|
142
|
+
if (subIds.size === mergedSubs.length) {
|
|
143
|
+
for (const sub of group) {
|
|
144
|
+
sub.emitter.emit(type, ...args);
|
|
114
145
|
}
|
|
115
146
|
}
|
|
116
|
-
|
|
147
|
+
if (type === SubscriptionEvent.Complete) {
|
|
148
|
+
mergedSub.emitter.removeAllListeners();
|
|
149
|
+
}
|
|
117
150
|
});
|
|
118
|
-
|
|
119
|
-
|
|
151
|
+
propagateFinality(SubscriptionEvent.Eose, eosedSubs);
|
|
152
|
+
propagateFinality(SubscriptionEvent.Close, closedSubs);
|
|
153
|
+
propagateFinality(SubscriptionEvent.Complete, completedSubs);
|
|
154
|
+
mergedSubs.push(mergedSub);
|
|
120
155
|
}
|
|
121
|
-
|
|
122
|
-
|
|
156
|
+
return mergedSubs;
|
|
157
|
+
});
|
|
123
158
|
};
|
|
124
|
-
|
|
159
|
+
const _executeSubscription = (sub) => {
|
|
125
160
|
const { request, emitter, tracker, controller } = sub;
|
|
126
|
-
const {
|
|
127
|
-
const executor =
|
|
161
|
+
const { filters, closeOnEose, relays, signal, timeout, authTimeout = 0 } = request;
|
|
162
|
+
const executor = ctx.net.getExecutor(relays);
|
|
128
163
|
const subs = [];
|
|
129
164
|
const completedRelays = new Set();
|
|
130
165
|
const events = [];
|
|
@@ -155,14 +190,14 @@ export const executeSubscription = (sub) => {
|
|
|
155
190
|
if (tracker.track(event.id, url)) {
|
|
156
191
|
emitter.emit(SubscriptionEvent.Duplicate, url, event);
|
|
157
192
|
}
|
|
158
|
-
else if (
|
|
193
|
+
else if (ctx.net.isDeleted(url, event)) {
|
|
159
194
|
emitter.emit(SubscriptionEvent.DeletedEvent, url, event);
|
|
160
195
|
}
|
|
161
|
-
else if (!
|
|
196
|
+
else if (!ctx.net.matchFilters(url, filters, event)) {
|
|
162
197
|
emitter.emit(SubscriptionEvent.FailedFilter, url, event);
|
|
163
198
|
}
|
|
164
|
-
else if (!
|
|
165
|
-
emitter.emit(SubscriptionEvent.
|
|
199
|
+
else if (!ctx.net.isValid(url, event)) {
|
|
200
|
+
emitter.emit(SubscriptionEvent.Invalid, url, event);
|
|
166
201
|
}
|
|
167
202
|
else {
|
|
168
203
|
emitter.emit(SubscriptionEvent.Event, url, event);
|
|
@@ -199,7 +234,8 @@ export const executeSubscription = (sub) => {
|
|
|
199
234
|
onComplete();
|
|
200
235
|
}
|
|
201
236
|
};
|
|
202
|
-
export const
|
|
237
|
+
export const executeSubscription = (sub) => optimizeSubscriptions([sub]).forEach(_executeSubscription);
|
|
238
|
+
export const executeSubscriptions = (subs) => optimizeSubscriptions(subs).forEach(_executeSubscription);
|
|
203
239
|
export const executeSubscriptionBatched = (() => {
|
|
204
240
|
const subs = [];
|
|
205
241
|
const timeouts = [];
|
|
@@ -214,14 +250,23 @@ export const executeSubscriptionBatched = (() => {
|
|
|
214
250
|
timeouts.push(setTimeout(executeAll, Math.max(16, sub.request.delay)));
|
|
215
251
|
};
|
|
216
252
|
})();
|
|
217
|
-
export const subscribe = (request) => {
|
|
218
|
-
const
|
|
253
|
+
export const subscribe = ({ onEvent, onEose, onClose, onComplete, ...request }) => {
|
|
254
|
+
const sub = makeSubscription({ delay: 50, ...request });
|
|
219
255
|
if (request.delay === 0) {
|
|
220
|
-
executeSubscription(
|
|
256
|
+
executeSubscription(sub);
|
|
221
257
|
}
|
|
222
258
|
else {
|
|
223
|
-
executeSubscriptionBatched(
|
|
259
|
+
executeSubscriptionBatched(sub);
|
|
224
260
|
}
|
|
225
|
-
|
|
261
|
+
// Signature for onEvent is different from emitter signature for historical reasons and convenience
|
|
262
|
+
if (onEvent)
|
|
263
|
+
sub.emitter.on(SubscriptionEvent.Event, (url, event) => onEvent(event));
|
|
264
|
+
if (onEose)
|
|
265
|
+
sub.emitter.on(SubscriptionEvent.Eose, onEose);
|
|
266
|
+
if (onClose)
|
|
267
|
+
sub.emitter.on(SubscriptionEvent.Close, onClose);
|
|
268
|
+
if (onComplete)
|
|
269
|
+
sub.emitter.on(SubscriptionEvent.Complete, onComplete);
|
|
270
|
+
return sub;
|
|
226
271
|
};
|
|
227
272
|
//# sourceMappingURL=Subscribe.mjs.map
|