@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.
@@ -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,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
- 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));
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
- 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)),
108
+ filters,
109
+ relays,
110
+ timeout,
111
+ authTimeout,
112
+ closeOnEose
66
113
  });
67
- for (const { id, controller, request } of callerSubs) {
114
+ for (const { id, controller, request } of group) {
68
115
  const onAbort = () => {
69
116
  abortedSubs.add(id);
70
- if (abortedSubs.size === callerSubs.length) {
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 callerSubs) {
79
- if (sub.tracker.track(event.id, url)) {
80
- continue;
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, checkFilter) => mergedSub.emitter.on(type, (url, event) => {
90
- for (const sub of callerSubs) {
91
- if (!checkFilter || (0, util_1.matchFilters)(sub.request.filters, event)) {
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, 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);
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
- mergedSub.emitter.removeAllListeners();
153
+ if (type === SubscriptionEvent.Complete) {
154
+ mergedSub.emitter.removeAllListeners();
155
+ }
122
156
  });
123
- mergedSubscriptions.push(mergedSub);
124
- groupSubscriptions.push(mergedSub);
157
+ propagateFinality(SubscriptionEvent.Eose, eosedSubs);
158
+ propagateFinality(SubscriptionEvent.Close, closedSubs);
159
+ propagateFinality(SubscriptionEvent.Complete, completedSubs);
160
+ mergedSubs.push(mergedSub);
125
161
  }
126
- }
127
- return mergedSubscriptions;
162
+ return mergedSubs;
163
+ });
128
164
  };
129
- exports.mergeSubscriptions = mergeSubscriptions;
130
- const executeSubscription = (sub) => {
165
+ exports.optimizeSubscriptions = optimizeSubscriptions;
166
+ const _executeSubscription = (sub) => {
131
167
  const { request, emitter, tracker, controller } = sub;
132
- const { timeout, filters, closeOnEose, relays, signal, authTimeout = 0 } = request;
133
- const executor = Context_1.NetworkContext.getExecutor(relays);
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 (Context_1.NetworkContext.isDeleted(url, event)) {
200
+ else if (lib_1.ctx.net.isDeleted(url, event)) {
165
201
  emitter.emit(SubscriptionEvent.DeletedEvent, url, event);
166
202
  }
167
- else if (!Context_1.NetworkContext.matchFilters(url, filters, event)) {
203
+ else if (!lib_1.ctx.net.matchFilters(url, filters, event)) {
168
204
  emitter.emit(SubscriptionEvent.FailedFilter, url, event);
169
205
  }
170
- else if (!Context_1.NetworkContext.hasValidSignature(url, event)) {
171
- emitter.emit(SubscriptionEvent.InvalidSignature, url, event);
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.mergeSubscriptions)(subs).forEach(exports.executeSubscription);
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 subscription = (0, exports.makeSubscription)({ delay: 800, ...request });
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)(subscription);
265
+ (0, exports.executeSubscription)(sub);
229
266
  }
230
267
  else {
231
- (0, exports.executeSubscriptionBatched)(subscription);
268
+ (0, exports.executeSubscriptionBatched)(sub);
232
269
  }
233
- return subscription;
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"}
@@ -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,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
- 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));
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
- 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)),
102
+ filters,
103
+ relays,
104
+ timeout,
105
+ authTimeout,
106
+ closeOnEose
61
107
  });
62
- for (const { id, controller, request } of callerSubs) {
108
+ for (const { id, controller, request } of group) {
63
109
  const onAbort = () => {
64
110
  abortedSubs.add(id);
65
- if (abortedSubs.size === callerSubs.length) {
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 callerSubs) {
74
- if (sub.tracker.track(event.id, url)) {
75
- continue;
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, checkFilter) => mergedSub.emitter.on(type, (url, event) => {
85
- for (const sub of callerSubs) {
86
- if (!checkFilter || matchFilters(sub.request.filters, event)) {
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, 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);
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
- mergedSub.emitter.removeAllListeners();
147
+ if (type === SubscriptionEvent.Complete) {
148
+ mergedSub.emitter.removeAllListeners();
149
+ }
117
150
  });
118
- mergedSubscriptions.push(mergedSub);
119
- groupSubscriptions.push(mergedSub);
151
+ propagateFinality(SubscriptionEvent.Eose, eosedSubs);
152
+ propagateFinality(SubscriptionEvent.Close, closedSubs);
153
+ propagateFinality(SubscriptionEvent.Complete, completedSubs);
154
+ mergedSubs.push(mergedSub);
120
155
  }
121
- }
122
- return mergedSubscriptions;
156
+ return mergedSubs;
157
+ });
123
158
  };
124
- export const executeSubscription = (sub) => {
159
+ const _executeSubscription = (sub) => {
125
160
  const { request, emitter, tracker, controller } = sub;
126
- const { timeout, filters, closeOnEose, relays, signal, authTimeout = 0 } = request;
127
- const executor = NetworkContext.getExecutor(relays);
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 (NetworkContext.isDeleted(url, event)) {
193
+ else if (ctx.net.isDeleted(url, event)) {
159
194
  emitter.emit(SubscriptionEvent.DeletedEvent, url, event);
160
195
  }
161
- else if (!NetworkContext.matchFilters(url, filters, event)) {
196
+ else if (!ctx.net.matchFilters(url, filters, event)) {
162
197
  emitter.emit(SubscriptionEvent.FailedFilter, url, event);
163
198
  }
164
- else if (!NetworkContext.hasValidSignature(url, event)) {
165
- emitter.emit(SubscriptionEvent.InvalidSignature, url, event);
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 executeSubscriptions = (subs) => mergeSubscriptions(subs).forEach(executeSubscription);
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 subscription = makeSubscription({ delay: 800, ...request });
253
+ export const subscribe = ({ onEvent, onEose, onClose, onComplete, ...request }) => {
254
+ const sub = makeSubscription({ delay: 50, ...request });
219
255
  if (request.delay === 0) {
220
- executeSubscription(subscription);
256
+ executeSubscription(sub);
221
257
  }
222
258
  else {
223
- executeSubscriptionBatched(subscription);
259
+ executeSubscriptionBatched(sub);
224
260
  }
225
- return subscription;
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