Compare commits

...

197 Commits

Author SHA1 Message Date
c3aaad4753 chore: add github actions 2021-04-09 10:30:48 +02:00
578276bd40 chore: update deps 2021-04-09 10:19:09 +02:00
d39ad01e96 chore: update url interfaces (#143) 2021-03-24 13:22:02 +01:00
37406d1924 chore: release version v0.15.3 2021-02-03 13:06:33 +01:00
2df478919d chore: update contributors 2021-02-03 13:06:32 +01:00
3813100438 fix: hanging close promise (#140) 2021-02-03 13:03:09 +01:00
8661c09b69 chore: release version v0.15.2 2020-12-28 09:54:14 +00:00
f9e329708d chore: update contributors 2020-12-28 09:54:14 +00:00
af9804e778 fix: intermittent error when asking for interfaces (#137)
Get interfaces only once per run
2020-12-28 09:49:48 +00:00
e9e1f56b87 chore: release version v0.15.1 2020-08-11 15:35:36 +02:00
dee839efa5 chore: update contributors 2020-08-11 15:35:36 +02:00
8ff9f607b0 chore: update deps (#136)
Updates to the latest mafmt which has the latest multiaddr
2020-08-11 15:34:44 +02:00
f17525a9b2 chore: update deps (#135)
Pulls in the latest interface module that depends on modules that
use Uint8Arrays in place of node Buffers.
2020-08-10 13:28:55 +02:00
b524848352 chore: release version v0.15.0 2020-08-07 18:09:07 +02:00
926a99caea chore: update contributors 2020-08-07 18:09:06 +02:00
d9f9912dac chore: update deps (#134)
* chore: update deps

Upgrades to the latest multiaddrs with Uint8Arrays

Also removes redundant deps.

BREAKING CHANGES:

- The multiaddr dep used by this module returns Uint8Arrays and may
  not be compatible with previous versions

* chore: update utils

* chore: remove gh dep url
2020-08-07 18:07:34 +02:00
82b99076d0 chore: release version v0.14.6 2020-07-17 12:37:16 +02:00
6590651e97 chore: update contributors 2020-07-17 12:37:16 +02:00
5757c7ea11 chore: update dependencies (#133)
* chore: update dependencies

This includes a memory leak fix in stream-to-it 0.2.1

* chore: update stream-to-it

* chore: remove bundlesize from CI, it's for browser support
2020-07-17 12:34:55 +02:00
562b3adf1f chore: release version v0.14.5 2020-04-28 14:46:01 +02:00
eac9129bc0 chore: update contributors 2020-04-28 14:46:01 +02:00
0fe0815514 fix: catch error from maConn.close (#128) 2020-04-28 14:34:37 +02:00
2bc2b36050 chore: release version v0.14.4 2020-02-24 18:22:49 +01:00
f4f3e8529b chore: update contributors 2020-02-24 18:22:48 +01:00
3a127fca4c chore(deps-dev): bump sinon from 8.1.1 to 9.0.0
Bumps [sinon](https://github.com/sinonjs/sinon) from 8.1.1 to 9.0.0.
- [Release notes](https://github.com/sinonjs/sinon/releases)
- [Changelog](https://github.com/sinonjs/sinon/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sinonjs/sinon/compare/v8.1.1...v9.0.0)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-19 08:21:22 -05:00
0c4269cdc2 chore(deps-dev): bump aegir from 20.6.1 to 21.0.2 (#125)
Bumps [aegir](https://github.com/ipfs/aegir) from 20.6.1 to 21.0.2.
- [Release notes](https://github.com/ipfs/aegir/releases)
- [Changelog](https://github.com/ipfs/aegir/blob/master/CHANGELOG.md)
- [Commits](https://github.com/ipfs/aegir/compare/v20.6.1...v21.0.2)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-18 07:57:52 -05:00
40f4cb6bb7 chore(deps-dev): bump sinon from 7.5.0 to 8.1.1 (#120)
Bumps [sinon](https://github.com/sinonjs/sinon) from 7.5.0 to 8.1.1.
- [Release notes](https://github.com/sinonjs/sinon/releases)
- [Changelog](https://github.com/sinonjs/sinon/blob/master/CHANGELOG.md)
- [Commits](https://github.com/sinonjs/sinon/compare/v7.5.0...v8.1.1)

Signed-off-by: dependabot-preview[bot] <support@dependabot.com>
2020-02-14 14:14:08 +01:00
62728769d3 fix: remove use of assert module (#123)
The polyfill is big, we can simulate it by throwing an Error and it doesn't work under React Native.
2020-02-14 14:13:03 +01:00
86db568cd8 fix: catch thrown maConn errors in listener (#122)
When upgrading sockets to MultiaddConnections, it's possible for an error to be thrown.
This can crash the application if a client disconnects prior to the listener
uprading the socket, as is likely occurring in #121. Errors will now be caught and logged
when attempting to upgrade the socket.
2020-02-14 14:12:30 +01:00
0c2d84e395 chore: release version v0.14.3
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-12-20 09:02:38 -08:00
13fb6ba6e4 chore: update contributors 2019-12-20 09:02:37 -08:00
21f87476f6 fix: transport should not handle connection if upgradeInbound throws (#119) 2019-12-20 08:33:36 -08:00
657d3e6f4a chore: release version v0.14.2
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-12-06 10:09:04 +01:00
162c605bf5 chore: update contributors 2019-12-06 10:09:03 +01:00
d76a1f27e7 feat: add path multiaddr support (#118)
* chore: update deps
* test: skip paths on windows
2019-12-06 09:42:43 +01:00
7702646cfa fix(log): log the bound port and host (#117) 2019-10-02 16:49:13 +02:00
7c977d3cb1 chore: use libp2p utils for ip port to multiaddr (#116) 2019-09-24 16:35:40 +02:00
524acbe372 chore: release version v0.14.1
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-09-20 13:43:27 +02:00
1b210e71c0 chore: update contributors 2019-09-20 13:43:27 +02:00
a385f0eb34 docs: add upgrader to readme example (#114) 2019-09-20 13:42:11 +02:00
605ee279ae fix: ensure timeline.close is set (#113)
* fix(test): dns4 isnt a valid tcp multiaddr

It should be resolved first

* fix: ensure timeline.close is set on the multiaddrConn

* chore: add docs to gitignore

They are generated and uploaded on release
2019-09-19 15:20:54 +02:00
872e15af46 chore: release version v0.14.0
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-09-16 17:27:16 +02:00
0aba4f8611 chore: update contributors 2019-09-16 17:27:15 +02:00
cf7d1b8501 feat: change api to async / await (#112)
BREAKING CHANGE: All places in the API that used callbacks are now replaced with async/await. The API has also been updated according to the latest `interface-transport` version, https://github.com/libp2p/interface-transport/tree/v0.6.0#api.
2019-09-16 17:19:47 +02:00
49c7f33375 chore: release version v0.13.1
License: MIT
Signed-off-by: Jacob Heun <jacobheun@gmail.com>
2019-08-08 13:27:01 +02:00
89bceb461f chore: update contributors 2019-08-08 13:27:01 +02:00
44f9e32d07 chore: update deps (#110)
* chore: add node 12 to travis
* test: just use spec files
2019-08-08 12:48:13 +02:00
c26cc70c65 chore: add discourse badge (#106) 2019-04-26 17:44:28 +02:00
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
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
01cfbda2e7 chore: update contributors 2018-09-12 19:40:49 +02:00
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
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
66ab208182 chore: update contributors 2018-07-31 14:13:10 +02:00
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
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
6c36a46831 test: fixes listen-dial test "dial and destroy on listener" (#97) 2018-07-31 13:46:12 +02:00
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
79428f3e62 chore: release version v0.12.0 2018-04-05 17:00:33 +01:00
8a394b5286 chore: update contributors 2018-04-05 17:00:33 +01:00
b7f73bcda1 test: fix dial error test 2018-04-05 17:00:19 +01:00
8b44aa28ee chore: update deps 2018-04-05 16:56:23 +01:00
ded1f6831c feat: add class-is module 2018-04-05 16:55:54 +01:00
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
df0aa059ca chore: release version v0.11.6 2018-02-20 10:27:27 +00:00
bf74e9acad chore: update contributors 2018-02-20 10:27:26 +00:00
83c4617e8d chore: update deps 2018-02-20 10:27:17 +00:00
3b7e68bc8a docs: update and polish 2018-02-20 10:25:18 +00:00
de1d7fe75c chore: tiny refactor 2018-02-07 06:40:00 +00:00
9c77a69ae3 chore: tiny refactor 2018-02-07 06:26:02 +00:00
50840a8067 test: refactor 2018-02-07 06:06:15 +00:00
d194ff0a3b chore: release version v0.11.5 2018-02-07 05:59:57 +00:00
41ca37e9ce chore: update contributors 2018-02-07 05:59:56 +00:00
71a28bb177 test: refactor 2018-02-07 05:59:34 +00:00
0d1861a1f8 chore: release version v0.11.4 2018-02-07 05:58:11 +00:00
929408eb38 chore: update contributors 2018-02-07 05:58:11 +00:00
b94f9c5d51 test: refactor 2018-02-07 05:56:55 +00:00
4b0851b4a4 chore: release version v0.11.3 2018-02-07 05:45:42 +00:00
74771b9504 chore: update contributors 2018-02-07 05:45:42 +00:00
48eefa1b40 chore: update deps 2018-02-07 05:45:30 +00:00
f8f52665f7 fix: clearing timeout when closes (#87) 2018-02-07 05:43:15 +00:00
d804244239 chore: release version v0.11.2 2018-01-12 12:30:45 +00:00
31c720f285 chore: update contributors 2018-01-12 12:30:45 +00:00
c553e0448f chore: fix release script 2018-01-12 12:30:38 +00:00
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
74a88f6868 fix: missing dependency debug, fixes #84 2018-01-12 12:01:54 +00:00
1de9f18894 chore: update gitignore 2017-10-13 17:17:54 +02:00
2673ae48b0 chore: release version v0.11.1 2017-10-13 17:17:16 +02:00
9a4425f5ba chore: update contributors 2017-10-13 17:17:16 +02:00
50d6a7b7cf chre: fix linting 2017-10-13 17:17:11 +02:00
0a515f8fda chore: update deps and CI config 2017-10-13 17:15:36 +02:00
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
7572279838 chore: release version v0.11.0 2017-09-03 10:02:33 +01:00
181ce4eef2 chore: update contributors 2017-09-03 10:02:33 +01:00
f8075be92a docs: update badge on readme 2017-09-03 10:02:10 +01:00
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
ef45cc9a34 chore: release version v0.10.2 2017-07-22 14:42:22 -07:00
ce5f023508 chore: update contributors 2017-07-22 14:42:21 -07:00
2f9b1fe7fe chore: update deps 2017-07-22 14:40:25 -07:00
46672b669f chore: release version v0.10.1 2017-04-13 15:10:07 +01:00
31f69ec3c2 chore: update contributors 2017-04-13 15:10:07 +01:00
afed19439a chore: update deps 2017-04-10 14:32:05 -04:00
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
e204517a51 fix: catch errors on incomming sockets 2017-04-07 11:51:56 -04:00
4694f9dd47 chore: release version v0.10.0 2017-03-27 16:21:35 +01:00
dd6e067125 chore: update contributors 2017-03-27 16:21:34 +01:00
fb382a3e2a codestyle: fix linting 2017-03-27 16:21:26 +01:00
fd741367a2 chore: update deps 2017-03-27 16:19:30 +01:00
4d4f295dd5 fix(dial): proper error handling on dial (#77) 2017-03-27 16:18:55 +01:00
0edc487b23 chore: release version v0.9.4 2017-03-21 14:27:22 +00:00
c3ad8ce47a chore: update contributors 2017-03-21 14:27:22 +00:00
665b755922 chore: update aegir 2017-03-21 14:27:16 +00:00
1a550bac26 chore: release version v0.9.3 2017-02-09 09:01:06 -08:00
51c5594d49 chore: update contributors 2017-02-09 09:01:05 -08:00
d5476caee1 missing dep 2017-02-09 09:00:58 -08:00
4b211f5cd6 chore: release version v0.9.2 2017-02-09 08:34:54 -08:00
433188f182 chore: update contributors 2017-02-09 08:34:54 -08:00
f3de45d198 chore: ^ to ~ 2017-02-09 08:33:48 -08:00
2afaed5f2a chore(package): update multiaddr to version 2.1.3 (#62)
https://greenkeeper.io/
2017-01-19 11:05:56 +01:00
308dead134 chore(package): update mafmt to version 2.1.4 (#63)
https://greenkeeper.io/
2017-01-16 17:05:57 +01:00
1c8603b721 chore(package): update mafmt to version 2.1.3 (#61)
https://greenkeeper.io/
2017-01-16 16:18:52 +01:00
c883475a4f chore(package): update aegir to version 9.3.0 (#57)
https://greenkeeper.io/
2016-12-18 11:44:36 +00:00
515c6a32ec chore(package): update ip-address to version 5.8.6 (#60)
https://greenkeeper.io/
2016-12-18 11:38:42 +00:00
a107e1da57 chore(package): update pre-commit to version 1.2.2 (#58)
https://greenkeeper.io/
2016-12-18 11:37:15 +00:00
2ec97b3c8c chore(package): update pre-commit to version 1.2.0 (#53)
https://greenkeeper.io/
2016-12-10 12:02:44 -08:00
cb449a6c5c chore(package): update aegir to version 9.2.1 (#54)
https://greenkeeper.io/
2016-12-10 12:01:37 -08:00
1773efecdf chore(package): update ip-address to version 5.8.4 (#52)
https://greenkeeper.io/
2016-12-08 19:19:52 -08:00
49e23f1961 refactor: use lodash.includes instead of lodash.contains
As `loadash.contains` is deprecated.
2016-12-04 13:28:18 +01:00
10b35b22f6 chore(package): update multiaddr to version 2.1.1 (#47)
https://greenkeeper.io/
2016-11-28 12:02:56 +00:00
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
9524e8670a chore(package): update aegir to version 9.1.1
https://greenkeeper.io/
2016-11-04 16:07:36 +01:00
32dc4fa5c6 chore: release version v0.9.1 2016-11-03 08:29:14 +00:00
9d697f66a4 chore: update contributors 2016-11-03 08:29:14 +00:00
fb6c61abe9 chore: update deps 2016-11-03 08:29:09 +00:00
114998db1c chore: release version v0.9.0 2016-11-03 08:23:38 +00:00
4a94e3ca01 chore: update contributors 2016-11-03 08:23:38 +00:00
e451201848 Async Crypto Endeavour (#40) 2016-11-03 08:22:32 +00:00
e7524e1747 docs(readme): fix coverage badge 2016-09-09 12:13:14 +02:00
06689e3ff0 fix(deps): remove unused pull dep 2016-09-09 11:49:11 +02:00
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
a2958b9bca chore(package): update aegir to version 8.0.1
https://greenkeeper.io/
2016-09-09 01:34:28 +02:00
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
2330732ed5 chore(package): update multiaddr to version 2.0.3
https://greenkeeper.io/
2016-09-08 01:20:22 +02:00
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
850a414e6f chore: release version v0.8.1 2016-09-06 09:31:40 -04:00
f6df6cfa40 chore: update contributors 2016-09-06 09:31:40 -04:00
c16376f567 Merge pull request #32 from libp2p/feature/standardize-readme
Standardize Readme
2016-09-06 09:24:19 -04:00
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
48708ac4d2 chore(package): update aegir to version 8.0.0
https://greenkeeper.io/
2016-09-06 15:11:49 +02:00
1d1d091082 chore: release version v0.8.0 2016-09-06 08:52:42 -04:00
0d007ff5fe chore: update contributors 2016-09-06 08:52:42 -04:00
2f2ca0d97b Merge pull request #20 from libp2p/pull
Migrate to pull-streams
2016-09-06 08:42:29 -04:00
da8ee216e1 feat(deps): update to published deps 2016-09-06 08:31:17 -04:00
d9f65e0b0c feat(readme): add pull-streams documentation 2016-09-05 18:31:34 -04:00
5e89a2608b feat(pull): migration to pull-streams 2016-09-05 18:31:34 -04:00
caa8d6dbb1 Merge pull request #18 from emschwartz/master
docs: fix README example
2016-09-05 18:01:32 -04:00
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
915fdc818f chore(package): update mafmt to version 2.1.2
https://greenkeeper.io/
2016-08-22 16:19:30 +02:00
2dc52d0a5c docs: fix README example 2016-08-03 17:52:01 +02:00
e01046eb03 chore: release version v0.7.4 2016-08-03 14:57:30 +01:00
918b9df322 chore: update contributors 2016-08-03 14:57:30 +01:00
31b47fbfd2 Merge pull request #17 from libp2p/update-deps
update dependencies
2016-08-03 14:47:05 +01:00
26e9268bb5 update dependencies 2016-08-03 14:42:35 +01:00
676b5f3dbf chore: release version v0.7.3 2016-06-26 21:18:26 +01:00
ad7a331d9a chore: update contributors 2016-06-26 21:18:25 +01:00
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
cf0e9a1a8f use duplexify fork while PR is not up yet 2016-06-26 21:13:39 +01:00
d2f91814b6 chore: release version v0.7.2 2016-06-23 08:42:03 +01:00
405f552c77 chore: update contributors 2016-06-23 08:42:02 +01:00
cba4b8b94a pass the err on the callback too 2016-06-23 08:41:54 +01:00
ae6a808fc7 chore: release version v0.7.1 2016-06-23 08:35:56 +01:00
eae6819b02 chore: update contributors 2016-06-23 08:35:56 +01:00
9ac5cca946 fix: error was passed in duplicate 2016-06-23 08:35:49 +01:00
cdfd473cac chore: release version v0.7.0 2016-06-22 11:31:32 +01:00
5344ea33aa chore: update contributors 2016-06-22 11:31:32 +01:00
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
539a007031 comply with the latest interface-transport and interface-connection spec 2016-06-22 09:36:08 +01:00
730a477bd8 chore: release version v0.6.2 2016-06-01 02:15:22 +02:00
19b29fe40b chore: update contributors 2016-06-01 02:15:22 +02:00
073e14553b Merge pull request #14 from diasdavid/close-timeout
fix: destroy hanging connections after timeout
2016-06-01 01:09:40 +01:00
2ed01e8f5b fix: address cr 2016-05-31 21:49:12 +02:00
4a121696d1 fix: destroy hanging connections after timeout 2016-05-31 14:48:18 +02:00
a008d1db34 chore: release version v0.6.1 2016-05-29 08:56:30 +01:00
f50b9bafdd chore: update contributors 2016-05-29 08:56:30 +01:00
abd71d76e4 support for tcp addrs with ipfs in the end as well 2016-05-29 08:56:24 +01:00
5c150db80b chore: release version v0.6.0 2016-05-22 17:21:04 +01:00
6d15dd94bb chore: update contributors 2016-05-22 17:21:04 +01:00
019d60cf61 fix npm scripts 2016-05-22 17:20:58 +01:00
0c97a3b191 chore: release version vnull 2016-05-22 17:20:09 +01:00
4c04e2565b chore: update contributors 2016-05-22 17:20:09 +01:00
0bc2321649 update deps 2016-05-22 17:20:00 +01:00
6267bf84c6 chore: release version v0.5.2 2016-05-09 10:55:15 +01:00
4b82e33b39 chore: update contributors 2016-05-09 10:55:15 +01:00
8adced0f4b Merge pull request #13 from dignifiedquire/next
refactor: use aegir
2016-05-09 10:51:21 +01:00
3f4f163f40 refactor: use aegir 2016-05-09 11:14:40 +02:00
11c46ac995 Release v0.5.1. 2016-05-08 21:50:30 +01:00
749db165ce do not callback with error on no listeners to close 2016-05-08 21:50:03 +01:00
21 changed files with 1479 additions and 367 deletions

33
.github/workflows/main.yml vendored Normal file
View File

@ -0,0 +1,33 @@
name: ci
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: npm install
- run: npx aegir lint
- run: npx aegir dep-check -- -i wrtc -i electron-webrtc
test-node:
needs: check
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [windows-latest, ubuntu-latest, macos-latest]
node: [14, 15]
fail-fast: true
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node }}
- run: npm install
- run: npx nyc --reporter=lcov aegir test -t node -- --bail
- uses: codecov/codecov-action@v1

30
.gitignore vendored
View File

@ -1,27 +1,5 @@
# Logs
logs
*.log
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules
package-lock.json
coverage
.nyc_output
docs

29
.npmignore Normal file
View File

@ -0,0 +1,29 @@
# Logs
logs
*.log
# Runtime data
pids
*.pid
*.seed
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# node-waf configuration
.lock-wscript
# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release
# Dependency directory
# https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git
node_modules
test

View File

@ -1,11 +0,0 @@
sudo: false
language: node_js
node_js:
- "4.0"
# Make sure we have new NPM.
before_install:
- npm install -g npm
script:
- npm test

408
CHANGELOG.md Normal file
View File

@ -0,0 +1,408 @@
<a name="0.15.3"></a>
## [0.15.3](https://github.com/libp2p/js-libp2p-tcp/compare/v0.15.2...v0.15.3) (2021-02-03)
### Bug Fixes
* hanging close promise ([#140](https://github.com/libp2p/js-libp2p-tcp/issues/140)) ([3813100](https://github.com/libp2p/js-libp2p-tcp/commit/3813100))
<a name="0.15.2"></a>
## [0.15.2](https://github.com/libp2p/js-libp2p-tcp/compare/v0.14.2...v0.15.2) (2020-12-28)
### Bug Fixes
* catch error from maConn.close ([#128](https://github.com/libp2p/js-libp2p-tcp/issues/128)) ([0fe0815](https://github.com/libp2p/js-libp2p-tcp/commit/0fe0815))
* catch thrown maConn errors in listener ([#122](https://github.com/libp2p/js-libp2p-tcp/issues/122)) ([86db568](https://github.com/libp2p/js-libp2p-tcp/commit/86db568)), closes [#121](https://github.com/libp2p/js-libp2p-tcp/issues/121)
* intermittent error when asking for interfaces ([#137](https://github.com/libp2p/js-libp2p-tcp/issues/137)) ([af9804e](https://github.com/libp2p/js-libp2p-tcp/commit/af9804e))
* remove use of assert module ([#123](https://github.com/libp2p/js-libp2p-tcp/issues/123)) ([6272876](https://github.com/libp2p/js-libp2p-tcp/commit/6272876))
* transport should not handle connection if upgradeInbound throws ([#119](https://github.com/libp2p/js-libp2p-tcp/issues/119)) ([21f8747](https://github.com/libp2p/js-libp2p-tcp/commit/21f8747))
### Chores
* update deps ([#134](https://github.com/libp2p/js-libp2p-tcp/issues/134)) ([d9f9912](https://github.com/libp2p/js-libp2p-tcp/commit/d9f9912))
### BREAKING CHANGES
* - The multiaddr dep used by this module returns Uint8Arrays and may
not be compatible with previous versions
* chore: update utils
* chore: remove gh dep url
<a name="0.15.1"></a>
## [0.15.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.15.0...v0.15.1) (2020-08-11)
<a name="0.15.0"></a>
# [0.15.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.14.6...v0.15.0) (2020-08-07)
### Chores
* update deps ([#134](https://github.com/libp2p/js-libp2p-tcp/issues/134)) ([d9f9912](https://github.com/libp2p/js-libp2p-tcp/commit/d9f9912))
### BREAKING CHANGES
* - The multiaddr dep used by this module returns Uint8Arrays and may
not be compatible with previous versions
* chore: update utils
* chore: remove gh dep url
<a name="0.14.6"></a>
## [0.14.6](https://github.com/libp2p/js-libp2p-tcp/compare/v0.14.5...v0.14.6) (2020-07-17)
<a name="0.14.5"></a>
## [0.14.5](https://github.com/libp2p/js-libp2p-tcp/compare/v0.14.4...v0.14.5) (2020-04-28)
### Bug Fixes
* catch error from maConn.close ([#128](https://github.com/libp2p/js-libp2p-tcp/issues/128)) ([0fe0815](https://github.com/libp2p/js-libp2p-tcp/commit/0fe0815))
<a name="0.14.4"></a>
## [0.14.4](https://github.com/libp2p/js-libp2p-tcp/compare/v0.14.3...v0.14.4) (2020-02-24)
### Bug Fixes
* catch thrown maConn errors in listener ([#122](https://github.com/libp2p/js-libp2p-tcp/issues/122)) ([86db568](https://github.com/libp2p/js-libp2p-tcp/commit/86db568)), closes [#121](https://github.com/libp2p/js-libp2p-tcp/issues/121)
* remove use of assert module ([#123](https://github.com/libp2p/js-libp2p-tcp/issues/123)) ([6272876](https://github.com/libp2p/js-libp2p-tcp/commit/6272876))
<a name="0.14.3"></a>
## [0.14.3](https://github.com/libp2p/js-libp2p-tcp/compare/v0.14.2...v0.14.3) (2019-12-20)
### Bug Fixes
* transport should not handle connection if upgradeInbound throws ([#119](https://github.com/libp2p/js-libp2p-tcp/issues/119)) ([21f8747](https://github.com/libp2p/js-libp2p-tcp/commit/21f8747))
<a name="0.14.2"></a>
## [0.14.2](https://github.com/libp2p/js-libp2p-tcp/compare/v0.14.1...v0.14.2) (2019-12-06)
### Bug Fixes
* **log:** log the bound port and host ([#117](https://github.com/libp2p/js-libp2p-tcp/issues/117)) ([7702646](https://github.com/libp2p/js-libp2p-tcp/commit/7702646))
### Features
* add path multiaddr support ([#118](https://github.com/libp2p/js-libp2p-tcp/issues/118)) ([d76a1f2](https://github.com/libp2p/js-libp2p-tcp/commit/d76a1f2))
<a name="0.14.1"></a>
## [0.14.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.14.0...v0.14.1) (2019-09-20)
### Bug Fixes
* ensure timeline.close is set ([#113](https://github.com/libp2p/js-libp2p-tcp/issues/113)) ([605ee27](https://github.com/libp2p/js-libp2p-tcp/commit/605ee27))
<a name="0.14.0"></a>
# [0.14.0](https://github.com/libp2p/js-libp2p-tcp/compare/v0.13.1...v0.14.0) (2019-09-16)
### Features
* change api to async / await ([#112](https://github.com/libp2p/js-libp2p-tcp/issues/112)) ([cf7d1b8](https://github.com/libp2p/js-libp2p-tcp/commit/cf7d1b8))
### BREAKING CHANGES
* All places in the API that used callbacks are now replaced with async/await. The API has also been updated according to the latest `interface-transport` version, https://github.com/libp2p/interface-transport/tree/v0.6.0#api.
<a name="0.13.1"></a>
## [0.13.1](https://github.com/libp2p/js-libp2p-tcp/compare/v0.13.0...v0.13.1) (2019-08-08)
<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)
Copyright (c) 2015 David Dias
Copyright (c) 2015-2016 David Dias
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

156
README.md
View File

@ -1,96 +1,118 @@
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/freenode-%23ipfs-blue.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23ipfs)
[![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/coverage-%3F-yellow.svg?style=flat-square)
[![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/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://protocol.ai)
[![](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/)
[![](https://img.shields.io/badge/freenode-%23libp2p-yellow.svg?style=flat-square)](http://webchat.freenode.net/?channels=%23libp2p)
[![Discourse posts](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg)](https://discuss.libp2p.io)
[![](https://img.shields.io/codecov/c/github/libp2p/js-libp2p-tcp.svg?style=flat-square)](https://codecov.io/gh/libp2p/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)
![](https://raw.githubusercontent.com/diasdavid/abstract-connection/master/img/badge.png)
![](https://raw.githubusercontent.com/diasdavid/abstract-transport/master/img/badge.png)
[![](https://raw.githubusercontent.com/libp2p/js-libp2p-interfaces/master/src/transport/img/badge.png)](https://github.com/libp2p/js-libp2p-interfaces/tree/master/src/transport)
[![](https://raw.githubusercontent.com/libp2p/js-libp2p-interfaces/master/src/connection/img/badge.png)](https://github.com/libp2p/js-libp2p-interfaces/tree/master/src/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/js-libp2p-interfaces/tree/master/src/transport) 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 transports.
`libp2p-tcp` in Node.js is a very thin shim that adds support for dialing to a
`multiaddr`. This small shim will enable libp2p to use other different
transports.
## Lead Maintainer
## Example
[Jacob Heun](https://github.com/jacobheun)
```js
const Tcp = require('libp2p-tcp')
const multiaddr = require('multiaddr')
## Table of Contents
const mh1 = multiaddr('/ip4/127.0.0.1/tcp/9090')
const mh2 = multiaddr('/ip6/::/tcp/9092')
- [Install](#install)
- [npm](#npm)
- [Usage](#usage)
- [API](#api)
- [Contribute](#contribute)
- [License](#license)
const tcp = new Tcp()
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
## Install
### npm
```sh
> npm i libp2p-tcp
> npm install libp2p-tcp
```
## Usage
```js
const TCP = require('libp2p-tcp')
const multiaddr = require('multiaddr')
const pipe = require('it-pipe')
const { collect } = require('streaming-iterables')
// A simple upgrader that just returns the MultiaddrConnection
const upgrader = {
upgradeInbound: maConn => maConn,
upgradeOutbound: maConn => maConn
}
const tcp = new TCP({ upgrader })
const listener = tcp.createListener((socket) => {
console.log('new connection opened')
pipe(
['hello'],
socket
)
})
const addr = multiaddr('/ip4/127.0.0.1/tcp/9090')
await listener.listen(addr)
console.log('listening')
const socket = await tcp.dial(addr)
const values = await pipe(
socket,
collect
)
console.log(`Value: ${values.toString()}`)
// Close connection after reading
await listener.close()
```
Outputs:
```sh
listening
new connection opened
Value: hello
```
## API
```js
const Tcp = require('libp2p-tcp')
```
### Transport
### var tcp = new Tcp()
[![](https://raw.githubusercontent.com/libp2p/js-libp2p-interfaces/master/src/transport/img/badge.png)](https://github.com/libp2p/js-libp2p-interfaces/tree/master/src/transport)
Creates a new TCP object. This does nothing on its own, but provides access to
`dial` and `createListener`.
`libp2p-tcp` accepts TCP addresses as both IPFS and non IPFS encapsulated addresses, i.e:
### 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
`multiaddrs`. Each connection will call `handler` with a connection stream.
`ready` is called once all servers are listening.
(both for dialing and listening)
### tcp.dial(multiaddr, options={})
### Connection
Connects to the multiaddress `multiaddr` using TCP, returning the socket stream.
If `options.ready` is set to a function, it is called when a connection is
established.
[![](https://raw.githubusercontent.com/libp2p/js-libp2p-interfaces/master/src/connection/img/badge.png)](https://github.com/libp2p/js-libp2p-interfaces/tree/master/src/connection)
### tcp.close(callback)
Closes all the listening TCP servers, calling `callback` once all of them have
been shut down.
## Contribute
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:
- [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
MIT
[MIT](LICENSE) © 2015-2016 David Dias

View File

@ -1,8 +0,0 @@
dependencies:
pre:
# setup ipv6
- sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=0 net.ipv6.conf.default.disable_ipv6=0 net.ipv6.conf.all.disable_ipv6=0
machine:
node:
version: stable

View File

@ -1,46 +1,78 @@
{
"name": "libp2p-tcp",
"version": "0.5.0",
"version": "0.15.3",
"description": "Node.js implementation of the TCP module that libp2p uses, which implements the interface-connection and interface-transport interfaces",
"leadMaintainer": "Jacob Heun <jacobheun@gmail.com>",
"main": "src/index.js",
"scripts": {
"test:compliance:connection": "node tests/connection.js",
"test:compliance:transport": "node tests/transport.js",
"test:specific": "mocha tests/*-test.js",
"test": "npm run test:specific",
"test-2": "npm run test:specific && npm run test:compliance:transport && npm run test:compliance:connection",
"lint": "standard"
"lint": "aegir lint",
"test": "aegir test -t node",
"test:node": "aegir test -t node",
"release": "aegir release -t node --no-build",
"release-minor": "aegir release -t node --type minor --no-build",
"release-major": "aegir-release -t node --type major --no-build",
"coverage": "nyc --reporter=text --reporter=lcov npm run test:node"
},
"pre-commit": [
"lint",
"test"
"pre-push": [
"lint"
],
"repository": {
"type": "git",
"url": "https://github.com/diasdavid/js-libp2p-tcp.git"
"url": "https://github.com/libp2p/js-libp2p-tcp.git"
},
"keywords": [
"IPFS"
"libp2p",
"network",
"p2p",
"peer",
"peer-to-peer",
"IPFS",
"TCP"
],
"author": "David Dias <daviddias@ipfs.io>",
"license": "MIT",
"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": ">=14.0.0"
},
"homepage": "https://github.com/diasdavid/js-libp2p-tcp",
"devDependencies": {
"chai": "^3.5.0",
"interface-connection": "0.0.3",
"interface-transport": "^0.1.1",
"istanbul": "^0.4.2",
"mocha": "^2.4.5",
"pre-commit": "^1.1.2",
"standard": "^6.0.7",
"tape": "^4.2.0"
"aegir": "^33.0.0",
"it-pipe": "^1.1.0",
"libp2p-interfaces": "^0.9.0",
"sinon": "^10.0.1",
"streaming-iterables": "^5.0.2"
},
"dependencies": {
"ip-address": "^5.8.0",
"mafmt": "^1.0.1",
"multiaddr": "^1.1.1"
}
"abortable-iterator": "^3.0.0",
"class-is": "^1.1.0",
"debug": "^4.3.1",
"err-code": "^3.0.1",
"libp2p-utils": "^0.3.0",
"mafmt": "^8.0.4",
"multiaddr": "^9.0.1",
"stream-to-it": "^0.2.2"
},
"contributors": [
"David Dias <daviddias.p@gmail.com>",
"Jacob Heun <jacobheun@gmail.com>",
"Stephen Whitmore <stephen.whitmore@gmail.com>",
"Friedel Ziegelmayer <dignifiedquire@gmail.com>",
"Vasco Santos <vasco.santos@moxy.studio>",
"Alex Potsides <alex@achingbrain.net>",
"Richard Littauer <richard.littauer@gmail.com>",
"Tom White <tomtinkerer@gmail.com>",
"Alan Shaw <alan@tableflip.io>",
"Pedro Teixeira <i@pgte.me>",
"Prashanth Chandra <coolshanth94@gmail.com>",
"João Antunes <j.goncalo.antunes@gmail.com>",
"Cayman <caymannava@gmail.com>",
"Diogo Silva <fsdiogo@gmail.com>",
"Dmitriy Ryajov <dryajov@gmail.com>",
"Drew Stone <drewstone329@gmail.com>",
"Evan Schwartz <evan.mark.schwartz@gmail.com>",
"Linus Unnebäck <linus@folkdatorn.se>",
"Mikeal Rogers <mikeal.rogers@gmail.com>"
]
}

8
src/constants.js Normal file
View File

@ -0,0 +1,8 @@
'use strict'
// p2p multi-address code
exports.CODE_P2P = 421
exports.CODE_CIRCUIT = 290
// Time to wait for a connection to close gracefully before destroying it manually
exports.CLOSE_TIMEOUT = 2000

View File

@ -1,104 +1,148 @@
// const debug = require('debug')
// const log = debug('libp2p:tcp')
const tcp = require('net')
const multiaddr = require('multiaddr')
const Address6 = require('ip-address').Address6
'use strict'
const net = require('net')
const mafmt = require('mafmt')
const withIs = require('class-is')
const errCode = require('err-code')
const log = require('debug')('libp2p:tcp')
const toConnection = require('./socket-to-conn')
const createListener = require('./listener')
const { multiaddrToNetConfig } = require('./utils')
const { AbortError } = require('abortable-iterator')
const { CODE_CIRCUIT, CODE_P2P } = require('./constants')
exports = module.exports = TCP
/**
* @typedef {import('multiaddr').Multiaddr} Multiaddr
* @typedef {import('libp2p-interfaces/src/connection').Connection} Connection
*/
function TCP () {
if (!(this instanceof TCP)) {
return new TCP()
/**
* @class TCP
*/
class TCP {
/**
* @class
* @param {object} options
* @param {Upgrader} options.upgrader
*/
constructor ({ upgrader }) {
if (!upgrader) {
throw new Error('An upgrader must be provided. See https://github.com/libp2p/interface-transport#upgrader.')
}
this._upgrader = upgrader
}
const listeners = []
this.dial = function (multiaddr, options) {
if (!options) {
options = {}
}
options.ready = options.ready || function noop () {}
const conn = tcp.connect(multiaddr.toOptions(), options.ready)
conn.getObservedAddrs = () => {
return [multiaddr]
}
/**
* @async
* @param {Multiaddr} ma
* @param {object} options
* @param {AbortSignal} options.signal - Used to abort dial requests
* @returns {Connection} An upgraded Connection
*/
async dial (ma, options) {
options = options || {}
const socket = await this._connect(ma, options)
const maConn = toConnection(socket, { remoteAddr: ma, signal: options.signal })
log('new outbound connection %s', maConn.remoteAddr)
const conn = await this._upgrader.upgradeOutbound(maConn)
log('outbound connection %s upgraded', maConn.remoteAddr)
return conn
}
this.createListener = (multiaddrs, handler, callback) => {
if (!Array.isArray(multiaddrs)) {
multiaddrs = [multiaddrs]
/**
* @private
* @param {Multiaddr} ma
* @param {object} options
* @param {AbortSignal} options.signal - Used to abort dial requests
* @returns {Promise<Socket>} Resolves a TCP Socket
*/
_connect (ma, options = {}) {
if (options.signal && options.signal.aborted) {
throw new AbortError()
}
var count = 0
const freshMultiaddrs = []
return new Promise((resolve, reject) => {
const start = Date.now()
const cOpts = multiaddrToNetConfig(ma)
multiaddrs.forEach((m) => {
const listener = tcp.createServer((conn) => {
conn.getObservedAddrs = () => {
return [getMultiaddr(conn)]
}
handler(conn)
})
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)
freshMultiaddrs.push(m)
}
if (address.family === 'IPv6') {
freshMultiaddrs.push(multiaddr('/ip6/' + address.address + '/tcp/' + address.port))
}
log('dialing %j', cOpts)
const rawSocket = net.connect(cOpts)
if (++count === multiaddrs.length) {
callback(null, freshMultiaddrs)
}
})
listeners.push(listener)
const onError = err => {
err.message = `connection error ${cOpts.host}:${cOpts.port}: ${err.message}`
done(err)
}
const onTimeout = () => {
log('connnection timeout %s:%s', cOpts.host, cOpts.port)
const err = errCode(new Error(`connection timeout after ${Date.now() - start}ms`), 'ERR_CONNECT_TIMEOUT')
// Note: this will result in onError() being called
rawSocket.emit('error', err)
}
const onConnect = () => {
log('connection opened %j', cOpts)
done()
}
const onAbort = () => {
log('connection aborted %j', cOpts)
rawSocket.destroy()
done(new AbortError())
}
const done = err => {
rawSocket.removeListener('error', onError)
rawSocket.removeListener('timeout', onTimeout)
rawSocket.removeListener('connect', onConnect)
options.signal && options.signal.removeEventListener('abort', onAbort)
if (err) return reject(err)
resolve(rawSocket)
}
rawSocket.on('error', onError)
rawSocket.on('timeout', onTimeout)
rawSocket.on('connect', onConnect)
options.signal && options.signal.addEventListener('abort', onAbort)
})
}
this.close = (callback) => {
if (listeners.length === 0) {
callback(new Error('there are no listeners'))
/**
* Creates a TCP listener. The provided `handler` function will be called
* anytime a new incoming Connection has been successfully upgraded via
* `upgrader.upgradeInbound`.
*
* @param {*} [options]
* @param {function(Connection)} handler
* @returns {Listener} A TCP listener
*/
createListener (options, handler) {
if (typeof options === 'function') {
handler = options
options = {}
}
var count = 0
listeners.forEach((listener) => {
listener.close(() => {
if (++count === listeners.length && callback) {
callback()
}
})
})
options = options || {}
return createListener({ handler, upgrader: this._upgrader }, options)
}
this.filter = (multiaddrs) => {
if (!Array.isArray(multiaddrs)) {
multiaddrs = [multiaddrs]
}
return multiaddrs.filter((ma) => {
return mafmt.TCP.matches(ma)
/**
* Takes a list of `Multiaddr`s and returns only valid TCP addresses
*
* @param {Multiaddr[]} multiaddrs
* @returns {Multiaddr[]} Valid TCP multiaddrs
*/
filter (multiaddrs) {
multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs]
return multiaddrs.filter(ma => {
if (ma.protoCodes().includes(CODE_CIRCUIT)) {
return false
}
return mafmt.TCP.matches(ma.decapsulateCode(CODE_P2P))
})
}
}
function getMultiaddr (conn) {
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
}
module.exports = withIs(TCP, { className: 'TCP', symbolName: '@libp2p/js-libp2p-tcp/tcp' })

123
src/listener.js Normal file
View File

@ -0,0 +1,123 @@
'use strict'
const net = require('net')
const EventEmitter = require('events')
const debug = require('debug')
const log = debug('libp2p:tcp:listener')
log.error = debug('libp2p:tcp:listener:error')
const toConnection = require('./socket-to-conn')
const { CODE_P2P } = require('./constants')
const {
getMultiaddrs,
multiaddrToNetConfig
} = require('./utils')
/**
* Attempts to close the given maConn. If a failure occurs, it will be logged.
*
* @private
* @param {import('libp2p-interfaces/src/transport/types').MultiaddrConnection} maConn
*/
async function attemptClose (maConn) {
try {
maConn && await maConn.close()
} catch (err) {
log.error('an error occurred closing the connection', err)
}
}
module.exports = ({ handler, upgrader }, options) => {
const listener = new EventEmitter()
const server = net.createServer(async socket => {
// Avoid uncaught errors caused by unstable connections
socket.on('error', err => log('socket error', err))
let maConn
let conn
try {
maConn = toConnection(socket, { listeningAddr })
log('new inbound connection %s', maConn.remoteAddr)
conn = await upgrader.upgradeInbound(maConn)
} catch (err) {
log.error('inbound connection failed', err)
return attemptClose(maConn)
}
log('inbound connection %s upgraded', maConn.remoteAddr)
trackConn(server, maConn)
if (handler) handler(conn)
listener.emit('connection', conn)
})
server
.on('listening', () => listener.emit('listening'))
.on('error', err => listener.emit('error', err))
.on('close', () => listener.emit('close'))
// Keep track of open connections to destroy in case of timeout
server.__connections = []
listener.close = () => {
if (!server.listening) return
return new Promise((resolve, reject) => {
server.__connections.forEach(maConn => attemptClose(maConn))
server.close(err => err ? reject(err) : resolve())
})
}
let peerId, listeningAddr
listener.listen = ma => {
listeningAddr = ma
peerId = ma.getPeerId()
if (peerId) {
listeningAddr = ma.decapsulateCode(CODE_P2P)
}
return new Promise((resolve, reject) => {
const options = multiaddrToNetConfig(listeningAddr)
server.listen(options, err => {
if (err) return reject(err)
log('Listening on %s', server.address())
resolve()
})
})
}
listener.getAddrs = () => {
let addrs = []
const address = server.address()
if (!address) {
throw 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().startsWith('/ip4')) {
addrs = addrs.concat(getMultiaddrs('ip4', address.address, address.port))
} else if (address.family === 'IPv6') {
addrs = addrs.concat(getMultiaddrs('ip6', address.address, address.port))
}
return addrs.map(ma => peerId ? ma.encapsulate(`/p2p/${peerId}`) : ma)
}
return listener
}
function trackConn (server, maConn) {
server.__connections.push(maConn)
const untrackConn = () => {
server.__connections = server.__connections.filter(c => c !== maConn)
}
maConn.conn.once('close', untrackConn)
}

104
src/socket-to-conn.js Normal file
View File

@ -0,0 +1,104 @@
'use strict'
const abortable = require('abortable-iterator')
const log = require('debug')('libp2p:tcp:socket')
const toIterable = require('stream-to-it')
const toMultiaddr = require('libp2p-utils/src/ip-port-to-multiaddr')
const { CLOSE_TIMEOUT } = require('./constants')
// Convert a socket into a MultiaddrConnection
// https://github.com/libp2p/interface-transport#multiaddrconnection
module.exports = (socket, options) => {
options = options || {}
// Check if we are connected on a unix path
if (options.listeningAddr && options.listeningAddr.getPath()) {
options.remoteAddr = options.listeningAddr
}
if (options.remoteAddr && options.remoteAddr.getPath()) {
options.localAddr = options.remoteAddr
}
const { sink, source } = toIterable.duplex(socket)
const maConn = {
async sink (source) {
if (options.signal) {
source = abortable(source, options.signal)
}
try {
await sink((async function * () {
for await (const chunk of source) {
// Convert BufferList to Buffer
yield Buffer.isBuffer(chunk) ? chunk : chunk.slice()
}
})())
} catch (err) {
// If aborted we can safely ignore
if (err.type !== 'aborted') {
// If the source errored the socket will already have been destroyed by
// toIterable.duplex(). If the socket errored it will already be
// destroyed. There's nothing to do here except log the error & return.
log(err)
}
}
},
source: options.signal ? abortable(source, options.signal) : source,
conn: socket,
localAddr: options.localAddr || toMultiaddr(socket.localAddress, socket.localPort),
// If the remote address was passed, use it - it may have the peer ID encapsulated
remoteAddr: options.remoteAddr || toMultiaddr(socket.remoteAddress, socket.remotePort),
timeline: { open: Date.now() },
close () {
if (socket.destroyed) return
return new Promise((resolve, reject) => {
const start = Date.now()
// Attempt to end the socket. If it takes longer to close than the
// timeout, destroy it manually.
const timeout = setTimeout(() => {
const { host, port } = maConn.remoteAddr.toOptions()
log('timeout closing socket to %s:%s after %dms, destroying it manually',
host, port, Date.now() - start)
if (socket.destroyed) {
log('%s:%s is already destroyed', host, port)
} else {
socket.destroy()
}
resolve()
}, CLOSE_TIMEOUT)
socket.once('close', () => {
clearTimeout(timeout)
resolve()
})
socket.end(err => {
maConn.timeline.close = Date.now()
if (err) return reject(err)
resolve()
})
})
}
}
socket.once('close', () => {
// In instances where `close` was not explicitly called,
// such as an iterable stream ending, ensure we have set the close
// timeline
if (!maConn.timeline.close) {
maConn.timeline.close = Date.now()
}
})
return maConn
}

47
src/utils.js Normal file
View File

@ -0,0 +1,47 @@
'use strict'
const { Multiaddr } = require('multiaddr')
const os = require('os')
const { resolve } = require('path')
const ProtoFamily = { ip4: 'IPv4', ip6: 'IPv6' }
function multiaddrToNetConfig (addr) {
const listenPath = addr.getPath()
// unix socket listening
if (listenPath) {
return resolve(listenPath)
}
// tcp listening
return addr.toOptions()
}
function getMultiaddrs (proto, ip, port) {
const toMa = ip => new Multiaddr(`/${proto}/${ip}/tcp/${port}`)
return (isAnyAddr(ip) ? getNetworkAddrs(ProtoFamily[proto]) : [ip]).map(toMa)
}
function isAnyAddr (ip) {
return ['0.0.0.0', '::'].includes(ip)
}
/**
* @private
* @param {string} family - One of ['IPv6', 'IPv4']
* @returns {string[]} an array of ip address strings
*/
const networks = os.networkInterfaces()
function getNetworkAddrs (family) {
return Object.values(networks).reduce((addresses, netAddrs) => {
netAddrs.forEach(netAddr => {
// Add the ip of each matching network interface
if (netAddr.family === family) addresses.push(netAddr.address)
})
return addresses
}, [])
}
module.exports = {
multiaddrToNetConfig,
isAnyAddr,
getMultiaddrs
}

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

@ -0,0 +1,42 @@
/* eslint-env mocha */
'use strict'
const sinon = require('sinon')
const tests = require('libp2p-interfaces/src/transport/tests')
const { Multiaddr } = require('multiaddr')
const net = require('net')
const TCP = require('../src')
describe('interface-transport compliance', () => {
tests({
setup ({ upgrader }) {
const tcp = new TCP({ upgrader })
const addrs = [
new Multiaddr('/ip4/127.0.0.1/tcp/9091'),
new Multiaddr('/ip4/127.0.0.1/tcp/9092'),
new Multiaddr('/ip4/127.0.0.1/tcp/9093')
]
// Used by the dial tests to simulate a delayed connect
const connector = {
delay (delayMs) {
const netConnect = net.connect
sinon.replace(net, 'connect', (opts) => {
const socket = netConnect(opts)
const socketEmit = socket.emit.bind(socket)
sinon.replace(socket, 'emit', (...args) => {
const time = args[0] === 'connect' ? delayMs : 0
setTimeout(() => socketEmit(...args), time)
})
return socket
})
},
restore () {
sinon.restore()
}
}
return { transport: tcp, addrs, connector }
}
})
})

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

@ -0,0 +1,87 @@
/* eslint-env mocha */
'use strict'
const { expect } = require('aegir/utils/chai')
const TCP = require('../src')
const { Multiaddr } = require('multiaddr')
describe('valid localAddr and remoteAddr', () => {
let tcp
const mockUpgrader = {
upgradeInbound: maConn => maConn,
upgradeOutbound: maConn => maConn
}
beforeEach(() => {
tcp = new TCP({ upgrader: mockUpgrader })
})
const ma = new Multiaddr('/ip4/127.0.0.1/tcp/0')
it('should resolve port 0', async () => {
// Create a Promise that resolves when a connection is handled
let handled
const handlerPromise = new Promise(resolve => { handled = resolve })
const handler = conn => handled(conn)
// Create a listener with the handler
const listener = tcp.createListener(handler)
// Listen on the multi-address
await listener.listen(ma)
const localAddrs = listener.getAddrs()
expect(localAddrs.length).to.equal(1)
// Dial to that address
const dialerConn = await tcp.dial(localAddrs[0])
// Wait for the incoming dial to be handled
const listenerConn = await handlerPromise
// Close the listener
await listener.close()
expect(dialerConn.localAddr.toString())
.to.equal(listenerConn.remoteAddr.toString())
expect(dialerConn.remoteAddr.toString())
.to.equal(listenerConn.localAddr.toString())
})
it('should handle multiple simultaneous closes', async () => {
// Create a Promise that resolves when a connection is handled
let handled
const handlerPromise = new Promise(resolve => { handled = resolve })
const handler = conn => handled(conn)
// Create a listener with the handler
const listener = tcp.createListener(handler)
// Listen on the multi-address
await listener.listen(ma)
const localAddrs = listener.getAddrs()
expect(localAddrs.length).to.equal(1)
// Dial to that address
const dialerConn = await tcp.dial(localAddrs[0])
// Wait for the incoming dial to be handled
await handlerPromise
// Close the dialer with two simultaneous calls to `close`
await Promise.race([
new Promise((resolve, reject) => setTimeout(() => reject(new Error('Timed out waiting for connection close')), 500)),
await Promise.all([
dialerConn.close(),
dialerConn.close()
])
])
await listener.close()
})
})

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

@ -0,0 +1,41 @@
/* eslint-env mocha */
'use strict'
const { expect } = require('aegir/utils/chai')
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({ upgrader: {} })
})
it('filter valid addrs for this transport', () => {
const ma1 = new Multiaddr(base + '/tcp/9090')
const ma2 = new Multiaddr(base + '/udp/9090')
const ma3 = new Multiaddr(base + '/tcp/9090/http')
const ma4 = new Multiaddr(base + '/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
const ma5 = new Multiaddr(base + '/tcp/9090/http' + ipfs)
const ma6 = new Multiaddr('/ip4/127.0.0.1/tcp/9090/p2p-circuit' + ipfs)
const ma7 = new Multiaddr('/dns4/libp2p.io/tcp/9090')
const ma8 = new 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 = new Multiaddr(base + '/tcp/9090')
const valid = tcp.filter(ma1)
expect(valid.length).to.equal(1)
expect(valid[0]).to.eql(ma1)
})
})

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

@ -0,0 +1,278 @@
/* eslint-env mocha */
'use strict'
const { expect } = require('aegir/utils/chai')
const TCP = require('../src')
const net = require('net')
const os = require('os')
const path = require('path')
const { Multiaddr } = require('multiaddr')
const pipe = require('it-pipe')
const { collect, map } = require('streaming-iterables')
const isCI = process.env.CI
const isWindows = os.platform() === 'win32'
const skipOnWindows = isWindows ? it.skip : it
describe('construction', () => {
it('requires an upgrader', () => {
expect(() => new TCP()).to.throw()
})
})
describe('listen', () => {
let tcp
let listener
beforeEach(() => {
tcp = new TCP({
upgrader: {
upgradeOutbound: maConn => maConn,
upgradeInbound: maConn => maConn
}
})
})
afterEach(async () => {
listener && await listener.close()
})
it('close listener with connections, through timeout', async () => {
const mh = new Multiaddr('/ip4/127.0.0.1/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
listener = tcp.createListener((conn) => {
pipe(conn, conn)
})
await 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', () => {})
await new Promise((resolve) => {
socket1.on('connect', async () => {
await listener.close({ timeout: 100 })
resolve()
})
})
})
// Windows doesn't support unix paths
skipOnWindows('listen on path', async () => {
const mh = new Multiaddr(`/unix${path.resolve(os.tmpdir(), '/tmp/p2pd.sock')}`)
listener = tcp.createListener((conn) => {})
await listener.listen(mh)
})
it('listen on port 0', async () => {
const mh = new Multiaddr('/ip4/127.0.0.1/tcp/0')
listener = tcp.createListener((conn) => {})
await listener.listen(mh)
})
it('listen on IPv6 addr', async () => {
if (isCI) {
return
}
const mh = new Multiaddr('/ip6/::/tcp/9090')
listener = tcp.createListener((conn) => {})
await listener.listen(mh)
})
it('listen on any Interface', async () => {
const mh = new Multiaddr('/ip4/0.0.0.0/tcp/9090')
listener = tcp.createListener((conn) => {})
await listener.listen(mh)
})
it('getAddrs', async () => {
const mh = new Multiaddr('/ip4/127.0.0.1/tcp/9090')
listener = tcp.createListener((conn) => {})
await listener.listen(mh)
const multiaddrs = listener.getAddrs()
expect(multiaddrs.length).to.equal(1)
expect(multiaddrs[0]).to.deep.equal(mh)
})
it('getAddrs on port 0 listen', async () => {
const mh = new Multiaddr('/ip4/127.0.0.1/tcp/0')
listener = tcp.createListener((conn) => {})
await listener.listen(mh)
const multiaddrs = listener.getAddrs()
expect(multiaddrs.length).to.equal(1)
})
it('getAddrs from listening on 0.0.0.0', async () => {
const mh = new Multiaddr('/ip4/0.0.0.0/tcp/9090')
listener = tcp.createListener((conn) => {})
await listener.listen(mh)
const multiaddrs = listener.getAddrs()
expect(multiaddrs.length > 0).to.equal(true)
expect(multiaddrs[0].toString().indexOf('0.0.0.0')).to.equal(-1)
})
it('getAddrs from listening on 0.0.0.0 and port 0', async () => {
const mh = new Multiaddr('/ip4/0.0.0.0/tcp/0')
listener = tcp.createListener((conn) => {})
await listener.listen(mh)
const multiaddrs = listener.getAddrs()
expect(multiaddrs.length > 0).to.equal(true)
expect(multiaddrs[0].toString().indexOf('0.0.0.0')).to.equal(-1)
})
it('getAddrs preserves IPFS Id', async () => {
const mh = new Multiaddr('/ip4/127.0.0.1/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
listener = tcp.createListener((conn) => {})
await listener.listen(mh)
const multiaddrs = listener.getAddrs()
expect(multiaddrs.length).to.equal(1)
expect(multiaddrs[0]).to.deep.equal(mh)
})
})
describe('dial', () => {
let tcp
let listener
const ma = new Multiaddr('/ip4/127.0.0.1/tcp/9090')
beforeEach(async () => {
tcp = new TCP({
upgrader: {
upgradeOutbound: maConn => maConn,
upgradeInbound: maConn => maConn
}
})
listener = tcp.createListener((conn) => {
pipe(
conn,
map((x) => Buffer.from(x.toString() + '!')),
conn
)
})
await listener.listen(ma)
})
afterEach(() => listener.close())
it('dial on IPv4', async () => {
const values = await pipe(
['hey'],
await tcp.dial(ma),
collect
)
expect(values).to.eql([Buffer.from('hey!')])
})
it('dial on IPv6', async () => {
if (isCI) {
return
}
const ma = new Multiaddr('/ip6/::/tcp/9066')
const listener = tcp.createListener((conn) => {
pipe(conn, conn)
})
await listener.listen(ma)
const values = await pipe(
['hey'],
await tcp.dial(ma),
collect
)
expect(values).to.be.eql([Buffer.from('hey')])
await listener.close()
})
// Windows doesn't support unix paths
skipOnWindows('dial on path', async () => {
const ma = new Multiaddr(`/unix${path.resolve(os.tmpdir(), '/tmp/p2pd.sock')}`)
const listener = tcp.createListener((conn) => {
pipe(conn, conn)
})
await listener.listen(ma)
const connection = await tcp.dial(ma)
const values = await pipe(
['hey'],
connection,
collect
)
expect(values).to.be.eql([Buffer.from('hey')])
await listener.close()
})
it('dial and destroy on listener', async () => {
let handled
const handledPromise = new Promise((resolve) => {
handled = resolve
})
const ma = new Multiaddr('/ip6/::/tcp/0')
const listener = tcp.createListener(async (conn) => {
await pipe(
[],
conn
)
handled()
})
await listener.listen(ma)
const addrs = listener.getAddrs()
await pipe(await tcp.dial(addrs[0]))
await handledPromise
await listener.close()
})
it('dial and destroy on dialer', async () => {
if (isCI) {
return
}
let handled
const handledPromise = new Promise((resolve) => {
handled = resolve
})
const ma = new Multiaddr('/ip6/::/tcp/0')
const listener = tcp.createListener(async (conn) => {
// pull(conn, pull.onEnd(destroyed))
await pipe(conn)
handled()
})
await listener.listen(ma)
const addrs = listener.getAddrs()
await pipe(await tcp.dial(addrs[0]))
await handledPromise
await listener.close()
})
it('dial on IPv4 with IPFS Id', async () => {
const ma = new Multiaddr('/ip4/127.0.0.1/tcp/9090/ipfs/Qmb6owHp6eaWArVbcJJbQSyifyJBttMMjYV76N2hMbf5Vw')
const conn = await tcp.dial(ma)
const res = await pipe(
['hey'],
conn,
collect
)
expect(res).to.be.eql([Buffer.from('hey!')])
})
})

View File

View File

@ -1,131 +0,0 @@
/* eslint-env mocha */
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()
})
}, () => {
const socket = net.connect({ host: '127.0.0.1', port: 9090 })
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 valid = tcp.filter([mh1, mh2, mh3])
expect(valid.length).to.equal(1)
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()
})
})

View File

@ -1,14 +0,0 @@
var tape = require('tape')
var tests = require('interface-transport/tests')
var conn = require('../src')
var common = {
setup: function (t, cb) {
cb(null, conn)
},
teardown: function (t, cb) {
cb()
}
}
tests(tape, common)