1
- 'use strict'
2
-
3
- const net = require ( 'net' )
4
- const mafmt = require ( 'mafmt' )
5
- // Missing Type
6
- // @ts -ignore
7
- const withIs = require ( 'class-is' )
8
- const errCode = require ( 'err-code' )
9
- const log = require ( 'debug' ) ( 'libp2p:tcp' )
10
- const toConnection = require ( './socket-to-conn' )
11
- const createListener = require ( './listener' )
12
- const { multiaddrToNetConfig } = require ( './utils' )
13
- const { AbortError } = require ( 'abortable-iterator' )
14
- const { CODE_CIRCUIT , CODE_P2P } = require ( './constants' )
1
+ import net from 'net'
2
+ import mafmt from 'mafmt'
3
+ import errCode from 'err-code'
4
+ import debug from 'debug'
5
+ import { toConnection } from './socket-to-conn.js'
6
+ import { createListener } from './listener.js'
7
+ import { multiaddrToNetConfig } from './utils.js'
8
+ import { AbortError } from 'abortable-iterator'
9
+ import { CODE_CIRCUIT , CODE_P2P } from './constants.js'
10
+ import type { Transport , Upgrader } from 'libp2p-interfaces/transport'
11
+ import type { Connection } from 'libp2p-interfaces/connection'
12
+ import type { Multiaddr } from 'multiaddr'
13
+ import type { Socket } from 'net'
14
+
15
+ const log = debug ( 'libp2p:tcp' )
15
16
16
17
/**
17
18
* @typedef {import('multiaddr').Multiaddr } Multiaddr
@@ -21,28 +22,28 @@ const { CODE_CIRCUIT, CODE_P2P } = require('./constants')
21
22
* @typedef {import('net').Socket } Socket
22
23
*/
23
24
24
- class TCP {
25
- /**
26
- * @class
27
- * @param {object } options
28
- * @param {Upgrader } options.upgrader
29
- */
30
- constructor ( { upgrader } ) {
31
- if ( ! upgrader ) {
25
+ interface TCPOptions {
26
+ upgrader : Upgrader
27
+ }
28
+
29
+ interface DialOptions {
30
+ signal ?: AbortSignal
31
+ }
32
+
33
+ export default class TCP implements Transport < DialOptions , { } > {
34
+ private readonly _upgrader : Upgrader
35
+
36
+ constructor ( options : TCPOptions ) {
37
+ const { upgrader } = options
38
+
39
+ if ( upgrader == null ) {
32
40
throw new Error ( 'An upgrader must be provided. See https://github.com/libp2p/interface-transport#upgrader.' )
33
41
}
42
+
34
43
this . _upgrader = upgrader
35
44
}
36
45
37
- /**
38
- * @async
39
- * @param {Multiaddr } ma
40
- * @param {object } options
41
- * @param {AbortSignal } [options.signal] - Used to abort dial requests
42
- * @returns {Promise<Connection> } An upgraded Connection
43
- */
44
- async dial ( ma , options ) {
45
- options = options || { }
46
+ async dial ( ma : Multiaddr , options : DialOptions = { } ) {
46
47
const socket = await this . _connect ( ma , options )
47
48
const maConn = toConnection ( socket , { remoteAddr : ma , signal : options . signal } )
48
49
log ( 'new outbound connection %s' , maConn . remoteAddr )
@@ -51,32 +52,27 @@ class TCP {
51
52
return conn
52
53
}
53
54
54
- /**
55
- * @private
56
- * @param {Multiaddr } ma
57
- * @param {object } options
58
- * @param {AbortSignal } [options.signal] - Used to abort dial requests
59
- * @returns {Promise<Socket> } Resolves a TCP Socket
60
- */
61
- _connect ( ma , options = { } ) {
62
- if ( options . signal && options . signal . aborted ) {
55
+ async _connect ( ma : Multiaddr , options : DialOptions = { } ) {
56
+ if ( options . signal ?. aborted === true ) {
63
57
throw new AbortError ( )
64
58
}
65
59
66
- return new Promise ( ( resolve , reject ) => {
60
+ return await new Promise < Socket > ( ( resolve , reject ) => {
67
61
const start = Date . now ( )
68
62
const cOpts = multiaddrToNetConfig ( ma )
69
63
70
64
log ( 'dialing %j' , cOpts )
71
65
const rawSocket = net . connect ( cOpts )
72
66
73
- const onError = /** @param { Error } err */ err => {
67
+ const onError = ( err : Error ) => {
74
68
err . message = `connection error ${ cOpts . host } :${ cOpts . port } : ${ err . message } `
69
+
75
70
done ( err )
76
71
}
77
72
78
73
const onTimeout = ( ) => {
79
74
log ( 'connection timeout %s:%s' , cOpts . host , cOpts . port )
75
+
80
76
const err = errCode ( new Error ( `connection timeout after ${ Date . now ( ) - start } ms` ) , 'ERR_CONNECT_TIMEOUT' )
81
77
// Note: this will result in onError() being called
82
78
rawSocket . emit ( 'error' , err )
@@ -93,52 +89,45 @@ class TCP {
93
89
done ( new AbortError ( ) )
94
90
}
95
91
96
- const done = /** @param { Error } [ err] */ err => {
92
+ const done = ( err ?: any ) => {
97
93
rawSocket . removeListener ( 'error' , onError )
98
94
rawSocket . removeListener ( 'timeout' , onTimeout )
99
95
rawSocket . removeListener ( 'connect' , onConnect )
100
- options . signal && options . signal . removeEventListener ( 'abort' , onAbort )
101
96
102
- if ( err ) return reject ( err )
97
+ if ( options . signal != null ) {
98
+ options . signal . removeEventListener ( 'abort' , onAbort )
99
+ }
100
+
101
+ if ( err != null ) {
102
+ return reject ( err )
103
+ }
104
+
103
105
resolve ( rawSocket )
104
106
}
105
107
106
108
rawSocket . on ( 'error' , onError )
107
109
rawSocket . on ( 'timeout' , onTimeout )
108
110
rawSocket . on ( 'connect' , onConnect )
109
- options . signal && options . signal . addEventListener ( 'abort' , onAbort )
111
+
112
+ if ( options . signal != null ) {
113
+ options . signal . addEventListener ( 'abort' , onAbort )
114
+ }
110
115
} )
111
116
}
112
117
113
118
/**
114
119
* Creates a TCP listener. The provided `handler` function will be called
115
120
* anytime a new incoming Connection has been successfully upgraded via
116
121
* `upgrader.upgradeInbound`.
117
- *
118
- * @param {* | function(Connection):void } options
119
- * @param {function(Connection):void } [handler]
120
- * @returns {Listener } A TCP listener
121
122
*/
122
- createListener ( options , handler ) {
123
- let listenerHandler
124
-
125
- if ( typeof options === 'function' ) {
126
- listenerHandler = options
127
- options = { }
128
- } else {
129
- listenerHandler = handler
130
- }
131
- options = options || { }
132
- return createListener ( { handler : listenerHandler , upgrader : this . _upgrader } , options )
123
+ createListener ( options : { } , handler ?: ( connection : Connection ) => void ) {
124
+ return createListener ( { handler : handler , upgrader : this . _upgrader } )
133
125
}
134
126
135
127
/**
136
128
* Takes a list of `Multiaddr`s and returns only valid TCP addresses
137
- *
138
- * @param {Multiaddr[] } multiaddrs
139
- * @returns {Multiaddr[] } Valid TCP multiaddrs
140
129
*/
141
- filter ( multiaddrs ) {
130
+ filter ( multiaddrs : Multiaddr [ ] ) {
142
131
multiaddrs = Array . isArray ( multiaddrs ) ? multiaddrs : [ multiaddrs ]
143
132
144
133
return multiaddrs . filter ( ma => {
@@ -150,7 +139,3 @@ class TCP {
150
139
} )
151
140
}
152
141
}
153
-
154
- const TCPWithIs = withIs ( TCP , { className : 'TCP' , symbolName : '@libp2p/js-libp2p-tcp/tcp' } )
155
-
156
- exports = module . exports = TCPWithIs
0 commit comments