From be2dbc3f674e9bce534dc92d93ad2739ed6d2bef Mon Sep 17 00:00:00 2001 From: Alex Potsides Date: Wed, 12 Oct 2022 15:43:32 +0100 Subject: [PATCH] fix!: remove @libp2p/components (#219) `@libp2p/components` is a choke-point for our dependency graph as it depends on every interface, meaning when one interface revs a major `@libp2p/components` major has to change too which means every module depending on it also needs a major. Switch instead to constructor injection of simple objects that let modules declare their dependencies on interfaces directly instead of indirectly via `@libp2p/components` Refs https://github.com/libp2p/js-libp2p-components/issues/6 BREAKING CHANGE: modules no longer implement `Initializable` instead switching to constructor injection --- README.md | 12 ++++---- package.json | 6 ++-- src/index.ts | 8 +++++- test/compliance.spec.ts | 6 ++-- test/connection.spec.ts | 16 +++++------ test/filter.spec.ts | 11 +++---- test/listen-dial.spec.ts | 56 ++++++++++++++++++------------------ test/max-connections.spec.ts | 6 ++-- 8 files changed, 64 insertions(+), 57 deletions(-) diff --git a/README.md b/README.md index ecb13ae..4cd2d81 100644 --- a/README.md +++ b/README.md @@ -36,9 +36,9 @@ $ npm i @libp2p/tcp ## Usage ```js -import { TCP } from '@libp2p/tcp' +import { tcp } from '@libp2p/tcp' import { multiaddr } from '@multiformats/multiaddr' -import {pipe} from 'it-pipe' +import { pipe } from 'it-pipe' import all from 'it-all' // A simple upgrader that just returns the MultiaddrConnection @@ -47,9 +47,9 @@ const upgrader = { upgradeOutbound: async maConn => maConn } -const tcp = new TCP() +const transport = tcp()() -const listener = tcp.createListener({ +const listener = transport.createListener({ upgrader, handler: (socket) => { console.log('new connection opened') @@ -64,7 +64,7 @@ const addr = multiaddr('/ip4/127.0.0.1/tcp/9090') await listener.listen(addr) console.log('listening') -const socket = await tcp.dial(addr, { upgrader }) +const socket = await transport.dial(addr, { upgrader }) const values = await pipe( socket, all @@ -89,7 +89,7 @@ Value: hello World! [![](https://github.com/raw/libp2p/js-libp2p-interfaces/master/packages/libp2p-interfaces/src/transport/img/badge.png)](https://github.com/libp2p/js-libp2p-interfaces/tree/master/packages/libp2p-interfaces/src/transport) -`libp2p-tcp` accepts TCP addresses as both IPFS and non IPFS encapsulated addresses, i.e: +`@libp2p/tcp` accepts TCP addresses as both IPFS and non IPFS encapsulated addresses, i.e: `/ip4/127.0.0.1/tcp/4001` `/ip4/127.0.0.1/tcp/4001/ipfs/QmHash` diff --git a/package.json b/package.json index bae5c23..f69fdc0 100644 --- a/package.json +++ b/package.json @@ -148,13 +148,13 @@ "stream-to-it": "^0.2.2" }, "devDependencies": { - "@libp2p/interface-mocks": "^6.0.0", - "@libp2p/interface-transport-compliance-tests": "^2.0.6", + "@libp2p/interface-mocks": "^7.0.1", + "@libp2p/interface-transport-compliance-tests": "^3.0.0", "aegir": "^37.5.3", "it-all": "^1.0.6", "it-pipe": "^2.0.3", "p-defer": "^4.0.0", "sinon": "^14.0.0", - "uint8arrays": "^3.0.0" + "uint8arrays": "^4.0.2" } } diff --git a/src/index.ts b/src/index.ts index d0ab4fd..7b2930f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -55,7 +55,7 @@ export interface TCPCreateListenerOptions extends CreateListenerOptions, TCPSock } -export class TCP implements Transport { +class TCP implements Transport { private readonly opts: TCPOptions constructor (options: TCPOptions = {}) { @@ -189,3 +189,9 @@ export class TCP implements Transport { }) } } + +export function tcp (init: TCPOptions = {}): (components?: any) => Transport { + return () => { + return new TCP(init) + } +} diff --git a/test/compliance.spec.ts b/test/compliance.spec.ts index 674e9ce..ed50c9c 100644 --- a/test/compliance.spec.ts +++ b/test/compliance.spec.ts @@ -2,12 +2,12 @@ import sinon from 'sinon' import tests from '@libp2p/interface-transport-compliance-tests' import { multiaddr } from '@multiformats/multiaddr' import net from 'net' -import { TCP } from '../src/index.js' +import { tcp } from '../src/index.js' describe('interface-transport compliance', () => { tests({ async setup () { - const tcp = new TCP() + const transport = tcp()() const addrs = [ multiaddr('/ip4/127.0.0.1/tcp/9091'), multiaddr('/ip4/127.0.0.1/tcp/9092'), @@ -35,7 +35,7 @@ describe('interface-transport compliance', () => { } } - return { transport: tcp, addrs, connector } + return { transport, addrs, connector } }, async teardown () {} }) diff --git a/test/connection.spec.ts b/test/connection.spec.ts index dafaac0..254826a 100644 --- a/test/connection.spec.ts +++ b/test/connection.spec.ts @@ -1,16 +1,16 @@ import { expect } from 'aegir/chai' -import { TCP } from '../src/index.js' +import { tcp } from '../src/index.js' import { multiaddr } from '@multiformats/multiaddr' import { mockUpgrader } from '@libp2p/interface-mocks' import type { Connection } from '@libp2p/interface-connection' -import type { Upgrader } from '@libp2p/interface-transport' +import type { Transport, Upgrader } from '@libp2p/interface-transport' describe('valid localAddr and remoteAddr', () => { - let tcp: TCP + let transport: Transport let upgrader: Upgrader beforeEach(() => { - tcp = new TCP() + transport = tcp()() upgrader = mockUpgrader() }) @@ -24,7 +24,7 @@ describe('valid localAddr and remoteAddr', () => { const handler = (conn: Connection) => handled(conn) // Create a listener with the handler - const listener = tcp.createListener({ + const listener = transport.createListener({ handler, upgrader }) @@ -36,7 +36,7 @@ describe('valid localAddr and remoteAddr', () => { expect(localAddrs.length).to.equal(1) // Dial to that address - await tcp.dial(localAddrs[0], { + await transport.dial(localAddrs[0], { upgrader }) @@ -55,7 +55,7 @@ describe('valid localAddr and remoteAddr', () => { const handler = (conn: Connection) => handled(conn) // Create a listener with the handler - const listener = tcp.createListener({ + const listener = transport.createListener({ handler, upgrader }) @@ -67,7 +67,7 @@ describe('valid localAddr and remoteAddr', () => { expect(localAddrs.length).to.equal(1) // Dial to that address - const dialerConn = await tcp.dial(localAddrs[0], { + const dialerConn = await transport.dial(localAddrs[0], { upgrader }) diff --git a/test/filter.spec.ts b/test/filter.spec.ts index 4d3feec..5c4fbb4 100644 --- a/test/filter.spec.ts +++ b/test/filter.spec.ts @@ -1,15 +1,16 @@ import { expect } from 'aegir/chai' -import { TCP } from '../src/index.js' +import { tcp } from '../src/index.js' import { multiaddr } from '@multiformats/multiaddr' +import type { Transport } from '@libp2p/interface-transport' describe('filter addrs', () => { const base = '/ip4/127.0.0.1' const ipfs = '/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw' - let tcp: TCP + let transport: Transport before(() => { - tcp = new TCP() + transport = tcp()() }) it('filter valid addrs for this transport', () => { @@ -22,7 +23,7 @@ describe('filter addrs', () => { const ma7 = multiaddr('/dns4/libp2p.io/tcp/9090') const ma8 = multiaddr('/dnsaddr/libp2p.io/tcp/9090') - const valid = tcp.filter([ma1, ma2, ma3, ma4, ma5, ma6, ma7, ma8]) + const valid = transport.filter([ma1, ma2, ma3, ma4, ma5, ma6, ma7, ma8]) expect(valid.length).to.equal(4) expect(valid[0]).to.deep.equal(ma1) expect(valid[1]).to.deep.equal(ma4) @@ -31,7 +32,7 @@ describe('filter addrs', () => { it('filter a single addr for this transport', () => { const ma1 = multiaddr(base + '/tcp/9090') - const valid = tcp.filter([ma1]) + const valid = transport.filter([ma1]) expect(valid.length).to.equal(1) expect(valid[0]).to.eql(ma1) }) diff --git a/test/listen-dial.spec.ts b/test/listen-dial.spec.ts index d3e7491..7a9e720 100644 --- a/test/listen-dial.spec.ts +++ b/test/listen-dial.spec.ts @@ -1,5 +1,5 @@ import { expect } from 'aegir/chai' -import { TCP } from '../src/index.js' +import { tcp } from '../src/index.js' import os from 'os' import path from 'path' import { multiaddr } from '@multiformats/multiaddr' @@ -7,17 +7,17 @@ import { pipe } from 'it-pipe' import all from 'it-all' import { mockRegistrar, mockUpgrader } from '@libp2p/interface-mocks' import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string' -import type { Upgrader } from '@libp2p/interface-transport' +import type { Transport, Upgrader } from '@libp2p/interface-transport' const isCI = process.env.CI describe('listen', () => { - let tcp: TCP + let transport: Transport let listener: any let upgrader: Upgrader beforeEach(() => { - tcp = new TCP() + transport = tcp()() upgrader = mockUpgrader() }) afterEach(async () => { @@ -33,7 +33,7 @@ describe('listen', () => { it('listen on path', async () => { const mh = multiaddr(`/unix/${path.resolve(os.tmpdir(), `/tmp/p2pd-${Date.now()}.sock`)}`) - listener = tcp.createListener({ + listener = transport.createListener({ upgrader }) await listener.listen(mh) @@ -41,7 +41,7 @@ describe('listen', () => { it('listen on port 0', async () => { const mh = multiaddr('/ip4/127.0.0.1/tcp/0') - listener = tcp.createListener({ + listener = transport.createListener({ upgrader }) await listener.listen(mh) @@ -52,7 +52,7 @@ describe('listen', () => { return } const mh = multiaddr('/ip6/::/tcp/9090') - listener = tcp.createListener({ + listener = transport.createListener({ upgrader }) await listener.listen(mh) @@ -60,7 +60,7 @@ describe('listen', () => { it('listen on any Interface', async () => { const mh = multiaddr('/ip4/0.0.0.0/tcp/9090') - listener = tcp.createListener({ + listener = transport.createListener({ upgrader }) await listener.listen(mh) @@ -68,7 +68,7 @@ describe('listen', () => { it('getAddrs', async () => { const mh = multiaddr('/ip4/127.0.0.1/tcp/9090') - listener = tcp.createListener({ + listener = transport.createListener({ upgrader }) await listener.listen(mh) @@ -80,7 +80,7 @@ describe('listen', () => { it('getAddrs on port 0 listen', async () => { const mh = multiaddr('/ip4/127.0.0.1/tcp/0') - listener = tcp.createListener({ + listener = transport.createListener({ upgrader }) await listener.listen(mh) @@ -91,7 +91,7 @@ describe('listen', () => { it('getAddrs from listening on 0.0.0.0', async () => { const mh = multiaddr('/ip4/0.0.0.0/tcp/9090') - listener = tcp.createListener({ + listener = transport.createListener({ upgrader }) await listener.listen(mh) @@ -103,7 +103,7 @@ describe('listen', () => { it('getAddrs from listening on 0.0.0.0 and port 0', async () => { const mh = multiaddr('/ip4/0.0.0.0/tcp/0') - listener = tcp.createListener({ + listener = transport.createListener({ upgrader }) await listener.listen(mh) @@ -115,7 +115,7 @@ describe('listen', () => { it('getAddrs from listening on ip6 \'::\'', async () => { const mh = multiaddr('/ip6/::/tcp/9090') - listener = tcp.createListener({ + listener = transport.createListener({ upgrader }) await listener.listen(mh) @@ -127,7 +127,7 @@ describe('listen', () => { it('getAddrs preserves IPFS Id', async () => { const mh = multiaddr('/ip4/127.0.0.1/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw') - listener = tcp.createListener({ + listener = transport.createListener({ upgrader }) await listener.listen(mh) @@ -140,7 +140,7 @@ describe('listen', () => { describe('dial', () => { const protocol = '/echo/1.0.0' - let tcp: TCP + let transport: Transport let upgrader: Upgrader beforeEach(async () => { @@ -155,17 +155,17 @@ describe('dial', () => { registrar }) - tcp = new TCP() + transport = tcp()() }) it('dial on IPv4', async () => { const ma = multiaddr('/ip4/127.0.0.1/tcp/9090') - const listener = tcp.createListener({ + const listener = transport.createListener({ upgrader }) await listener.listen(ma) - const conn = await tcp.dial(ma, { + const conn = await transport.dial(ma, { upgrader }) const stream = await conn.newStream([protocol]) @@ -187,11 +187,11 @@ describe('dial', () => { } const ma = multiaddr('/ip6/::/tcp/9090') - const listener = tcp.createListener({ + const listener = transport.createListener({ upgrader }) await listener.listen(ma) - const conn = await tcp.dial(ma, { + const conn = await transport.dial(ma, { upgrader }) const stream = await conn.newStream([protocol]) @@ -209,11 +209,11 @@ describe('dial', () => { it('dial on path', async () => { const ma = multiaddr(`/unix/${path.resolve(os.tmpdir(), `/tmp/p2pd-${Date.now()}.sock`)}`) - const listener = tcp.createListener({ + const listener = transport.createListener({ upgrader }) await listener.listen(ma) - const conn = await tcp.dial(ma, { + const conn = await transport.dial(ma, { upgrader }) const stream = await conn.newStream([protocol]) @@ -235,7 +235,7 @@ describe('dial', () => { const ma = multiaddr('/ip6/::/tcp/9090') - const listener = tcp.createListener({ + const listener = transport.createListener({ handler: (conn) => { // let multistream select finish before closing setTimeout(() => { @@ -249,7 +249,7 @@ describe('dial', () => { await listener.listen(ma) const addrs = listener.getAddrs() - const conn = await tcp.dial(addrs[0], { + const conn = await transport.dial(addrs[0], { upgrader }) const stream = await conn.newStream([protocol]) @@ -270,7 +270,7 @@ describe('dial', () => { const ma = multiaddr('/ip6/::/tcp/9090') - const listener = tcp.createListener({ + const listener = transport.createListener({ handler: () => { handled() }, @@ -279,7 +279,7 @@ describe('dial', () => { await listener.listen(ma) const addrs = listener.getAddrs() - const conn = await tcp.dial(addrs[0], { + const conn = await transport.dial(addrs[0], { upgrader }) @@ -290,12 +290,12 @@ describe('dial', () => { it('dials on IPv4 with IPFS Id', async () => { const ma = multiaddr('/ip4/127.0.0.1/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw') - const listener = tcp.createListener({ + const listener = transport.createListener({ upgrader }) await listener.listen(ma) - const conn = await tcp.dial(ma, { + const conn = await transport.dial(ma, { upgrader }) const stream = await conn.newStream([protocol]) diff --git a/test/max-connections.spec.ts b/test/max-connections.spec.ts index d0c28e7..19f4bbf 100644 --- a/test/max-connections.spec.ts +++ b/test/max-connections.spec.ts @@ -3,7 +3,7 @@ import net from 'node:net' import { promisify } from 'node:util' import { mockUpgrader } from '@libp2p/interface-mocks' import { multiaddr } from '@multiformats/multiaddr' -import { TCP } from '../src/index.js' +import { tcp } from '../src/index.js' describe('maxConnections', () => { const afterEachCallbacks: Array<() => Promise | any> = [] @@ -18,10 +18,10 @@ describe('maxConnections', () => { const port = 9900 const seenRemoteConnections = new Set() - const tcp = new TCP({ maxConnections }) + const trasnport = tcp({ maxConnections })() const upgrader = mockUpgrader() - const listener = tcp.createListener({ upgrader }) + const listener = trasnport.createListener({ upgrader }) // eslint-disable-next-line @typescript-eslint/promise-function-async afterEachCallbacks.push(() => listener.close()) await listener.listen(multiaddr(`/ip4/127.0.0.1/tcp/${port}`))