@libp2p/utils 7.1.0-d1ab98294 → 7.2.0-9c3c0b22a

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.
@@ -4,4 +4,5 @@ export * from './is-link-local.ts';
4
4
  export * from './is-loopback.ts';
5
5
  export * from './is-network-address.ts';
6
6
  export * from './is-private.ts';
7
+ export * from './sorters.ts';
7
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/multiaddr/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/multiaddr/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA"}
@@ -4,4 +4,5 @@ export * from "./is-link-local.js";
4
4
  export * from "./is-loopback.js";
5
5
  export * from "./is-network-address.js";
6
6
  export * from "./is-private.js";
7
+ export * from "./sorters.js";
7
8
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/multiaddr/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/multiaddr/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,cAAc,wBAAwB,CAAA;AACtC,cAAc,oBAAoB,CAAA;AAClC,cAAc,kBAAkB,CAAA;AAChC,cAAc,yBAAyB,CAAA;AACvC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA"}
@@ -0,0 +1,30 @@
1
+ import type { Multiaddr } from '@multiformats/multiaddr';
2
+ /**
3
+ * Sorts addresses by order of reliability, where they have presented the fewest
4
+ * problems:
5
+ *
6
+ * TCP -> WebSockets/Secure -> WebRTC -> WebRTCDirect -> WebTransport
7
+ */
8
+ export declare function reliableTransportsFirst(a: Multiaddr, b: Multiaddr): -1 | 0 | 1;
9
+ /**
10
+ * Compare function for array.sort() that moves loopback addresses to the end
11
+ * of the array.
12
+ */
13
+ export declare function loopbackAddressLast(a: Multiaddr, b: Multiaddr): -1 | 0 | 1;
14
+ /**
15
+ * Compare function for array.sort() that moves public addresses to the start
16
+ * of the array.
17
+ */
18
+ export declare function publicAddressesFirst(a: Multiaddr, b: Multiaddr): -1 | 0 | 1;
19
+ /**
20
+ * Compare function for array.sort() that moves circuit relay addresses to the
21
+ * end of the array.
22
+ */
23
+ export declare function circuitRelayAddressesLast(a: Multiaddr, b: Multiaddr): -1 | 0 | 1;
24
+ /**
25
+ * Sort multiaddrs by the default multiaddr-only ordering: loopback addresses
26
+ * last, public addresses first, circuit-relay addresses last, with reliable
27
+ * transports as the innermost tiebreaker.
28
+ */
29
+ export declare function defaultMultiaddrSorter(multiaddrs: Multiaddr[]): Multiaddr[];
30
+ //# sourceMappingURL=sorters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sorters.d.ts","sourceRoot":"","sources":["../../../src/multiaddr/sorters.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAA;AAExD;;;;;GAKG;AAEH,wBAAgB,uBAAuB,CAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAqE/E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAW3E;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAW5E;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAWjF;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAE,UAAU,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CAO5E"}
@@ -0,0 +1,119 @@
1
+ import { Circuit, WebSockets, WebSocketsSecure, WebRTC, WebRTCDirect, WebTransport, TCP } from '@multiformats/multiaddr-matcher';
2
+ import { isLoopback } from "./is-loopback.js";
3
+ import { isPrivate } from "./is-private.js";
4
+ /**
5
+ * Sorts addresses by order of reliability, where they have presented the fewest
6
+ * problems:
7
+ *
8
+ * TCP -> WebSockets/Secure -> WebRTC -> WebRTCDirect -> WebTransport
9
+ */
10
+ // eslint-disable-next-line complexity
11
+ export function reliableTransportsFirst(a, b) {
12
+ const isATcp = TCP.exactMatch(a);
13
+ const isBTcp = TCP.exactMatch(b);
14
+ if (isATcp && !isBTcp) {
15
+ return -1;
16
+ }
17
+ if (!isATcp && isBTcp) {
18
+ return 1;
19
+ }
20
+ const isAWebSocketSecure = WebSocketsSecure.exactMatch(a);
21
+ const isBWebSocketSecure = WebSocketsSecure.exactMatch(b);
22
+ if (isAWebSocketSecure && !isBWebSocketSecure) {
23
+ return -1;
24
+ }
25
+ if (!isAWebSocketSecure && isBWebSocketSecure) {
26
+ return 1;
27
+ }
28
+ const isAWebSocket = WebSockets.exactMatch(a);
29
+ const isBWebSocket = WebSockets.exactMatch(b);
30
+ if (isAWebSocket && !isBWebSocket) {
31
+ return -1;
32
+ }
33
+ if (!isAWebSocket && isBWebSocket) {
34
+ return 1;
35
+ }
36
+ const isAWebRTC = WebRTC.exactMatch(a);
37
+ const isBWebRTC = WebRTC.exactMatch(b);
38
+ if (isAWebRTC && !isBWebRTC) {
39
+ return -1;
40
+ }
41
+ if (!isAWebRTC && isBWebRTC) {
42
+ return 1;
43
+ }
44
+ const isAWebRTCDirect = WebRTCDirect.exactMatch(a);
45
+ const isBWebRTCDirect = WebRTCDirect.exactMatch(b);
46
+ if (isAWebRTCDirect && !isBWebRTCDirect) {
47
+ return -1;
48
+ }
49
+ if (!isAWebRTCDirect && isBWebRTCDirect) {
50
+ return 1;
51
+ }
52
+ const isAWebTransport = WebTransport.exactMatch(a);
53
+ const isBWebTransport = WebTransport.exactMatch(b);
54
+ if (isAWebTransport && !isBWebTransport) {
55
+ return -1;
56
+ }
57
+ if (!isAWebTransport && isBWebTransport) {
58
+ return 1;
59
+ }
60
+ // ... everything else
61
+ return 0;
62
+ }
63
+ /**
64
+ * Compare function for array.sort() that moves loopback addresses to the end
65
+ * of the array.
66
+ */
67
+ export function loopbackAddressLast(a, b) {
68
+ const isALoopback = isLoopback(a);
69
+ const isBLoopback = isLoopback(b);
70
+ if (isALoopback && !isBLoopback) {
71
+ return 1;
72
+ }
73
+ else if (!isALoopback && isBLoopback) {
74
+ return -1;
75
+ }
76
+ return 0;
77
+ }
78
+ /**
79
+ * Compare function for array.sort() that moves public addresses to the start
80
+ * of the array.
81
+ */
82
+ export function publicAddressesFirst(a, b) {
83
+ const isAPrivate = isPrivate(a);
84
+ const isBPrivate = isPrivate(b);
85
+ if (isAPrivate && !isBPrivate) {
86
+ return 1;
87
+ }
88
+ else if (!isAPrivate && isBPrivate) {
89
+ return -1;
90
+ }
91
+ return 0;
92
+ }
93
+ /**
94
+ * Compare function for array.sort() that moves circuit relay addresses to the
95
+ * end of the array.
96
+ */
97
+ export function circuitRelayAddressesLast(a, b) {
98
+ const isACircuit = Circuit.exactMatch(a);
99
+ const isBCircuit = Circuit.exactMatch(b);
100
+ if (isACircuit && !isBCircuit) {
101
+ return 1;
102
+ }
103
+ else if (!isACircuit && isBCircuit) {
104
+ return -1;
105
+ }
106
+ return 0;
107
+ }
108
+ /**
109
+ * Sort multiaddrs by the default multiaddr-only ordering: loopback addresses
110
+ * last, public addresses first, circuit-relay addresses last, with reliable
111
+ * transports as the innermost tiebreaker.
112
+ */
113
+ export function defaultMultiaddrSorter(multiaddrs) {
114
+ return multiaddrs.sort((a, b) => loopbackAddressLast(a, b) ||
115
+ publicAddressesFirst(a, b) ||
116
+ circuitRelayAddressesLast(a, b) ||
117
+ reliableTransportsFirst(a, b));
118
+ }
119
+ //# sourceMappingURL=sorters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sorters.js","sourceRoot":"","sources":["../../../src/multiaddr/sorters.ts"],"names":[],"mappings":"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"}
@@ -15,6 +15,7 @@ export declare class Job<JobOptions extends AbortOptions & ProgressOptions = Abo
15
15
  status: JobStatus;
16
16
  readonly timeline: JobTimeline;
17
17
  private readonly controller;
18
+ private dispatchingProgress;
18
19
  constructor(fn: (options: JobOptions) => Promise<JobReturnType>, options: any);
19
20
  abort(err: Error): void;
20
21
  onAbort(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../../src/queue/job.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAStD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,qBAAa,GAAG,CAAE,UAAU,SAAS,YAAY,GAAG,eAAe,GAAG,YAAY,EAAE,aAAa,GAAG,OAAO;IAClG,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,aAAa,CAAC,CAAA;IACnD,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAA;IAC9C,MAAM,EAAE,SAAS,CAAA;IACxB,SAAgB,QAAQ,EAAE,WAAW,CAAA;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;gBAE/B,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,GAAG;IAgB9E,KAAK,CAAE,GAAG,EAAE,KAAK,GAAG,IAAI;IAIxB,OAAO,IAAK,IAAI;IAYV,IAAI,CAAE,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAS3F,GAAG,IAAK,OAAO,CAAC,IAAI,CAAC;IAkC3B,OAAO,IAAK,IAAI;CAMjB"}
1
+ {"version":3,"file":"job.d.ts","sourceRoot":"","sources":["../../../src/queue/job.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAC3C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAStD,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,qBAAa,GAAG,CAAE,UAAU,SAAS,YAAY,GAAG,eAAe,GAAG,YAAY,EAAE,aAAa,GAAG,OAAO;IAClG,EAAE,EAAE,MAAM,CAAA;IACV,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,aAAa,CAAC,CAAA;IACnD,OAAO,EAAE,UAAU,CAAA;IACnB,UAAU,EAAE,KAAK,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC,CAAA;IAC9C,MAAM,EAAE,SAAS,CAAA;IACxB,SAAgB,QAAQ,EAAE,WAAW,CAAA;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiB;IAC5C,OAAO,CAAC,mBAAmB,CAAS;gBAEvB,EAAE,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,GAAG;IAkB9E,KAAK,CAAE,GAAG,EAAE,KAAK,GAAG,IAAI;IAIxB,OAAO,IAAK,IAAI;IAYV,IAAI,CAAE,OAAO,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,GAAG,YAAY,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAS3F,GAAG,IAAK,OAAO,CAAC,IAAI,CAAC;IA8C3B,OAAO,IAAK,IAAI;CAMjB"}
@@ -16,6 +16,7 @@ export class Job {
16
16
  status;
17
17
  timeline;
18
18
  controller;
19
+ dispatchingProgress;
19
20
  constructor(fn, options) {
20
21
  this.id = randomId();
21
22
  this.status = 'queued';
@@ -27,6 +28,7 @@ export class Job {
27
28
  };
28
29
  this.controller = new AbortController();
29
30
  setMaxListeners(Infinity, this.controller.signal);
31
+ this.dispatchingProgress = false;
30
32
  this.onAbort = this.onAbort.bind(this);
31
33
  }
32
34
  abort(err) {
@@ -57,9 +59,20 @@ export class Job {
57
59
  ...(this.options ?? {}),
58
60
  signal: this.controller.signal,
59
61
  onProgress: (evt) => {
60
- this.recipients.forEach(recipient => {
61
- recipient.onProgress?.(evt);
62
- });
62
+ // Recipients can transitively re-enter this dispatcher; without
63
+ // this guard a single event recurses until the stack overflows.
64
+ if (this.dispatchingProgress) {
65
+ return;
66
+ }
67
+ this.dispatchingProgress = true;
68
+ try {
69
+ this.recipients.forEach(recipient => {
70
+ recipient.onProgress?.(evt);
71
+ });
72
+ }
73
+ finally {
74
+ this.dispatchingProgress = false;
75
+ }
63
76
  }
64
77
  }), this.controller.signal);
65
78
  this.recipients.forEach(recipient => {
@@ -1 +1 @@
1
- {"version":3,"file":"job.js","sourceRoot":"","sources":["../../../src/queue/job.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"job.js","sourceRoot":"","sources":["../../../src/queue/job.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@libp2p/utils",
3
- "version": "7.1.0-d1ab98294",
3
+ "version": "7.2.0-9c3c0b22a",
4
4
  "description": "Package to aggregate shared logic and dependencies for the libp2p ecosystem",
5
5
  "license": "Apache-2.0 OR MIT",
6
6
  "homepage": "https://github.com/libp2p/js-libp2p/tree/main/packages/utils#readme",
@@ -47,10 +47,11 @@
47
47
  "dependencies": {
48
48
  "@chainsafe/is-ip": "^2.1.0",
49
49
  "@chainsafe/netmask": "^2.0.0",
50
- "@libp2p/crypto": "5.1.17-d1ab98294",
51
- "@libp2p/interface": "3.2.2-d1ab98294",
52
- "@libp2p/logger": "6.2.6-d1ab98294",
50
+ "@libp2p/crypto": "5.1.18-9c3c0b22a",
51
+ "@libp2p/interface": "3.2.2-9c3c0b22a",
52
+ "@libp2p/logger": "6.2.7-9c3c0b22a",
53
53
  "@multiformats/multiaddr": "^13.0.1",
54
+ "@multiformats/multiaddr-matcher": "^3.0.1",
54
55
  "@sindresorhus/fnv1a": "^3.1.0",
55
56
  "any-signal": "^4.1.1",
56
57
  "cborg": "^5.1.0",
@@ -71,7 +72,7 @@
71
72
  "uint8arrays": "^5.1.0"
72
73
  },
73
74
  "devDependencies": {
74
- "@libp2p/peer-id": "6.0.8-d1ab98294",
75
+ "@libp2p/peer-id": "6.0.9-9c3c0b22a",
75
76
  "@types/netmask": "^2.0.5",
76
77
  "aegir": "^47.0.22",
77
78
  "benchmark": "^2.1.4",
@@ -4,3 +4,4 @@ export * from './is-link-local.ts'
4
4
  export * from './is-loopback.ts'
5
5
  export * from './is-network-address.ts'
6
6
  export * from './is-private.ts'
7
+ export * from './sorters.ts'
@@ -0,0 +1,147 @@
1
+ import { Circuit, WebSockets, WebSocketsSecure, WebRTC, WebRTCDirect, WebTransport, TCP } from '@multiformats/multiaddr-matcher'
2
+ import { isLoopback } from './is-loopback.ts'
3
+ import { isPrivate } from './is-private.ts'
4
+ import type { Multiaddr } from '@multiformats/multiaddr'
5
+
6
+ /**
7
+ * Sorts addresses by order of reliability, where they have presented the fewest
8
+ * problems:
9
+ *
10
+ * TCP -> WebSockets/Secure -> WebRTC -> WebRTCDirect -> WebTransport
11
+ */
12
+ // eslint-disable-next-line complexity
13
+ export function reliableTransportsFirst (a: Multiaddr, b: Multiaddr): -1 | 0 | 1 {
14
+ const isATcp = TCP.exactMatch(a)
15
+ const isBTcp = TCP.exactMatch(b)
16
+
17
+ if (isATcp && !isBTcp) {
18
+ return -1
19
+ }
20
+
21
+ if (!isATcp && isBTcp) {
22
+ return 1
23
+ }
24
+
25
+ const isAWebSocketSecure = WebSocketsSecure.exactMatch(a)
26
+ const isBWebSocketSecure = WebSocketsSecure.exactMatch(b)
27
+
28
+ if (isAWebSocketSecure && !isBWebSocketSecure) {
29
+ return -1
30
+ }
31
+
32
+ if (!isAWebSocketSecure && isBWebSocketSecure) {
33
+ return 1
34
+ }
35
+
36
+ const isAWebSocket = WebSockets.exactMatch(a)
37
+ const isBWebSocket = WebSockets.exactMatch(b)
38
+
39
+ if (isAWebSocket && !isBWebSocket) {
40
+ return -1
41
+ }
42
+
43
+ if (!isAWebSocket && isBWebSocket) {
44
+ return 1
45
+ }
46
+
47
+ const isAWebRTC = WebRTC.exactMatch(a)
48
+ const isBWebRTC = WebRTC.exactMatch(b)
49
+
50
+ if (isAWebRTC && !isBWebRTC) {
51
+ return -1
52
+ }
53
+
54
+ if (!isAWebRTC && isBWebRTC) {
55
+ return 1
56
+ }
57
+
58
+ const isAWebRTCDirect = WebRTCDirect.exactMatch(a)
59
+ const isBWebRTCDirect = WebRTCDirect.exactMatch(b)
60
+
61
+ if (isAWebRTCDirect && !isBWebRTCDirect) {
62
+ return -1
63
+ }
64
+
65
+ if (!isAWebRTCDirect && isBWebRTCDirect) {
66
+ return 1
67
+ }
68
+
69
+ const isAWebTransport = WebTransport.exactMatch(a)
70
+ const isBWebTransport = WebTransport.exactMatch(b)
71
+
72
+ if (isAWebTransport && !isBWebTransport) {
73
+ return -1
74
+ }
75
+
76
+ if (!isAWebTransport && isBWebTransport) {
77
+ return 1
78
+ }
79
+
80
+ // ... everything else
81
+ return 0
82
+ }
83
+
84
+ /**
85
+ * Compare function for array.sort() that moves loopback addresses to the end
86
+ * of the array.
87
+ */
88
+ export function loopbackAddressLast (a: Multiaddr, b: Multiaddr): -1 | 0 | 1 {
89
+ const isALoopback = isLoopback(a)
90
+ const isBLoopback = isLoopback(b)
91
+
92
+ if (isALoopback && !isBLoopback) {
93
+ return 1
94
+ } else if (!isALoopback && isBLoopback) {
95
+ return -1
96
+ }
97
+
98
+ return 0
99
+ }
100
+
101
+ /**
102
+ * Compare function for array.sort() that moves public addresses to the start
103
+ * of the array.
104
+ */
105
+ export function publicAddressesFirst (a: Multiaddr, b: Multiaddr): -1 | 0 | 1 {
106
+ const isAPrivate = isPrivate(a)
107
+ const isBPrivate = isPrivate(b)
108
+
109
+ if (isAPrivate && !isBPrivate) {
110
+ return 1
111
+ } else if (!isAPrivate && isBPrivate) {
112
+ return -1
113
+ }
114
+
115
+ return 0
116
+ }
117
+
118
+ /**
119
+ * Compare function for array.sort() that moves circuit relay addresses to the
120
+ * end of the array.
121
+ */
122
+ export function circuitRelayAddressesLast (a: Multiaddr, b: Multiaddr): -1 | 0 | 1 {
123
+ const isACircuit = Circuit.exactMatch(a)
124
+ const isBCircuit = Circuit.exactMatch(b)
125
+
126
+ if (isACircuit && !isBCircuit) {
127
+ return 1
128
+ } else if (!isACircuit && isBCircuit) {
129
+ return -1
130
+ }
131
+
132
+ return 0
133
+ }
134
+
135
+ /**
136
+ * Sort multiaddrs by the default multiaddr-only ordering: loopback addresses
137
+ * last, public addresses first, circuit-relay addresses last, with reliable
138
+ * transports as the innermost tiebreaker.
139
+ */
140
+ export function defaultMultiaddrSorter (multiaddrs: Multiaddr[]): Multiaddr[] {
141
+ return multiaddrs.sort((a, b) =>
142
+ loopbackAddressLast(a, b) ||
143
+ publicAddressesFirst(a, b) ||
144
+ circuitRelayAddressesLast(a, b) ||
145
+ reliableTransportsFirst(a, b)
146
+ )
147
+ }
package/src/queue/job.ts CHANGED
@@ -27,6 +27,7 @@ export class Job <JobOptions extends AbortOptions & ProgressOptions = AbortOptio
27
27
  public status: JobStatus
28
28
  public readonly timeline: JobTimeline
29
29
  private readonly controller: AbortController
30
+ private dispatchingProgress: boolean
30
31
 
31
32
  constructor (fn: (options: JobOptions) => Promise<JobReturnType>, options: any) {
32
33
  this.id = randomId()
@@ -41,6 +42,8 @@ export class Job <JobOptions extends AbortOptions & ProgressOptions = AbortOptio
41
42
  this.controller = new AbortController()
42
43
  setMaxListeners(Infinity, this.controller.signal)
43
44
 
45
+ this.dispatchingProgress = false
46
+
44
47
  this.onAbort = this.onAbort.bind(this)
45
48
  }
46
49
 
@@ -80,9 +83,21 @@ export class Job <JobOptions extends AbortOptions & ProgressOptions = AbortOptio
80
83
  ...(this.options ?? {}),
81
84
  signal: this.controller.signal,
82
85
  onProgress: (evt: any): void => {
83
- this.recipients.forEach(recipient => {
84
- recipient.onProgress?.(evt)
85
- })
86
+ // Recipients can transitively re-enter this dispatcher; without
87
+ // this guard a single event recurses until the stack overflows.
88
+ if (this.dispatchingProgress) {
89
+ return
90
+ }
91
+
92
+ this.dispatchingProgress = true
93
+
94
+ try {
95
+ this.recipients.forEach(recipient => {
96
+ recipient.onProgress?.(evt)
97
+ })
98
+ } finally {
99
+ this.dispatchingProgress = false
100
+ }
86
101
  }
87
102
  }), this.controller.signal)
88
103