From 54098810cc6798970274909e9c69f8848bdc1726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Kr=C3=BCger?= Date: Sun, 6 Jan 2019 13:01:11 +0100 Subject: [PATCH] feat: add muxer code --- src/micro-switch/index.js | 30 +++++++++++++++++++++++++++++- src/server/index.js | 4 ++-- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/micro-switch/index.js b/src/micro-switch/index.js index 9ba39e8..493ff1f 100644 --- a/src/micro-switch/index.js +++ b/src/micro-switch/index.js @@ -1,6 +1,7 @@ 'use strict' const multiaddr = require('multiaddr') +const multistream = require('multistream-select') const WS = require('libp2p-websockets') const MPLEX = require('libp2p-mplex') @@ -31,14 +32,41 @@ class MicroSwitch { this.muxers = muxers || [MPLEX] this.addresses = addresses || [multiaddr('/ip6/::/tcp/5892/ws')] this.handler = handler || console.log + + this.msListener = new multistream.Listener() + this.muxers.forEach(muxer => { + this.msListener.addHandler(muxer.multicodec, (protocol, conn) => { + const muxed = muxer.listener(conn) + conn.info.info.msCallback(muxed) + }) + }) } /* * Wraps a connection in a muxer * @returns MuxedConn */ - async wrapInMuxer (conn, isServer) { + wrapInMuxer (conn, isServer) { + return new Promise((resolve, reject) => { + if (isServer) { + conn.msCallback = resolve + this.msListener.handle(conn, (err) => { + if (err) { return reject(err) } + }) + } else { + const msDialer = new multistream.Dialer() + msDialer.handle(conn, (err) => { + if (err) { return reject(err) } + const firstMuxer = this.muxers[0] // TODO: iterate or do ls first + msDialer.select(firstMuxer.multicodec, (err, conn) => { + if (err) { return reject(err) } + const muxed = firstMuxer.dialer(conn) + return resolve(muxed) + }) + }) + } + }) } async dial (addr) { diff --git a/src/server/index.js b/src/server/index.js index ac7e609..c27bb32 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -76,8 +76,8 @@ class Server { this.network = {} } - handler (conn) { - const muxed = this.switch.wrapInMuxer(conn, true) + async handler (conn) { + const muxed = await this.switch.wrapInMuxer(conn, true) muxed.newStream(async (err, conn) => { if (err) { return log(err)