@welshman/net 0.0.19 → 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.
@@ -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 NetworkContext. This can be useful for
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["InvalidSignature"] = "invalid-signature";
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
- var _a;
53
- const completedRelays = new Set();
54
- const mergedSubscriptions = [];
55
- for (const group of (0, lib_1.groupBy)(exports.calculateSubscriptionGroup, subs).values()) {
56
- const groupSubscriptions = [];
57
- for (const relay of (0, lib_1.uniq)(group.flatMap((sub) => sub.request.relays))) {
58
- const abortedSubs = new Set();
59
- const callerSubs = group.filter((sub) => sub.request.relays.includes(relay));
60
- const mergedSub = (0, exports.makeSubscription)({
61
- relays: [relay],
62
- timeout: callerSubs[0].request.timeout,
63
- closeOnEose: callerSubs[0].request.closeOnEose,
64
- authTimeout: (0, lib_1.max)(callerSubs.map(r => r.request.authTimeout).filter(lib_1.identity)),
65
- filters: (0, util_1.unionFilters)(callerSubs.flatMap((sub) => sub.request.filters)),
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 callerSubs) {
113
+ for (const { id, controller, request } of group) {
68
114
  const onAbort = () => {
69
115
  abortedSubs.add(id);
70
- if (abortedSubs.size === callerSubs.length) {
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 callerSubs) {
79
- if (sub.tracker.track(event.id, url)) {
80
- continue;
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, checkFilter) => mergedSub.emitter.on(type, (url, event) => {
90
- for (const sub of callerSubs) {
91
- if (!checkFilter || (0, util_1.matchFilters)(sub.request.filters, event)) {
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, true);
97
- propagateEvent(SubscriptionEvent.DeletedEvent, false);
98
- propagateEvent(SubscriptionEvent.FailedFilter, false);
99
- propagateEvent(SubscriptionEvent.InvalidSignature, true);
100
- // Propagate eose
101
- mergedSub.emitter.on(SubscriptionEvent.Eose, (url) => {
102
- for (const sub of callerSubs) {
103
- sub.emitter.emit(SubscriptionEvent.Eose, url);
104
- }
105
- });
106
- // Propagate close
107
- mergedSub.emitter.on(SubscriptionEvent.Close, (url) => {
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
- mergedSub.emitter.removeAllListeners();
152
+ if (type === SubscriptionEvent.Complete) {
153
+ mergedSub.emitter.removeAllListeners();
154
+ }
122
155
  });
123
- mergedSubscriptions.push(mergedSub);
124
- groupSubscriptions.push(mergedSub);
156
+ propagateFinality(SubscriptionEvent.Eose, eosedSubs);
157
+ propagateFinality(SubscriptionEvent.Close, closedSubs);
158
+ propagateFinality(SubscriptionEvent.Complete, completedSubs);
159
+ mergedSubs.push(mergedSub);
125
160
  }
126
- }
127
- return mergedSubscriptions;
161
+ return mergedSubs;
162
+ });
128
163
  };
129
- exports.mergeSubscriptions = mergeSubscriptions;
164
+ exports.optimizeSubscriptions = optimizeSubscriptions;
130
165
  const executeSubscription = (sub) => {
131
166
  const { request, emitter, tracker, controller } = sub;
132
- const { timeout, filters, closeOnEose, relays, signal, authTimeout = 0 } = request;
133
- const executor = Context_1.NetworkContext.getExecutor(relays);
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 (Context_1.NetworkContext.isDeleted(url, event)) {
199
+ else if (lib_1.ctx.net.isDeleted(url, event)) {
165
200
  emitter.emit(SubscriptionEvent.DeletedEvent, url, event);
166
201
  }
167
- else if (!Context_1.NetworkContext.matchFilters(url, filters, event)) {
202
+ else if (!lib_1.ctx.net.matchFilters(url, filters, event)) {
168
203
  emitter.emit(SubscriptionEvent.FailedFilter, url, event);
169
204
  }
170
- else if (!Context_1.NetworkContext.hasValidSignature(url, event)) {
171
- emitter.emit(SubscriptionEvent.InvalidSignature, url, event);
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.mergeSubscriptions)(subs).forEach(exports.executeSubscription);
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 subscription = (0, exports.makeSubscription)({ delay: 800, ...request });
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)(subscription);
263
+ (0, exports.executeSubscription)(sub);
229
264
  }
230
265
  else {
231
- (0, exports.executeSubscriptionBatched)(subscription);
266
+ (0, exports.executeSubscriptionBatched)(sub);
232
267
  }
233
- return subscription;
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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"}
@@ -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
- InvalidSignature = "invalid-signature"
13
+ Invalid = "invalid"
13
14
  }
14
- export type SubscribeRequest = {
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 declare const subscribe: (request: SubscribeRequest) => Subscription;
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;
@@ -1,13 +1,12 @@
1
- import { Emitter, identity, max, chunk, randomId, once, groupBy, uniq } from '@welshman/lib';
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 NetworkContext. This can be useful for
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["InvalidSignature"] = "invalid-signature";
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
- var _a;
48
- const completedRelays = new Set();
49
- const mergedSubscriptions = [];
50
- for (const group of groupBy(calculateSubscriptionGroup, subs).values()) {
51
- const groupSubscriptions = [];
52
- for (const relay of uniq(group.flatMap((sub) => sub.request.relays))) {
53
- const abortedSubs = new Set();
54
- const callerSubs = group.filter((sub) => sub.request.relays.includes(relay));
55
- const mergedSub = makeSubscription({
56
- relays: [relay],
57
- timeout: callerSubs[0].request.timeout,
58
- closeOnEose: callerSubs[0].request.closeOnEose,
59
- authTimeout: max(callerSubs.map(r => r.request.authTimeout).filter(identity)),
60
- filters: unionFilters(callerSubs.flatMap((sub) => sub.request.filters)),
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 callerSubs) {
107
+ for (const { id, controller, request } of group) {
63
108
  const onAbort = () => {
64
109
  abortedSubs.add(id);
65
- if (abortedSubs.size === callerSubs.length) {
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 callerSubs) {
74
- if (sub.tracker.track(event.id, url)) {
75
- continue;
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, checkFilter) => mergedSub.emitter.on(type, (url, event) => {
85
- for (const sub of callerSubs) {
86
- if (!checkFilter || matchFilters(sub.request.filters, event)) {
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, true);
92
- propagateEvent(SubscriptionEvent.DeletedEvent, false);
93
- propagateEvent(SubscriptionEvent.FailedFilter, false);
94
- propagateEvent(SubscriptionEvent.InvalidSignature, true);
95
- // Propagate eose
96
- mergedSub.emitter.on(SubscriptionEvent.Eose, (url) => {
97
- for (const sub of callerSubs) {
98
- sub.emitter.emit(SubscriptionEvent.Eose, url);
99
- }
100
- });
101
- // Propagate close
102
- mergedSub.emitter.on(SubscriptionEvent.Close, (url) => {
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
- mergedSub.emitter.removeAllListeners();
146
+ if (type === SubscriptionEvent.Complete) {
147
+ mergedSub.emitter.removeAllListeners();
148
+ }
117
149
  });
118
- mergedSubscriptions.push(mergedSub);
119
- groupSubscriptions.push(mergedSub);
150
+ propagateFinality(SubscriptionEvent.Eose, eosedSubs);
151
+ propagateFinality(SubscriptionEvent.Close, closedSubs);
152
+ propagateFinality(SubscriptionEvent.Complete, completedSubs);
153
+ mergedSubs.push(mergedSub);
120
154
  }
121
- }
122
- return mergedSubscriptions;
155
+ return mergedSubs;
156
+ });
123
157
  };
124
158
  export const executeSubscription = (sub) => {
125
159
  const { request, emitter, tracker, controller } = sub;
126
- const { timeout, filters, closeOnEose, relays, signal, authTimeout = 0 } = request;
127
- const executor = NetworkContext.getExecutor(relays);
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 (NetworkContext.isDeleted(url, event)) {
192
+ else if (ctx.net.isDeleted(url, event)) {
159
193
  emitter.emit(SubscriptionEvent.DeletedEvent, url, event);
160
194
  }
161
- else if (!NetworkContext.matchFilters(url, filters, event)) {
195
+ else if (!ctx.net.matchFilters(url, filters, event)) {
162
196
  emitter.emit(SubscriptionEvent.FailedFilter, url, event);
163
197
  }
164
- else if (!NetworkContext.hasValidSignature(url, event)) {
165
- emitter.emit(SubscriptionEvent.InvalidSignature, url, event);
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) => mergeSubscriptions(subs).forEach(executeSubscription);
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 subscription = makeSubscription({ delay: 800, ...request });
251
+ export const subscribe = ({ onEvent, onEose, onClose, onComplete, ...request }) => {
252
+ const sub = makeSubscription({ delay: 50, ...request });
219
253
  if (request.delay === 0) {
220
- executeSubscription(subscription);
254
+ executeSubscription(sub);
221
255
  }
222
256
  else {
223
- executeSubscriptionBatched(subscription);
257
+ executeSubscriptionBatched(sub);
224
258
  }
225
- return subscription;
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