@libp2p/interface-compliance-tests 1.0.5 → 1.1.0

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 (63) hide show
  1. package/dist/src/connection/connection.d.ts.map +1 -1
  2. package/dist/src/connection/connection.js +0 -2
  3. package/dist/src/connection/connection.js.map +1 -1
  4. package/dist/src/crypto/utils/index.d.ts.map +1 -1
  5. package/dist/src/crypto/utils/index.js +0 -1
  6. package/dist/src/crypto/utils/index.js.map +1 -1
  7. package/dist/src/stream-muxer/base-test.d.ts.map +1 -1
  8. package/dist/src/stream-muxer/base-test.js +23 -17
  9. package/dist/src/stream-muxer/base-test.js.map +1 -1
  10. package/dist/src/stream-muxer/close-test.d.ts.map +1 -1
  11. package/dist/src/stream-muxer/close-test.js +14 -26
  12. package/dist/src/stream-muxer/close-test.js.map +1 -1
  13. package/dist/src/stream-muxer/index.d.ts +2 -2
  14. package/dist/src/stream-muxer/index.d.ts.map +1 -1
  15. package/dist/src/stream-muxer/index.js.map +1 -1
  16. package/dist/src/stream-muxer/mega-stress-test.js +1 -1
  17. package/dist/src/stream-muxer/mega-stress-test.js.map +1 -1
  18. package/dist/src/stream-muxer/spawner.js +2 -2
  19. package/dist/src/stream-muxer/spawner.js.map +1 -1
  20. package/dist/src/stream-muxer/stress-test.js +1 -1
  21. package/dist/src/stream-muxer/stress-test.js.map +1 -1
  22. package/dist/src/transport/dial-test.js +1 -1
  23. package/dist/src/transport/dial-test.js.map +1 -1
  24. package/dist/src/transport/utils/index.d.ts +9 -2
  25. package/dist/src/transport/utils/index.d.ts.map +1 -1
  26. package/dist/src/transport/utils/index.js +61 -26
  27. package/dist/src/transport/utils/index.js.map +1 -1
  28. package/dist/src/utils/mock-connection-gater.d.ts +12 -0
  29. package/dist/src/utils/mock-connection-gater.d.ts.map +1 -0
  30. package/dist/src/utils/mock-connection-gater.js +14 -0
  31. package/dist/src/utils/mock-connection-gater.js.map +1 -0
  32. package/dist/src/utils/mock-connection.d.ts +5 -0
  33. package/dist/src/utils/mock-connection.d.ts.map +1 -0
  34. package/dist/src/utils/mock-connection.js +52 -0
  35. package/dist/src/utils/mock-connection.js.map +1 -0
  36. package/dist/src/utils/mock-multiaddr-connection.d.ts +4 -0
  37. package/dist/src/utils/mock-multiaddr-connection.d.ts.map +1 -0
  38. package/dist/src/utils/mock-multiaddr-connection.js +14 -0
  39. package/dist/src/utils/mock-multiaddr-connection.js.map +1 -0
  40. package/dist/src/utils/mock-muxer.d.ts +3 -0
  41. package/dist/src/utils/mock-muxer.d.ts.map +1 -0
  42. package/dist/src/utils/mock-muxer.js +37 -0
  43. package/dist/src/utils/mock-muxer.js.map +1 -0
  44. package/dist/src/utils/mock-upgrader.d.ts +7 -0
  45. package/dist/src/utils/mock-upgrader.d.ts.map +1 -0
  46. package/dist/src/utils/mock-upgrader.js +24 -0
  47. package/dist/src/utils/mock-upgrader.js.map +1 -0
  48. package/package.json +34 -7
  49. package/src/connection/connection.ts +0 -2
  50. package/src/crypto/utils/index.ts +0 -1
  51. package/src/stream-muxer/base-test.ts +37 -26
  52. package/src/stream-muxer/close-test.ts +14 -28
  53. package/src/stream-muxer/index.ts +2 -2
  54. package/src/stream-muxer/mega-stress-test.ts +1 -1
  55. package/src/stream-muxer/spawner.ts +2 -2
  56. package/src/stream-muxer/stress-test.ts +1 -1
  57. package/src/transport/dial-test.ts +1 -1
  58. package/src/transport/utils/index.ts +86 -35
  59. package/src/utils/mock-connection-gater.ts +14 -0
  60. package/src/utils/mock-connection.ts +66 -0
  61. package/src/utils/mock-multiaddr-connection.ts +18 -0
  62. package/src/utils/mock-muxer.ts +43 -0
  63. package/src/utils/mock-upgrader.ts +33 -0
@@ -1,10 +1,16 @@
1
1
  import { expect } from 'aegir/utils/chai.js'
2
- import type { Upgrader, MultiaddrConnection } from '@libp2p/interfaces/transport'
3
- import type { Connection, StreamData } from '@libp2p/interfaces/connection'
4
- import type { MuxedStream } from '@libp2p/interfaces/stream-muxer'
5
2
  import { pair } from 'it-pair'
6
3
  import { PeerId } from '@libp2p/peer-id'
7
4
  import * as PeerIdFactory from '@libp2p/peer-id-factory'
5
+ import { pushable } from 'it-pushable'
6
+ import drain from 'it-drain'
7
+ import { Multiaddr } from '@multiformats/multiaddr'
8
+ import { pipe } from 'it-pipe'
9
+ import type { Upgrader, MultiaddrConnection } from '@libp2p/interfaces/transport'
10
+ import type { Connection, Stream, Metadata, ProtocolStream } from '@libp2p/interfaces/connection'
11
+ import type { Muxer } from '@libp2p/interfaces/stream-muxer'
12
+ import type { Duplex } from 'it-stream-types'
13
+
8
14
  /**
9
15
  * A tick is considered valid if it happened between now
10
16
  * and `ms` milliseconds ago
@@ -23,51 +29,105 @@ export function isValidTick (date?: number, ms: number = 5000) {
23
29
  return false
24
30
  }
25
31
 
26
- export function mockUpgrader () {
32
+ export function mockMultiaddrConnection (source: Duplex<Uint8Array>): MultiaddrConnection {
33
+ const maConn: MultiaddrConnection = {
34
+ ...source,
35
+ async close () {
36
+
37
+ },
38
+ timeline: {
39
+ open: Date.now()
40
+ },
41
+ remoteAddr: new Multiaddr('/ip4/127.0.0.1/tcp/4001')
42
+ }
43
+
44
+ return maConn
45
+ }
46
+
47
+ export function mockMuxer (): Muxer {
48
+ let streamId = 0
49
+ let streams: Stream[] = []
50
+ const p = pushable<Uint8Array>()
51
+
52
+ const muxer: Muxer = {
53
+ source: p,
54
+ sink: async (source) => {
55
+ await drain(source)
56
+ },
57
+ get streams () {
58
+ return streams
59
+ },
60
+ newStream: (name?: string) => {
61
+ const echo = pair<Uint8Array>()
62
+
63
+ const id = `${streamId++}`
64
+ const stream: Stream = {
65
+ id,
66
+ sink: echo.sink,
67
+ source: echo.source,
68
+ close: () => {
69
+ streams = streams.filter(s => s !== stream)
70
+ },
71
+ abort: () => {},
72
+ reset: () => {},
73
+ timeline: {
74
+ open: 0
75
+ }
76
+ }
77
+
78
+ return stream
79
+ }
80
+ }
81
+
82
+ return muxer
83
+ }
84
+
85
+ export interface MockUpgraderOptions {
86
+ muxer?: Muxer
87
+ }
88
+
89
+ export function mockUpgrader (options: MockUpgraderOptions = {}) {
27
90
  const ensureProps = (multiaddrConnection: MultiaddrConnection) => {
28
- ['sink', 'source', 'remoteAddr', 'conn', 'timeline', 'close'].forEach(prop => {
91
+ ['sink', 'source', 'remoteAddr', 'timeline', 'close'].forEach(prop => {
29
92
  expect(multiaddrConnection).to.have.property(prop)
30
93
  })
31
94
  expect(isValidTick(multiaddrConnection.timeline.open)).to.equal(true)
32
95
  return multiaddrConnection
33
96
  }
97
+
98
+ const muxer = options.muxer ?? mockMuxer()
99
+
34
100
  const upgrader: Upgrader = {
35
101
  async upgradeOutbound (multiaddrConnection) {
36
102
  ensureProps(multiaddrConnection)
37
- return await createConnection(multiaddrConnection, 'outbound')
103
+ return await createConnection(multiaddrConnection, 'outbound', muxer)
38
104
  },
39
105
  async upgradeInbound (multiaddrConnection) {
40
106
  ensureProps(multiaddrConnection)
41
- return await createConnection(multiaddrConnection, 'inbound')
107
+ return await createConnection(multiaddrConnection, 'inbound', muxer)
42
108
  }
43
109
  }
44
110
 
45
111
  return upgrader
46
112
  }
47
113
 
48
- async function createConnection (maConn: MultiaddrConnection, direction: 'inbound' | 'outbound'): Promise<Connection> {
49
- const localAddr = maConn.localAddr
114
+ async function createConnection (maConn: MultiaddrConnection, direction: 'inbound' | 'outbound', muxer: Muxer): Promise<Connection> {
50
115
  const remoteAddr = maConn.remoteAddr
51
-
52
- if (localAddr == null) {
53
- throw new Error('No localAddr found on MultiaddrConnection')
54
- }
55
-
56
- const localPeerIdStr = localAddr.getPeerId()
57
116
  const remotePeerIdStr = remoteAddr.getPeerId()
58
- const localPeer = localPeerIdStr != null ? PeerId.fromString(localPeerIdStr) : await PeerIdFactory.createEd25519PeerId()
59
117
  const remotePeer = remotePeerIdStr != null ? PeerId.fromString(remotePeerIdStr) : await PeerIdFactory.createEd25519PeerId()
60
118
 
61
- const streams: MuxedStream[] = []
119
+ const streams: Stream[] = []
62
120
  let streamId = 0
63
121
 
64
122
  const registry = new Map()
65
123
 
124
+ void pipe(
125
+ maConn, muxer, maConn
126
+ )
127
+
66
128
  return {
67
129
  id: 'mock-connection',
68
- localAddr,
69
130
  remoteAddr,
70
- localPeer,
71
131
  remotePeer,
72
132
  stat: {
73
133
  status: 'OPEN',
@@ -80,26 +140,17 @@ async function createConnection (maConn: MultiaddrConnection, direction: 'inboun
80
140
  tags: [],
81
141
  streams,
82
142
  newStream: async (protocols) => {
143
+ if (!Array.isArray(protocols)) {
144
+ protocols = [protocols]
145
+ }
146
+
83
147
  if (protocols.length === 0) {
84
148
  throw new Error('protocols must have a length')
85
149
  }
86
150
 
87
- const echo = pair<Uint8Array>()
88
-
89
151
  const id = `${streamId++}`
90
- const stream: MuxedStream = {
91
- id,
92
- sink: echo.sink,
93
- source: echo.source,
94
- close: () => {},
95
- abort: () => {},
96
- reset: () => {},
97
- timeline: {
98
- open: 0
99
- }
100
- }
101
-
102
- const streamData = {
152
+ const stream: Stream = muxer.newStream(id)
153
+ const streamData: ProtocolStream = {
103
154
  protocol: protocols[0],
104
155
  stream
105
156
  }
@@ -108,7 +159,7 @@ async function createConnection (maConn: MultiaddrConnection, direction: 'inboun
108
159
 
109
160
  return streamData
110
161
  },
111
- addStream: (muxedStream: MuxedStream, streamData: StreamData) => {
162
+ addStream: (stream: Stream, metadata: Metadata) => {
112
163
 
113
164
  },
114
165
  removeStream: (id: string) => {
@@ -0,0 +1,14 @@
1
+
2
+ export function mockConnectionGater () {
3
+ return {
4
+ denyDialPeer: async () => await Promise.resolve(false),
5
+ denyDialMultiaddr: async () => await Promise.resolve(false),
6
+ denyInboundConnection: async () => await Promise.resolve(false),
7
+ denyOutboundConnection: async () => await Promise.resolve(false),
8
+ denyInboundEncryptedConnection: async () => await Promise.resolve(false),
9
+ denyOutboundEncryptedConnection: async () => await Promise.resolve(false),
10
+ denyInboundUpgradedConnection: async () => await Promise.resolve(false),
11
+ denyOutboundUpgradedConnection: async () => await Promise.resolve(false),
12
+ filterMultiaddrForPeer: async () => await Promise.resolve(true)
13
+ }
14
+ }
@@ -0,0 +1,66 @@
1
+ import { PeerId } from '@libp2p/peer-id'
2
+ import { createEd25519PeerId } from '@libp2p/peer-id-factory'
3
+ import { pipe } from 'it-pipe'
4
+ import type { MultiaddrConnection } from '@libp2p/interfaces/transport'
5
+ import type { Connection, Stream, Metadata, ProtocolStream } from '@libp2p/interfaces/connection'
6
+ import type { Muxer } from '@libp2p/interfaces/stream-muxer'
7
+
8
+ export async function mockConnection (maConn: MultiaddrConnection, direction: 'inbound' | 'outbound', muxer: Muxer): Promise<Connection> {
9
+ const remoteAddr = maConn.remoteAddr
10
+ const remotePeerIdStr = remoteAddr.getPeerId()
11
+ const remotePeer = remotePeerIdStr != null ? PeerId.fromString(remotePeerIdStr) : await createEd25519PeerId()
12
+
13
+ const streams: Stream[] = []
14
+ let streamId = 0
15
+
16
+ const registry = new Map()
17
+
18
+ void pipe(
19
+ maConn, muxer, maConn
20
+ )
21
+
22
+ return {
23
+ id: 'mock-connection',
24
+ remoteAddr,
25
+ remotePeer,
26
+ stat: {
27
+ status: 'OPEN',
28
+ direction,
29
+ timeline: maConn.timeline,
30
+ multiplexer: 'test-multiplexer',
31
+ encryption: 'yes-yes-very-secure'
32
+ },
33
+ registry,
34
+ tags: [],
35
+ streams,
36
+ newStream: async (protocols) => {
37
+ if (!Array.isArray(protocols)) {
38
+ protocols = [protocols]
39
+ }
40
+
41
+ if (protocols.length === 0) {
42
+ throw new Error('protocols must have a length')
43
+ }
44
+
45
+ const id = `${streamId++}`
46
+ const stream: Stream = muxer.newStream(id)
47
+ const streamData: ProtocolStream = {
48
+ protocol: protocols[0],
49
+ stream
50
+ }
51
+
52
+ registry.set(id, streamData)
53
+
54
+ return streamData
55
+ },
56
+ addStream: (stream: Stream, metadata: Metadata) => {
57
+
58
+ },
59
+ removeStream: (id: string) => {
60
+ registry.delete(id)
61
+ },
62
+ close: async () => {
63
+ await maConn.close()
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,18 @@
1
+ import { Multiaddr } from '@multiformats/multiaddr'
2
+ import type { MultiaddrConnection } from '@libp2p/interfaces/transport'
3
+ import type { Duplex } from 'it-stream-types'
4
+
5
+ export function mockMultiaddrConnection (source: Duplex<Uint8Array>): MultiaddrConnection {
6
+ const maConn: MultiaddrConnection = {
7
+ ...source,
8
+ async close () {
9
+
10
+ },
11
+ timeline: {
12
+ open: Date.now()
13
+ },
14
+ remoteAddr: new Multiaddr('/ip4/127.0.0.1/tcp/4001')
15
+ }
16
+
17
+ return maConn
18
+ }
@@ -0,0 +1,43 @@
1
+ import { pair } from 'it-pair'
2
+ import { pushable } from 'it-pushable'
3
+ import drain from 'it-drain'
4
+ import type { Stream } from '@libp2p/interfaces/connection'
5
+ import type { Muxer } from '@libp2p/interfaces/stream-muxer'
6
+
7
+ export function mockMuxer (): Muxer {
8
+ let streamId = 0
9
+ let streams: Stream[] = []
10
+ const p = pushable<Uint8Array>()
11
+
12
+ const muxer: Muxer = {
13
+ source: p,
14
+ sink: async (source) => {
15
+ await drain(source)
16
+ },
17
+ get streams () {
18
+ return streams
19
+ },
20
+ newStream: (name?: string) => {
21
+ const echo = pair<Uint8Array>()
22
+
23
+ const id = `${streamId++}`
24
+ const stream: Stream = {
25
+ id,
26
+ sink: echo.sink,
27
+ source: echo.source,
28
+ close: () => {
29
+ streams = streams.filter(s => s !== stream)
30
+ },
31
+ abort: () => {},
32
+ reset: () => {},
33
+ timeline: {
34
+ open: 0
35
+ }
36
+ }
37
+
38
+ return stream
39
+ }
40
+ }
41
+
42
+ return muxer
43
+ }
@@ -0,0 +1,33 @@
1
+ import { expect } from 'aegir/utils/chai.js'
2
+ import { mockMuxer } from './mock-muxer.js'
3
+ import { mockConnection } from './mock-connection.js'
4
+ import type { Upgrader, MultiaddrConnection } from '@libp2p/interfaces/transport'
5
+ import type { Muxer } from '@libp2p/interfaces/stream-muxer'
6
+
7
+ export interface MockUpgraderOptions {
8
+ muxer?: Muxer
9
+ }
10
+
11
+ export function mockUpgrader (options: MockUpgraderOptions = {}) {
12
+ const ensureProps = (multiaddrConnection: MultiaddrConnection) => {
13
+ ['sink', 'source', 'remoteAddr', 'timeline', 'close'].forEach(prop => {
14
+ expect(multiaddrConnection).to.have.property(prop)
15
+ })
16
+ return multiaddrConnection
17
+ }
18
+
19
+ const muxer = options.muxer ?? mockMuxer()
20
+
21
+ const upgrader: Upgrader = {
22
+ async upgradeOutbound (multiaddrConnection) {
23
+ ensureProps(multiaddrConnection)
24
+ return await mockConnection(multiaddrConnection, 'outbound', muxer)
25
+ },
26
+ async upgradeInbound (multiaddrConnection) {
27
+ ensureProps(multiaddrConnection)
28
+ return await mockConnection(multiaddrConnection, 'inbound', muxer)
29
+ }
30
+ }
31
+
32
+ return upgrader
33
+ }