Skip to content
This repository was archived by the owner on Aug 29, 2023. It is now read-only.

Commit 8bc0b09

Browse files
committed
feat: convert to typescript
Converts this module to typescript Depends on: - [ ] libp2p/js-libp2p-interfaces#116 BREAKING CHANGE: this module now uses the updated libp2p-interfaces module
1 parent 1faa587 commit 8bc0b09

16 files changed

+635
-704
lines changed

.aegir.js renamed to .aegir.cjs

File renamed without changes.

README.md

+11-11
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,18 @@
1515

1616
> JavaScript implementation of the TCP module for libp2p. It exposes the [interface-transport](https://github.com/libp2p/js-libp2p-interfaces/tree/master/src/transport) for dial/listen. `libp2p-tcp` is a very thin shim that adds support for dialing to a `multiaddr`. This small shim will enable libp2p to use other transports.
1717
18-
## Lead Maintainer
19-
20-
[Jacob Heun](https://github.com/jacobheun)
21-
2218
## Table of Contents
2319

24-
- [Install](#install)
25-
- [npm](#npm)
26-
- [Usage](#usage)
27-
- [API](#api)
28-
- [Contribute](#contribute)
29-
- [License](#license)
20+
- [js-libp2p-tcp](#js-libp2p-tcp)
21+
- [Table of Contents](#table-of-contents)
22+
- [Install](#install)
23+
- [npm](#npm)
24+
- [Usage](#usage)
25+
- [API](#api)
26+
- [Transport](#transport)
27+
- [Connection](#connection)
28+
- [Contribute](#contribute)
29+
- [License](#license)
3030

3131
## Install
3232

@@ -52,7 +52,7 @@ const upgrader = {
5252

5353
const tcp = new TCP({ upgrader })
5454

55-
const listener = tcp.createListener((socket) => {
55+
const listener = tcp.createListener({}, (socket) => {
5656
console.log('new connection opened')
5757
pipe(
5858
['hello'],

package.json

+21-16
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,24 @@
22
"name": "libp2p-tcp",
33
"version": "0.17.2",
44
"description": "Node.js implementation of the TCP module that libp2p uses, which implements the interface-connection and interface-transport interfaces",
5-
"leadMaintainer": "Jacob Heun <[email protected]>",
6-
"main": "src/index.js",
5+
"main": "./dist/src/index.js",
6+
"type": "module",
7+
"exports": {
8+
".": {
9+
"import": "./dist/src/index.js"
10+
}
11+
},
712
"scripts": {
813
"lint": "aegir ts -p check && aegir lint",
9-
"build": "aegir build",
10-
"test": "aegir test -t node",
11-
"test:node": "aegir test -t node",
12-
"release": "aegir release -t node",
13-
"release-minor": "aegir release -t node --type minor",
14-
"release-major": "aegir-release -t node --type major",
14+
"build": "tsc",
15+
"pretest": "npm run build",
16+
"test": "aegir test -t node -f ./dist/test/*.js",
17+
"test:node": "aegir test -t node -f ./dist/test/*.js",
18+
"release": "aegir release -t node -f ./dist/test/*.js",
19+
"release-minor": "aegir release -t node -f ./dist/test/*.js --type minor",
20+
"release-major": "aegir-release -t node -f ./dist/test/*.js --type major",
1521
"coverage": "nyc --reporter=text --reporter=lcov npm run test:node"
1622
},
17-
"pre-push": [
18-
"lint"
19-
],
2023
"repository": {
2124
"type": "git",
2225
"url": "https://github.com/libp2p/js-libp2p-tcp.git"
@@ -41,11 +44,12 @@
4144
"types": "dist/src/index.d.ts",
4245
"devDependencies": {
4346
"@types/debug": "^4.1.5",
44-
"aegir": "^35.0.3",
47+
"@types/mocha": "^9.0.0",
48+
"aegir": "^36.0.0",
4549
"it-pipe": "^1.1.0",
46-
"libp2p-interfaces": "^1.0.0",
47-
"libp2p-interfaces-compliance-tests": "^1.0.0",
48-
"sinon": "^11.1.1",
50+
"libp2p-interfaces": "^2.0.0",
51+
"libp2p-interfaces-compliance-tests": "^2.0.0",
52+
"sinon": "^12.0.0",
4953
"streaming-iterables": "^6.0.0"
5054
},
5155
"dependencies": {
@@ -56,7 +60,8 @@
5660
"libp2p-utils": "^0.4.0",
5761
"mafmt": "^10.0.0",
5862
"multiaddr": "^10.0.0",
59-
"stream-to-it": "^0.2.2"
63+
"stream-to-it": "^0.2.2",
64+
"why-is-node-running": "^2.2.0"
6065
},
6166
"contributors": [
6267
"David Dias <[email protected]>",
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
'use strict'
2-
31
// p2p multi-address code
4-
exports.CODE_P2P = 421
5-
exports.CODE_CIRCUIT = 290
2+
export const CODE_P2P = 421
3+
export const CODE_CIRCUIT = 290
64

75
// Time to wait for a connection to close gracefully before destroying it manually
8-
exports.CLOSE_TIMEOUT = 2000
6+
export const CLOSE_TIMEOUT = 2000
+54-69
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
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')
1516

1617
/**
1718
* @typedef {import('multiaddr').Multiaddr} Multiaddr
@@ -21,28 +22,28 @@ const { CODE_CIRCUIT, CODE_P2P } = require('./constants')
2122
* @typedef {import('net').Socket} Socket
2223
*/
2324

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) {
3240
throw new Error('An upgrader must be provided. See https://github.com/libp2p/interface-transport#upgrader.')
3341
}
42+
3443
this._upgrader = upgrader
3544
}
3645

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 = {}) {
4647
const socket = await this._connect(ma, options)
4748
const maConn = toConnection(socket, { remoteAddr: ma, signal: options.signal })
4849
log('new outbound connection %s', maConn.remoteAddr)
@@ -51,32 +52,27 @@ class TCP {
5152
return conn
5253
}
5354

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) {
6357
throw new AbortError()
6458
}
6559

66-
return new Promise((resolve, reject) => {
60+
return await new Promise<Socket>((resolve, reject) => {
6761
const start = Date.now()
6862
const cOpts = multiaddrToNetConfig(ma)
6963

7064
log('dialing %j', cOpts)
7165
const rawSocket = net.connect(cOpts)
7266

73-
const onError = /** @param {Error} err */ err => {
67+
const onError = (err: Error) => {
7468
err.message = `connection error ${cOpts.host}:${cOpts.port}: ${err.message}`
69+
7570
done(err)
7671
}
7772

7873
const onTimeout = () => {
7974
log('connection timeout %s:%s', cOpts.host, cOpts.port)
75+
8076
const err = errCode(new Error(`connection timeout after ${Date.now() - start}ms`), 'ERR_CONNECT_TIMEOUT')
8177
// Note: this will result in onError() being called
8278
rawSocket.emit('error', err)
@@ -93,52 +89,45 @@ class TCP {
9389
done(new AbortError())
9490
}
9591

96-
const done = /** @param {Error} [err] */ err => {
92+
const done = (err?: any) => {
9793
rawSocket.removeListener('error', onError)
9894
rawSocket.removeListener('timeout', onTimeout)
9995
rawSocket.removeListener('connect', onConnect)
100-
options.signal && options.signal.removeEventListener('abort', onAbort)
10196

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+
103105
resolve(rawSocket)
104106
}
105107

106108
rawSocket.on('error', onError)
107109
rawSocket.on('timeout', onTimeout)
108110
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+
}
110115
})
111116
}
112117

113118
/**
114119
* Creates a TCP listener. The provided `handler` function will be called
115120
* anytime a new incoming Connection has been successfully upgraded via
116121
* `upgrader.upgradeInbound`.
117-
*
118-
* @param {* | function(Connection):void} options
119-
* @param {function(Connection):void} [handler]
120-
* @returns {Listener} A TCP listener
121122
*/
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 })
133125
}
134126

135127
/**
136128
* Takes a list of `Multiaddr`s and returns only valid TCP addresses
137-
*
138-
* @param {Multiaddr[]} multiaddrs
139-
* @returns {Multiaddr[]} Valid TCP multiaddrs
140129
*/
141-
filter (multiaddrs) {
130+
filter (multiaddrs: Multiaddr[]) {
142131
multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs]
143132

144133
return multiaddrs.filter(ma => {
@@ -150,7 +139,3 @@ class TCP {
150139
})
151140
}
152141
}
153-
154-
const TCPWithIs = withIs(TCP, { className: 'TCP', symbolName: '@libp2p/js-libp2p-tcp/tcp' })
155-
156-
exports = module.exports = TCPWithIs

0 commit comments

Comments
 (0)