diff --git a/examples/transfer-file/dialer.js b/examples/transfer-file/dialer.js new file mode 100644 index 0000000..7cb4e5d --- /dev/null +++ b/examples/transfer-file/dialer.js @@ -0,0 +1,68 @@ +'use strict' +/* eslint-disable no-console */ + +const PeerId = require('peer-id') +const PeerInfo = require('peer-info') +const Node = require('../../src') +const multiaddr = require('multiaddr') +const pull = require('pull-stream') +const async = require('async') +let idListener + +async.parallel([ + (callback) => { + PeerId.createFromJSON(require('./peer-id-dialer'), (err, idDialer) => { + if (err) { + throw err + } + callback(null, idDialer) + }) + }, + (callback) => { + PeerId.createFromJSON(require('./peer-id-listener'), (err, idListener) => { + if (err) { + throw err + } + callback(null, idListener) + }) + } +], (err, ids) => { + if (err) throw err + const peerDialer = new PeerInfo(ids[0]) + peerDialer.multiaddr.add(multiaddr('/ip4/0.0.0.0/tcp/0')) + const nodeDialer = new Node(peerDialer) + + const peerListener = new PeerInfo(ids[1]) + idListener = ids[1] + peerListener.multiaddr.add(multiaddr('/ip4/127.0.0.1/tcp/10333')) + nodeDialer.start((err) => { + if (err) { + throw err + } + + console.log('Dialer ready, listening on:') + + peerListener.multiaddrs.forEach((ma) => { + console.log(ma.toString() + '/ipfs/' + idListener.toB58String()) + }) + + nodeDialer.dialByPeerInfo(peerListener, '/echo/1.0.0', (err, conn) => { + if (err) { + throw err + } + console.log('nodeA dialed to nodeB on protocol: /echo/1.0.0') + + pull( + pull.values(['hey']), + conn, + pull.through(console.log), + pull.collect((err, data) => { + if (err) { + throw err + } + console.log('received echo:', data.toString()) + }) + ) + }) + }) +}) diff --git a/examples/transfer-file/listener.js b/examples/transfer-file/listener.js new file mode 100644 index 0000000..b7e4e82 --- /dev/null +++ b/examples/transfer-file/listener.js @@ -0,0 +1,51 @@ +'use strict' +/* eslint-disable no-console */ + +const PeerId = require('peer-id') +const PeerInfo = require('peer-info') +const Node = require('../../src') +const multiaddr = require('multiaddr') +const pull = require('pull-stream') + +PeerId.createFromJSON(require('./peer-id-listener'), (err, idListener) => { + if (err) { + throw err + } + const peerListener = new PeerInfo(idListener) + peerListener.multiaddr.add(multiaddr('/ip4/0.0.0.0/tcp/10333')) + const nodeListener = new Node(peerListener) + + nodeListener.start((err) => { + if (err) { + throw err + } + + nodeListener.swarm.on('peer-mux-established', (peerInfo) => { + console.log(peerInfo.id.toB58String()) + }) + + nodeListener.handle('/echo/1.0.0', (protocol, conn) => { + pull( + conn, + conn + ) + }) + + nodeListener.handle('/hello/1.0.0', (protocol, conn) => { + pull( + pull.values(['hello', 'world']), + conn + ) + setTimeout(() => { + console.log('Printing my peerbook') + Object + .keys(nodeListener.peerBook.getAll()) + .forEach(console.log) + }, 500) + }) + console.log('Listener ready, listening on:') + peerListener.multiaddrs.forEach((ma) => { + console.log(ma.toString() + '/ipfs/' + idListener.toB58String()) + }) + }) +}) diff --git a/examples/transfer-file/peer-id-dialer.json b/examples/transfer-file/peer-id-dialer.json new file mode 100644 index 0000000..5716d74 --- /dev/null +++ b/examples/transfer-file/peer-id-dialer.json @@ -0,0 +1,5 @@ +{ + "id": "Qma3GsJmB47xYuyahPZPSadh1avvxfyYQwk8R3UnFrQ6aP", + "privKey": "CAASpwkwggSjAgEAAoIBAQCaNSDOjPz6T8HZsf7LDpxiQRiN2OjeyIHUS05p8QWOr3EFUCFsC31R4moihE5HN+FxNalUyyFZU//yjf1pdnlMJqrVByJSMa+y2y4x2FucpoCAO97Tx+iWzwlZ2UXEUXM1Y81mhPbeWXy+wP2xElTgIER0Tsn/thoA0SD2u9wJuVvM7dB7cBcHYmqV6JH+KWCedRTum6O1BssqP/4Lbm2+rkrbZ4+oVRoU2DRLoFhKqwqLtylrbuj4XOI3XykMXV5+uQXz1JzubNOB9lsc6K+eRC+w8hhhDuFMgzkZ4qomCnx3uhO67KaICd8yqqBa6PJ/+fBM5Xk4hjyR40bwcf41AgMBAAECggEAZnrCJ6IYiLyyRdr9SbKXCNDb4YByGYPEi/HT1aHgIJfFE1PSMjxcdytxfyjP4JJpVtPjiT9JFVU2ddoYu5qJN6tGwjVwgJEWg1UXmPaAw1T/drjS94kVsAs82qICtFmwp52Apg3dBZ0Qwq/8qE1XbG7lLyohIbfCBiL0tiPYMfkcsN9gnFT/kFCX0LVs2pa9fHCRMY9rqCc4/rWJa1w8sMuQ23y4lDaxKF9OZVvOHFQkbBDrkquWHE4r55fchCz/rJklkPJUNENuncBRu0/2X+p4IKFD1DnttXNwb8j4LPiSlLro1T0hiUr5gO2QmdYwXFF63Q3mjQy0+5I4eNbjjQKBgQDZvZy3gUKS/nQNkYfq9za80uLbIj/cWbO+ZZjXCsj0fNIcQFJcKMBoA7DjJvu2S/lf86/41YHkPdmrLAEQAkJ+5BBNOycjYK9minTEjIMMmZDTXXugZ62wnU6F46uLkgEChTqEP57Y6xwwV+JaEDFEsW5N1eE9lEVX9nGIr4phMwKBgQC1TazLuEt1WBx/iUT83ita7obXqoKNzwsS/MWfY2innzYZKDOqeSYZzLtt9uTtp4X4uLyPbYs0qFYhXLsUYMoGHNN8+NdjoyxCjQRJRBkMtaNR0lc5lVDWl3bTuJovjFCgAr9uqJrmI5OHcCIk/cDpdWb3nWaMihVlePmiTcTy9wKBgQCU0u7c1jKkudqks4XM6a+2HAYGdUBk4cLjLhnrUWnNAcuyl5wzdX8dGPi8KZb+IKuQE8WBNJ2VXVj7kBYh1QmSJVunDflQSvNYCOaKuOeRoxzD+y9Wkca74qkbBmPn/6FFEb7PSZTO+tPHjyodGNgz9XpJJRjQuBk1aDJtlF3m1QKBgE5SAr5ym65SZOU3UGUIOKRsfDW4Q/OsqDUImvpywCgBICaX9lHDShFFHwau7FA52ScL7vDquoMB4UtCOtLfyQYA9995w9oYCCurrVlVIJkb8jSLcADBHw3EmqF1kq3NqJqm9TmBfoDCh52vdCCUufxgKh33kfBOSlXuf7B8dgMbAoGAZ3r0/mBQX6S+s5+xCETMTSNv7TQzxgtURIpVs+ZVr2cMhWhiv+n0Omab9X9Z50se8cWl5lkvx8vn3D/XHHIPrMF6qk7RAXtvReb+PeitNvm0odqjFv0J2qki6fDs0HKwq4kojAXI1Md8Th0eobNjsy21fEEJT7uKMJdovI/SErI=", + "pubKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCaNSDOjPz6T8HZsf7LDpxiQRiN2OjeyIHUS05p8QWOr3EFUCFsC31R4moihE5HN+FxNalUyyFZU//yjf1pdnlMJqrVByJSMa+y2y4x2FucpoCAO97Tx+iWzwlZ2UXEUXM1Y81mhPbeWXy+wP2xElTgIER0Tsn/thoA0SD2u9wJuVvM7dB7cBcHYmqV6JH+KWCedRTum6O1BssqP/4Lbm2+rkrbZ4+oVRoU2DRLoFhKqwqLtylrbuj4XOI3XykMXV5+uQXz1JzubNOB9lsc6K+eRC+w8hhhDuFMgzkZ4qomCnx3uhO67KaICd8yqqBa6PJ/+fBM5Xk4hjyR40bwcf41AgMBAAE=" +} diff --git a/examples/transfer-file/peer-id-listener.json b/examples/transfer-file/peer-id-listener.json new file mode 100644 index 0000000..7acb97c --- /dev/null +++ b/examples/transfer-file/peer-id-listener.json @@ -0,0 +1,5 @@ +{ + "id": "QmcrQZ6RJdpYuGvZqD5QEHAv6qX4BrQLJLQPQUrTrzdcgm", + "privKey": "CAASqAkwggSkAgEAAoIBAQDLZZcGcbe4urMBVlcHgN0fpBymY+xcr14ewvamG70QZODJ1h9sljlExZ7byLiqRB3SjGbfpZ1FweznwNxWtWpjHkQjTVXeoM4EEgDSNO/Cg7KNlU0EJvgPJXeEPycAZX9qASbVJ6EECQ40VR/7+SuSqsdL1hrmG1phpIju+D64gLyWpw9WEALfzMpH5I/KvdYDW3N4g6zOD2mZNp5y1gHeXINHWzMF596O72/6cxwyiXV1eJ000k1NVnUyrPjXtqWdVLRk5IU1LFpoQoXZU5X1hKj1a2qt/lZfH5eOrF/ramHcwhrYYw1txf8JHXWO/bbNnyemTHAvutZpTNrsWATfAgMBAAECggEAQj0obPnVyjxLFZFnsFLgMHDCv9Fk5V5bOYtmxfvcm50us6ye+T8HEYWGUa9RrGmYiLweuJD34gLgwyzE1RwptHPj3tdNsr4NubefOtXwixlWqdNIjKSgPlaGULQ8YF2tm/kaC2rnfifwz0w1qVqhPReO5fypL+0ShyANVD3WN0Fo2ugzrniCXHUpR2sHXSg6K+2+qWdveyjNWog34b7CgpV73Ln96BWae6ElU8PR5AWdMnRaA9ucA+/HWWJIWB3Fb4+6uwlxhu2L50Ckq1gwYZCtGw63q5L4CglmXMfIKnQAuEzazq9T4YxEkp+XDnVZAOgnQGUBYpetlgMmkkh9qQKBgQDvsEs0ThzFLgnhtC2Jy//ZOrOvIAKAZZf/mS08AqWH3L0/Rjm8ZYbLsRcoWU78sl8UFFwAQhMRDBP9G+RPojWVahBL/B7emdKKnFR1NfwKjFdDVaoX5uNvZEKSl9UubbC4WZJ65u/cd5jEnj+w3ir9G8n+P1gp/0yBz02nZXFgSwKBgQDZPQr4HBxZL7Kx7D49ormIlB7CCn2i7mT11Cppn5ifUTrp7DbFJ2t9e8UNk6tgvbENgCKXvXWsmflSo9gmMxeEOD40AgAkO8Pn2R4OYhrwd89dECiKM34HrVNBzGoB5+YsAno6zGvOzLKbNwMG++2iuNXqXTk4uV9GcI8OnU5ZPQKBgCZUGrKSiyc85XeiSGXwqUkjifhHNh8yH8xPwlwGUFIZimnD4RevZI7OEtXw8iCWpX2gg9XGuyXOuKORAkF5vvfVriV4e7c9Ad4Igbj8mQFWz92EpV6NHXGCpuKqRPzXrZrNOA9PPqwSs+s9IxI1dMpk1zhBCOguWx2m+NP79NVhAoGBAI6WSoTfrpu7ewbdkVzTWgQTdLzYNe6jmxDf2ZbKclrf7lNr/+cYIK2Ud5qZunsdBwFdgVcnu/02czeS42TvVBgs8mcgiQc/Uy7yi4/VROlhOnJTEMjlU2umkGc3zLzDgYiRd7jwRDLQmMrYKNyEr02HFKFn3w8kXSzW5I8rISnhAoGBANhchHVtJd3VMYvxNcQb909FiwTnT9kl9pkjhwivx+f8/K8pDfYCjYSBYCfPTM5Pskv5dXzOdnNuCj6Y2H/9m2SsObukBwF0z5Qijgu1DsxvADVIKZ4rzrGb4uSEmM6200qjJ/9U98fVM7rvOraakrhcf9gRwuspguJQnSO9cLj6", + "pubKey": "CAASpgIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDLZZcGcbe4urMBVlcHgN0fpBymY+xcr14ewvamG70QZODJ1h9sljlExZ7byLiqRB3SjGbfpZ1FweznwNxWtWpjHkQjTVXeoM4EEgDSNO/Cg7KNlU0EJvgPJXeEPycAZX9qASbVJ6EECQ40VR/7+SuSqsdL1hrmG1phpIju+D64gLyWpw9WEALfzMpH5I/KvdYDW3N4g6zOD2mZNp5y1gHeXINHWzMF596O72/6cxwyiXV1eJ000k1NVnUyrPjXtqWdVLRk5IU1LFpoQoXZU5X1hKj1a2qt/lZfH5eOrF/ramHcwhrYYw1txf8JHXWO/bbNnyemTHAvutZpTNrsWATfAgMBAAE=" +} diff --git a/package.json b/package.json index b066029..54c4918 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,9 @@ "main": "src/index.js", "scripts": { "test": "aegir-test node", + "test:muxer:spdy": "aegir-test node LIBP2P_MUXER=spdy", + "test:muxer:multiplex": "aegir-test node LIBP2P_MUXER=multiplex", + "test:muxer:both": "aegir-test node LIBP2P_MUXER=spdy, multiplex", "lint": "aegir-lint", "release": "aegir-release node", "release-minor": "aegir-release node --type minor", @@ -43,6 +46,7 @@ "dependencies": { "libp2p": "^0.3.1", "libp2p-mdns": "^0.5.2", + "libp2p-multiplex": "^0.3.2", "libp2p-secio": "^0.6.5", "libp2p-spdy": "^0.10.3", "libp2p-swarm": "^0.26.10", @@ -66,4 +70,4 @@ "greenkeeperio-bot ", "varunagarwal315 " ] -} \ No newline at end of file +} diff --git a/src/index.js b/src/index.js index 3300cc5..8ae23dc 100644 --- a/src/index.js +++ b/src/index.js @@ -6,6 +6,7 @@ const WebRTCStar = require('libp2p-webrtc-star') const MulticastDNS = require('libp2p-mdns') const WS = require('libp2p-websockets') const spdy = require('libp2p-spdy') +const multiplex = require('libp2p-multiplex') const secio = require('libp2p-secio') const libp2p = require('libp2p') @@ -21,9 +22,16 @@ class Node extends libp2p { webRTCStar ], connection: { - muxer: [ - spdy - ], + muxer: process.env.LIBP2P_MUXER ? (() => { + const muxerPrefs = process.env.LIBP2P_MUXER + return muxerPrefs.split(',').map((pref) => { + switch (pref) { + case 'spdy': return spdy + case 'multiplex': return multiplex + default: throw new Error(pref + ' muxer not available') + } + }) + })() : [spdy], crypto: [ secio ]