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

Commit 26ef08b

Browse files
authored
fix: update interfaces (#146)
Updates to latest code from libp2p/js-libp2p-interfaces#180
1 parent f433ef9 commit 26ef08b

File tree

7 files changed

+108
-108
lines changed

7 files changed

+108
-108
lines changed

.aegir.cjs

+7-5
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,21 @@ module.exports = {
1111

1212
const protocol = '/echo/1.0.0'
1313
const registrar = mockRegistrar()
14-
registrar.handle(protocol, (evt) => {
14+
registrar.handle(protocol, ({ stream }) => {
1515
void pipe(
16-
evt.detail.stream,
17-
evt.detail.stream
16+
stream,
17+
stream
1818
)
1919
})
2020
const upgrader = mockUpgrader({
2121
registrar
2222
})
2323

24-
const ws = new WebSockets({ upgrader })
24+
const ws = new WebSockets()
2525
const ma = new Multiaddr('/ip4/127.0.0.1/tcp/9095/ws')
26-
const listener = ws.createListener()
26+
const listener = ws.createListener({
27+
upgrader
28+
})
2729
await listener.listen(ma)
2830
listener.addEventListener('error', (evt) => {
2931
console.error(evt.detail)

package.json

+8-9
Original file line numberDiff line numberDiff line change
@@ -152,10 +152,10 @@
152152
"release": "semantic-release"
153153
},
154154
"dependencies": {
155-
"@libp2p/logger": "^1.0.2",
156-
"@libp2p/utils": "^1.0.0",
157-
"@multiformats/mafmt": "^11.0.1",
158-
"@multiformats/multiaddr": "^10.0.0",
155+
"@libp2p/logger": "^1.1.2",
156+
"@libp2p/utils": "^1.0.9",
157+
"@multiformats/mafmt": "^11.0.2",
158+
"@multiformats/multiaddr": "^10.1.5",
159159
"@multiformats/multiaddr-to-uri": "^9.0.0",
160160
"abortable-iterator": "^4.0.2",
161161
"err-code": "^3.0.1",
@@ -165,19 +165,18 @@
165165
"wherearewe": "^1.0.0"
166166
},
167167
"devDependencies": {
168-
"@libp2p/interface-compliance-tests": "^1.1.2",
169-
"@libp2p/interfaces": "^1.3.2",
168+
"@libp2p/interface-compliance-tests": "^1.1.17",
169+
"@libp2p/interfaces": "^1.3.14",
170170
"@types/ws": "^8.2.2",
171171
"aegir": "^36.1.3",
172172
"is-loopback-addr": "^2.0.1",
173173
"it-all": "^1.0.6",
174174
"it-drain": "^1.0.5",
175175
"it-goodbye": "^4.0.1",
176-
"it-pipe": "^2.0.2",
176+
"it-pipe": "^2.0.3",
177177
"it-take": "^1.0.2",
178178
"p-wait-for": "^4.1.0",
179-
"uint8arrays": "^3.0.0",
180-
"util": "^0.12.3"
179+
"uint8arrays": "^3.0.0"
181180
},
182181
"browser": {
183182
"./dist/src/listener.js": "./dist/src/listener.browser.js"

src/index.ts

+27-25
Original file line numberDiff line numberDiff line change
@@ -7,48 +7,50 @@ import env from 'wherearewe'
77
import { createListener } from './listener.js'
88
import { socketToMaConn } from './socket-to-conn.js'
99
import * as filters from './filters.js'
10-
import type { Transport, Upgrader, MultiaddrFilter } from '@libp2p/interfaces/transport'
10+
import { Transport, MultiaddrFilter, symbol, CreateListenerOptions, DialOptions } from '@libp2p/interfaces/transport'
1111
import type { AbortOptions } from '@libp2p/interfaces'
12-
import type { WebSocketListenerOptions } from './listener.js'
1312
import type { Multiaddr } from '@multiformats/multiaddr'
14-
import type { DuplexWebSocket } from 'it-ws/dist/src/duplex'
13+
import type { DuplexWebSocket } from 'it-ws/duplex'
14+
import type { ClientOptions } from 'ws'
15+
import type { Server } from 'http'
1516

1617
const log = logger('libp2p:websockets')
1718

18-
/**
19-
* @class WebSockets
20-
*/
21-
export class WebSockets implements Transport<AbortOptions & WebSocketOptions, WebSocketListenerOptions> {
22-
private readonly upgrader: Upgrader
23-
private readonly _filter?: MultiaddrFilter
19+
export interface WebSocketsInit extends AbortOptions, WebSocketOptions {
20+
filter?: MultiaddrFilter
21+
websocket?: ClientOptions
22+
server?: Server
23+
}
2424

25-
constructor (opts: { upgrader: Upgrader, filter?: MultiaddrFilter }) {
26-
const { upgrader, filter } = opts
25+
export class WebSockets implements Transport {
26+
private readonly init?: WebSocketsInit
2727

28-
if (upgrader == null) {
29-
throw new Error('An upgrader must be provided. See https://github.com/libp2p/js-libp2p-interfaces/tree/master/packages/libp2p-interfaces/src/transport#upgrader')
30-
}
28+
constructor (init?: WebSocketsInit) {
29+
this.init = init
30+
}
3131

32-
this.upgrader = upgrader
33-
this._filter = filter
32+
get [Symbol.toStringTag] () {
33+
return this.constructor.name
3434
}
3535

36-
[Symbol.toStringTag] = 'WebSockets'
36+
get [symbol] (): true {
37+
return true
38+
}
3739

38-
async dial (ma: Multiaddr, options?: AbortOptions & WebSocketOptions) {
40+
async dial (ma: Multiaddr, options: DialOptions) {
3941
log('dialing %s', ma)
4042
options = options ?? {}
4143

4244
const socket = await this._connect(ma, options)
4345
const maConn = socketToMaConn(socket, ma)
4446
log('new outbound connection %s', maConn.remoteAddr)
4547

46-
const conn = await this.upgrader.upgradeOutbound(maConn)
48+
const conn = await options.upgrader.upgradeOutbound(maConn)
4749
log('outbound connection %s upgraded', maConn.remoteAddr)
4850
return conn
4951
}
5052

51-
async _connect (ma: Multiaddr, options: AbortOptions & WebSocketOptions): Promise<DuplexWebSocket> {
53+
async _connect (ma: Multiaddr, options: AbortOptions): Promise<DuplexWebSocket> {
5254
if (options?.signal?.aborted === true) {
5355
throw new AbortError()
5456
}
@@ -62,7 +64,7 @@ export class WebSockets implements Transport<AbortOptions & WebSocketOptions, We
6264
errorPromise.reject(err)
6365
}
6466

65-
const rawSocket = connect(toUri(ma), options)
67+
const rawSocket = connect(toUri(ma), this.init)
6668

6769
if (rawSocket.socket.on != null) {
6870
rawSocket.socket.on('error', errfn)
@@ -115,8 +117,8 @@ export class WebSockets implements Transport<AbortOptions & WebSocketOptions, We
115117
* anytime a new incoming Connection has been successfully upgraded via
116118
* `upgrader.upgradeInbound`
117119
*/
118-
createListener (options?: WebSocketListenerOptions) {
119-
return createListener(this.upgrader, options)
120+
createListener (options: CreateListenerOptions) {
121+
return createListener({ ...this.init, ...options })
120122
}
121123

122124
/**
@@ -127,8 +129,8 @@ export class WebSockets implements Transport<AbortOptions & WebSocketOptions, We
127129
filter (multiaddrs: Multiaddr[]) {
128130
multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs]
129131

130-
if (this._filter != null) {
131-
return this._filter(multiaddrs)
132+
if (this.init?.filter != null) {
133+
return this.init?.filter(multiaddrs)
132134
}
133135

134136
// Browser

src/listener.ts

+11-12
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,12 @@ import { createServer } from 'it-ws/server'
44
import { logger } from '@libp2p/logger'
55
import { socketToMaConn } from './socket-to-conn.js'
66
import { ipPortToMultiaddr as toMultiaddr } from '@libp2p/utils/ip-port-to-multiaddr'
7-
import type { ListenerOptions, Upgrader, Listener, ListenerEvents } from '@libp2p/interfaces/transport'
7+
import type { Listener, ListenerEvents, CreateListenerOptions } from '@libp2p/interfaces/transport'
88
import type { Server } from 'http'
99
import type { WebSocketServer } from 'it-ws/server'
1010
import type { DuplexWebSocket } from 'it-ws/duplex'
1111
import { EventEmitter, CustomEvent } from '@libp2p/interfaces'
12+
import type { Connection } from '@libp2p/interfaces/connection'
1213

1314
const log = logger('libp2p:websockets:listener')
1415

@@ -17,7 +18,7 @@ class WebSocketListener extends EventEmitter<ListenerEvents> implements Listener
1718
private listeningMultiaddr?: Multiaddr
1819
private readonly server: WebSocketServer
1920

20-
constructor (upgrader: Upgrader, options: WebSocketListenerOptions) {
21+
constructor (init: WebSocketListenerInit) {
2122
super()
2223

2324
// Keep track of open connections to destroy when the listener is closed
@@ -26,7 +27,7 @@ class WebSocketListener extends EventEmitter<ListenerEvents> implements Listener
2627
const self = this // eslint-disable-line @typescript-eslint/no-this-alias
2728

2829
this.server = createServer({
29-
...options,
30+
...init,
3031
onConnection: (stream: DuplexWebSocket) => {
3132
const maConn = socketToMaConn(stream, toMultiaddr(stream.remoteAddress ?? '', stream.remotePort ?? 0))
3233
log('new inbound connection %s', maConn.remoteAddr)
@@ -38,15 +39,15 @@ class WebSocketListener extends EventEmitter<ListenerEvents> implements Listener
3839
})
3940

4041
try {
41-
void upgrader.upgradeInbound(maConn)
42+
void init.upgrader.upgradeInbound(maConn)
4243
.then((conn) => {
4344
log('inbound connection %s upgraded', maConn.remoteAddr)
4445

45-
if (options?.handler != null) {
46-
options?.handler(conn)
46+
if (init?.handler != null) {
47+
init?.handler(conn)
4748
}
4849

49-
self.dispatchEvent(new CustomEvent('connection', {
50+
self.dispatchEvent(new CustomEvent<Connection>('connection', {
5051
detail: conn
5152
}))
5253
})
@@ -149,12 +150,10 @@ class WebSocketListener extends EventEmitter<ListenerEvents> implements Listener
149150
}
150151
}
151152

152-
export interface WebSocketListenerOptions extends ListenerOptions {
153+
export interface WebSocketListenerInit extends CreateListenerOptions {
153154
server?: Server
154155
}
155156

156-
export function createListener (upgrader: Upgrader, options?: WebSocketListenerOptions): Listener {
157-
options = options ?? {}
158-
159-
return new WebSocketListener(upgrader, options)
157+
export function createListener (init: WebSocketListenerInit): Listener {
158+
return new WebSocketListener(init)
160159
}

test/browser.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ describe('libp2p-websockets', () => {
1818
let conn: Connection
1919

2020
beforeEach(async () => {
21-
ws = new WebSockets({ upgrader: mockUpgrader() })
22-
conn = await ws.dial(ma)
21+
ws = new WebSockets()
22+
conn = await ws.dial(ma, { upgrader: mockUpgrader() })
2323
})
2424

2525
afterEach(async () => {
@@ -86,6 +86,6 @@ describe('libp2p-websockets', () => {
8686
})
8787

8888
it('.createServer throws in browser', () => {
89-
expect(new WebSockets({ upgrader: mockUpgrader() }).createListener).to.throw()
89+
expect(new WebSockets().createListener).to.throw()
9090
})
9191
})

test/compliance.node.ts

+4-11
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,12 @@ import { Multiaddr } from '@multiformats/multiaddr'
55
import http from 'http'
66
import { WebSockets } from '../src/index.js'
77
import * as filters from '../src/filters.js'
8-
import type { WebSocketListenerOptions } from '../src/listener.js'
8+
import type { WebSocketListenerInit } from '../src/listener.js'
99

1010
describe('interface-transport compliance', () => {
1111
tests({
12-
async setup (args) {
13-
if (args == null) {
14-
throw new Error('No args')
15-
}
16-
17-
const { upgrader } = args
18-
const ws = new WebSockets({ upgrader, filter: filters.all })
12+
async setup () {
13+
const ws = new WebSockets({ filter: filters.all })
1914
const addrs = [
2015
new Multiaddr('/ip4/127.0.0.1/tcp/9091/ws'),
2116
new Multiaddr('/ip4/127.0.0.1/tcp/9092/ws'),
@@ -24,9 +19,7 @@ describe('interface-transport compliance', () => {
2419
]
2520

2621
let delayMs = 0
27-
const delayedCreateListener = (options?: WebSocketListenerOptions) => {
28-
options = options ?? {}
29-
22+
const delayedCreateListener = (options: WebSocketListenerInit) => {
3023
// A server that will delay the upgrade event by delayMs
3124
options.server = new Proxy(http.createServer(), {
3225
get (server, prop) {

0 commit comments

Comments
 (0)