@libp2p/interface-compliance-tests 6.1.8 → 6.1.9

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.
Files changed (66) hide show
  1. package/dist/src/matchers.d.ts +6 -0
  2. package/dist/src/matchers.d.ts.map +1 -1
  3. package/dist/src/matchers.js +6 -0
  4. package/dist/src/matchers.js.map +1 -1
  5. package/dist/src/mocks/index.d.ts +0 -2
  6. package/dist/src/mocks/index.d.ts.map +1 -1
  7. package/dist/src/mocks/index.js +0 -2
  8. package/dist/src/mocks/index.js.map +1 -1
  9. package/dist/src/mocks/muxer.d.ts +8 -3
  10. package/dist/src/mocks/muxer.d.ts.map +1 -1
  11. package/dist/src/mocks/muxer.js +15 -6
  12. package/dist/src/mocks/muxer.js.map +1 -1
  13. package/dist/src/mocks/upgrader.d.ts.map +1 -1
  14. package/dist/src/mocks/upgrader.js +0 -1
  15. package/dist/src/mocks/upgrader.js.map +1 -1
  16. package/dist/src/transport/index.d.ts +23 -10
  17. package/dist/src/transport/index.d.ts.map +1 -1
  18. package/dist/src/transport/index.js +418 -6
  19. package/dist/src/transport/index.js.map +1 -1
  20. package/dist/src/transport/utils.d.ts +17 -0
  21. package/dist/src/transport/utils.d.ts.map +1 -0
  22. package/dist/src/transport/utils.js +63 -0
  23. package/dist/src/transport/utils.js.map +1 -0
  24. package/dist/typedoc-urls.json +1 -6
  25. package/package.json +11 -10
  26. package/src/matchers.ts +6 -0
  27. package/src/mocks/index.ts +0 -2
  28. package/src/mocks/muxer.ts +24 -10
  29. package/src/mocks/upgrader.ts +1 -3
  30. package/src/transport/index.ts +570 -16
  31. package/src/transport/utils.ts +76 -0
  32. package/dist/src/connection/index.d.ts +0 -5
  33. package/dist/src/connection/index.d.ts.map +0 -1
  34. package/dist/src/connection/index.js +0 -135
  35. package/dist/src/connection/index.js.map +0 -1
  36. package/dist/src/mocks/connection-gater.d.ts +0 -3
  37. package/dist/src/mocks/connection-gater.d.ts.map +0 -1
  38. package/dist/src/mocks/connection-gater.js +0 -17
  39. package/dist/src/mocks/connection-gater.js.map +0 -1
  40. package/dist/src/mocks/metrics.d.ts +0 -3
  41. package/dist/src/mocks/metrics.d.ts.map +0 -1
  42. package/dist/src/mocks/metrics.js +0 -286
  43. package/dist/src/mocks/metrics.js.map +0 -1
  44. package/dist/src/mocks/peer-discovery.d.ts +0 -21
  45. package/dist/src/mocks/peer-discovery.d.ts.map +0 -1
  46. package/dist/src/mocks/peer-discovery.js +0 -47
  47. package/dist/src/mocks/peer-discovery.js.map +0 -1
  48. package/dist/src/transport/dial-test.d.ts +0 -5
  49. package/dist/src/transport/dial-test.d.ts.map +0 -1
  50. package/dist/src/transport/dial-test.js +0 -99
  51. package/dist/src/transport/dial-test.js.map +0 -1
  52. package/dist/src/transport/filter-test.d.ts +0 -5
  53. package/dist/src/transport/filter-test.d.ts.map +0 -1
  54. package/dist/src/transport/filter-test.js +0 -24
  55. package/dist/src/transport/filter-test.js.map +0 -1
  56. package/dist/src/transport/listen-test.d.ts +0 -5
  57. package/dist/src/transport/listen-test.d.ts.map +0 -1
  58. package/dist/src/transport/listen-test.js +0 -154
  59. package/dist/src/transport/listen-test.js.map +0 -1
  60. package/src/connection/index.ts +0 -166
  61. package/src/mocks/connection-gater.ts +0 -18
  62. package/src/mocks/metrics.ts +0 -385
  63. package/src/mocks/peer-discovery.ts +0 -59
  64. package/src/transport/dial-test.ts +0 -125
  65. package/src/transport/filter-test.ts +0 -32
  66. package/src/transport/listen-test.ts +0 -192
@@ -1,385 +0,0 @@
1
- import { TDigest } from 'tdigest'
2
- import type { MultiaddrConnection, Stream, Connection, Metric, MetricGroup, StopTimer, Metrics, CalculatedMetricOptions, MetricOptions, Histogram, HistogramOptions, HistogramGroup, Summary, SummaryOptions, SummaryGroup, CalculatedHistogramOptions, CalculatedSummaryOptions } from '@libp2p/interface'
3
-
4
- class DefaultMetric implements Metric {
5
- public value: number = 0
6
-
7
- update (value: number): void {
8
- this.value = value
9
- }
10
-
11
- increment (value: number = 1): void {
12
- this.value += value
13
- }
14
-
15
- decrement (value: number = 1): void {
16
- this.value -= value
17
- }
18
-
19
- reset (): void {
20
- this.value = 0
21
- }
22
-
23
- timer (): StopTimer {
24
- const start = Date.now()
25
-
26
- return () => {
27
- this.value = Date.now() - start
28
- }
29
- }
30
- }
31
-
32
- class DefaultGroupMetric implements MetricGroup {
33
- public values: Record<string, number> = {}
34
-
35
- update (values: Record<string, number>): void {
36
- Object.entries(values).forEach(([key, value]) => {
37
- this.values[key] = value
38
- })
39
- }
40
-
41
- increment (values: Record<string, number | unknown>): void {
42
- Object.entries(values).forEach(([key, value]) => {
43
- this.values[key] = this.values[key] ?? 0
44
- const inc = typeof value === 'number' ? value : 1
45
-
46
- this.values[key] += Number(inc)
47
- })
48
- }
49
-
50
- decrement (values: Record<string, number | unknown>): void {
51
- Object.entries(values).forEach(([key, value]) => {
52
- this.values[key] = this.values[key] ?? 0
53
- const dec = typeof value === 'number' ? value : 1
54
-
55
- this.values[key] -= Number(dec)
56
- })
57
- }
58
-
59
- reset (): void {
60
- this.values = {}
61
- }
62
-
63
- timer (key: string): StopTimer {
64
- const start = Date.now()
65
-
66
- return () => {
67
- this.values[key] = Date.now() - start
68
- }
69
- }
70
- }
71
-
72
- class DefaultHistogram implements Histogram {
73
- public bucketValues = new Map<number, number>()
74
- public countValue: number = 0
75
- public sumValue: number = 0
76
-
77
- constructor (opts: HistogramOptions) {
78
- const buckets = [
79
- ...(opts.buckets ?? [0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1, 2.5, 5, 10]),
80
- Infinity
81
- ]
82
- for (const bucket of buckets) {
83
- this.bucketValues.set(bucket, 0)
84
- }
85
- }
86
-
87
- observe (value: number): void {
88
- this.countValue++
89
- this.sumValue += value
90
-
91
- for (const [bucket, count] of this.bucketValues.entries()) {
92
- if (value <= bucket) {
93
- this.bucketValues.set(bucket, count + 1)
94
- }
95
- }
96
- }
97
-
98
- reset (): void {
99
- this.countValue = 0
100
- this.sumValue = 0
101
- for (const bucket of this.bucketValues.keys()) {
102
- this.bucketValues.set(bucket, 0)
103
- }
104
- }
105
-
106
- timer (): StopTimer {
107
- const start = Date.now()
108
-
109
- return () => {
110
- this.observe(Date.now() - start)
111
- }
112
- }
113
- }
114
-
115
- class DefaultHistogramGroup implements HistogramGroup {
116
- public histograms: Record<string, DefaultHistogram> = {}
117
-
118
- constructor (opts: HistogramOptions) {
119
- this.histograms = {}
120
- }
121
-
122
- observe (values: Partial<Record<string, number>>): void {
123
- for (const [key, value] of Object.entries(values) as Array<[string, number]>) {
124
- if (this.histograms[key] === undefined) {
125
- this.histograms[key] = new DefaultHistogram({})
126
- }
127
-
128
- this.histograms[key].observe(value)
129
- }
130
- }
131
-
132
- reset (): void {
133
- for (const histogram of Object.values(this.histograms)) {
134
- histogram.reset()
135
- }
136
- }
137
-
138
- timer (key: string): StopTimer {
139
- const start = Date.now()
140
-
141
- return () => {
142
- this.observe({ [key]: Date.now() - start })
143
- }
144
- }
145
- }
146
-
147
- class DefaultSummary implements Summary {
148
- public sumValue: number = 0
149
- public countValue: number = 0
150
- public percentiles: number[]
151
- public tdigest = new TDigest(0.01)
152
- private readonly compressCount: number
153
-
154
- constructor (opts: SummaryOptions) {
155
- this.percentiles = opts.percentiles ?? [0.01, 0.05, 0.5, 0.9, 0.95, 0.99, 0.999]
156
- this.compressCount = opts.compressCount ?? 1000
157
- }
158
-
159
- observe (value: number): void {
160
- this.sumValue += value
161
- this.countValue++
162
-
163
- this.tdigest.push(value)
164
- if (this.tdigest.size() > this.compressCount) {
165
- this.tdigest.compress()
166
- }
167
- }
168
-
169
- reset (): void {
170
- this.sumValue = 0
171
- this.countValue = 0
172
-
173
- this.tdigest.reset()
174
- }
175
-
176
- timer (): StopTimer {
177
- const start = Date.now()
178
-
179
- return () => {
180
- this.observe(Date.now() - start)
181
- }
182
- }
183
- }
184
-
185
- class DefaultSummaryGroup implements SummaryGroup {
186
- public summaries: Record<string, DefaultSummary> = {}
187
- private readonly opts: SummaryOptions
188
-
189
- constructor (opts: SummaryOptions) {
190
- this.summaries = {}
191
- this.opts = opts
192
- }
193
-
194
- observe (values: Record<string, number>): void {
195
- for (const [key, value] of Object.entries(values)) {
196
- if (this.summaries[key] === undefined) {
197
- this.summaries[key] = new DefaultSummary(this.opts)
198
- }
199
-
200
- this.summaries[key].observe(value)
201
- }
202
- }
203
-
204
- reset (): void {
205
- for (const summary of Object.values(this.summaries)) {
206
- summary.reset()
207
- }
208
- }
209
-
210
- timer (key: string): StopTimer {
211
- const start = Date.now()
212
-
213
- return () => {
214
- this.observe({ [key]: Date.now() - start })
215
- }
216
- }
217
- }
218
-
219
- class MockMetrics implements Metrics {
220
- public metrics = new Map<string, any>()
221
-
222
- trackMultiaddrConnection (maConn: MultiaddrConnection): void {
223
-
224
- }
225
-
226
- trackProtocolStream (stream: Stream, connection: Connection): void {
227
-
228
- }
229
-
230
- registerMetric (name: string, opts: CalculatedMetricOptions): void
231
- registerMetric (name: string, opts?: MetricOptions): Metric
232
- registerMetric (name: string, opts: any): any {
233
- if (name == null || name.trim() === '') {
234
- throw new Error('Metric name is required')
235
- }
236
-
237
- if (opts?.calculate != null) {
238
- // calculated metric
239
- this.metrics.set(name, opts.calculate)
240
- return
241
- }
242
-
243
- const metric = new DefaultMetric()
244
- this.metrics.set(name, metric)
245
-
246
- return metric
247
- }
248
-
249
- registerCounter (name: string, opts: CalculatedMetricOptions): void
250
- registerCounter (name: string, opts?: MetricOptions): Metric
251
- registerCounter (name: string, opts: any): any {
252
- if (name == null || name.trim() === '') {
253
- throw new Error('Metric name is required')
254
- }
255
-
256
- if (opts?.calculate != null) {
257
- // calculated metric
258
- this.metrics.set(name, opts.calculate)
259
- return
260
- }
261
-
262
- const metric = new DefaultMetric()
263
- this.metrics.set(name, metric)
264
-
265
- return metric
266
- }
267
-
268
- registerMetricGroup (name: string, opts: CalculatedMetricOptions<Record<string, number>>): void
269
- registerMetricGroup (name: string, opts?: MetricOptions): MetricGroup
270
- registerMetricGroup (name: string, opts: any): any {
271
- if (name == null || name.trim() === '') {
272
- throw new Error('Metric name is required')
273
- }
274
-
275
- if (opts?.calculate != null) {
276
- // calculated metric
277
- this.metrics.set(name, opts.calculate)
278
- return
279
- }
280
-
281
- const metric = new DefaultGroupMetric()
282
- this.metrics.set(name, metric)
283
-
284
- return metric
285
- }
286
-
287
- registerCounterGroup (name: string, opts: CalculatedMetricOptions<Record<string, number>>): void
288
- registerCounterGroup (name: string, opts?: MetricOptions): MetricGroup
289
- registerCounterGroup (name: string, opts: any): any {
290
- if (name == null || name.trim() === '') {
291
- throw new Error('Metric name is required')
292
- }
293
-
294
- if (opts?.calculate != null) {
295
- // calculated metric
296
- this.metrics.set(name, opts.calculate)
297
- return
298
- }
299
-
300
- const metric = new DefaultGroupMetric()
301
- this.metrics.set(name, metric)
302
-
303
- return metric
304
- }
305
-
306
- registerHistogram (name: string, opts: CalculatedHistogramOptions): void
307
- registerHistogram (name: string, opts?: HistogramOptions): Histogram
308
- registerHistogram (name: string, opts: any = {}): any {
309
- if (name == null || name.trim() === '') {
310
- throw new Error('Metric name is required')
311
- }
312
-
313
- if (opts?.calculate != null) {
314
- // calculated metric
315
- this.metrics.set(name, opts.calculate)
316
- return
317
- }
318
-
319
- const metric = new DefaultHistogram(opts)
320
- this.metrics.set(name, metric)
321
-
322
- return metric
323
- }
324
-
325
- registerHistogramGroup (name: string, opts: CalculatedHistogramOptions<Record<string, number>>): void
326
- registerHistogramGroup (name: string, opts?: HistogramOptions): HistogramGroup
327
- registerHistogramGroup (name: string, opts: any = {}): any {
328
- if (name == null || name.trim() === '') {
329
- throw new Error('Metric name is required')
330
- }
331
-
332
- if (opts?.calculate != null) {
333
- // calculated metric
334
- this.metrics.set(name, opts.calculate)
335
- return
336
- }
337
-
338
- const metric = new DefaultHistogramGroup(opts)
339
- this.metrics.set(name, metric)
340
-
341
- return metric
342
- }
343
-
344
- registerSummary (name: string, opts: CalculatedSummaryOptions): void
345
- registerSummary (name: string, opts?: SummaryOptions): Summary
346
- registerSummary (name: string, opts: any = {}): any {
347
- if (name == null || name.trim() === '') {
348
- throw new Error('Metric name is required')
349
- }
350
-
351
- if (opts?.calculate != null) {
352
- // calculated metric
353
- this.metrics.set(name, opts.calculate)
354
- return
355
- }
356
-
357
- const metric = new DefaultSummary(opts)
358
- this.metrics.set(name, metric)
359
-
360
- return metric
361
- }
362
-
363
- registerSummaryGroup (name: string, opts: CalculatedSummaryOptions<Record<string, number>>): void
364
- registerSummaryGroup (name: string, opts?: SummaryOptions): SummaryGroup
365
- registerSummaryGroup (name: string, opts: any = {}): any {
366
- if (name == null || name.trim() === '') {
367
- throw new Error('Metric name is required')
368
- }
369
-
370
- if (opts?.calculate != null) {
371
- // calculated metric
372
- this.metrics.set(name, opts.calculate)
373
- return
374
- }
375
-
376
- const metric = new DefaultSummaryGroup(opts)
377
- this.metrics.set(name, metric)
378
-
379
- return metric
380
- }
381
- }
382
-
383
- export function mockMetrics (): () => Metrics {
384
- return () => new MockMetrics()
385
- }
@@ -1,59 +0,0 @@
1
- import { generateKeyPair } from '@libp2p/crypto/keys'
2
- import { TypedEventEmitter, peerDiscoverySymbol } from '@libp2p/interface'
3
- import { peerIdFromPrivateKey } from '@libp2p/peer-id'
4
- import { multiaddr } from '@multiformats/multiaddr'
5
- import type { PeerDiscovery, PeerDiscoveryEvents, PeerInfo } from '@libp2p/interface'
6
-
7
- interface MockDiscoveryInit {
8
- discoveryDelay?: number
9
- }
10
-
11
- /**
12
- * Emits 'peer' events on discovery.
13
- */
14
- export class MockDiscovery extends TypedEventEmitter<PeerDiscoveryEvents> implements PeerDiscovery {
15
- public readonly options: MockDiscoveryInit
16
- private _isRunning: boolean
17
- private _timer: any
18
-
19
- constructor (init = {}) {
20
- super()
21
-
22
- this.options = init
23
- this._isRunning = false
24
- }
25
-
26
- readonly [peerDiscoverySymbol] = this
27
-
28
- start (): void {
29
- this._isRunning = true
30
- this._discoverPeer()
31
- }
32
-
33
- stop (): void {
34
- clearTimeout(this._timer)
35
- this._isRunning = false
36
- }
37
-
38
- isStarted (): boolean {
39
- return this._isRunning
40
- }
41
-
42
- _discoverPeer (): void {
43
- if (!this._isRunning) return
44
-
45
- generateKeyPair('Ed25519')
46
- .then(key => {
47
- const peerId = peerIdFromPrivateKey(key)
48
- this._timer = setTimeout(() => {
49
- this.safeDispatchEvent<PeerInfo>('peer', {
50
- detail: {
51
- id: peerId,
52
- multiaddrs: [multiaddr('/ip4/127.0.0.1/tcp/8000')]
53
- }
54
- })
55
- }, this.options.discoveryDelay ?? 1000)
56
- })
57
- .catch(() => {})
58
- }
59
- }
@@ -1,125 +0,0 @@
1
- import { TypedEventEmitter } from '@libp2p/interface'
2
- import { expect } from 'aegir/chai'
3
- import all from 'it-all'
4
- import drain from 'it-drain'
5
- import { pipe } from 'it-pipe'
6
- import sinon from 'sinon'
7
- import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string'
8
- import { isValidTick } from '../is-valid-tick.js'
9
- import { mockUpgrader, mockRegistrar } from '../mocks/index.js'
10
- import type { TransportTestFixtures, Connector } from './index.js'
11
- import type { TestSetup } from '../index.js'
12
- import type { Listener, Transport, Upgrader } from '@libp2p/interface'
13
- import type { Registrar } from '@libp2p/interface-internal'
14
- import type { Multiaddr } from '@multiformats/multiaddr'
15
-
16
- export default (common: TestSetup<TransportTestFixtures>): void => {
17
- describe('dial', () => {
18
- let upgrader: Upgrader
19
- let registrar: Registrar
20
- let listenAddrs: Multiaddr[]
21
- let dialAddrs: Multiaddr[]
22
- let dialer: Transport
23
- let listener: Transport
24
- let connector: Connector
25
- let listen: Listener
26
-
27
- before(async () => {
28
- registrar = mockRegistrar()
29
- upgrader = mockUpgrader({
30
- registrar,
31
- events: new TypedEventEmitter()
32
- });
33
-
34
- ({ listenAddrs, dialAddrs, dialer, listener, connector } = await common.setup())
35
- })
36
-
37
- after(async () => {
38
- await common.teardown()
39
- })
40
-
41
- beforeEach(async () => {
42
- listen = listener.createListener({
43
- upgrader
44
- })
45
- await listen.listen(listenAddrs[0])
46
- })
47
-
48
- afterEach(async () => {
49
- sinon.restore()
50
- connector.restore()
51
- await listen.close()
52
- })
53
-
54
- it('simple', async () => {
55
- const protocol = '/hello/1.0.0'
56
- void registrar.handle(protocol, (data) => {
57
- void pipe([
58
- uint8ArrayFromString('hey')
59
- ],
60
- data.stream,
61
- drain
62
- )
63
- })
64
-
65
- const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
66
- const conn = await dialer.dial(dialAddrs[0], {
67
- upgrader
68
- })
69
-
70
- const stream = await conn.newStream([protocol])
71
- const result = await all(stream.source)
72
-
73
- expect(upgradeSpy.callCount).to.equal(1)
74
- await expect(upgradeSpy.getCall(0).returnValue).to.eventually.equal(conn)
75
- expect(result.length).to.equal(1)
76
- expect(result[0].subarray()).to.equalBytes(uint8ArrayFromString('hey'))
77
- await conn.close()
78
- })
79
-
80
- it('can close connections', async () => {
81
- const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
82
- const conn = await dialer.dial(dialAddrs[0], {
83
- upgrader
84
- })
85
-
86
- expect(upgradeSpy.callCount).to.equal(1)
87
- await expect(upgradeSpy.getCall(0).returnValue).to.eventually.equal(conn)
88
- await conn.close()
89
- expect(isValidTick(conn.timeline.close)).to.equal(true)
90
- })
91
-
92
- it('to non existent listener', async () => {
93
- const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
94
-
95
- await expect(dialer.dial(dialAddrs[1], {
96
- upgrader
97
- })).to.eventually.be.rejected()
98
- expect(upgradeSpy.callCount).to.equal(0)
99
- })
100
-
101
- it('abort before dialing throws AbortError', async () => {
102
- const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
103
- const controller = new AbortController()
104
- controller.abort()
105
- const conn = dialer.dial(dialAddrs[0], { signal: controller.signal, upgrader })
106
-
107
- await expect(conn).to.eventually.be.rejected().with.property('name', 'AbortError')
108
- expect(upgradeSpy.callCount).to.equal(0)
109
- })
110
-
111
- it('abort while dialing throws AbortError', async () => {
112
- const upgradeSpy = sinon.spy(upgrader, 'upgradeOutbound')
113
- // Add a delay to connect() so that we can abort while the dial is in
114
- // progress
115
- connector.delay(100)
116
-
117
- const controller = new AbortController()
118
- const conn = dialer.dial(dialAddrs[0], { signal: controller.signal, upgrader })
119
- setTimeout(() => { controller.abort() }, 50)
120
-
121
- await expect(conn).to.eventually.be.rejected().with.property('name', 'AbortError')
122
- expect(upgradeSpy.callCount).to.equal(0)
123
- })
124
- })
125
- }
@@ -1,32 +0,0 @@
1
- import { expect } from 'aegir/chai'
2
- import type { TransportTestFixtures } from './index.js'
3
- import type { TestSetup } from '../index.js'
4
- import type { Transport } from '@libp2p/interface'
5
- import type { Multiaddr } from '@multiformats/multiaddr'
6
-
7
- export default (common: TestSetup<TransportTestFixtures>): void => {
8
- describe('filter', () => {
9
- let listenAddrs: Multiaddr[]
10
- let dialAddrs: Multiaddr[]
11
- let dialer: Transport
12
- let listener: Transport
13
-
14
- before(async () => {
15
- ({ listenAddrs, dialAddrs, dialer, listener } = await common.setup())
16
- })
17
-
18
- after(async () => {
19
- await common.teardown()
20
- })
21
-
22
- it('filters listen addresses', () => {
23
- const filteredAddrs = listener.listenFilter(listenAddrs)
24
- expect(filteredAddrs).to.eql(listenAddrs)
25
- })
26
-
27
- it('filters dial addresses', () => {
28
- const filteredAddrs = dialer.dialFilter(dialAddrs)
29
- expect(filteredAddrs).to.eql(dialAddrs)
30
- })
31
- })
32
- }