1
- 'use strict'
2
-
3
- const assert = require ( 'debug' )
4
- const debug = require ( 'debug' )
5
- const log = debug ( 'libp2p:webrtcdirect' )
6
- log . error = debug ( 'libp2p:webrtcdirect:error' )
7
- const errcode = require ( 'err-code' )
8
-
9
- const wrtc = require ( 'wrtc' )
10
- const SimplePeer = require ( 'libp2p-webrtc-peer' )
11
- const isNode = require ( 'detect-node' )
12
- const mafmt = require ( 'mafmt' )
13
- const { base58btc } = require ( 'multiformats/bases/base58' )
14
- const { fetch } = require ( 'native-fetch' )
15
- const withIs = require ( 'class-is' )
16
- const { AbortError } = require ( 'abortable-iterator' )
17
- const { toString } = require ( 'uint8arrays/to-string' )
18
- const { fromString } = require ( 'uint8arrays/from-string' )
19
-
20
- const { CODE_CIRCUIT , CODE_P2P } = require ( './constants' )
21
- const toConnection = require ( './socket-to-conn' )
22
- const createListener = require ( './listener' )
23
-
24
- function noop ( ) { }
25
-
26
- /**
27
- * @typedef {import('multiaddr').Multiaddr } Multiaddr
28
- */
29
-
30
- class WebRTCDirect {
31
- /**
32
- * @class
33
- * @param {object } options
34
- * @param {Upgrader } options.upgrader
35
- */
36
- constructor ( { upgrader } ) {
37
- assert ( upgrader , 'An upgrader must be provided. See https://github.com/libp2p/interface-transport#upgrader.' )
1
+ import { logger } from '@libp2p/logger'
2
+ import errcode from 'err-code'
3
+ // @ts -expect-error no types
4
+ import wrtc from 'wrtc'
5
+ // @ts -expect-error no types
6
+ import SimplePeer from 'libp2p-webrtc-peer'
7
+ // @ts -expect-error no types
8
+ import isNode from 'detect-node'
9
+ import mafmt from 'mafmt'
10
+ import { base58btc } from 'multiformats/bases/base58'
11
+ import { fetch } from 'native-fetch'
12
+ import { AbortError } from 'abortable-iterator'
13
+ import { toString } from 'uint8arrays/to-string'
14
+ import { fromString } from 'uint8arrays/from-string'
15
+ import { CODE_CIRCUIT , CODE_P2P } from './constants'
16
+ import { toMultiaddrConnection } from './socket-to-conn'
17
+ import { createListener } from './listener'
18
+
19
+ import type { AbortOptions } from '@libp2p/interfaces'
20
+ import type { Listener , ListenerOptions , Transport , Upgrader } from '@libp2p/interfaces/transport'
21
+ import type { Multiaddr } from '@multiformats/multiaddr'
22
+
23
+ const log = logger ( 'libp2p:webrtcdirect' )
24
+
25
+ export interface WebRTCDirectListenerOptions extends ListenerOptions {
26
+ channelOptions ?: Object
27
+ }
28
+
29
+ export class WebRTCDirect implements Transport < AbortOptions , ListenerOptions > {
30
+ private readonly _upgrader : Upgrader
31
+
32
+ constructor ( options : { upgrader : Upgrader } ) {
33
+ const { upgrader } = options
34
+
35
+ if ( upgrader == null ) {
36
+ throw new Error ( 'An upgrader must be provided. See https://github.com/libp2p/interface-transport#upgrader.' )
37
+ }
38
+
38
39
this . _upgrader = upgrader
39
40
}
40
41
41
- /**
42
- * @param {Multiaddr } ma
43
- * @param {object } options
44
- * @param {AbortSignal } options.signal - Used to abort dial requests
45
- * @returns {Promise<Connection> } An upgraded Connection
46
- */
47
- async dial ( ma , options = { } ) {
42
+ async dial ( ma : Multiaddr , options : AbortOptions = { } ) {
48
43
const socket = await this . _connect ( ma , options )
49
- const maConn = toConnection ( socket , { remoteAddr : ma , signal : options . signal } )
44
+ const maConn = toMultiaddrConnection ( socket , { remoteAddr : ma , signal : options . signal } )
50
45
log ( 'new outbound connection %s' , maConn . remoteAddr )
51
46
const conn = await this . _upgrader . upgradeOutbound ( maConn )
52
47
log ( 'outbound connection %s upgraded' , maConn . remoteAddr )
53
48
return conn
54
49
}
55
50
56
- /**
57
- * @private
58
- * @param {Multiaddr } ma
59
- * @param {object } options
60
- * @param {AbortSignal } options.signal - Used to abort dial requests
61
- * @returns {Promise<SimplePeer> } Resolves a SimplePeer Webrtc channel
62
- */
63
- _connect ( ma , options = { } ) {
51
+ async _connect ( ma : Multiaddr , options :any = { } ) {
64
52
if ( options . signal && options . signal . aborted ) {
65
53
throw new AbortError ( )
66
54
}
@@ -74,14 +62,14 @@ class WebRTCDirect {
74
62
75
63
return new Promise ( ( resolve , reject ) => {
76
64
const start = Date . now ( )
77
- let connected
65
+ let connected : boolean
78
66
79
67
const cOpts = ma . toOptions ( )
80
68
log ( 'Dialing %s:%s' , cOpts . host , cOpts . port )
81
69
82
70
const channel = new SimplePeer ( options )
83
71
84
- const onError = ( err ) => {
72
+ const onError = ( err : Error ) => {
85
73
if ( ! connected ) {
86
74
const msg = `connection error ${ cOpts . host } :${ cOpts . port } : ${ err . message } `
87
75
@@ -111,7 +99,7 @@ class WebRTCDirect {
111
99
done ( new AbortError ( ) )
112
100
}
113
101
114
- const done = ( err ) => {
102
+ const done = ( err : Error | null ) => {
115
103
channel . removeListener ( 'error' , onError )
116
104
channel . removeListener ( 'timeout' , onTimeout )
117
105
channel . removeListener ( 'connect' , onConnect )
@@ -150,33 +138,19 @@ class WebRTCDirect {
150
138
* Creates a WebrtcDirect listener. The provided `handler` function will be called
151
139
* anytime a new incoming Connection has been successfully upgraded via
152
140
* `upgrader.upgradeInbound`.
153
- *
154
- * @param {* } [options]
155
- * @param {function(Connection) } handler
156
- * @returns {Listener } A WebrtcDirect listener
157
141
*/
158
- createListener ( options = { } , handler ) {
142
+ createListener ( options ?: WebRTCDirectListenerOptions ) : Listener {
159
143
if ( ! isNode ) {
160
144
throw errcode ( new Error ( 'Can\'t listen if run from the Browser' ) , 'ERR_NO_SUPPORT_FROM_BROWSER' )
161
145
}
162
146
163
- if ( typeof options === 'function' ) {
164
- handler = options
165
- options = { }
166
- }
167
-
168
- handler = handler || noop
169
-
170
- return createListener ( { handler, upgrader : this . _upgrader } , options )
147
+ return createListener ( this . _upgrader , options )
171
148
}
172
149
173
150
/**
174
151
* Takes a list of `Multiaddr`s and returns only valid addresses
175
- *
176
- * @param {Multiaddr[] } multiaddrs
177
- * @returns {Multiaddr[] } Valid multiaddrs
178
152
*/
179
- filter ( multiaddrs ) {
153
+ filter ( multiaddrs : Multiaddr [ ] ) : Multiaddr [ ] {
180
154
multiaddrs = Array . isArray ( multiaddrs ) ? multiaddrs : [ multiaddrs ]
181
155
182
156
return multiaddrs . filter ( ( ma ) => {
@@ -188,5 +162,3 @@ class WebRTCDirect {
188
162
} )
189
163
}
190
164
}
191
-
192
- module . exports = withIs ( WebRTCDirect , { className : 'WebRTCDirect' , symbolName : '@libp2p/js-libp2p-webrtc-direct/webrtcdirect' } )
0 commit comments