Compare commits

...

142 Commits

Author SHA1 Message Date
Jacob Heun
c7f695bf4b chore: update deps and more non Travis ci
chore: improve test listener closures

License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-02-27 15:09:52 +01:00
Jacob Heun
8279d3500c chore: remove travis test bail
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-02-26 19:42:02 +01:00
Jacob Heun
9660c3daee chore: add missing npm script for aegir
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-02-26 19:21:04 +01:00
Jacob Heun
ea762d12ee chore: remove unneeded deps
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-02-26 19:18:35 +01:00
Jacob Heun
eedc264a9a chore: remove browser builds from travis
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-02-26 19:12:49 +01:00
Jacob Heun
5ce2566885 chore: use travis and update badges
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-02-26 19:06:34 +01:00
Jacob Heun
2be751a758 chore: update deps
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-02-26 19:02:08 +01:00
Jacob Heun
2ab529ec31 test: rename file to fix coverage
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2018-11-15 20:08:44 +01:00
Jacob Heun
4f80c195a8 chore: fix test runner for aegir on jenkins
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2018-11-15 19:29:54 +01:00
Jacob Heun
537ebee0b4 fix: allow internal
libp2p should eventually handle listen versus announce addresses, this helps with ip6 support in the interim

License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2018-11-15 19:21:36 +01:00
Jacob Heun
5f8571efb0 fix: only expose external hosts
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2018-11-09 23:50:24 +01:00
Jacob Heun
299b795f8a chore: fix linting
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2018-11-09 23:15:09 +01:00
Jacob Heun
c9e8dd5714 feat: add support for ip6 wildcards
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2018-11-09 23:10:52 +01:00
Linus Unnebäck
3ab43a3604 chore: prefer const over let (#99)
Prefer const over let when the binding is static, in order to comply with an upcoming Standard rule.
2018-10-31 08:35:55 +00:00
Jacob Heun
3aad2ed243 chore: release version v0.13.0
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2018-09-12 19:40:49 +02:00
Jacob Heun
01cfbda2e7 chore: update contributors 2018-09-12 19:40:49 +02:00
Jacob Heun
eba0b48744 feat: add support for dialing over dns
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2018-09-12 19:38:02 +02:00
Jacob Heun
a0c23e49f7 chore: release version v0.12.1
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2018-07-31 14:13:11 +02:00
Jacob Heun
66ab208182 chore: update contributors 2018-07-31 14:13:10 +02:00
Jacob Heun
168d111158 chore: update deps and fix test runner
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2018-07-31 14:08:31 +02:00
TomCoded
4b04b17dfa fix: invalid ip address and daemon can be crashed by remote user
Per the nodeJS documentation, a Net socket.remoteAddress value may
be undefined if the socket is destroyed, as by a client disconnect.
A multiaddr cannot be created for an invalid IP address (such as
the undefined remote address of a destroyed socket). Currently
the attempt results in a crash that can be triggered remotely. This
commit catches the exception in get-multiaddr and returns an
undefined value to listener rather than throwing an exception when
trying to process defective or destroyed socket data. Listener then
terminates processing of the incoming p2p connections that generate
this error condition.

fixes: https://github.com/libp2p/js-libp2p-tcp/issues/93
fixes: https://github.com/ipfs/js-ipfs/issues/1447
2018-07-31 13:51:27 +02:00
Tom White
6c36a46831 test: fixes listen-dial test "dial and destroy on listener" (#97) 2018-07-31 13:46:12 +02:00
Jacob Heun
d39ec2db40 chore: add lead maintainer (#94)
* chore: add lead maintainer

License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>

* Update package.json
2018-06-26 17:58:30 +02:00
David Dias
79428f3e62 chore: release version v0.12.0 2018-04-05 17:00:33 +01:00
David Dias
8a394b5286 chore: update contributors 2018-04-05 17:00:33 +01:00
David Dias
b7f73bcda1 test: fix dial error test 2018-04-05 17:00:19 +01:00
David Dias
8b44aa28ee chore: update deps 2018-04-05 16:56:23 +01:00
Diogo Silva
ded1f6831c feat: add class-is module 2018-04-05 16:55:54 +01:00
Drew Stone
5ef24695fc docs: fixing the broken example in README (#91)
* Working example fix

* Char fix

* Corrected output, and add yarn to gitignore
2018-04-05 16:55:25 +01:00
David Dias
df0aa059ca chore: release version v0.11.6 2018-02-20 10:27:27 +00:00
David Dias
bf74e9acad chore: update contributors 2018-02-20 10:27:26 +00:00
David Dias
83c4617e8d chore: update deps 2018-02-20 10:27:17 +00:00
David Dias
3b7e68bc8a docs: update and polish 2018-02-20 10:25:18 +00:00
David Dias
de1d7fe75c chore: tiny refactor 2018-02-07 06:40:00 +00:00
David Dias
9c77a69ae3 chore: tiny refactor 2018-02-07 06:26:02 +00:00
David Dias
50840a8067 test: refactor 2018-02-07 06:06:15 +00:00
David Dias
d194ff0a3b chore: release version v0.11.5 2018-02-07 05:59:57 +00:00
David Dias
41ca37e9ce chore: update contributors 2018-02-07 05:59:56 +00:00
David Dias
71a28bb177 test: refactor 2018-02-07 05:59:34 +00:00
David Dias
0d1861a1f8 chore: release version v0.11.4 2018-02-07 05:58:11 +00:00
David Dias
929408eb38 chore: update contributors 2018-02-07 05:58:11 +00:00
David Dias
b94f9c5d51 test: refactor 2018-02-07 05:56:55 +00:00
David Dias
4b0851b4a4 chore: release version v0.11.3 2018-02-07 05:45:42 +00:00
David Dias
74771b9504 chore: update contributors 2018-02-07 05:45:42 +00:00
David Dias
48eefa1b40 chore: update deps 2018-02-07 05:45:30 +00:00
Pedro Teixeira
f8f52665f7 fix: clearing timeout when closes (#87) 2018-02-07 05:43:15 +00:00
David Dias
d804244239 chore: release version v0.11.2 2018-01-12 12:30:45 +00:00
David Dias
31c720f285 chore: update contributors 2018-01-12 12:30:45 +00:00
David Dias
c553e0448f chore: fix release script 2018-01-12 12:30:38 +00:00
David Dias
533835d22f test: do not run IPv6 tests on CI (#86)
* test: do not run IPv6 tests on CI

* Updating CI files (#83)

This commit updates all CI scripts to the latest version

* chore: use env variable instead

* skip the other IPv6 tests
2018-01-12 12:27:39 +00:00
Alan Shaw
74a88f6868 fix: missing dependency debug, fixes #84 2018-01-12 12:01:54 +00:00
David Dias
1de9f18894 chore: update gitignore 2017-10-13 17:17:54 +02:00
David Dias
2673ae48b0 chore: release version v0.11.1 2017-10-13 17:17:16 +02:00
David Dias
9a4425f5ba chore: update contributors 2017-10-13 17:17:16 +02:00
David Dias
50d6a7b7cf chre: fix linting 2017-10-13 17:17:11 +02:00
David Dias
0a515f8fda chore: update deps and CI config 2017-10-13 17:15:36 +02:00
Dmitriy Ryajov
11c4f451f4 feat: relay filtering
* feat: filter IPFS addrs correctly

* feat: mafmt addrs now support /ipfs no need for ad-hoc filtering

* feat: skip p2p-circuit addresses
2017-10-13 17:13:28 +02:00
David Dias
7572279838 chore: release version v0.11.0 2017-09-03 10:02:33 +01:00
David Dias
181ce4eef2 chore: update contributors 2017-09-03 10:02:33 +01:00
David Dias
f8075be92a docs: update badge on readme 2017-09-03 10:02:10 +01:00
David Dias
a54bb83657 feat: p2p addrs situation (#82)
* chore: update gitignore

* chore: update CI configs

* chore: update deps

* chore: small refactor
2017-09-03 10:01:16 +01:00
David Dias
ef45cc9a34 chore: release version v0.10.2 2017-07-22 14:42:22 -07:00
David Dias
ce5f023508 chore: update contributors 2017-07-22 14:42:21 -07:00
David Dias
2f9b1fe7fe chore: update deps 2017-07-22 14:40:25 -07:00
David Dias
46672b669f chore: release version v0.10.1 2017-04-13 15:10:07 +01:00
David Dias
31f69ec3c2 chore: update contributors 2017-04-13 15:10:07 +01:00
David Dias
afed19439a chore: update deps 2017-04-10 14:32:05 -04:00
David Dias
4b78faae3f Merge pull request #79 from libp2p/fix/catch-socket-reset-errors
fix: catch errors on incomming sockets
2017-04-10 14:19:24 -04:00
David Dias
e204517a51 fix: catch errors on incomming sockets 2017-04-07 11:51:56 -04:00
David Dias
4694f9dd47 chore: release version v0.10.0 2017-03-27 16:21:35 +01:00
David Dias
dd6e067125 chore: update contributors 2017-03-27 16:21:34 +01:00
David Dias
fb382a3e2a codestyle: fix linting 2017-03-27 16:21:26 +01:00
David Dias
fd741367a2 chore: update deps 2017-03-27 16:19:30 +01:00
Friedel Ziegelmayer
4d4f295dd5 fix(dial): proper error handling on dial (#77) 2017-03-27 16:18:55 +01:00
David Dias
0edc487b23 chore: release version v0.9.4 2017-03-21 14:27:22 +00:00
David Dias
c3ad8ce47a chore: update contributors 2017-03-21 14:27:22 +00:00
David Dias
665b755922 chore: update aegir 2017-03-21 14:27:16 +00:00
David Dias
1a550bac26 chore: release version v0.9.3 2017-02-09 09:01:06 -08:00
David Dias
51c5594d49 chore: update contributors 2017-02-09 09:01:05 -08:00
David Dias
d5476caee1 missing dep 2017-02-09 09:00:58 -08:00
David Dias
4b211f5cd6 chore: release version v0.9.2 2017-02-09 08:34:54 -08:00
David Dias
433188f182 chore: update contributors 2017-02-09 08:34:54 -08:00
David Dias
f3de45d198 chore: ^ to ~ 2017-02-09 08:33:48 -08:00
Greenkeeper
2afaed5f2a chore(package): update multiaddr to version 2.1.3 (#62)
https://greenkeeper.io/
2017-01-19 11:05:56 +01:00
Greenkeeper
308dead134 chore(package): update mafmt to version 2.1.4 (#63)
https://greenkeeper.io/
2017-01-16 17:05:57 +01:00
Greenkeeper
1c8603b721 chore(package): update mafmt to version 2.1.3 (#61)
https://greenkeeper.io/
2017-01-16 16:18:52 +01:00
Greenkeeper
c883475a4f chore(package): update aegir to version 9.3.0 (#57)
https://greenkeeper.io/
2016-12-18 11:44:36 +00:00
Greenkeeper
515c6a32ec chore(package): update ip-address to version 5.8.6 (#60)
https://greenkeeper.io/
2016-12-18 11:38:42 +00:00
Greenkeeper
a107e1da57 chore(package): update pre-commit to version 1.2.2 (#58)
https://greenkeeper.io/
2016-12-18 11:37:15 +00:00
Greenkeeper
2ec97b3c8c chore(package): update pre-commit to version 1.2.0 (#53)
https://greenkeeper.io/
2016-12-10 12:02:44 -08:00
Greenkeeper
cb449a6c5c chore(package): update aegir to version 9.2.1 (#54)
https://greenkeeper.io/
2016-12-10 12:01:37 -08:00
Greenkeeper
1773efecdf chore(package): update ip-address to version 5.8.4 (#52)
https://greenkeeper.io/
2016-12-08 19:19:52 -08:00
Prashanth Chandra
49e23f1961 refactor: use lodash.includes instead of lodash.contains
As `loadash.contains` is deprecated.
2016-12-04 13:28:18 +01:00
Greenkeeper
10b35b22f6 chore(package): update multiaddr to version 2.1.1 (#47)
https://greenkeeper.io/
2016-11-28 12:02:56 +00:00
Friedel Ziegelmayer
5677e12592 Merge pull request #44 from libp2p/greenkeeper-aegir-9.1.1
aegir@9.1.1 breaks build ⚠️
2016-11-07 16:12:35 +01:00
greenkeeperio-bot
9524e8670a chore(package): update aegir to version 9.1.1
https://greenkeeper.io/
2016-11-04 16:07:36 +01:00
David Dias
32dc4fa5c6 chore: release version v0.9.1 2016-11-03 08:29:14 +00:00
David Dias
9d697f66a4 chore: update contributors 2016-11-03 08:29:14 +00:00
David Dias
fb6c61abe9 chore: update deps 2016-11-03 08:29:09 +00:00
David Dias
114998db1c chore: release version v0.9.0 2016-11-03 08:23:38 +00:00
David Dias
4a94e3ca01 chore: update contributors 2016-11-03 08:23:38 +00:00
Friedel Ziegelmayer
e451201848 Async Crypto Endeavour (#40) 2016-11-03 08:22:32 +00:00
Friedel Ziegelmayer
e7524e1747 docs(readme): fix coverage badge 2016-09-09 12:13:14 +02:00
Friedel Ziegelmayer
06689e3ff0 fix(deps): remove unused pull dep 2016-09-09 11:49:11 +02:00
David Dias
376f938cc0 Merge pull request #34 from libp2p/greenkeeper-aegir-8.0.1
aegir@8.0.1 breaks build ⚠️
2016-09-08 20:07:25 -04:00
greenkeeperio-bot
a2958b9bca chore(package): update aegir to version 8.0.1
https://greenkeeper.io/
2016-09-09 01:34:28 +02:00
David Dias
7b7e521e57 Merge pull request #33 from libp2p/greenkeeper-multiaddr-2.0.3
multiaddr@2.0.3 breaks build ⚠️
2016-09-07 20:21:13 -04:00
greenkeeperio-bot
2330732ed5 chore(package): update multiaddr to version 2.0.3
https://greenkeeper.io/
2016-09-08 01:20:22 +02:00
David Dias
7b7e7f6344 Merge pull request #31 from libp2p/greenkeeper-aegir-8.0.0
Update aegir to version 8.0.0 🚀
2016-09-07 14:13:02 -04:00
David Dias
850a414e6f chore: release version v0.8.1 2016-09-06 09:31:40 -04:00
David Dias
f6df6cfa40 chore: update contributors 2016-09-06 09:31:40 -04:00
David Dias
c16376f567 Merge pull request #32 from libp2p/feature/standardize-readme
Standardize Readme
2016-09-06 09:24:19 -04:00
Richard Littauer
0025407a5b Standardize Readme
Also did some edits to the text here and there. Added a contribute section, too.
2016-09-06 09:16:32 -04:00
greenkeeperio-bot
48708ac4d2 chore(package): update aegir to version 8.0.0
https://greenkeeper.io/
2016-09-06 15:11:49 +02:00
David Dias
1d1d091082 chore: release version v0.8.0 2016-09-06 08:52:42 -04:00
David Dias
0d007ff5fe chore: update contributors 2016-09-06 08:52:42 -04:00
David Dias
2f2ca0d97b Merge pull request #20 from libp2p/pull
Migrate to pull-streams
2016-09-06 08:42:29 -04:00
David Dias
da8ee216e1 feat(deps): update to published deps 2016-09-06 08:31:17 -04:00
David Dias
d9f65e0b0c feat(readme): add pull-streams documentation 2016-09-05 18:31:34 -04:00
dignifiedquire
5e89a2608b feat(pull): migration to pull-streams 2016-09-05 18:31:34 -04:00
David Dias
caa8d6dbb1 Merge pull request #18 from emschwartz/master
docs: fix README example
2016-09-05 18:01:32 -04:00
David Dias
9b61bbc040 Merge pull request #23 from libp2p/greenkeeper-mafmt-2.1.2
mafmt@2.1.2 breaks build ⚠️
2016-08-31 06:49:48 -04:00
greenkeeperio-bot
915fdc818f chore(package): update mafmt to version 2.1.2
https://greenkeeper.io/
2016-08-22 16:19:30 +02:00
Evan Schwartz
2dc52d0a5c docs: fix README example 2016-08-03 17:52:01 +02:00
David Dias
e01046eb03 chore: release version v0.7.4 2016-08-03 14:57:30 +01:00
David Dias
918b9df322 chore: update contributors 2016-08-03 14:57:30 +01:00
David Dias
31b47fbfd2 Merge pull request #17 from libp2p/update-deps
update dependencies
2016-08-03 14:47:05 +01:00
David Dias
26e9268bb5 update dependencies 2016-08-03 14:42:35 +01:00
David Dias
676b5f3dbf chore: release version v0.7.3 2016-06-26 21:18:26 +01:00
David Dias
ad7a331d9a chore: update contributors 2016-06-26 21:18:25 +01:00
David Dias
a00c38437e Merge pull request #16 from libp2p/destroy-properly
use duplexify fork while PR is not up yet
2016-06-26 21:18:02 +01:00
David Dias
cf0e9a1a8f use duplexify fork while PR is not up yet 2016-06-26 21:13:39 +01:00
David Dias
d2f91814b6 chore: release version v0.7.2 2016-06-23 08:42:03 +01:00
David Dias
405f552c77 chore: update contributors 2016-06-23 08:42:02 +01:00
David Dias
cba4b8b94a pass the err on the callback too 2016-06-23 08:41:54 +01:00
David Dias
ae6a808fc7 chore: release version v0.7.1 2016-06-23 08:35:56 +01:00
David Dias
eae6819b02 chore: update contributors 2016-06-23 08:35:56 +01:00
David Dias
9ac5cca946 fix: error was passed in duplicate 2016-06-23 08:35:49 +01:00
David Dias
cdfd473cac chore: release version v0.7.0 2016-06-22 11:31:32 +01:00
David Dias
5344ea33aa chore: update contributors 2016-06-22 11:31:32 +01:00
David Dias
c2654206d3 Merge pull request #15 from libp2p/follow-spec
comply with the latest interface-transport and interface-connection spec
2016-06-22 11:28:15 +01:00
David Dias
539a007031 comply with the latest interface-transport and interface-connection spec 2016-06-22 09:36:08 +01:00
20 changed files with 1346 additions and 459 deletions

20
.gitignore vendored
View File

@@ -1,7 +1,18 @@
docs
**/node_modules/
**/*.log
test/repo-tests*
**/bundle.js
# yarn
yarn.lock
# Logs # Logs
logs logs
*.log *.log
coverage
# Runtime data # Runtime data
pids pids
*.pid *.pid
@@ -19,8 +30,7 @@ coverage
# node-waf configuration # node-waf configuration
.lock-wscript .lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html) build
build/Release
# Dependency directory # Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
@@ -28,3 +38,9 @@ node_modules
lib lib
dist dist
test/test-data/go-ipfs-repo/LOCK
test/test-data/go-ipfs-repo/LOG
test/test-data/go-ipfs-repo/LOG.old
# while testing npm5
package-lock.json

View File

@@ -1,25 +1,28 @@
sudo: false
language: node_js language: node_js
cache: npm
stages:
- check
- test
- cov
node_js: node_js:
- 4 - '10'
- 5
- stable
# Make sure we have new NPM. os:
before_install: - linux
- npm install -g npm - osx
- windows
script: npx nyc -s npm run test:node
after_success: npx nyc report --reporter=text-lcov > coverage.lcov && npx codecov
jobs:
include:
- stage: check
script: script:
- npx aegir commitlint --travis
- npx aegir dep-check
- npm run lint - npm run lint
- npm test
- npm run coverage
addons: notifications:
firefox: 'latest' email: false
before_script:
- export DISPLAY=:99.0
- sh -e /etc/init.d/xvfb start
after_success:
- npm run coverage-publish

263
CHANGELOG.md Normal file
View File

@@ -0,0 +1,263 @@
<a name="0.13.0"></a>
# [0.13.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.12.1...v0.13.0) (2018-09-12)
### Features
* add support for dialing over dns ([eba0b48](https://github.com/libp2p/js-libp2p-tcp/commit/eba0b48))
<a name="0.12.1"></a>
## [0.12.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.12.0...v0.12.1) (2018-07-31)
### Bug Fixes
* invalid ip address and daemon can be crashed by remote user ([4b04b17](https://github.com/libp2p/js-libp2p-tcp/commit/4b04b17))
<a name="0.12.0"></a>
# [0.12.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.11.6...v0.12.0) (2018-04-05)
### Features
* add class-is module ([ded1f68](https://github.com/libp2p/js-libp2p-tcp/commit/ded1f68))
<a name="0.11.6"></a>
## [0.11.6](https://github.com/libp2p/js-libp2p-tcp/compare/v0.11.5...v0.11.6) (2018-02-20)
<a name="0.11.5"></a>
## [0.11.5](https://github.com/libp2p/js-libp2p-tcp/compare/v0.11.4...v0.11.5) (2018-02-07)
<a name="0.11.4"></a>
## [0.11.4](https://github.com/libp2p/js-libp2p-tcp/compare/v0.11.3...v0.11.4) (2018-02-07)
<a name="0.11.3"></a>
## [0.11.3](https://github.com/libp2p/js-libp2p-tcp/compare/v0.11.2...v0.11.3) (2018-02-07)
### Bug Fixes
* clearing timeout when closes ([#87](https://github.com/libp2p/js-libp2p-tcp/issues/87)) ([f8f5266](https://github.com/libp2p/js-libp2p-tcp/commit/f8f5266))
<a name="0.11.2"></a>
## [0.11.2](https://github.com/libp2p/js-libp2p-tcp/compare/v0.11.1...v0.11.2) (2018-01-12)
### Bug Fixes
* missing dependency debug, fixes [#84](https://github.com/libp2p/js-libp2p-tcp/issues/84) ([74a88f6](https://github.com/libp2p/js-libp2p-tcp/commit/74a88f6))
<a name="0.11.1"></a>
## [0.11.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.11.0...v0.11.1) (2017-10-13)
### Features
* relay filtering ([11c4f45](https://github.com/libp2p/js-libp2p-tcp/commit/11c4f45))
<a name="0.11.0"></a>
# [0.11.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.10.2...v0.11.0) (2017-09-03)
### Features
* p2p addrs situation ([#82](https://github.com/libp2p/js-libp2p-tcp/issues/82)) ([a54bb83](https://github.com/libp2p/js-libp2p-tcp/commit/a54bb83))
<a name="0.10.2"></a>
## [0.10.2](https://github.com/libp2p/js-libp2p-tcp/compare/v0.10.1...v0.10.2) (2017-07-22)
<a name="0.10.1"></a>
## [0.10.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.10.0...v0.10.1) (2017-04-13)
### Bug Fixes
* catch errors on incomming sockets ([e204517](https://github.com/libp2p/js-libp2p-tcp/commit/e204517))
<a name="0.10.0"></a>
# [0.10.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.9.4...v0.10.0) (2017-03-27)
### Bug Fixes
* **dial:** proper error handling on dial ([#77](https://github.com/libp2p/js-libp2p-tcp/issues/77)) ([4d4f295](https://github.com/libp2p/js-libp2p-tcp/commit/4d4f295))
<a name="0.9.4"></a>
## [0.9.4](https://github.com/libp2p/js-libp2p-tcp/compare/v0.9.3...v0.9.4) (2017-03-21)
<a name="0.9.3"></a>
## [0.9.3](https://github.com/libp2p/js-libp2p-tcp/compare/v0.9.2...v0.9.3) (2017-02-09)
<a name="0.9.2"></a>
## [0.9.2](https://github.com/libp2p/js-libp2p-tcp/compare/v0.9.1...v0.9.2) (2017-02-09)
<a name="0.9.1"></a>
## [0.9.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.9.0...v0.9.1) (2016-11-03)
<a name="0.9.0"></a>
# [0.9.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.8.1...v0.9.0) (2016-11-03)
### Bug Fixes
* **deps:** remove unused pull dep ([06689e3](https://github.com/libp2p/js-libp2p-tcp/commit/06689e3))
<a name="0.8.1"></a>
## [0.8.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.8.0...v0.8.1) (2016-09-06)
<a name="0.8.0"></a>
# [0.8.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.7.4...v0.8.0) (2016-09-06)
### Features
* **deps:** update to published deps ([da8ee21](https://github.com/libp2p/js-libp2p-tcp/commit/da8ee21))
* **pull:** migration to pull-streams ([5e89a26](https://github.com/libp2p/js-libp2p-tcp/commit/5e89a26))
* **readme:** add pull-streams documentation ([d9f65e0](https://github.com/libp2p/js-libp2p-tcp/commit/d9f65e0))
<a name="0.7.4"></a>
## [0.7.4](https://github.com/libp2p/js-libp2p-tcp/compare/v0.7.3...v0.7.4) (2016-08-03)
<a name="0.7.3"></a>
## [0.7.3](https://github.com/libp2p/js-libp2p-tcp/compare/v0.7.2...v0.7.3) (2016-06-26)
<a name="0.7.2"></a>
## [0.7.2](https://github.com/libp2p/js-libp2p-tcp/compare/v0.7.1...v0.7.2) (2016-06-23)
<a name="0.7.1"></a>
## [0.7.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.7.0...v0.7.1) (2016-06-23)
### Bug Fixes
* error was passed in duplicate ([9ac5cca](https://github.com/libp2p/js-libp2p-tcp/commit/9ac5cca))
<a name="0.7.0"></a>
# [0.7.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.6.2...v0.7.0) (2016-06-22)
<a name="0.6.2"></a>
## [0.6.2](https://github.com/libp2p/js-libp2p-tcp/compare/v0.6.1...v0.6.2) (2016-06-01)
### Bug Fixes
* address cr ([2ed01e8](https://github.com/libp2p/js-libp2p-tcp/commit/2ed01e8))
* destroy hanging connections after timeout ([4a12169](https://github.com/libp2p/js-libp2p-tcp/commit/4a12169))
<a name="0.6.1"></a>
## [0.6.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.6.0...v0.6.1) (2016-05-29)
<a name="0.6.0"></a>
# [0.6.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.5.3...v0.6.0) (2016-05-22)
<a name="0.5.3"></a>
## [0.5.3](https://github.com/libp2p/js-libp2p-tcp/compare/v0.5.2...v0.5.3) (2016-05-22)
<a name="0.5.2"></a>
## [0.5.2](https://github.com/libp2p/js-libp2p-tcp/compare/v0.5.1...v0.5.2) (2016-05-09)
<a name="0.5.1"></a>
## [0.5.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.5.0...v0.5.1) (2016-05-08)
<a name="0.5.0"></a>
# [0.5.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.4.0...v0.5.0) (2016-04-25)
<a name="0.4.0"></a>
# [0.4.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.3.0...v0.4.0) (2016-03-14)
<a name="0.3.0"></a>
# [0.3.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.2.1...v0.3.0) (2016-03-10)
<a name="0.2.1"></a>
## [0.2.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.2.0...v0.2.1) (2016-03-04)
<a name="0.2.0"></a>
# [0.2.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.1.2...v0.2.0) (2016-03-04)
<a name="0.1.2"></a>
## [0.1.2](https://github.com/libp2p/js-libp2p-tcp/compare/v0.1.1...v0.1.2) (2015-10-29)
<a name="0.1.1"></a>
## [0.1.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.1.0...v0.1.1) (2015-09-17)
<a name="0.1.0"></a>
# 0.1.0 (2015-09-16)

View File

@@ -1,6 +1,6 @@
The MIT License (MIT) The MIT License (MIT)
Copyright (c) 2015 David Dias Copyright (c) 2015-2016 David Dias
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

155
README.md
View File

@@ -1,96 +1,117 @@
js-libp2p-tcp # js-libp2p-tcp
===============
[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io) [![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://protocol.ai)
[![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs) [![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/)
[![Build Status](https://travis-ci.org/diasdavid/js-libp2p-tcp.svg?style=flat-square)](https://travis-ci.org/diasdavid/js-libp2p-tcp) [![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p)
![](https://img.shields.io/badge/coverage-%3F-yellow.svg?style=flat-square) [![](https://img.shields.io/codecov/c/github/libp2p/js-libp2p-tcp.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-tcp)
[![Dependency Status](https://david-dm.org/diasdavid/js-libp2p-tcp.svg?style=flat-square)](https://david-dm.org/diasdavid/js-libp2p-tcp) [![](https://img.shields.io/travis/libp2p/js-libp2p-tcp.svg?style=flat-square)](https://travis-ci.com/libp2p/js-libp2p-tcp)
[![Dependency Status](https://david-dm.org/libp2p/js-libp2p-tcp.svg?style=flat-square)](https://david-dm.org/libp2p/js-libp2p-tcp)
[![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard) [![js-standard-style](https://img.shields.io/badge/code%20style-standard-brightgreen.svg?style=flat-square)](https://github.com/feross/standard)
![](https://img.shields.io/badge/npm-%3E%3D6.0.0-orange.svg?style=flat-square)
![](https://img.shields.io/badge/Node.js-%3E%3D10.0.0-orange.svg?style=flat-square)
![](https://raw.githubusercontent.com/diasdavid/abstract-connection/master/img/badge.png) [![](https://raw.githubusercontent.com/libp2p/interface-transport/master/img/badge.png)](https://github.com/libp2p/interface-transport)
![](https://raw.githubusercontent.com/diasdavid/abstract-transport/master/img/badge.png) [![](https://raw.githubusercontent.com/libp2p/interface-connection/master/img/badge.png)](https://github.com/libp2p/interface-connection)
> Node.js implementation of the TCP module that libp2p uses, which implements
> the [interface-connection](https://github.com/diasdavid/interface-connection)
> interface for dial/listen.
## Description > JavaScript implementation of the TCP module for libp2p. It exposes the [interface-transport](https://github.com/libp2p/interface-connection) 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 different transports.
`libp2p-tcp` in Node.js is a very thin shim that adds support for dialing to a ## Lead Maintainer
`multiaddr`. This small shim will enable libp2p to use other different
transports.
## Example [Jacob Heun](https://github.com/jacobheun)
```js ## Table of Contents
const Tcp = require('libp2p-tcp')
const multiaddr = require('multiaddr')
const mh1 = multiaddr('/ip4/127.0.0.1/tcp/9090') - [Install](#install)
const mh2 = multiaddr('/ip6/::/tcp/9092') - [npm](#npm)
- [Usage](#usage)
- [API](#api)
- [Contribute](#contribute)
- [License](#license)
const tcp = new Tcp() ## Install
tcp.createListener([mh1, mh2], function handler (socket) {
console.log('connection')
socket.end('bye')
}, function ready () {
console.log('ready')
const client = tcp.dial(mh1)
client.pipe(process.stdout)
client.on('end', () => {
tcp.close()
})
})
```
outputs
```
ready
connection
bye
```
## Installation
### npm ### npm
```sh ```sh
> npm i libp2p-tcp > npm install libp2p-tcp
```
## Usage
```js
const TCP = require('libp2p-tcp')
const multiaddr = require('multiaddr')
const pull = require('pull-stream')
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090')
const tcp = new TCP()
const listener = tcp.createListener((socket) => {
console.log('new connection opened')
pull(
pull.values(['hello']),
socket
)
})
listener.listen(mh, () => {
console.log('listening')
pull(
tcp.dial(mh),
pull.collect((err, values) => {
if (!err) {
console.log(`Value: ${values.toString()}`)
} else {
console.log(`Error: ${err}`)
}
// Close connection after reading
listener.close()
}),
)
})
```
Outputs:
```sh
listening
new connection opened
Value: hello
``` ```
## API ## API
```js ### Transport
const Tcp = require('libp2p-tcp')
```
### var tcp = new Tcp() [![](https://raw.githubusercontent.com/libp2p/interface-transport/master/img/badge.png)](https://github.com/libp2p/interface-transport)
Creates a new TCP object. This does nothing on its own, but provides access to `libp2p-tcp` accepts TCP addresses both IPFS and non IPFS encapsulated addresses, i.e:
`dial` and `createListener`.
### tcp.createListener(multiaddrs, handler, ready) `/ip4/127.0.0.1/tcp/4001`
`/ip4/127.0.0.1/tcp/4001/ipfs/QmHash`
Creates TCP servers that listen on the addresses described in the array Both for dialing and listening.
`multiaddrs`. Each connection will call `handler` with a connection stream.
`ready` is called once all servers are listening.
### tcp.dial(multiaddr, options={}) ### Connection
Connects to the multiaddress `multiaddr` using TCP, returning the socket stream. [![](https://raw.githubusercontent.com/libp2p/interface-connection/master/img/badge.png)](https://github.com/libp2p/interface-connection)
If `options.ready` is set to a function, it is called when a connection is
established.
### tcp.close(callback) ## Contribute
Closes all the listening TCP servers, calling `callback` once all of them have Contributions are welcome! The libp2p implementation in JavaScript is a work in progress. As such, there's a few things you can do right now to help out:
been shut down.
- [Check out the existing issues](//github.com/libp2p/js-libp2p-tcp/issues).
- **Perform code reviews**.
- **Add tests**. There can never be enough tests.
Please be aware that all interactions related to libp2p are subject to the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md).
Small note: If editing the README, please conform to the [standard-readme](https://github.com/RichardLitt/standard-readme) specification.
## License ## License
MIT [MIT](LICENSE) © 2015-2016 David Dias

View File

@@ -1,12 +0,0 @@
machine:
node:
version: stable
dependencies:
pre:
- google-chrome --version
- wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
- sudo sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list'
- sudo apt-get update
- sudo apt-get --only-upgrade install google-chrome-stable
- google-chrome --version

View File

@@ -1,56 +1,76 @@
{ {
"name": "libp2p-tcp", "name": "libp2p-tcp",
"version": "0.6.2", "version": "0.13.0",
"description": "Node.js implementation of the TCP module that libp2p uses, which implements the interface-connection and interface-transport interfaces", "description": "Node.js implementation of the TCP module that libp2p uses, which implements the interface-connection and interface-transport interfaces",
"main": "lib/index.js", "leadMaintainer": "Jacob Heun <jacobheun@gmail.com>",
"jsnext:main": "src/index.js", "main": "src/index.js",
"files": [
"dist",
"src"
],
"scripts": { "scripts": {
"lint": "aegir-lint", "lint": "aegir lint",
"build": "aegir-build --env node", "test": "aegir test -t node -f test/**/*.js",
"test": "aegir-test --env node", "test:node": "aegir test -t node -f test/**/*.js",
"release": "aegir-release --env node", "release": "aegir release -t node --no-build",
"release-minor": "aegir-release --type minor --env node", "release-minor": "aegir release -t node --type minor --no-build",
"release-major": "aegir-release --type major --env node", "release-major": "aegir-release -t node --type major --no-build",
"coverage": "aegir-coverage", "coverage": "aegir coverage",
"coverage-publish": "aegir-coverage publish" "coverage-publish": "aegir coverage --provider coveralls"
}, },
"pre-commit": [ "pre-push": [
"lint", "lint",
"test" "test"
], ],
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://github.com/diasdavid/js-libp2p-tcp.git" "url": "https://github.com/libp2p/js-libp2p-tcp.git"
}, },
"keywords": [ "keywords": [
"IPFS" "IPFS"
], ],
"author": "David Dias <daviddias@ipfs.io>",
"license": "MIT", "license": "MIT",
"bugs": { "bugs": {
"url": "https://github.com/diasdavid/js-libp2p-tcp/issues" "url": "https://github.com/libp2p/js-libp2p-tcp/issues"
},
"homepage": "https://github.com/libp2p/js-libp2p-tcp",
"engines": {
"node": ">=6.0.0",
"npm": ">=3.0.0"
}, },
"homepage": "https://github.com/diasdavid/js-libp2p-tcp",
"devDependencies": { "devDependencies": {
"aegir": "^3.0.4", "aegir": "^18.2.0",
"chai": "^3.5.0", "chai": "^4.2.0",
"interface-connection": "0.0.3", "dirty-chai": "^2.0.1",
"interface-transport": "^0.1.1", "interface-transport": "~0.3.7",
"pre-commit": "^1.1.2", "pull-stream": "^3.6.9"
"tape": "^4.5.1"
}, },
"dependencies": { "dependencies": {
"ip-address": "^5.8.0", "class-is": "^1.1.0",
"lodash.contains": "^2.4.3", "debug": "^4.1.1",
"mafmt": "^2.1.0", "interface-connection": "~0.3.3",
"multiaddr": "^2.0.2", "ip-address": "^5.8.9",
"run-parallel": "^1.1.6" "mafmt": "^6.0.6",
"multiaddr": "^6.0.5",
"once": "^1.4.0",
"stream-to-pull-stream": "^1.7.2"
}, },
"contributors": [ "contributors": [
"Alan Shaw <alan@tableflip.io>",
"David Dias <daviddias.p@gmail.com>", "David Dias <daviddias.p@gmail.com>",
"Diogo Silva <fsdiogo@gmail.com>",
"Dmitriy Ryajov <dryajov@gmail.com>",
"Drew Stone <drewstone329@gmail.com>",
"Evan Schwartz <evan.mark.schwartz@gmail.com>",
"Friedel Ziegelmayer <dignifiedquire@gmail.com>",
"Greenkeeper <support@greenkeeper.io>",
"Jacob Heun <jacobheun@gmail.com>",
"Jacob Heun <jake@andyet.net>",
"João Antunes <j.goncalo.antunes@gmail.com>", "João Antunes <j.goncalo.antunes@gmail.com>",
"Pedro Teixeira <i@pgte.me>",
"Prashanth Chandra <coolshanth94@gmail.com>",
"Richard Littauer <richard.littauer@gmail.com>", "Richard Littauer <richard.littauer@gmail.com>",
"Stephen Whitmore <stephen.whitmore@gmail.com>", "Stephen Whitmore <stephen.whitmore@gmail.com>",
"dignifiedquire <dignifiedquire@gmail.com>" "TomCoded <tomtinkerer@gmail.com>"
] ]
} }

33
src/get-multiaddr.js Normal file
View File

@@ -0,0 +1,33 @@
'use strict'
const multiaddr = require('multiaddr')
const Address6 = require('ip-address').Address6
const debug = require('debug')
const log = debug('libp2p:tcp:get-multiaddr')
module.exports = (socket) => {
let ma
try {
if (socket.remoteFamily === 'IPv6') {
const addr = new Address6(socket.remoteAddress)
if (addr.v4) {
const ip4 = addr.to4().correctForm()
ma = multiaddr('/ip4/' + ip4 +
'/tcp/' + socket.remotePort
)
} else {
ma = multiaddr('/ip6/' + socket.remoteAddress +
'/tcp/' + socket.remotePort
)
}
} else {
ma = multiaddr('/ip4/' + socket.remoteAddress +
'/tcp/' + socket.remotePort)
}
} catch (err) {
log(err)
}
return ma
}

View File

@@ -1,148 +1,83 @@
'use strict' 'use strict'
const debug = require('debug') const net = require('net')
const log = debug('libp2p:tcp') const toPull = require('stream-to-pull-stream')
const tcp = require('net')
const multiaddr = require('multiaddr')
const Address6 = require('ip-address').Address6
const mafmt = require('mafmt') const mafmt = require('mafmt')
const parallel = require('run-parallel') const withIs = require('class-is')
const contains = require('lodash.contains') const Connection = require('interface-connection').Connection
const once = require('once')
const debug = require('debug')
const log = debug('libp2p:tcp:dial')
exports = module.exports = TCP const createListener = require('./listener')
const IPFS_CODE = 421 function noop () {}
const CLOSE_TIMEOUT = 300
function TCP () { class TCP {
if (!(this instanceof TCP)) { dial (ma, options, callback) {
return new TCP() if (typeof options === 'function') {
} callback = options
const listeners = []
this.dial = function (multiaddr, options) {
if (!options) {
options = {} options = {}
} }
options.ready = options.ready || function noop () {}
const conn = tcp.connect(multiaddr.toOptions(), options.ready) callback = once(callback || noop)
conn.getObservedAddrs = () => {
return [multiaddr] const cOpts = ma.toOptions()
log('Connecting to %s %s', cOpts.port, cOpts.host)
const rawSocket = net.connect(cOpts)
rawSocket.once('timeout', () => {
log('timeout')
rawSocket.emit('error', new Error('Timeout'))
})
rawSocket.once('error', callback)
rawSocket.once('connect', () => {
rawSocket.removeListener('error', callback)
callback()
})
const socket = toPull.duplex(rawSocket)
const conn = new Connection(socket)
conn.getObservedAddrs = (callback) => {
return callback(null, [ma])
} }
return conn return conn
} }
this.createListener = (multiaddrs, handler, callback) => { createListener (options, handler) {
if (typeof options === 'function') {
handler = options
options = {}
}
handler = handler || noop
return createListener(handler)
}
filter (multiaddrs) {
if (!Array.isArray(multiaddrs)) { if (!Array.isArray(multiaddrs)) {
multiaddrs = [multiaddrs] multiaddrs = [multiaddrs]
} }
const freshMultiaddrs = []
parallel(multiaddrs.map((m) => (cb) => {
let ipfsHashId
if (contains(m.protoNames(), 'ipfs')) {
ipfsHashId = m.stringTuples().filter((tuple) => {
if (tuple[0] === IPFS_CODE) {
return true
}
})[0][1]
m = m.decapsulate('ipfs')
}
const listener = tcp.createServer((conn) => {
conn.getObservedAddrs = () => {
return [getMultiaddr(conn)]
}
handler(conn)
})
listener.__connections = {}
listener.on('connection', (conn) => {
const key = `${conn.remoteAddress}:${conn.remotePort}`
listener.__connections[key] = conn
conn.on('close', () => {
delete listener.__connections[key]
})
})
listener.listen(m.toOptions(), () => {
// Node.js likes to convert addr to IPv6 (when 0.0.0.0 for e.g)
const address = listener.address()
if (m.toString().indexOf('ip4')) {
m = m.decapsulate('tcp')
m = m.encapsulate('/tcp/' + address.port)
if (ipfsHashId) {
m = m.encapsulate('/ipfs/' + ipfsHashId)
}
freshMultiaddrs.push(m)
}
if (address.family === 'IPv6') {
let mh = multiaddr('/ip6/' + address.address + '/tcp/' + address.port)
if (ipfsHashId) {
mh = mh.encapsulate('/ipfs/' + ipfsHashId)
}
freshMultiaddrs.push(mh)
}
cb()
})
listeners.push(listener)
}), (err) => {
callback(err, freshMultiaddrs)
})
}
this.close = (callback) => {
log('closing')
if (listeners.length === 0) {
log('Called close with no active listeners')
return callback()
}
parallel(listeners.map((listener) => (cb) => {
setTimeout(() => {
Object.keys(listener.__connections).forEach((key) => {
log('destroying %s', key)
listener.__connections[key].destroy()
})
}, CLOSE_TIMEOUT)
listener.close(cb)
}), callback)
}
this.filter = (multiaddrs) => {
if (!Array.isArray(multiaddrs)) {
multiaddrs = [multiaddrs]
}
return multiaddrs.filter((ma) => { return multiaddrs.filter((ma) => {
if (contains(ma.protoNames(), 'ipfs')) { if (ma.protoNames().includes('p2p-circuit')) {
return false
}
if (ma.protoNames().includes('ipfs')) {
ma = ma.decapsulate('ipfs') ma = ma.decapsulate('ipfs')
} }
return mafmt.TCP.matches(ma) return mafmt.TCP.matches(ma)
}) })
} }
} }
function getMultiaddr (conn) { module.exports = withIs(TCP, { className: 'TCP', symbolName: '@libp2p/js-libp2p-tcp/tcp' })
var mh
if (conn.remoteFamily === 'IPv6') {
var addr = new Address6(conn.remoteAddress)
if (addr.v4) {
var ip4 = addr.to4().correctForm()
mh = multiaddr('/ip4/' + ip4 + '/tcp/' + conn.remotePort)
} else {
mh = multiaddr('/ip6/' + conn.remoteAddress + '/tcp/' + conn.remotePort)
}
} else {
mh = multiaddr('/ip4/' + conn.remoteAddress + '/tcp/' + conn.remotePort)
}
return mh
}

153
src/listener.js Normal file
View File

@@ -0,0 +1,153 @@
'use strict'
const multiaddr = require('multiaddr')
const Connection = require('interface-connection').Connection
const os = require('os')
const net = require('net')
const toPull = require('stream-to-pull-stream')
const EventEmitter = require('events').EventEmitter
const debug = require('debug')
const log = debug('libp2p:tcp:listen')
const getMultiaddr = require('./get-multiaddr')
const CLOSE_TIMEOUT = 2000
function noop () {}
module.exports = (handler) => {
const listener = new EventEmitter()
const server = net.createServer((socket) => {
// Avoid uncaught errors cause by unstable connections
socket.on('error', noop)
const addr = getMultiaddr(socket)
if (!addr) {
if (socket.remoteAddress === undefined) {
log('connection closed before p2p connection made')
} else {
log('error interpreting incoming p2p connection')
}
return
}
log('new connection', addr.toString())
const s = toPull.duplex(socket)
s.getObservedAddrs = (cb) => {
cb(null, [addr])
}
trackSocket(server, socket)
const conn = new Connection(s)
handler(conn)
listener.emit('connection', conn)
})
server.on('listening', () => listener.emit('listening'))
server.on('error', (err) => listener.emit('error', err))
server.on('close', () => listener.emit('close'))
// Keep track of open connections to destroy in case of timeout
server.__connections = {}
listener.close = (options, callback) => {
if (typeof options === 'function') {
callback = options
options = {}
}
callback = callback || noop
options = options || {}
const timeout = setTimeout(() => {
log('unable to close graciously, destroying conns')
Object.keys(server.__connections).forEach((key) => {
log('destroying %s', key)
server.__connections[key].destroy()
})
}, options.timeout || CLOSE_TIMEOUT)
server.close(callback)
server.once('close', () => {
clearTimeout(timeout)
})
}
let listeningAddr
listener.listen = (ma, callback) => {
listeningAddr = ma
const lOpts = listeningAddr.toOptions()
log('Listening on %s %s', lOpts.port, lOpts.host)
return server.listen(lOpts.port, lOpts.host, callback)
}
listener.getAddrs = (callback) => {
const multiaddrs = []
const address = server.address()
if (!address) {
return callback(new Error('Listener is not ready yet'))
}
// Because TCP will only return the IPv6 version
// we need to capture from the passed multiaddr
if (listeningAddr.toString().indexOf('ip4') !== -1) {
if (listeningAddr.toString().indexOf('0.0.0.0') !== -1) {
const netInterfaces = os.networkInterfaces()
Object.keys(netInterfaces).forEach((niKey) => {
netInterfaces[niKey].forEach((ni) => {
if (ni.family === 'IPv4') {
multiaddrs.push(
multiaddr(listeningAddr.toString().replace('0.0.0.0', ni.address))
)
}
})
})
} else {
multiaddrs.push(listeningAddr)
}
}
if (address.family === 'IPv6') {
// Listen on all available addresses when using wildcard
if (listeningAddr.toString().indexOf('/::/') !== -1) {
const netInterfaces = os.networkInterfaces()
Object.keys(netInterfaces).forEach((niKey) => {
netInterfaces[niKey].forEach((ni) => {
if (ni.family === address.family) {
const maOpts = listeningAddr.toOptions()
if (maOpts.host === '::') {
maOpts.family = address.family
maOpts.address = ni.address
multiaddrs.push(
multiaddr.fromNodeAddress(maOpts, maOpts.transport)
)
}
}
})
})
} else {
multiaddrs.push(listeningAddr)
}
}
callback(null, multiaddrs)
}
return listener
}
function trackSocket (server, socket) {
const key = `${socket.remoteAddress}:${socket.remotePort}`
server.__connections[key] = socket
socket.on('close', () => {
delete server.__connections[key]
})
}

25
test/compliance.spec.js Normal file
View File

@@ -0,0 +1,25 @@
/* eslint-env mocha */
'use strict'
const tests = require('interface-transport')
const multiaddr = require('multiaddr')
const TCP = require('../src')
describe('interface-transport compliance', () => {
tests({
setup (cb) {
const tcp = new TCP()
const addrs = [
multiaddr('/ip4/127.0.0.1/tcp/9091'),
multiaddr('/ip4/127.0.0.1/tcp/9092'),
multiaddr('/ip4/127.0.0.1/tcp/9093'),
multiaddr('/ip6/::/tcp/9094'),
multiaddr('/dns4/ipfs.io')
]
cb(null, tcp, addrs)
},
teardown (cb) {
cb()
}
})
})

View File

@@ -0,0 +1,121 @@
/* eslint-env mocha */
'use strict'
const pull = require('pull-stream')
const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
const TCP = require('../src')
const multiaddr = require('multiaddr')
const Connection = require('interface-connection').Connection
describe('Connection Wrap', () => {
let tcp
let listener
const ma = multiaddr('/ip4/127.0.0.1/tcp/9090')
beforeEach((done) => {
tcp = new TCP()
listener = tcp.createListener((conn) => {
pull(conn, conn)
})
listener.on('listening', done)
listener.listen(ma)
})
afterEach((done) => {
listener.close(done)
})
it('simple wrap', (done) => {
const conn = tcp.dial(ma)
conn.setPeerInfo('peerInfo')
const connWrap = new Connection(conn)
pull(
pull.values(['hey']),
connWrap,
pull.collect((err, chunks) => {
expect(err).to.not.exist()
expect(chunks).to.be.eql([Buffer.from('hey')])
connWrap.getPeerInfo((err, peerInfo) => {
expect(err).to.not.exist()
expect(peerInfo).to.equal('peerInfo')
done()
})
})
)
})
it('buffer wrap', (done) => {
const conn = tcp.dial(ma)
const connWrap = new Connection()
pull(
pull.values(['hey']),
connWrap,
pull.collect((err, chunks) => {
expect(err).to.not.exist()
expect(chunks).to.be.eql([Buffer.from('hey')])
done()
})
)
connWrap.setInnerConn(conn)
})
it('overload wrap', (done) => {
const conn = tcp.dial(ma)
const connWrap = new Connection(conn)
connWrap.getPeerInfo = (callback) => {
callback(null, 'none')
}
conn.getPeerInfo((err, peerInfo) => {
expect(err).to.exist()
})
connWrap.getPeerInfo((err, peerInfo) => {
expect(err).to.not.exist()
expect(peerInfo).to.equal('none')
})
pull(
pull.values(['hey']),
connWrap,
pull.collect((err, chunks) => {
expect(err).to.not.exist()
expect(chunks).to.be.eql([Buffer.from('hey')])
done()
})
)
})
it('dial error', (done) => {
tcp.dial(multiaddr('/ip4/127.0.0.1/tcp/22234'), (err) => {
expect(err).to.exist()
done()
})
})
it('matryoshka wrap', (done) => {
const conn = tcp.dial(ma)
const connWrap1 = new Connection(conn)
const connWrap2 = new Connection(connWrap1)
const connWrap3 = new Connection(connWrap2)
conn.getPeerInfo = (callback) => {
callback(null, 'inner doll')
}
pull(
pull.values(['hey']),
connWrap3,
pull.collect((err, chunks) => {
expect(err).to.not.exist()
expect(chunks).to.eql([Buffer.from('hey')])
connWrap3.getPeerInfo((err, peerInfo) => {
expect(err).to.not.exist()
expect(peerInfo).to.equal('inner doll')
done()
})
})
)
})
})

111
test/connection.spec.js Normal file
View File

@@ -0,0 +1,111 @@
/* eslint-env mocha */
'use strict'
const pull = require('pull-stream')
const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
const TCP = require('../src')
const multiaddr = require('multiaddr')
describe('valid Connection', () => {
let tcp
beforeEach(() => {
tcp = new TCP()
})
const ma = multiaddr('/ip4/127.0.0.1/tcp/9090')
it('get observed addrs', (done) => {
let dialerObsAddrs
const listener = tcp.createListener((conn) => {
expect(conn).to.exist()
conn.getObservedAddrs((err, addrs) => {
expect(err).to.not.exist()
dialerObsAddrs = addrs
pull(pull.empty(), conn)
})
})
listener.listen(ma, () => {
const conn = tcp.dial(ma)
pull(
conn,
pull.onEnd(endHandler)
)
function endHandler () {
conn.getObservedAddrs((err, addrs) => {
expect(err).to.not.exist()
pull(pull.empty(), conn)
closeAndAssert(listener, addrs)
})
}
function closeAndAssert (listener, addrs) {
listener.close(() => {
expect(addrs[0]).to.deep.equal(ma)
expect(dialerObsAddrs.length).to.equal(1)
done()
})
}
})
})
it('get Peer Info', (done) => {
const listener = tcp.createListener((conn) => {
expect(conn).to.exist()
conn.getPeerInfo((err, peerInfo) => {
expect(err).to.exist()
expect(peerInfo).to.not.exist()
pull(pull.empty(), conn)
})
})
listener.listen(ma, () => {
const conn = tcp.dial(ma)
pull(conn, pull.onEnd(endHandler))
function endHandler () {
conn.getPeerInfo((err, peerInfo) => {
expect(err).to.exist()
expect(peerInfo).to.not.exist()
listener.close(done)
})
}
})
})
it('set Peer Info', (done) => {
const listener = tcp.createListener((conn) => {
expect(conn).to.exist()
conn.setPeerInfo('batatas')
conn.getPeerInfo((err, peerInfo) => {
expect(err).to.not.exist()
expect(peerInfo).to.equal('batatas')
pull(pull.empty(), conn)
})
})
listener.listen(ma, () => {
const conn = tcp.dial(ma)
pull(conn, pull.onEnd(endHandler))
function endHandler () {
conn.setPeerInfo('arroz')
conn.getPeerInfo((err, peerInfo) => {
expect(err).to.not.exist()
expect(peerInfo).to.equal('arroz')
listener.close(done)
})
}
})
})
})

15
test/constructor.spec.js Normal file
View File

@@ -0,0 +1,15 @@
/* eslint-env mocha */
'use strict'
const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
const TCP = require('../src')
describe('Constructor', () => {
it('create an instance', () => {
const tcp = new TCP()
expect(tcp).to.exist()
})
})

44
test/filter.spec.js Normal file
View File

@@ -0,0 +1,44 @@
/* eslint-env mocha */
'use strict'
const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
const TCP = require('../src')
const multiaddr = require('multiaddr')
describe('filter addrs', () => {
const base = '/ip4/127.0.0.1'
const ipfs = '/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw'
let tcp
before(() => {
tcp = new TCP()
})
it('filter valid addrs for this transport', () => {
const ma1 = multiaddr(base + '/tcp/9090')
const ma2 = multiaddr(base + '/udp/9090')
const ma3 = multiaddr(base + '/tcp/9090/http')
const ma4 = multiaddr(base + '/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
const ma5 = multiaddr(base + '/tcp/9090/http' + ipfs)
const ma6 = multiaddr('/ip4/127.0.0.1/tcp/9090/p2p-circuit' + ipfs)
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])
expect(valid.length).to.equal(4)
expect(valid[0]).to.deep.equal(ma1)
expect(valid[1]).to.deep.equal(ma4)
})
it('filter a single addr for this transport', () => {
const ma1 = multiaddr(base + '/tcp/9090')
const valid = tcp.filter(ma1)
expect(valid.length).to.equal(1)
expect(valid[0]).to.eql(ma1)
})
})

View File

@@ -0,0 +1,54 @@
/* eslint-env mocha */
'use strict'
const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
const getMultiaddr = require('../src/get-multiaddr')
const goodSocket4 = {
remoteAddress: '127.0.0.1',
remotePort: '9090',
remoteFamily: 'IPv4'
}
const goodSocket6 = {
remoteAddress: '::1',
remotePort: '9090',
remoteFamily: 'IPv6'
}
const badSocket = {}
const badSocketData = {
remoteAddress: 'aewmrn4awoew',
remotePort: '234',
remoteFamily: 'Hufflepuff'
}
describe('getMultiaddr multiaddr creation', () => {
it('creates multiaddr from valid socket data', (done) => {
expect(getMultiaddr(goodSocket4))
.to.exist()
done()
})
it('creates multiaddr from valid IPv6 socket data', (done) => {
expect(getMultiaddr(goodSocket6))
.to.exist()
done()
})
it('returns undefined multiaddr from missing socket data', (done) => {
expect(getMultiaddr(badSocket))
.to.equal(undefined)
done()
})
it('returns undefined multiaddr from unparseable socket data', (done) => {
expect(getMultiaddr(badSocketData))
.to.equal(undefined)
done()
})
})

View File

@@ -1,182 +0,0 @@
/* eslint-env mocha */
'use strict'
const expect = require('chai').expect
const TCPlibp2p = require('../src')
const net = require('net')
const multiaddr = require('multiaddr')
describe('libp2p-tcp', function () {
this.timeout(10000)
var tcp
it('create', (done) => {
tcp = new TCPlibp2p()
expect(tcp).to.exist
done()
})
it('create without new', (done) => {
tcp = TCPlibp2p()
expect(tcp).to.exist
done()
})
it('close /wo listeners', (done) => {
tcp = new TCPlibp2p()
expect(tcp).to.exist
expect(function () { tcp.close() }).to.throw(Error)
done()
})
it('listen', (done) => {
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090')
tcp.createListener(mh, (socket) => {
expect(socket).to.exist
socket.end()
tcp.close(() => {
done()
})
}, (err, freshMultiaddrs) => {
expect(err).to.not.exist
expect(mh).to.deep.equal(freshMultiaddrs[0])
const socket = net.connect({ host: '127.0.0.1', port: 9090 })
socket.end()
})
})
it('listen on addr with /ipfs/QmHASH', (done) => {
const mh = multiaddr('/ip4/127.0.0.1/tcp/14090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
tcp.createListener(mh, (socket) => {
expect(socket).to.exist
socket.end()
tcp.close(() => {
done()
})
}, (err, freshMultiaddrs) => {
expect(err).to.not.exist
expect(mh).to.deep.equal(freshMultiaddrs[0])
const socket = net.connect({ host: '127.0.0.1', port: 14090 })
socket.end()
})
})
it('dial', (done) => {
const server = net.createServer((socket) => {
expect(socket).to.exist
socket.end()
server.close(done)
})
server.listen(9090, () => {
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090')
const socket = tcp.dial(mh)
socket.end()
})
})
it('listen on several', (done) => {
const mh1 = multiaddr('/ip4/127.0.0.1/tcp/9090')
const mh2 = multiaddr('/ip4/127.0.0.1/tcp/9091')
const mh3 = multiaddr('/ip6/::/tcp/9092')
const tcp = new TCPlibp2p()
tcp.createListener([mh1, mh2, mh3], (socket) => {}, () => {
tcp.close(done)
})
})
it('dial ipv6', (done) => {
const mh = multiaddr('/ip6/::/tcp/9091')
var dialerObsAddrs
tcp.createListener(mh, (conn) => {
expect(conn).to.exist
dialerObsAddrs = conn.getObservedAddrs()
conn.end()
}, () => {
const conn = tcp.dial(mh)
conn.on('end', () => {
expect(dialerObsAddrs.length).to.equal(1)
tcp.close()
done()
})
})
})
it('get observed addrs', (done) => {
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090')
var dialerObsAddrs
var listenerObsAddrs
tcp.createListener(mh, (conn) => {
expect(conn).to.exist
dialerObsAddrs = conn.getObservedAddrs()
conn.end()
}, () => {
const conn = tcp.dial(mh)
conn.on('end', () => {
listenerObsAddrs = conn.getObservedAddrs()
conn.end()
tcp.close(() => {
expect(listenerObsAddrs[0]).to.deep.equal(mh)
expect(dialerObsAddrs.length).to.equal(1)
done()
})
})
})
})
it('filter valid addrs for this transport', (done) => {
const mh1 = multiaddr('/ip4/127.0.0.1/tcp/9090')
const mh2 = multiaddr('/ip4/127.0.0.1/udp/9090')
const mh3 = multiaddr('/ip4/127.0.0.1/tcp/9090/http')
const mh4 = multiaddr('/ip4/127.0.0.1/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
const valid = tcp.filter([mh1, mh2, mh3, mh4])
expect(valid.length).to.equal(2)
expect(valid[0]).to.deep.equal(mh1)
done()
})
it('filter a valid addr for this transport', (done) => {
const mh1 = multiaddr('/ip4/127.0.0.1/tcp/9090')
const valid = tcp.filter(mh1)
expect(valid.length).to.equal(1)
expect(valid[0]).to.deep.equal(mh1)
done()
})
it('destroys after timeout', (done) => {
const server = new TCPlibp2p()
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090')
server.createListener(mh, (conn) => {
const i = setInterval(() => {
conn.read()
conn.write('hi\n')
}, 100)
i.unref()
}, () => {
let connected = 0
const connectHandler = () => {
connected++
if (connected === 10) {
setTimeout(() => {
server.close(done)
}, 1)
}
}
const errorHandler = () => {}
for (let i = 0; i < 10; i++) {
const client = net.connect(9090)
client.on('connect', connectHandler)
// just ignore the resets
client.on('error', errorHandler)
}
})
})
})

View File

@@ -1,23 +0,0 @@
/* eslint-env mocha */
'use strict'
const tape = require('tape')
const tests = require('interface-transport/tests')
const TCP = require('../src')
// Not adhering to this interface anymore!
describe.skip('interface-transport', () => {
it('works', (done) => {
const common = {
setup (t, cb) {
cb(null, new TCP())
},
teardown (t, cb) {
cb()
}
}
tape.onFinish(done)
tests(tape, common)
})
})

274
test/listen-dial.spec.js Normal file
View File

@@ -0,0 +1,274 @@
/* eslint-env mocha */
/* eslint max-nested-callbacks: ["error", 5] */
'use strict'
const pull = require('pull-stream')
const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
const TCP = require('../src')
const net = require('net')
const multiaddr = require('multiaddr')
const isCI = process.env.CI
describe('listen', () => {
let tcp
let listener
beforeEach(() => {
tcp = new TCP()
})
afterEach((done) => {
listener ? listener.close(done) : done()
})
it('close listener with connections, through timeout', (done) => {
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
listener = tcp.createListener((conn) => {
pull(conn, conn)
})
listener.listen(mh, () => {
const socket1 = net.connect(9090)
const socket2 = net.connect(9090)
socket1.write('Some data that is never handled')
socket1.end()
socket1.on('error', () => {})
socket2.on('error', () => {})
socket1.on('connect', done)
})
})
it('listen on port 0', (done) => {
const mh = multiaddr('/ip4/127.0.0.1/tcp/0')
listener = tcp.createListener((conn) => {})
listener.listen(mh, done)
})
it('listen on IPv6 addr', (done) => {
if (isCI) { return done() }
const mh = multiaddr('/ip6/::/tcp/9090')
listener = tcp.createListener((conn) => {})
listener.listen(mh, done)
})
it('listen on any Interface', (done) => {
const mh = multiaddr('/ip4/0.0.0.0/tcp/9090')
listener = tcp.createListener((conn) => {})
listener.listen(mh, done)
})
it('getAddrs', (done) => {
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090')
listener = tcp.createListener((conn) => {})
listener.listen(mh, () => {
listener.getAddrs((err, multiaddrs) => {
expect(err).to.not.exist()
expect(multiaddrs.length).to.equal(1)
expect(multiaddrs[0]).to.deep.equal(mh)
done()
})
})
})
it('getAddrs on port 0 listen', (done) => {
const mh = multiaddr('/ip4/127.0.0.1/tcp/0')
listener = tcp.createListener((conn) => {})
listener.listen(mh, () => {
listener.getAddrs((err, multiaddrs) => {
expect(err).to.not.exist()
expect(multiaddrs.length).to.equal(1)
done()
})
})
})
it('getAddrs from listening on 0.0.0.0', (done) => {
const mh = multiaddr('/ip4/0.0.0.0/tcp/9090')
listener = tcp.createListener((conn) => {})
listener.listen(mh, () => {
listener.getAddrs((err, multiaddrs) => {
expect(err).to.not.exist()
expect(multiaddrs.length > 0).to.equal(true)
expect(multiaddrs[0].toString().indexOf('0.0.0.0')).to.equal(-1)
done()
})
})
})
it('getAddrs from listening on 0.0.0.0 and port 0', (done) => {
const mh = multiaddr('/ip4/0.0.0.0/tcp/0')
listener = tcp.createListener((conn) => {})
listener.listen(mh, () => {
listener.getAddrs((err, multiaddrs) => {
expect(err).to.not.exist()
expect(multiaddrs.length > 0).to.equal(true)
multiaddrs.forEach((m) => {
expect(m.toOptions().host).to.not.eql('0.0.0.0')
})
done()
})
})
})
it('getAddrs from listening on ip6 \'::\'', (done) => {
const mh = multiaddr('/ip6/::/tcp/9090')
listener = tcp.createListener((conn) => {})
listener.listen(mh, () => {
listener.getAddrs((err, multiaddrs) => {
expect(err).to.not.exist()
expect(multiaddrs.length > 0).to.equal(true)
multiaddrs.forEach((m) => {
expect(m.toOptions().host).to.not.eql('::')
})
done()
})
})
})
it('getAddrs preserves IPFS Id', (done) => {
const mh = multiaddr('/ip4/127.0.0.1/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
listener = tcp.createListener((conn) => {})
listener.listen(mh, () => {
listener.getAddrs((err, multiaddrs) => {
expect(err).to.not.exist()
expect(multiaddrs.length).to.equal(1)
expect(multiaddrs[0]).to.deep.equal(mh)
done()
})
})
})
})
describe('dial', () => {
let tcp
let listener
const ma = multiaddr('/ip4/127.0.0.1/tcp/9090')
beforeEach((done) => {
tcp = new TCP()
listener = tcp.createListener((conn) => {
pull(
conn,
pull.map((x) => Buffer.from(x.toString() + '!')),
conn
)
})
listener.listen(ma, done)
})
afterEach((done) => {
listener.close(done)
})
it('dial on IPv4', (done) => {
pull(
pull.values(['hey']),
tcp.dial(ma),
pull.collect((err, values) => {
expect(err).to.not.exist()
expect(values).to.eql([Buffer.from('hey!')])
done()
})
)
})
it('dial to non existent listener', (done) => {
const ma = multiaddr('/ip4/127.0.0.1/tcp/8989')
pull(
tcp.dial(ma),
pull.onEnd((err) => {
expect(err).to.exist()
done()
})
)
})
it('dial on IPv6', (done) => {
if (isCI) { return done() }
const ma = multiaddr('/ip6/::/tcp/9066')
const listener = tcp.createListener((conn) => {
pull(conn, conn)
})
listener.listen(ma, () => {
pull(
pull.values(['hey']),
tcp.dial(ma),
pull.collect((err, values) => {
expect(err).to.not.exist()
expect(values).to.be.eql([Buffer.from('hey')])
listener.close(done)
})
)
})
})
it('dial and destroy on listener', (done) => {
let count = 0
const closed = () => ++count === 2 ? finish() : null
const ma = multiaddr('/ip6/::/tcp/9067')
const listener = tcp.createListener((conn) => {
pull(
pull.empty(),
conn,
pull.onEnd(closed)
)
})
listener.listen(ma, () => {
pull(tcp.dial(ma), pull.onEnd(closed))
})
function finish () {
listener.close(done)
}
})
it('dial and destroy on dialer', (done) => {
if (isCI) { return done() }
let count = 0
const destroyed = () => ++count === 2 ? finish() : null
const ma = multiaddr('/ip6/::/tcp/9068')
const listener = tcp.createListener((conn) => {
pull(conn, pull.onEnd(destroyed))
})
listener.listen(ma, () => {
pull(
pull.empty(),
tcp.dial(ma),
pull.onEnd(destroyed)
)
})
function finish () {
listener.close(done)
}
})
it('dial on IPv4 with IPFS Id', (done) => {
const ma = multiaddr('/ip4/127.0.0.1/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
const conn = tcp.dial(ma)
pull(
pull.values(['hey']),
conn,
pull.collect((err, res) => {
expect(err).to.not.exist()
expect(res).to.be.eql([Buffer.from('hey!')])
done()
})
)
})
})

16
test/turbolence.spec.js Normal file
View File

@@ -0,0 +1,16 @@
/* eslint-env mocha */
'use strict'
const chai = require('chai')
const dirtyChai = require('dirty-chai')
const expect = chai.expect
chai.use(dirtyChai)
// const TCP = require('../src')
describe.skip('turbolence', () => {
it('dialer - emits error on the other end is terminated abruptly', (done) => {
expect('ok').to.equal('ok')
})
it('listener - emits error on the other end is terminated abruptly', (done) => {})
})