@libp2p/interface-compliance-tests 3.0.7-883082ca → 3.0.7-8b0e6bef

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 (132) hide show
  1. package/README.md +9 -0
  2. package/dist/src/connection/index.d.ts +5 -0
  3. package/dist/src/connection/index.d.ts.map +1 -0
  4. package/dist/src/connection/index.js +151 -0
  5. package/dist/src/connection/index.js.map +1 -0
  6. package/dist/src/connection-encryption/index.d.ts +5 -0
  7. package/dist/src/connection-encryption/index.d.ts.map +1 -0
  8. package/dist/src/connection-encryption/index.js +71 -0
  9. package/dist/src/connection-encryption/index.js.map +1 -0
  10. package/dist/src/connection-encryption/utils/index.d.ts +3 -0
  11. package/dist/src/connection-encryption/utils/index.d.ts.map +1 -0
  12. package/dist/src/connection-encryption/utils/index.js +18 -0
  13. package/dist/src/connection-encryption/utils/index.js.map +1 -0
  14. package/dist/src/mocks/connection-encrypter.d.ts +3 -0
  15. package/dist/src/mocks/connection-encrypter.d.ts.map +1 -0
  16. package/dist/src/mocks/connection-encrypter.js +98 -0
  17. package/dist/src/mocks/connection-encrypter.js.map +1 -0
  18. package/dist/src/mocks/connection-gater.d.ts +3 -0
  19. package/dist/src/mocks/connection-gater.d.ts.map +1 -0
  20. package/dist/src/mocks/connection-gater.js +17 -0
  21. package/dist/src/mocks/connection-gater.js.map +1 -0
  22. package/dist/src/mocks/connection-manager.d.ts +27 -0
  23. package/dist/src/mocks/connection-manager.d.ts.map +1 -0
  24. package/dist/src/mocks/connection-manager.js +145 -0
  25. package/dist/src/mocks/connection-manager.js.map +1 -0
  26. package/dist/src/mocks/connection.d.ts +32 -0
  27. package/dist/src/mocks/connection.d.ts.map +1 -0
  28. package/dist/src/mocks/connection.js +162 -0
  29. package/dist/src/mocks/connection.js.map +1 -0
  30. package/dist/src/mocks/duplex.d.ts +3 -0
  31. package/dist/src/mocks/duplex.d.ts.map +1 -0
  32. package/dist/src/mocks/duplex.js +9 -0
  33. package/dist/src/mocks/duplex.js.map +1 -0
  34. package/dist/src/mocks/index.d.ts +13 -0
  35. package/dist/src/mocks/index.d.ts.map +1 -0
  36. package/dist/src/mocks/index.js +11 -0
  37. package/dist/src/mocks/index.js.map +1 -0
  38. package/dist/src/mocks/metrics.d.ts +3 -0
  39. package/dist/src/mocks/metrics.d.ts.map +1 -0
  40. package/dist/src/mocks/metrics.js +115 -0
  41. package/dist/src/mocks/metrics.js.map +1 -0
  42. package/dist/src/mocks/multiaddr-connection.d.ts +17 -0
  43. package/dist/src/mocks/multiaddr-connection.d.ts.map +1 -0
  44. package/dist/src/mocks/multiaddr-connection.js +51 -0
  45. package/dist/src/mocks/multiaddr-connection.js.map +1 -0
  46. package/dist/src/mocks/muxer.d.ts +8 -0
  47. package/dist/src/mocks/muxer.d.ts.map +1 -0
  48. package/dist/src/mocks/muxer.js +341 -0
  49. package/dist/src/mocks/muxer.js.map +1 -0
  50. package/dist/src/mocks/peer-discovery.d.ts +22 -0
  51. package/dist/src/mocks/peer-discovery.d.ts.map +1 -0
  52. package/dist/src/mocks/peer-discovery.js +47 -0
  53. package/dist/src/mocks/peer-discovery.js.map +1 -0
  54. package/dist/src/mocks/registrar.d.ts +18 -0
  55. package/dist/src/mocks/registrar.d.ts.map +1 -0
  56. package/dist/src/mocks/registrar.js +66 -0
  57. package/dist/src/mocks/registrar.js.map +1 -0
  58. package/dist/src/mocks/upgrader.d.ts +10 -0
  59. package/dist/src/mocks/upgrader.d.ts.map +1 -0
  60. package/dist/src/mocks/upgrader.js +31 -0
  61. package/dist/src/mocks/upgrader.js.map +1 -0
  62. package/dist/src/peer-discovery/index.d.ts +5 -0
  63. package/dist/src/peer-discovery/index.d.ts.map +1 -0
  64. package/dist/src/peer-discovery/index.js +66 -0
  65. package/dist/src/peer-discovery/index.js.map +1 -0
  66. package/dist/src/stream-muxer/base-test.d.ts +5 -0
  67. package/dist/src/stream-muxer/base-test.d.ts.map +1 -0
  68. package/dist/src/stream-muxer/base-test.js +153 -0
  69. package/dist/src/stream-muxer/base-test.js.map +1 -0
  70. package/dist/src/stream-muxer/close-test.d.ts +5 -0
  71. package/dist/src/stream-muxer/close-test.d.ts.map +1 -0
  72. package/dist/src/stream-muxer/close-test.js +269 -0
  73. package/dist/src/stream-muxer/close-test.js.map +1 -0
  74. package/dist/src/stream-muxer/index.d.ts +5 -0
  75. package/dist/src/stream-muxer/index.d.ts.map +1 -0
  76. package/dist/src/stream-muxer/index.js +13 -0
  77. package/dist/src/stream-muxer/index.js.map +1 -0
  78. package/dist/src/stream-muxer/mega-stress-test.d.ts +5 -0
  79. package/dist/src/stream-muxer/mega-stress-test.d.ts.map +1 -0
  80. package/dist/src/stream-muxer/mega-stress-test.js +11 -0
  81. package/dist/src/stream-muxer/mega-stress-test.js.map +1 -0
  82. package/dist/src/stream-muxer/spawner.d.ts +4 -0
  83. package/dist/src/stream-muxer/spawner.d.ts.map +1 -0
  84. package/dist/src/stream-muxer/spawner.js +36 -0
  85. package/dist/src/stream-muxer/spawner.js.map +1 -0
  86. package/dist/src/stream-muxer/stress-test.d.ts +5 -0
  87. package/dist/src/stream-muxer/stress-test.d.ts.map +1 -0
  88. package/dist/src/stream-muxer/stress-test.js +23 -0
  89. package/dist/src/stream-muxer/stress-test.js.map +1 -0
  90. package/dist/src/transport/dial-test.d.ts +5 -0
  91. package/dist/src/transport/dial-test.d.ts.map +1 -0
  92. package/dist/src/transport/dial-test.js +98 -0
  93. package/dist/src/transport/dial-test.js.map +1 -0
  94. package/dist/src/transport/filter-test.d.ts +5 -0
  95. package/dist/src/transport/filter-test.d.ts.map +1 -0
  96. package/dist/src/transport/filter-test.js +18 -0
  97. package/dist/src/transport/filter-test.js.map +1 -0
  98. package/dist/src/transport/index.d.ts +15 -0
  99. package/dist/src/transport/index.d.ts.map +1 -0
  100. package/dist/src/transport/index.js +11 -0
  101. package/dist/src/transport/index.js.map +1 -0
  102. package/dist/src/transport/listen-test.d.ts +5 -0
  103. package/dist/src/transport/listen-test.d.ts.map +1 -0
  104. package/dist/src/transport/listen-test.js +152 -0
  105. package/dist/src/transport/listen-test.js.map +1 -0
  106. package/package.json +64 -88
  107. package/src/connection/index.ts +184 -0
  108. package/src/connection-encryption/index.ts +97 -0
  109. package/src/connection-encryption/utils/index.ts +23 -0
  110. package/src/mocks/connection-encrypter.ts +113 -0
  111. package/src/mocks/connection-gater.ts +18 -0
  112. package/src/mocks/connection-manager.ts +209 -0
  113. package/src/mocks/connection.ts +218 -0
  114. package/src/mocks/duplex.ts +10 -0
  115. package/src/mocks/index.ts +12 -0
  116. package/src/mocks/metrics.ts +162 -0
  117. package/src/mocks/multiaddr-connection.ts +67 -0
  118. package/src/mocks/muxer.ts +447 -0
  119. package/src/mocks/peer-discovery.ts +60 -0
  120. package/src/mocks/registrar.ts +88 -0
  121. package/src/mocks/upgrader.ts +49 -0
  122. package/src/peer-discovery/index.ts +90 -0
  123. package/src/stream-muxer/base-test.ts +196 -0
  124. package/src/stream-muxer/close-test.ts +346 -0
  125. package/src/stream-muxer/index.ts +15 -0
  126. package/src/stream-muxer/mega-stress-test.ts +14 -0
  127. package/src/stream-muxer/spawner.ts +54 -0
  128. package/src/stream-muxer/stress-test.ts +27 -0
  129. package/src/transport/dial-test.ts +124 -0
  130. package/src/transport/filter-test.ts +25 -0
  131. package/src/transport/index.ts +25 -0
  132. package/src/transport/listen-test.ts +191 -0
@@ -0,0 +1,218 @@
1
+ import * as STATUS from '@libp2p/interface/connection/status'
2
+ import { CodeError } from '@libp2p/interface/errors'
3
+ import { logger } from '@libp2p/logger'
4
+ import * as mss from '@libp2p/multistream-select'
5
+ import { peerIdFromString } from '@libp2p/peer-id'
6
+ import { duplexPair } from 'it-pair/duplex'
7
+ import { pipe } from 'it-pipe'
8
+ import { mockMultiaddrConnection } from './multiaddr-connection.js'
9
+ import { mockMuxer } from './muxer.js'
10
+ import { mockRegistrar } from './registrar.js'
11
+ import type { AbortOptions } from '@libp2p/interface'
12
+ import type { MultiaddrConnection, Connection, Stream, ConnectionStat, Direction } from '@libp2p/interface/connection'
13
+ import type { PeerId } from '@libp2p/interface/peer-id'
14
+ import type { StreamMuxer, StreamMuxerFactory } from '@libp2p/interface/stream-muxer'
15
+ import type { Registrar } from '@libp2p/interface-internal/registrar'
16
+ import type { Multiaddr } from '@multiformats/multiaddr'
17
+ import type { Duplex, Source } from 'it-stream-types'
18
+ import type { Uint8ArrayList } from 'uint8arraylist'
19
+
20
+ const log = logger('libp2p:mock-connection')
21
+
22
+ export interface MockConnectionOptions {
23
+ direction?: Direction
24
+ registrar?: Registrar
25
+ muxerFactory?: StreamMuxerFactory
26
+ }
27
+
28
+ interface MockConnectionInit {
29
+ remoteAddr: Multiaddr
30
+ remotePeer: PeerId
31
+ direction: Direction
32
+ maConn: MultiaddrConnection
33
+ muxer: StreamMuxer
34
+ }
35
+
36
+ class MockConnection implements Connection {
37
+ public id: string
38
+ public remoteAddr: Multiaddr
39
+ public remotePeer: PeerId
40
+ public direction: Direction
41
+ public stat: ConnectionStat
42
+ public streams: Stream[]
43
+ public tags: string[]
44
+
45
+ private readonly muxer: StreamMuxer
46
+ private readonly maConn: MultiaddrConnection
47
+
48
+ constructor (init: MockConnectionInit) {
49
+ const { remoteAddr, remotePeer, direction, maConn, muxer } = init
50
+
51
+ this.id = `mock-connection-${Math.random()}`
52
+ this.remoteAddr = remoteAddr
53
+ this.remotePeer = remotePeer
54
+ this.direction = direction
55
+ this.stat = {
56
+ status: STATUS.OPEN,
57
+ direction,
58
+ timeline: maConn.timeline,
59
+ multiplexer: 'test-multiplexer',
60
+ encryption: 'yes-yes-very-secure'
61
+ }
62
+ this.streams = []
63
+ this.tags = []
64
+ this.muxer = muxer
65
+ this.maConn = maConn
66
+ }
67
+
68
+ async newStream (protocols: string | string[], options?: AbortOptions): Promise<Stream> {
69
+ if (!Array.isArray(protocols)) {
70
+ protocols = [protocols]
71
+ }
72
+
73
+ if (protocols.length === 0) {
74
+ throw new Error('protocols must have a length')
75
+ }
76
+
77
+ if (this.stat.status !== STATUS.OPEN) {
78
+ throw new CodeError('connection must be open to create streams', 'ERR_CONNECTION_CLOSED')
79
+ }
80
+
81
+ const id = `${Math.random()}`
82
+ const stream = await this.muxer.newStream(id)
83
+ const result = await mss.select(stream, protocols, options)
84
+
85
+ const streamWithProtocol: Stream = {
86
+ ...stream,
87
+ ...result.stream,
88
+ stat: {
89
+ ...stream.stat,
90
+ direction: 'outbound',
91
+ protocol: result.protocol
92
+ }
93
+ }
94
+
95
+ this.streams.push(streamWithProtocol)
96
+
97
+ return streamWithProtocol
98
+ }
99
+
100
+ addStream (stream: Stream): void {
101
+ this.streams.push(stream)
102
+ }
103
+
104
+ removeStream (id: string): void {
105
+ this.streams = this.streams.filter(stream => stream.id !== id)
106
+ }
107
+
108
+ async close (): Promise<void> {
109
+ this.stat.status = STATUS.CLOSING
110
+ await this.maConn.close()
111
+ this.streams.forEach(s => {
112
+ s.close()
113
+ })
114
+ this.stat.status = STATUS.CLOSED
115
+ this.stat.timeline.close = Date.now()
116
+ }
117
+ }
118
+
119
+ export function mockConnection (maConn: MultiaddrConnection, opts: MockConnectionOptions = {}): Connection {
120
+ const remoteAddr = maConn.remoteAddr
121
+ const remotePeerIdStr = remoteAddr.getPeerId() ?? '12D3KooWCrhmFM1BCPGBkNzbPfDk4cjYmtAYSpZwUBC69Qg2kZyq'
122
+
123
+ if (remotePeerIdStr == null) {
124
+ throw new Error('Remote multiaddr must contain a peer id')
125
+ }
126
+
127
+ const remotePeer = peerIdFromString(remotePeerIdStr)
128
+ const direction = opts.direction ?? 'inbound'
129
+ const registrar = opts.registrar ?? mockRegistrar()
130
+ const muxerFactory = opts.muxerFactory ?? mockMuxer()
131
+
132
+ const muxer = muxerFactory.createStreamMuxer({
133
+ direction,
134
+ onIncomingStream: (muxedStream) => {
135
+ try {
136
+ mss.handle(muxedStream, registrar.getProtocols())
137
+ .then(({ stream, protocol }) => {
138
+ log('%s: incoming stream opened on %s', direction, protocol)
139
+ muxedStream = { ...muxedStream, ...stream }
140
+ muxedStream.stat.protocol = protocol
141
+
142
+ connection.addStream(muxedStream)
143
+ const { handler } = registrar.getHandler(protocol)
144
+
145
+ handler({ connection, stream: muxedStream })
146
+ }).catch(err => {
147
+ log.error(err)
148
+ })
149
+ } catch (err: any) {
150
+ log.error(err)
151
+ }
152
+ },
153
+ onStreamEnd: (muxedStream) => {
154
+ connection.removeStream(muxedStream.id)
155
+ }
156
+ })
157
+
158
+ void pipe(
159
+ maConn, muxer, maConn
160
+ )
161
+
162
+ const connection = new MockConnection({
163
+ remoteAddr,
164
+ remotePeer,
165
+ direction,
166
+ maConn,
167
+ muxer
168
+ })
169
+
170
+ return connection
171
+ }
172
+
173
+ export function mockStream (stream: Duplex<AsyncGenerator<Uint8ArrayList>, Source<Uint8ArrayList | Uint8Array>, Promise<void>>): Stream {
174
+ return {
175
+ ...stream,
176
+ close: () => {},
177
+ closeRead: () => {},
178
+ closeWrite: () => {},
179
+ abort: () => {},
180
+ reset: () => {},
181
+ stat: {
182
+ direction: 'outbound',
183
+ protocol: '/foo/1.0.0',
184
+ timeline: {
185
+ open: Date.now()
186
+ }
187
+ },
188
+ metadata: {},
189
+ id: `stream-${Date.now()}`
190
+ }
191
+ }
192
+
193
+ export interface Peer {
194
+ peerId: PeerId
195
+ registrar: Registrar
196
+ }
197
+
198
+ export function multiaddrConnectionPair (a: { peerId: PeerId, registrar: Registrar }, b: { peerId: PeerId, registrar: Registrar }): [ MultiaddrConnection, MultiaddrConnection ] {
199
+ const [peerBtoPeerA, peerAtoPeerB] = duplexPair<Uint8Array>()
200
+
201
+ return [
202
+ mockMultiaddrConnection(peerAtoPeerB, b.peerId),
203
+ mockMultiaddrConnection(peerBtoPeerA, a.peerId)
204
+ ]
205
+ }
206
+
207
+ export function connectionPair (a: { peerId: PeerId, registrar: Registrar }, b: { peerId: PeerId, registrar: Registrar }): [ Connection, Connection ] {
208
+ const [peerBtoPeerA, peerAtoPeerB] = multiaddrConnectionPair(a, b)
209
+
210
+ return [
211
+ mockConnection(peerBtoPeerA, {
212
+ registrar: a.registrar
213
+ }),
214
+ mockConnection(peerAtoPeerB, {
215
+ registrar: b.registrar
216
+ })
217
+ ]
218
+ }
@@ -0,0 +1,10 @@
1
+ import type { Duplex, Source } from 'it-stream-types'
2
+
3
+ export function mockDuplex (): Duplex<AsyncGenerator<Uint8Array>, Source<Uint8Array>, Promise<void>> {
4
+ return {
5
+ source: (async function * () {
6
+ yield * []
7
+ }()),
8
+ sink: async () => {}
9
+ }
10
+ }
@@ -0,0 +1,12 @@
1
+ export { mockConnectionEncrypter } from './connection-encrypter.js'
2
+ export { mockConnectionGater } from './connection-gater.js'
3
+ export { mockConnectionManager, mockNetwork } from './connection-manager.js'
4
+ export { mockConnection, mockStream, connectionPair } from './connection.js'
5
+ export { mockMultiaddrConnection, mockMultiaddrConnPair } from './multiaddr-connection.js'
6
+ export { mockMuxer } from './muxer.js'
7
+ export { mockRegistrar } from './registrar.js'
8
+ export { mockUpgrader } from './upgrader.js'
9
+ export { mockDuplex } from './duplex.js'
10
+ export { mockMetrics } from './metrics.js'
11
+ export type { MockUpgraderInit } from './upgrader.js'
12
+ export type { MockNetworkComponents } from './connection-manager.js'
@@ -0,0 +1,162 @@
1
+ import type { MultiaddrConnection, Stream, Connection } from '@libp2p/interface/connection'
2
+ import type { Metric, MetricGroup, StopTimer, Metrics, CalculatedMetricOptions, MetricOptions } from '@libp2p/interface/metrics'
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 MockMetrics implements Metrics {
73
+ public metrics = new Map<string, any>()
74
+
75
+ trackMultiaddrConnection (maConn: MultiaddrConnection): void {
76
+
77
+ }
78
+
79
+ trackProtocolStream (stream: Stream, connection: Connection): void {
80
+
81
+ }
82
+
83
+ registerMetric (name: string, opts: CalculatedMetricOptions): void
84
+ registerMetric (name: string, opts?: MetricOptions): Metric
85
+ registerMetric (name: string, opts: any): any {
86
+ if (name == null ?? name.trim() === '') {
87
+ throw new Error('Metric name is required')
88
+ }
89
+
90
+ if (opts?.calculate != null) {
91
+ // calculated metric
92
+ this.metrics.set(name, opts.calculate)
93
+ return
94
+ }
95
+
96
+ const metric = new DefaultMetric()
97
+ this.metrics.set(name, metric)
98
+
99
+ return metric
100
+ }
101
+
102
+ registerCounter (name: string, opts: CalculatedMetricOptions): void
103
+ registerCounter (name: string, opts?: MetricOptions): Metric
104
+ registerCounter (name: string, opts: any): any {
105
+ if (name == null ?? name.trim() === '') {
106
+ throw new Error('Metric name is required')
107
+ }
108
+
109
+ if (opts?.calculate != null) {
110
+ // calculated metric
111
+ this.metrics.set(name, opts.calculate)
112
+ return
113
+ }
114
+
115
+ const metric = new DefaultMetric()
116
+ this.metrics.set(name, metric)
117
+
118
+ return metric
119
+ }
120
+
121
+ registerMetricGroup (name: string, opts: CalculatedMetricOptions<Record<string, number>>): void
122
+ registerMetricGroup (name: string, opts?: MetricOptions): MetricGroup
123
+ registerMetricGroup (name: string, opts: any): any {
124
+ if (name == null ?? name.trim() === '') {
125
+ throw new Error('Metric name is required')
126
+ }
127
+
128
+ if (opts?.calculate != null) {
129
+ // calculated metric
130
+ this.metrics.set(name, opts.calculate)
131
+ return
132
+ }
133
+
134
+ const metric = new DefaultGroupMetric()
135
+ this.metrics.set(name, metric)
136
+
137
+ return metric
138
+ }
139
+
140
+ registerCounterGroup (name: string, opts: CalculatedMetricOptions<Record<string, number>>): void
141
+ registerCounterGroup (name: string, opts?: MetricOptions): MetricGroup
142
+ registerCounterGroup (name: string, opts: any): any {
143
+ if (name == null ?? name.trim() === '') {
144
+ throw new Error('Metric name is required')
145
+ }
146
+
147
+ if (opts?.calculate != null) {
148
+ // calculated metric
149
+ this.metrics.set(name, opts.calculate)
150
+ return
151
+ }
152
+
153
+ const metric = new DefaultGroupMetric()
154
+ this.metrics.set(name, metric)
155
+
156
+ return metric
157
+ }
158
+ }
159
+
160
+ export function mockMetrics (): () => Metrics {
161
+ return () => new MockMetrics()
162
+ }
@@ -0,0 +1,67 @@
1
+ import { multiaddr } from '@multiformats/multiaddr'
2
+ import { abortableSource } from 'abortable-iterator'
3
+ import { duplexPair } from 'it-pair/duplex'
4
+ import type { MultiaddrConnection } from '@libp2p/interface/connection'
5
+ import type { PeerId } from '@libp2p/interface/peer-id'
6
+ import type { Multiaddr } from '@multiformats/multiaddr'
7
+ import type { Duplex } from 'it-stream-types'
8
+
9
+ export function mockMultiaddrConnection (source: Duplex<AsyncGenerator<Uint8Array>> & Partial<MultiaddrConnection>, peerId: PeerId): MultiaddrConnection {
10
+ const maConn: MultiaddrConnection = {
11
+ async close () {
12
+
13
+ },
14
+ timeline: {
15
+ open: Date.now()
16
+ },
17
+ remoteAddr: multiaddr(`/ip4/127.0.0.1/tcp/4001/p2p/${peerId.toString()}`),
18
+ ...source
19
+ }
20
+
21
+ return maConn
22
+ }
23
+
24
+ export interface MockMultiaddrConnPairOptions {
25
+ addrs: Multiaddr[]
26
+ remotePeer: PeerId
27
+ }
28
+
29
+ /**
30
+ * Returns both sides of a mocked MultiaddrConnection
31
+ */
32
+ export function mockMultiaddrConnPair (opts: MockMultiaddrConnPairOptions): { inbound: MultiaddrConnection, outbound: MultiaddrConnection } {
33
+ const { addrs, remotePeer } = opts
34
+ const controller = new AbortController()
35
+ const [localAddr, remoteAddr] = addrs
36
+ const [inboundStream, outboundStream] = duplexPair<Uint8Array>()
37
+
38
+ const outbound: MultiaddrConnection = {
39
+ ...outboundStream,
40
+ remoteAddr: remoteAddr.toString().includes(`/p2p/${remotePeer.toString()}`) ? remoteAddr : remoteAddr.encapsulate(`/p2p/${remotePeer.toString()}`),
41
+ timeline: {
42
+ open: Date.now()
43
+ },
44
+ close: async () => {
45
+ outbound.timeline.close = Date.now()
46
+ controller.abort()
47
+ }
48
+ }
49
+
50
+ const inbound: MultiaddrConnection = {
51
+ ...inboundStream,
52
+ remoteAddr: localAddr,
53
+ timeline: {
54
+ open: Date.now()
55
+ },
56
+ close: async () => {
57
+ inbound.timeline.close = Date.now()
58
+ controller.abort()
59
+ }
60
+ }
61
+
62
+ // Make the sources abortable so we can close them easily
63
+ inbound.source = abortableSource(inbound.source, controller.signal)
64
+ outbound.source = abortableSource(outbound.source, controller.signal)
65
+
66
+ return { inbound, outbound }
67
+ }