├── .github ├── dependabot.yml └── workflows │ ├── automerge.yml │ ├── js-test-and-release.yml │ └── stale.yml ├── .gitignore ├── .npmrc ├── Dockerfile ├── LICENSE ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── lerna.json ├── package.json └── packages ├── webrtc-star-protocol ├── CHANGELOG.md ├── LICENSE ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── package.json ├── src │ └── index.ts └── tsconfig.json ├── webrtc-star-signalling-server ├── .aegir.js ├── CHANGELOG.md ├── DEPLOYMENT.md ├── LICENSE ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── bin │ └── index.js ├── package.json ├── src │ ├── config.ts │ ├── index.html │ ├── index.ts │ └── socket-server.ts ├── test │ ├── node.ts │ └── sig-server.ts └── tsconfig.json └── webrtc-star-transport ├── .aegir.js ├── CHANGELOG.md ├── DEPLOYMENT.md ├── LICENSE ├── LICENSE-APACHE ├── LICENSE-MIT ├── README.md ├── package.json ├── src ├── constants.ts ├── index.ts ├── listener.ts ├── socket-to-conn.ts ├── transport.ts └── utils.ts ├── test ├── browser.ts ├── compliance.spec.ts ├── index.ts ├── node.ts ├── transport │ ├── dial.ts │ ├── discovery.ts │ ├── filter.ts │ ├── instance.spec.ts │ ├── listen.ts │ ├── multiple-signal-servers.ts │ ├── reconnect.node.ts │ └── track.ts └── utils.spec.ts └── tsconfig.json /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: npm 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "10:00" 8 | open-pull-requests-limit: 10 9 | commit-message: 10 | prefix: "deps" 11 | prefix-development: "deps(dev)" 12 | -------------------------------------------------------------------------------- /.github/workflows/automerge.yml: -------------------------------------------------------------------------------- 1 | name: Automerge 2 | on: [ pull_request ] 3 | 4 | jobs: 5 | automerge: 6 | uses: protocol/.github/.github/workflows/automerge.yml@master 7 | with: 8 | job: 'automerge' 9 | -------------------------------------------------------------------------------- /.github/workflows/js-test-and-release.yml: -------------------------------------------------------------------------------- 1 | name: test & maybe release 2 | on: 3 | push: 4 | branches: 5 | - master 6 | pull_request: 7 | 8 | jobs: 9 | 10 | check: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v3 14 | - uses: actions/setup-node@v3 15 | with: 16 | node-version: lts/* 17 | - uses: ipfs/aegir/actions/cache-node-modules@master 18 | - run: npm run --if-present lint 19 | - run: npm run --if-present dep-check 20 | 21 | test-node: 22 | needs: check 23 | runs-on: ${{ matrix.os }} 24 | strategy: 25 | matrix: 26 | os: [windows-latest, ubuntu-latest, macos-latest] 27 | node: [lts/*] 28 | fail-fast: true 29 | steps: 30 | - uses: actions/checkout@v3 31 | - uses: actions/setup-node@v3 32 | with: 33 | node-version: ${{ matrix.node }} 34 | - uses: ipfs/aegir/actions/cache-node-modules@master 35 | - run: npm run --if-present test:node 36 | - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # v3.1.1 37 | with: 38 | flags: node 39 | 40 | test-chrome: 41 | needs: check 42 | runs-on: ubuntu-latest 43 | steps: 44 | - uses: actions/checkout@v3 45 | - uses: actions/setup-node@v3 46 | with: 47 | node-version: lts/* 48 | - uses: ipfs/aegir/actions/cache-node-modules@master 49 | - run: npm run --if-present test:chrome 50 | - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # v3.1.1 51 | with: 52 | flags: chrome 53 | 54 | test-chrome-webworker: 55 | needs: check 56 | runs-on: ubuntu-latest 57 | steps: 58 | - uses: actions/checkout@v3 59 | - uses: actions/setup-node@v3 60 | with: 61 | node-version: lts/* 62 | - uses: ipfs/aegir/actions/cache-node-modules@master 63 | - run: npm run --if-present test:chrome-webworker 64 | - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # v3.1.1 65 | with: 66 | flags: chrome-webworker 67 | 68 | test-firefox: 69 | needs: check 70 | runs-on: ubuntu-latest 71 | steps: 72 | - uses: actions/checkout@v3 73 | - uses: actions/setup-node@v3 74 | with: 75 | node-version: lts/* 76 | - uses: ipfs/aegir/actions/cache-node-modules@master 77 | - run: npm run --if-present test:firefox 78 | - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # v3.1.1 79 | with: 80 | flags: firefox 81 | 82 | test-firefox-webworker: 83 | needs: check 84 | runs-on: ubuntu-latest 85 | steps: 86 | - uses: actions/checkout@v3 87 | - uses: actions/setup-node@v3 88 | with: 89 | node-version: lts/* 90 | - uses: ipfs/aegir/actions/cache-node-modules@master 91 | - run: npm run --if-present test:firefox-webworker 92 | - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # v3.1.1 93 | with: 94 | flags: firefox-webworker 95 | 96 | test-webkit: 97 | needs: check 98 | runs-on: ${{ matrix.os }} 99 | strategy: 100 | matrix: 101 | os: [ubuntu-latest, macos-latest] 102 | node: [lts/*] 103 | fail-fast: true 104 | steps: 105 | - uses: actions/checkout@v3 106 | - uses: actions/setup-node@v3 107 | with: 108 | node-version: lts/* 109 | - uses: ipfs/aegir/actions/cache-node-modules@master 110 | - run: npm run --if-present test:webkit 111 | - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # v3.1.1 112 | with: 113 | flags: webkit 114 | 115 | test-webkit-webworker: 116 | needs: check 117 | runs-on: ${{ matrix.os }} 118 | strategy: 119 | matrix: 120 | os: [ubuntu-latest, macos-latest] 121 | node: [lts/*] 122 | fail-fast: true 123 | steps: 124 | - uses: actions/checkout@v3 125 | - uses: actions/setup-node@v3 126 | with: 127 | node-version: lts/* 128 | - uses: ipfs/aegir/actions/cache-node-modules@master 129 | - run: npm run --if-present test:webkit-webworker 130 | - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # v3.1.1 131 | with: 132 | flags: webkit-webworker 133 | 134 | test-electron-main: 135 | needs: check 136 | runs-on: ubuntu-latest 137 | steps: 138 | - uses: actions/checkout@v3 139 | - uses: actions/setup-node@v3 140 | with: 141 | node-version: lts/* 142 | - uses: ipfs/aegir/actions/cache-node-modules@master 143 | - run: npx xvfb-maybe npm run --if-present test:electron-main 144 | - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # v3.1.1 145 | with: 146 | flags: electron-main 147 | 148 | test-electron-renderer: 149 | needs: check 150 | runs-on: ubuntu-latest 151 | steps: 152 | - uses: actions/checkout@v3 153 | - uses: actions/setup-node@v3 154 | with: 155 | node-version: lts/* 156 | - uses: ipfs/aegir/actions/cache-node-modules@master 157 | - run: npx xvfb-maybe npm run --if-present test:electron-renderer 158 | - uses: codecov/codecov-action@d9f34f8cd5cb3b3eb79b3e4b5dae3a16df499a70 # v3.1.1 159 | with: 160 | flags: electron-renderer 161 | 162 | release: 163 | needs: [test-node, test-chrome, test-chrome-webworker, test-firefox, test-firefox-webworker, test-webkit, test-webkit-webworker, test-electron-main, test-electron-renderer] 164 | runs-on: ubuntu-latest 165 | if: github.event_name == 'push' && github.ref == 'refs/heads/master' 166 | steps: 167 | - uses: actions/checkout@v3 168 | with: 169 | fetch-depth: 0 170 | - uses: actions/setup-node@v3 171 | with: 172 | node-version: lts/* 173 | - uses: ipfs/aegir/actions/cache-node-modules@master 174 | - uses: ipfs/aegir/actions/docker-login@master 175 | with: 176 | docker-token: ${{ secrets.DOCKER_TOKEN }} 177 | docker-username: ${{ secrets.DOCKER_USERNAME }} 178 | - run: npm run --if-present release 179 | env: 180 | GITHUB_TOKEN: ${{ secrets.UCI_GITHUB_TOKEN || github.token }} 181 | NPM_TOKEN: ${{ secrets.NPM_TOKEN }} 182 | -------------------------------------------------------------------------------- /.github/workflows/stale.yml: -------------------------------------------------------------------------------- 1 | name: Close and mark stale issue 2 | 3 | on: 4 | schedule: 5 | - cron: '0 0 * * *' 6 | 7 | jobs: 8 | stale: 9 | 10 | runs-on: ubuntu-latest 11 | permissions: 12 | issues: write 13 | pull-requests: write 14 | 15 | steps: 16 | - uses: actions/stale@v3 17 | with: 18 | repo-token: ${{ secrets.GITHUB_TOKEN }} 19 | stale-issue-message: 'Oops, seems like we needed more information for this issue, please comment with more details or this issue will be closed in 7 days.' 20 | close-issue-message: 'This issue was closed because it is missing author input.' 21 | stale-issue-label: 'kind/stale' 22 | any-of-labels: 'need/author-input' 23 | exempt-issue-labels: 'need/triage,need/community-input,need/maintainer-input,need/maintainers-input,need/analysis,status/blocked,status/in-progress,status/ready,status/deferred,status/inactive' 24 | days-before-issue-stale: 6 25 | days-before-issue-close: 7 26 | enable-statistics: true 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | docs 2 | **/node_modules/ 3 | **/*.log 4 | test/repo-tests* 5 | **/bundle.js 6 | 7 | # Logs 8 | logs 9 | *.log 10 | 11 | coverage 12 | .coverage 13 | 14 | # Runtime data 15 | pids 16 | *.pid 17 | *.seed 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | .nyc_output 25 | 26 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 27 | .grunt 28 | 29 | # node-waf configuration 30 | .lock-wscript 31 | 32 | build 33 | 34 | # Dependency directory 35 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 36 | node_modules 37 | 38 | lib 39 | dist 40 | test/test-data/go-ipfs-repo/LOCK 41 | test/test-data/go-ipfs-repo/LOG 42 | test/test-data/go-ipfs-repo/LOG.old 43 | 44 | # while testing npm5 45 | package-lock.json 46 | yarn.lock 47 | .vscode 48 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | ; package-lock with tarball deps breaks lerna/nx - remove when https://github.com/semantic-release/github/pull/487 is merged 2 | package-lock=false 3 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine as node 2 | 3 | # Switch to the node user for installation 4 | RUN npm install -g @libp2p/webrtc-star-signalling-server 5 | 6 | # webrtc-star defaults to 9090 7 | EXPOSE 9090 8 | 9 | # Available overrides (defaults shown): 10 | # --port=9090 --host=0.0.0.0 --disableMetrics=false 11 | # Server logging can be enabled via the DEBUG environment variable: 12 | # DEBUG=signalling-server,signalling-server:error 13 | CMD [ "webrtc-star"] 14 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | This project is dual licensed under MIT and Apache-2.0. 2 | 3 | MIT: https://www.opensource.org/licenses/mit 4 | Apache-2.0: https://www.apache.org/licenses/license-2.0 5 | -------------------------------------------------------------------------------- /LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at 2 | 3 | http://www.apache.org/licenses/LICENSE-2.0 4 | 5 | Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 6 | -------------------------------------------------------------------------------- /LICENSE-MIT: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ⚠️⚠️⚠️⚠️⚠️⚠️ 2 | 3 | **Status:** 4 | 5 | [Archived](https://github.com/libp2p/github-mgmt/pull/80) and not maintained 6 | 7 | **Alternatives:** 8 | 9 | WebRTC Browser-to-Server is being implemented in js-libp2p and tracked here per the specification: 10 | 11 | WebRTC Browser-to-Browser is being tracked here: 12 | 13 | **Questions:** 14 | 15 | Please direct any questions about the specification to: 16 | 17 | Please direct any questions about the js-libp2p WebRTC implementations to: 18 | or 19 | 20 | 21 | # ⚠️⚠️⚠️⚠️⚠️⚠️ 22 | 23 | # libp2p-webrtc-star 24 | 25 | [![libp2p.io](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/) 26 | [![Discuss](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg?style=flat-square)](https://discuss.libp2p.io) 27 | [![codecov](https://img.shields.io/codecov/c/github/libp2p/js-libp2p-webrtc-star.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-webrtc-star) 28 | [![CI](https://img.shields.io/github/actions/workflow/status/libp2p/js-libp2p-webrtc-star/js-test-and-release.yml?branch=master\&style=flat-square)](https://github.com/libp2p/js-libp2p-webrtc-star/actions/workflows/js-test-and-release.yml?query=branch%3Amaster) 29 | 30 | > The webrtc-star libp2p transport and signalling server 31 | 32 | ## Table of contents 33 | 34 | - [Structure](#structure) 35 | - [Contribute](#contribute) 36 | - [License](#license) 37 | - [Contribution](#contribution) 38 | 39 | ## Structure 40 | 41 | - [`/packages/webrtc-star-protocol`](./packages/webrtc-star-protocol) shared types used by the libp2p webrtc transport and signalling server 42 | - [`/packages/webrtc-star-signalling-server`](./packages/webrtc-star-signalling-server) signalling server to use with the libp2p WebRTC transport 43 | - [`/packages/webrtc-star-transport`](./packages/webrtc-star-transport) libp2p WebRTC transport that includes a discovery mechanism provided by the signalling-star 44 | 45 | ## Contribute 46 | 47 | Feel free to join in. All welcome. Open an [issue](https://github.com/libp2p/js-interfaces/issues)! 48 | 49 | This repository falls under the IPFS [Code of Conduct](https://github.com/ipfs/community/blob/master/code-of-conduct.md). 50 | 51 | [![](https://cdn.rawgit.com/jbenet/contribute-ipfs-gif/master/img/contribute.gif)](https://github.com/ipfs/community/blob/master/contributing.md) 52 | 53 | ## License 54 | 55 | Licensed under either of 56 | 57 | - Apache 2.0, ([LICENSE-APACHE](LICENSE-APACHE) / ) 58 | - MIT ([LICENSE-MIT](LICENSE-MIT) / ) 59 | 60 | ## Contribution 61 | 62 | Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. 63 | -------------------------------------------------------------------------------- /lerna.json: -------------------------------------------------------------------------------- 1 | { 2 | "lerna": "4.0.0", 3 | "useWorkspaces": true, 4 | "version": "independent", 5 | "command": { 6 | "run": { 7 | "stream": true 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "libp2p-webrtc-star", 3 | "version": "1.0.0", 4 | "description": "The webrtc-star libp2p transport and signalling server", 5 | "license": "Apache-2.0 OR MIT", 6 | "homepage": "https://github.com/libp2p/js-libp2p-webrtc-star#readme", 7 | "repository": { 8 | "type": "git", 9 | "url": "git+https://github.com/libp2p/js-libp2p-webrtc-star.git" 10 | }, 11 | "bugs": { 12 | "url": "https://github.com/libp2p/js-libp2p-webrtc-star/issues" 13 | }, 14 | "engines": { 15 | "node": ">=16.0.0", 16 | "npm": ">=7.0.0" 17 | }, 18 | "private": true, 19 | "scripts": { 20 | "reset": "aegir run clean && aegir clean ./node_modules ./package-lock.json packages/*/node_modules packages/*/package-lock.json packages/*/dist", 21 | "test": "aegir run test", 22 | "test:node": "aegir run test:node", 23 | "test:chrome": "aegir run test:chrome", 24 | "test:chrome-webworker": "aegir run test:chrome-webworker", 25 | "test:firefox": "aegir run test:firefox", 26 | "test:firefox-webworker": "aegir run test:firefox-webworker", 27 | "test:electron-main": "aegir run test:electron-main", 28 | "test:electron-renderer": "aegir run test:electron-renderer", 29 | "clean": "aegir run clean", 30 | "build": "aegir run build", 31 | "lint": "aegir run lint", 32 | "dep-check": "aegir run dep-check", 33 | "release": "aegir run release" 34 | }, 35 | "dependencies": { 36 | "aegir": "^37.9.1" 37 | }, 38 | "workspaces": [ 39 | "packages/*" 40 | ] 41 | } 42 | -------------------------------------------------------------------------------- /packages/webrtc-star-protocol/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [@libp2p/webrtc-star-protocol-v4.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-protocol-v3.0.0...@libp2p/webrtc-star-protocol-v4.0.0) (2023-04-24) 2 | 3 | 4 | ### ⚠ BREAKING CHANGES 5 | 6 | * update all dependencies (#506) 7 | 8 | ### Dependencies 9 | 10 | * update all dependencies ([#506](https://github.com/libp2p/js-libp2p-webrtc-star/issues/506)) ([417c05f](https://github.com/libp2p/js-libp2p-webrtc-star/commit/417c05f5a85f585699e09ed5d84ee51391697d5e)) 11 | 12 | ## [@libp2p/webrtc-star-protocol-v3.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-protocol-v2.0.1...@libp2p/webrtc-star-protocol-v3.0.0) (2023-01-06) 13 | 14 | 15 | ### ⚠ BREAKING CHANGES 16 | 17 | * update multiformats deps (#490) 18 | 19 | ### Bug Fixes 20 | 21 | * update multiformats deps ([#490](https://github.com/libp2p/js-libp2p-webrtc-star/issues/490)) ([f1acfea](https://github.com/libp2p/js-libp2p-webrtc-star/commit/f1acfeaea8744c392912c837fda504f3a192d970)) 22 | 23 | ## [@libp2p/webrtc-star-protocol-v2.0.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-protocol-v2.0.0...@libp2p/webrtc-star-protocol-v2.0.1) (2022-09-21) 24 | 25 | 26 | ### Trivial Changes 27 | 28 | * update project config ([#460](https://github.com/libp2p/js-libp2p-webrtc-star/issues/460)) ([02197df](https://github.com/libp2p/js-libp2p-webrtc-star/commit/02197df3f7e65cd8d6cdea81efa137035aa8228e)) 29 | 30 | 31 | ### Dependencies 32 | 33 | * update @multiformats/multiaddr to 11.0.0 ([#471](https://github.com/libp2p/js-libp2p-webrtc-star/issues/471)) ([2abc084](https://github.com/libp2p/js-libp2p-webrtc-star/commit/2abc0844537030bd3d248f08e5467f29bba6dec6)) 34 | 35 | ## [@libp2p/webrtc-star-protocol-v2.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-protocol-v1.0.2...@libp2p/webrtc-star-protocol-v2.0.0) (2022-06-15) 36 | 37 | 38 | ### ⚠ BREAKING CHANGES 39 | 40 | * uses new single-issue libp2p interface modules 41 | 42 | ### Features 43 | 44 | * update to latest interfaces ([#442](https://github.com/libp2p/js-libp2p-webrtc-star/issues/442)) ([d5bf151](https://github.com/libp2p/js-libp2p-webrtc-star/commit/d5bf1519ece9203ed2ab221a3575b3198332c438)) 45 | 46 | ## [@libp2p/webrtc-star-protocol-v1.0.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-protocol-v1.0.1...@libp2p/webrtc-star-protocol-v1.0.2) (2022-04-08) 47 | 48 | 49 | ### Trivial Changes 50 | 51 | * update aegir ([#425](https://github.com/libp2p/js-libp2p-webrtc-star/issues/425)) ([1cb62cb](https://github.com/libp2p/js-libp2p-webrtc-star/commit/1cb62cb63477f6442fdb6e932198faed62b38188)) 52 | 53 | ## [@libp2p/webrtc-star-protocol-v1.0.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-protocol-v1.0.0...@libp2p/webrtc-star-protocol-v1.0.1) (2022-03-17) 54 | 55 | 56 | ### Bug Fixes 57 | 58 | * update interfaces ([#411](https://github.com/libp2p/js-libp2p-webrtc-star/issues/411)) ([bf67a12](https://github.com/libp2p/js-libp2p-webrtc-star/commit/bf67a12b30b8d099b9ad4cf93d6f1fa357326616)) 59 | 60 | ## @libp2p/webrtc-star-protocol-v1.0.0 (2022-02-10) 61 | 62 | 63 | ### ⚠ BREAKING CHANGES 64 | 65 | * switch to named exports, ESM only 66 | 67 | ### Features 68 | 69 | * convert to typescript ([#401](https://github.com/libp2p/js-libp2p-webrtc-star/issues/401)) ([fb7950c](https://github.com/libp2p/js-libp2p-webrtc-star/commit/fb7950c5d688b62878af8e6538175eb1ff93ec22)) 70 | -------------------------------------------------------------------------------- /packages/webrtc-star-protocol/LICENSE: -------------------------------------------------------------------------------- 1 | This project is dual licensed under MIT and Apache-2.0. 2 | 3 | MIT: https://www.opensource.org/licenses/mit 4 | Apache-2.0: https://www.apache.org/licenses/license-2.0 5 | -------------------------------------------------------------------------------- /packages/webrtc-star-protocol/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at 2 | 3 | http://www.apache.org/licenses/LICENSE-2.0 4 | 5 | Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 6 | -------------------------------------------------------------------------------- /packages/webrtc-star-protocol/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /packages/webrtc-star-protocol/README.md: -------------------------------------------------------------------------------- 1 | # @libp2p/webrtc-star-protocol 2 | 3 | [![libp2p.io](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/) 4 | [![Discuss](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg?style=flat-square)](https://discuss.libp2p.io) 5 | [![codecov](https://img.shields.io/codecov/c/github/libp2p/js-libp2p-webrtc-star.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-webrtc-star) 6 | [![CI](https://img.shields.io/github/actions/workflow/status/libp2p/js-libp2p-webrtc-star/js-test-and-release.yml?branch=master\&style=flat-square)](https://github.com/libp2p/js-libp2p-webrtc-star/actions/workflows/js-test-and-release.yml?query=branch%3Amaster) 7 | 8 | > shared types used by the libp2p webrtc transport and signalling server 9 | 10 | ## Table of contents 11 | 12 | - [Install](#install) 13 | - [Description](#description) 14 | - [Protocol](#protocol) 15 | - [License](#license) 16 | - [Contribution](#contribution) 17 | 18 | ## Install 19 | 20 | ```console 21 | $ npm i @libp2p/webrtc-star-protocol 22 | ``` 23 | 24 | ## Description 25 | 26 | This module contains type definitions for the websocket events that are exchanged between peers during the handshake process. 27 | 28 | ## Protocol 29 | 30 | 1. Peers connect to the same signal server and send an `ss-join` event with their multiaddr as a string 31 | 2. Peers send one or more `ss-handshake` events with candidate signals 32 | 3. Peers receive one or more `ws-handshake` events with candidate signals 33 | 4. Peers send one `ss-handshake` event with an offer signal 34 | 5. Peers receive one `ws-handshake` events with an offer signal 35 | 6. Peers are now connected 36 | 7. Peers receive one or more `ws-peer` events with a multiaddr as a string for peer discovery 37 | 8. Peers send an `ss-leave` event or disconnect when hanging up 38 | 39 | See [./src/index.ts](src/index.ts) for definitions of `ss-handshake` and `ws-handshake` payloads. 40 | 41 | ## License 42 | 43 | Licensed under either of 44 | 45 | - Apache 2.0, ([LICENSE-APACHE](LICENSE-APACHE) / ) 46 | - MIT ([LICENSE-MIT](LICENSE-MIT) / ) 47 | 48 | ## Contribution 49 | 50 | Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. 51 | -------------------------------------------------------------------------------- /packages/webrtc-star-protocol/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@libp2p/webrtc-star-protocol", 3 | "version": "4.0.0", 4 | "description": "shared types used by the libp2p webrtc transport and signalling server", 5 | "license": "Apache-2.0 OR MIT", 6 | "homepage": "https://github.com/libp2p/js-libp2p-webrtc-star/tree/master/packages/webrtc-star-protocol#readme", 7 | "repository": { 8 | "type": "git", 9 | "url": "git+https://github.com/libp2p/js-libp2p-webrtc-star.git" 10 | }, 11 | "bugs": { 12 | "url": "https://github.com/libp2p/js-libp2p-webrtc-star/issues" 13 | }, 14 | "keywords": [ 15 | "IPFS", 16 | "libp2p" 17 | ], 18 | "engines": { 19 | "node": ">=16.0.0", 20 | "npm": ">=7.0.0" 21 | }, 22 | "type": "module", 23 | "types": "./dist/src/index.d.ts", 24 | "files": [ 25 | "src", 26 | "dist", 27 | "!dist/test", 28 | "!**/*.tsbuildinfo" 29 | ], 30 | "exports": { 31 | ".": { 32 | "types": "./dist/src/index.d.ts", 33 | "import": "./dist/src/index.js" 34 | } 35 | }, 36 | "eslintConfig": { 37 | "extends": "ipfs", 38 | "parserOptions": { 39 | "sourceType": "module" 40 | } 41 | }, 42 | "release": { 43 | "branches": [ 44 | "master" 45 | ], 46 | "plugins": [ 47 | [ 48 | "@semantic-release/commit-analyzer", 49 | { 50 | "preset": "conventionalcommits", 51 | "releaseRules": [ 52 | { 53 | "breaking": true, 54 | "release": "major" 55 | }, 56 | { 57 | "revert": true, 58 | "release": "patch" 59 | }, 60 | { 61 | "type": "feat", 62 | "release": "minor" 63 | }, 64 | { 65 | "type": "fix", 66 | "release": "patch" 67 | }, 68 | { 69 | "type": "docs", 70 | "release": "patch" 71 | }, 72 | { 73 | "type": "test", 74 | "release": "patch" 75 | }, 76 | { 77 | "type": "deps", 78 | "release": "patch" 79 | }, 80 | { 81 | "scope": "no-release", 82 | "release": false 83 | } 84 | ] 85 | } 86 | ], 87 | [ 88 | "@semantic-release/release-notes-generator", 89 | { 90 | "preset": "conventionalcommits", 91 | "presetConfig": { 92 | "types": [ 93 | { 94 | "type": "feat", 95 | "section": "Features" 96 | }, 97 | { 98 | "type": "fix", 99 | "section": "Bug Fixes" 100 | }, 101 | { 102 | "type": "chore", 103 | "section": "Trivial Changes" 104 | }, 105 | { 106 | "type": "docs", 107 | "section": "Documentation" 108 | }, 109 | { 110 | "type": "deps", 111 | "section": "Dependencies" 112 | }, 113 | { 114 | "type": "test", 115 | "section": "Tests" 116 | } 117 | ] 118 | } 119 | } 120 | ], 121 | "@semantic-release/changelog", 122 | "@semantic-release/npm", 123 | "@semantic-release/github", 124 | "@semantic-release/git" 125 | ] 126 | }, 127 | "scripts": { 128 | "clean": "aegir clean", 129 | "lint": "aegir lint", 130 | "dep-check": "aegir dep-check", 131 | "build": "aegir build", 132 | "release": "aegir release" 133 | }, 134 | "dependencies": { 135 | "socket.io-client": "^4.1.2" 136 | }, 137 | "devDependencies": { 138 | "aegir": "^38.1.8" 139 | } 140 | } 141 | -------------------------------------------------------------------------------- /packages/webrtc-star-protocol/src/index.ts: -------------------------------------------------------------------------------- 1 | import type { Socket } from 'socket.io-client' 2 | 3 | export interface OfferSignal { 4 | type: 'offer' 5 | sdp: string 6 | } 7 | 8 | export interface AnswerSignal { 9 | type: 'answer' 10 | sdp: string 11 | } 12 | 13 | export interface CandidateSignal { 14 | type: 'candidate' 15 | candidate: { 16 | candidate: string 17 | sdpMLineIndex?: number 18 | sdpMid?: string 19 | } 20 | } 21 | 22 | export interface RenegotiateSignal { 23 | type: 'renegotiate' 24 | } 25 | 26 | export interface GoodbyeSignal { 27 | type: 'goodbye' 28 | } 29 | 30 | export type Signal = OfferSignal | AnswerSignal | CandidateSignal | RenegotiateSignal | GoodbyeSignal 31 | 32 | export interface HandshakeSignal { 33 | srcMultiaddr: string 34 | dstMultiaddr: string 35 | intentId: string 36 | signal: Signal 37 | answer?: boolean 38 | err?: string 39 | } 40 | 41 | interface SocketEvents { 42 | 'ss-handshake': (offer: HandshakeSignal) => void 43 | 'ss-join': (maStr: string) => void 44 | 'ss-leave': (maStr: string) => void 45 | 'ws-peer': (maStr: string) => void 46 | 'ws-handshake': (offer: HandshakeSignal) => void 47 | 'error': (err: Error) => void 48 | 'listening': () => void 49 | 'close': () => void 50 | } 51 | 52 | export interface WebRTCStarSocket extends Socket { 53 | 54 | } 55 | -------------------------------------------------------------------------------- /packages/webrtc-star-protocol/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "aegir/src/config/tsconfig.aegir.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "emitDeclarationOnly": false, 6 | "module": "ES2020" 7 | }, 8 | "include": [ 9 | "src", 10 | "test" 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/.aegir.js: -------------------------------------------------------------------------------- 1 | let firstRun = true 2 | let sigServers = [] 3 | 4 | async function boot () { 5 | const options1 = { 6 | port: 15555, 7 | host: '127.0.0.1', 8 | metrics: firstRun 9 | } 10 | 11 | const options2 = { 12 | port: 15556, 13 | host: '127.0.0.1', 14 | metrics: false 15 | } 16 | 17 | const options3 = { 18 | port: 15557, 19 | host: '127.0.0.1', 20 | metrics: false 21 | } 22 | 23 | if (firstRun) { 24 | firstRun = false 25 | } 26 | 27 | const { sigServer } = await import('./dist/src/index.js') 28 | 29 | sigServers.push(await sigServer(options1)) 30 | sigServers.push(await sigServer(options2)) 31 | sigServers.push(await sigServer(options3)) 32 | 33 | console.log('signalling on:') 34 | sigServers.forEach((sig) => console.log(sig.info.uri)) 35 | } 36 | 37 | async function stop () { 38 | await Promise.all(sigServers.map(s => s.stop())) 39 | } 40 | 41 | /** @type {import('aegir').PartialOptions} */ 42 | export default { 43 | test: { 44 | before: boot, 45 | after: stop 46 | }, 47 | build: { 48 | bundle: false 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [@libp2p/webrtc-star-signalling-server-v4.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v3.0.0...@libp2p/webrtc-star-signalling-server-v4.0.0) (2023-04-24) 2 | 3 | 4 | ### ⚠ BREAKING CHANGES 5 | 6 | * update all dependencies (#506) 7 | 8 | ### Dependencies 9 | 10 | * update all dependencies ([#506](https://github.com/libp2p/js-libp2p-webrtc-star/issues/506)) ([417c05f](https://github.com/libp2p/js-libp2p-webrtc-star/commit/417c05f5a85f585699e09ed5d84ee51391697d5e)) 11 | * update sibling dependencies ([ee00041](https://github.com/libp2p/js-libp2p-webrtc-star/commit/ee00041eb262cc79c05644c51688330ea15e9489)) 12 | 13 | ## [@libp2p/webrtc-star-signalling-server-v3.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v2.0.5...@libp2p/webrtc-star-signalling-server-v3.0.0) (2023-01-06) 14 | 15 | 16 | ### ⚠ BREAKING CHANGES 17 | 18 | * update multiformats deps (#490) 19 | 20 | ### Bug Fixes 21 | 22 | * update multiformats deps ([#490](https://github.com/libp2p/js-libp2p-webrtc-star/issues/490)) ([f1acfea](https://github.com/libp2p/js-libp2p-webrtc-star/commit/f1acfeaea8744c392912c837fda504f3a192d970)) 23 | 24 | 25 | ### Dependencies 26 | 27 | * update sibling dependencies ([93e035d](https://github.com/libp2p/js-libp2p-webrtc-star/commit/93e035da84643ab0f7379fe336f2051e5c50edf1)) 28 | 29 | ## [@libp2p/webrtc-star-signalling-server-v2.0.5](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v2.0.4...@libp2p/webrtc-star-signalling-server-v2.0.5) (2022-09-21) 30 | 31 | 32 | ### Dependencies 33 | 34 | * update @multiformats/multiaddr to 11.0.0 ([#471](https://github.com/libp2p/js-libp2p-webrtc-star/issues/471)) ([2abc084](https://github.com/libp2p/js-libp2p-webrtc-star/commit/2abc0844537030bd3d248f08e5467f29bba6dec6)) 35 | 36 | ## [@libp2p/webrtc-star-signalling-server-v2.0.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v2.0.3...@libp2p/webrtc-star-signalling-server-v2.0.4) (2022-09-21) 37 | 38 | 39 | ### Bug Fixes 40 | 41 | * do not close connections when sigserver goes away ([#456](https://github.com/libp2p/js-libp2p-webrtc-star/issues/456)) ([206bdd5](https://github.com/libp2p/js-libp2p-webrtc-star/commit/206bdd55e84d92929cf4dec6dd98d9bd6b37f650)), closes [#453](https://github.com/libp2p/js-libp2p-webrtc-star/issues/453) 42 | 43 | ## [@libp2p/webrtc-star-signalling-server-v2.0.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v2.0.2...@libp2p/webrtc-star-signalling-server-v2.0.3) (2022-09-21) 44 | 45 | 46 | ### Bug Fixes 47 | 48 | * copy index file to dist on build ([#470](https://github.com/libp2p/js-libp2p-webrtc-star/issues/470)) ([31e307e](https://github.com/libp2p/js-libp2p-webrtc-star/commit/31e307ebec5cf022cde999a29e5afde48d93c95f)), closes [#468](https://github.com/libp2p/js-libp2p-webrtc-star/issues/468) 49 | 50 | ## [@libp2p/webrtc-star-signalling-server-v2.0.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v2.0.1...@libp2p/webrtc-star-signalling-server-v2.0.2) (2022-08-10) 51 | 52 | 53 | ### Bug Fixes 54 | 55 | * update all deps ([#465](https://github.com/libp2p/js-libp2p-webrtc-star/issues/465)) ([01714f7](https://github.com/libp2p/js-libp2p-webrtc-star/commit/01714f73f8b7fee0d515060150604b6edf3ecaa0)) 56 | 57 | 58 | ### Trivial Changes 59 | 60 | * update project config ([#460](https://github.com/libp2p/js-libp2p-webrtc-star/issues/460)) ([02197df](https://github.com/libp2p/js-libp2p-webrtc-star/commit/02197df3f7e65cd8d6cdea81efa137035aa8228e)) 61 | 62 | ## [@libp2p/webrtc-star-signalling-server-v2.0.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v2.0.0...@libp2p/webrtc-star-signalling-server-v2.0.1) (2022-06-15) 63 | 64 | 65 | ### Trivial Changes 66 | 67 | * update deps ([#443](https://github.com/libp2p/js-libp2p-webrtc-star/issues/443)) ([ac7f92d](https://github.com/libp2p/js-libp2p-webrtc-star/commit/ac7f92de776bf798849733e6128823c798a416c0)) 68 | 69 | ## [@libp2p/webrtc-star-signalling-server-v2.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v1.0.5...@libp2p/webrtc-star-signalling-server-v2.0.0) (2022-06-15) 70 | 71 | 72 | ### ⚠ BREAKING CHANGES 73 | 74 | * uses new single-issue libp2p interface modules 75 | 76 | ### Features 77 | 78 | * update to latest interfaces ([#442](https://github.com/libp2p/js-libp2p-webrtc-star/issues/442)) ([d5bf151](https://github.com/libp2p/js-libp2p-webrtc-star/commit/d5bf1519ece9203ed2ab221a3575b3198332c438)) 79 | 80 | ## [@libp2p/webrtc-star-signalling-server-v1.0.5](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v1.0.4...@libp2p/webrtc-star-signalling-server-v1.0.5) (2022-05-11) 81 | 82 | 83 | ### Bug Fixes 84 | 85 | * defined dirname ([#429](https://github.com/libp2p/js-libp2p-webrtc-star/issues/429)) ([ced684b](https://github.com/libp2p/js-libp2p-webrtc-star/commit/ced684b9f1f16b1c05a828e491c74c33e50fc681)) 86 | 87 | ## [@libp2p/webrtc-star-signalling-server-v1.0.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v1.0.3...@libp2p/webrtc-star-signalling-server-v1.0.4) (2022-04-08) 88 | 89 | 90 | ### Trivial Changes 91 | 92 | * update aegir ([#425](https://github.com/libp2p/js-libp2p-webrtc-star/issues/425)) ([1cb62cb](https://github.com/libp2p/js-libp2p-webrtc-star/commit/1cb62cb63477f6442fdb6e932198faed62b38188)) 93 | 94 | ## [@libp2p/webrtc-star-signalling-server-v1.0.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v1.0.2...@libp2p/webrtc-star-signalling-server-v1.0.3) (2022-03-17) 95 | 96 | 97 | ### Bug Fixes 98 | 99 | * update interfaces ([#411](https://github.com/libp2p/js-libp2p-webrtc-star/issues/411)) ([bf67a12](https://github.com/libp2p/js-libp2p-webrtc-star/commit/bf67a12b30b8d099b9ad4cf93d6f1fa357326616)) 100 | 101 | ## [@libp2p/webrtc-star-signalling-server-v1.0.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v1.0.1...@libp2p/webrtc-star-signalling-server-v1.0.2) (2022-02-24) 102 | 103 | 104 | ### Bug Fixes 105 | 106 | * fix docker build ([#408](https://github.com/libp2p/js-libp2p-webrtc-star/issues/408)) ([982f1f9](https://github.com/libp2p/js-libp2p-webrtc-star/commit/982f1f9b5827fca95d1e36233eb62e3105e6381e)) 107 | 108 | ## [@libp2p/webrtc-star-signalling-server-v1.0.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-signalling-server-v1.0.0...@libp2p/webrtc-star-signalling-server-v1.0.1) (2022-02-24) 109 | 110 | 111 | ### Trivial Changes 112 | 113 | * update project references ([#407](https://github.com/libp2p/js-libp2p-webrtc-star/issues/407)) ([09be6cf](https://github.com/libp2p/js-libp2p-webrtc-star/commit/09be6cfabdbe70fc39811451fd6812e58b146458)) 114 | 115 | ## @libp2p/webrtc-star-signalling-server-v1.0.0 (2022-02-10) 116 | 117 | 118 | ### ⚠ BREAKING CHANGES 119 | 120 | * switch to named exports, ESM only 121 | 122 | ### Features 123 | 124 | * convert to typescript ([#401](https://github.com/libp2p/js-libp2p-webrtc-star/issues/401)) ([fb7950c](https://github.com/libp2p/js-libp2p-webrtc-star/commit/fb7950c5d688b62878af8e6538175eb1ff93ec22)) 125 | 126 | # Change Log 127 | 128 | All notable changes to this project will be documented in this file. 129 | See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. 130 | 131 | ## [0.1.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/libp2p-webrtc-star-signalling-server@0.1.1...libp2p-webrtc-star-signalling-server@0.1.2) (2021-12-02) 132 | 133 | **Note:** Version bump only for package libp2p-webrtc-star-signalling-server 134 | 135 | 136 | 137 | 138 | 139 | ## 0.1.1 (2021-11-30) 140 | 141 | 142 | ### Features 143 | 144 | * make into monorepo ([#376](https://github.com/libp2p/js-libp2p-webrtc-star/issues/376)) ([8c7f5de](https://github.com/libp2p/js-libp2p-webrtc-star/commit/8c7f5de7e1bddf1db240bc5d7634722253326b14)) 145 | 146 | 147 | ### BREAKING CHANGES 148 | 149 | * The transport module no longer includes the signalling server 150 | 151 | 152 | 153 | 154 | 155 | # 0.1.0 (2021-09-28) 156 | 157 | 158 | ### Features 159 | 160 | * make into monorepo ([#376](https://github.com/libp2p/js-libp2p-webrtc-star/issues/376)) ([8c7f5de](https://github.com/libp2p/js-libp2p-webrtc-star/commit/8c7f5de7e1bddf1db240bc5d7634722253326b14)) 161 | 162 | 163 | ### BREAKING CHANGES 164 | 165 | * The transport module no longer includes the signalling server 166 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/DEPLOYMENT.md: -------------------------------------------------------------------------------- 1 | # Deployment 2 | 3 | libp2p-webrtc-star is integrated with the [libp2p Docker Hub](https://hub.docker.com/u/libp2p) organization. Docker containers are built for passing CI to the `master` branch and to `tags`. The libp2p infra team leverages these containers to deploy and host webrtc-star services for users to test with. These servers should **not be relied on for Production applications**. If you wish to leverage webrtc-star servers for your application, we recommend running your own as we currently do not guarantee uptime of these servers. 4 | 5 | ## SSL & Localhost Development 6 | 7 | Since working with localhost is a bit tricky at the time of writing, we recommend using proxy servers for the deployment. Here's a turnkey build for a signalling server which supports SSL. 8 | 9 | 1. `touch docker-compose.yml`, paste in the compose file below, and run `DOMAIN= docker-compose up`. 10 | 2. Visit yourdomain.com. Voila! 11 | 12 | ``` 13 | version: "3.3" 14 | services: 15 | 16 | js-libp2p-webrtc-star: 17 | image: libp2p/js-libp2p-webrtc-star 18 | environment: 19 | - VIRTUAL_HOST=${DOMAIN} 20 | - LETSENCRYPT_HOST=${DOMAIN} 21 | - VIRTUAL_PORT=9090 22 | networks: 23 | service_network: 24 | 25 | nginx-proxy: 26 | image: jwilder/nginx-proxy 27 | ports: 28 | - 443:443 29 | - 80:80 30 | container_name: nginx-proxy 31 | networks: 32 | service_network: 33 | volumes: 34 | - /var/run/docker.sock:/tmp/docker.sock:ro 35 | - nginx-certs:/etc/nginx/certs 36 | - nginx-vhost:/etc/nginx/vhost.d 37 | - nginx-html:/usr/share/nginx/html 38 | depends_on: 39 | - js-libp2p-webrtc-star 40 | 41 | nginx-proxy-letsencrypt: 42 | image: jrcs/letsencrypt-nginx-proxy-companion 43 | environment: 44 | NGINX_PROXY_CONTAINER: "nginx-proxy" 45 | networks: 46 | service_network: 47 | volumes: 48 | - /var/run/docker.sock:/var/run/docker.sock:ro 49 | - nginx-certs:/etc/nginx/certs 50 | - nginx-vhost:/etc/nginx/vhost.d 51 | - nginx-html:/usr/share/nginx/html 52 | 53 | networks: 54 | service_network: 55 | 56 | volumes: 57 | nginx-certs: 58 | nginx-vhost: 59 | nginx-html: 60 | ``` 61 | 62 | Kudos to @jjperezaguinaga for the initial proxy-wrap. 63 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/LICENSE: -------------------------------------------------------------------------------- 1 | This project is dual licensed under MIT and Apache-2.0. 2 | 3 | MIT: https://www.opensource.org/licenses/mit 4 | Apache-2.0: https://www.apache.org/licenses/license-2.0 5 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at 2 | 3 | http://www.apache.org/licenses/LICENSE-2.0 4 | 5 | Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 6 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/README.md: -------------------------------------------------------------------------------- 1 | # @libp2p/webrtc-star-signalling-server 2 | 3 | [![libp2p.io](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/) 4 | [![Discuss](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg?style=flat-square)](https://discuss.libp2p.io) 5 | [![codecov](https://img.shields.io/codecov/c/github/libp2p/js-libp2p-webrtc-star.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-webrtc-star) 6 | [![CI](https://img.shields.io/github/actions/workflow/status/libp2p/js-libp2p-webrtc-star/js-test-and-release.yml?branch=master\&style=flat-square)](https://github.com/libp2p/js-libp2p-webrtc-star/actions/workflows/js-test-and-release.yml?query=branch%3Amaster) 7 | 8 | > signalling server to use with the libp2p WebRTC transport 9 | 10 | ## Table of contents 11 | 12 | - [Install](#install) 13 | - [Description](#description) 14 | - [Usage](#usage) 15 | - [Hosted Rendezvous Server](#hosted-rendezvous-server) 16 | - [License](#license) 17 | - [Contribution](#contribution) 18 | 19 | ## Install 20 | 21 | ```console 22 | $ npm i @libp2p/webrtc-star-signalling-server 23 | ``` 24 | 25 | ## Description 26 | 27 | Nodes using the `libp2p-webrtc-star` transport will connect to a known point in the network, a rendezvous point where they can learn about other nodes (Discovery) and exchange their [SDP offers (signalling data)](https://www.html5rocks.com/en/tutorials/webrtc/infrastructure/). 28 | 29 | ## Usage 30 | 31 | To start a server run: 32 | 33 | ```console 34 | $ webrtc-star --port=13579 --host=127.0.0.1 35 | ``` 36 | 37 | Defaults: 38 | 39 | - `port` - 9090 40 | - `host` - '0.0.0.0' 41 | 42 | Or in JavaScript: 43 | 44 | ```js 45 | import { sigServer } from '@libp2p/webrtc-star-signalling-server' 46 | 47 | const server = await sigServer({ 48 | port: 24642, 49 | host: '0.0.0.0', 50 | metrics: false 51 | }) 52 | 53 | // some time later 54 | await server.stop() 55 | ``` 56 | 57 | ## Hosted Rendezvous Server 58 | 59 | We host signaling servers at `wrtc-star1.par.dwebops.pub` and `wrtc-star2.sjc.dwebops.pub`, that can be used for practical demos and experimentation, it **should not be used for apps in production**. Check [Deployment.md](./DEPLOYMENT.md) for how to deploy your own server. 60 | 61 | A libp2p-webrtc-star address, using the signalling server we provide, looks like: 62 | 63 | `/dns4/wrtc-star1.par.dwebops.pub/tcp/443/wss/p2p-webrtc-star/p2p/` 64 | 65 | Note: The address above indicates WebSockets Secure, which can be accessed from both http and https. 66 | 67 | ## License 68 | 69 | Licensed under either of 70 | 71 | - Apache 2.0, ([LICENSE-APACHE](LICENSE-APACHE) / ) 72 | - MIT ([LICENSE-MIT](LICENSE-MIT) / ) 73 | 74 | ## Contribution 75 | 76 | Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. 77 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/bin/index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | /* eslint-disable no-console */ 3 | 4 | // Usage: $0 [--host ] [--port ] [--disable-metrics] 5 | 6 | import { sigServer } from '../dist/src/index.js' 7 | import minimist from 'minimist' 8 | import { createRequire } from 'module' 9 | 10 | const require = createRequire(import.meta.url) 11 | const info = require('../package.json') 12 | 13 | const argv = minimist(process.argv.slice(2), { 14 | alias: { 15 | p: 'port', 16 | h: 'host', 17 | 'disable-metrics': 'disableMetrics' 18 | } 19 | }) 20 | 21 | ;(async () => { 22 | const server = await sigServer({ 23 | port: argv.port || process.env.PORT || 9090, 24 | host: argv.host || process.env.HOST || '0.0.0.0', 25 | metrics: !(argv.disableMetrics || process.env.DISABLE_METRICS) 26 | }) 27 | 28 | console.log(`${info.name}@${info.version}`) 29 | console.log('Listening on:', server.info.uri) 30 | 31 | process.on('SIGINT', async () => { 32 | await server.stop() 33 | console.log('Signalling server stopped') 34 | process.exit() 35 | }) 36 | })() 37 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@libp2p/webrtc-star-signalling-server", 3 | "version": "4.0.0", 4 | "description": "signalling server to use with the libp2p WebRTC transport", 5 | "license": "Apache-2.0 OR MIT", 6 | "homepage": "https://github.com/libp2p/js-libp2p-webrtc-star/tree/master/packages/webrtc-star-signalling-server#readme", 7 | "repository": { 8 | "type": "git", 9 | "url": "git+https://github.com/libp2p/js-libp2p-webrtc-star.git" 10 | }, 11 | "bugs": { 12 | "url": "https://github.com/libp2p/js-libp2p-webrtc-star/issues" 13 | }, 14 | "keywords": [ 15 | "IPFS", 16 | "libp2p" 17 | ], 18 | "engines": { 19 | "node": ">=16.0.0", 20 | "npm": ">=7.0.0" 21 | }, 22 | "bin": { 23 | "webrtc-star": "bin/index.js", 24 | "star-sig": "bin/index.js", 25 | "star-signal": "bin/index.js" 26 | }, 27 | "type": "module", 28 | "types": "./dist/src/index.d.ts", 29 | "files": [ 30 | "src", 31 | "dist", 32 | "!dist/test", 33 | "!**/*.tsbuildinfo" 34 | ], 35 | "exports": { 36 | ".": { 37 | "types": "./dist/src/index.d.ts", 38 | "import": "./dist/src/index.js" 39 | } 40 | }, 41 | "eslintConfig": { 42 | "extends": "ipfs", 43 | "parserOptions": { 44 | "sourceType": "module" 45 | } 46 | }, 47 | "release": { 48 | "branches": [ 49 | "master" 50 | ], 51 | "plugins": [ 52 | [ 53 | "@semantic-release/commit-analyzer", 54 | { 55 | "preset": "conventionalcommits", 56 | "releaseRules": [ 57 | { 58 | "breaking": true, 59 | "release": "major" 60 | }, 61 | { 62 | "revert": true, 63 | "release": "patch" 64 | }, 65 | { 66 | "type": "feat", 67 | "release": "minor" 68 | }, 69 | { 70 | "type": "fix", 71 | "release": "patch" 72 | }, 73 | { 74 | "type": "docs", 75 | "release": "patch" 76 | }, 77 | { 78 | "type": "test", 79 | "release": "patch" 80 | }, 81 | { 82 | "type": "deps", 83 | "release": "patch" 84 | }, 85 | { 86 | "scope": "no-release", 87 | "release": false 88 | } 89 | ] 90 | } 91 | ], 92 | [ 93 | "@semantic-release/release-notes-generator", 94 | { 95 | "preset": "conventionalcommits", 96 | "presetConfig": { 97 | "types": [ 98 | { 99 | "type": "feat", 100 | "section": "Features" 101 | }, 102 | { 103 | "type": "fix", 104 | "section": "Bug Fixes" 105 | }, 106 | { 107 | "type": "chore", 108 | "section": "Trivial Changes" 109 | }, 110 | { 111 | "type": "docs", 112 | "section": "Documentation" 113 | }, 114 | { 115 | "type": "deps", 116 | "section": "Dependencies" 117 | }, 118 | { 119 | "type": "test", 120 | "section": "Tests" 121 | } 122 | ] 123 | } 124 | } 125 | ], 126 | "@semantic-release/changelog", 127 | "@semantic-release/npm", 128 | "@semantic-release/github", 129 | "@semantic-release/git" 130 | ] 131 | }, 132 | "scripts": { 133 | "clean": "aegir clean", 134 | "lint": "aegir lint", 135 | "dep-check": "aegir dep-check", 136 | "build": "aegir build && cp src/index.html dist/src", 137 | "test": "aegir test -t node", 138 | "test:node": "aegir test -t node --cov", 139 | "start": "node bin/index.js", 140 | "release": "aegir release" 141 | }, 142 | "dependencies": { 143 | "@hapi/hapi": "^21.1.0", 144 | "@hapi/inert": "^7.0.0", 145 | "@libp2p/logger": "^2.0.0", 146 | "@libp2p/webrtc-star-protocol": "^4.0.0", 147 | "@multiformats/multiaddr": "^12.1.2", 148 | "menoetius": "0.0.3", 149 | "minimist": "^1.2.5", 150 | "prom-client": "^14.0.0", 151 | "socket.io": "^4.1.2", 152 | "socket.io-client": "^4.1.2" 153 | }, 154 | "devDependencies": { 155 | "@types/hapi__inert": "^5.2.3", 156 | "aegir": "^38.1.8", 157 | "p-event": "^5.0.1", 158 | "p-wait-for": "^5.0.0", 159 | "socket.io-client-v2": "npm:socket.io-client@^2.3.0", 160 | "socket.io-client-v3": "npm:socket.io-client@^3.1.2" 161 | } 162 | } 163 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/src/config.ts: -------------------------------------------------------------------------------- 1 | import { logger } from '@libp2p/logger' 2 | 3 | const log = logger('signalling-server') 4 | 5 | export const config = { 6 | log, 7 | hapi: { 8 | port: process.env.PORT ?? 13579, 9 | host: '0.0.0.0', 10 | options: { 11 | routes: { 12 | cors: true 13 | } 14 | } 15 | }, 16 | refreshPeerListIntervalMS: 10000 17 | } 18 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Signalling Server 8 | 9 | 20 | 21 | 22 | 23 |
24 |
25 | Libp2p Logo 26 |

This is a libp2p-webrtc-star signalling-server

27 |

Signaling Servers are used in libp2p to allow browsers and clients with restricted port-forwarding
to communicate with other peers in the libp2p network

28 |
29 | » Learn more 30 |
31 | 32 | 33 | 62 | 63 | 64 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/src/index.ts: -------------------------------------------------------------------------------- 1 | import { Server } from '@hapi/hapi' 2 | import Inert from '@hapi/inert' 3 | 4 | import { config } from './config.js' 5 | // @ts-expect-error no types 6 | import menoetius from 'menoetius' 7 | import path, { dirname } from 'path' 8 | import { socketServer } from './socket-server.js' 9 | import type { WebRTCStarSocket } from '@libp2p/webrtc-star-protocol' 10 | import type { Server as SocketServer } from 'socket.io' 11 | import { fileURLToPath } from 'url' 12 | 13 | const currentDir = dirname(fileURLToPath(import.meta.url)) 14 | 15 | const log = config.log 16 | 17 | interface Options { 18 | port?: number 19 | host?: string 20 | metrics?: boolean 21 | refreshPeerListIntervalMS?: number 22 | } 23 | 24 | export interface SigServer extends Server { 25 | peers: Map 26 | io: SocketServer 27 | } 28 | 29 | export async function sigServer (options: Options = {}): Promise { 30 | const port = options.port ?? config.hapi.port 31 | const host = options.host ?? config.hapi.host 32 | const peers = new Map() 33 | 34 | const http: SigServer = Object.assign(new Server({ 35 | ...config.hapi.options, 36 | port, 37 | host 38 | }), { 39 | peers, 40 | io: socketServer( 41 | peers, 42 | options.metrics ?? false, 43 | options.refreshPeerListIntervalMS ?? config.refreshPeerListIntervalMS 44 | ) 45 | }) 46 | 47 | http.io.attach(http.listener, { 48 | path: '/socket.io' // v2/v3/v4 clients can use this path 49 | }) 50 | http.io.attach(http.listener, { 51 | path: '/socket.io-next' // v3/v4 clients might be using this path 52 | }) 53 | http.events.on('stop', () => { http.io.close() }) 54 | 55 | await http.register(Inert) 56 | await http.start() 57 | 58 | log('signaling server has started on: ' + http.info.uri) 59 | 60 | http.route({ 61 | method: 'GET', 62 | path: '/', 63 | handler: (request, reply) => reply.file(path.join(currentDir, 'index.html'), { 64 | confine: false 65 | }) 66 | }) 67 | 68 | if (options.metrics === true) { 69 | log('enabling metrics') 70 | await menoetius.instrument(http) 71 | } 72 | 73 | return http 74 | } 75 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/src/socket-server.ts: -------------------------------------------------------------------------------- 1 | import { config } from './config.js' 2 | import { Server } from 'socket.io' 3 | import client from 'prom-client' 4 | import type { HandshakeSignal, WebRTCStarSocket } from '@libp2p/webrtc-star-protocol' 5 | 6 | const log = config.log 7 | 8 | const fake = { 9 | gauge: { 10 | set: () => {} 11 | }, 12 | counter: { 13 | inc: () => {} 14 | } 15 | } 16 | 17 | export function socketServer (peers: Map, hasMetrics: boolean, refreshPeerListIntervalMS: number): Server { 18 | const io = new Server({ 19 | allowEIO3: true // allow socket.io v2 clients to connect 20 | }) 21 | // @ts-expect-error types are different? 22 | io.on('connection', (socket) => { handle(socket) }) 23 | 24 | const peersMetric = hasMetrics ? new client.Gauge({ name: 'webrtc_star_peers', help: 'peers online now' }) : fake.gauge 25 | const dialsSuccessTotal = hasMetrics ? new client.Counter({ name: 'webrtc_star_dials_total_success', help: 'successfully completed dials since server started' }) : fake.counter 26 | const dialsFailureTotal = hasMetrics ? new client.Counter({ name: 'webrtc_star_dials_total_failure', help: 'failed dials since server started' }) : fake.counter 27 | const dialsTotal = hasMetrics ? new client.Counter({ name: 'webrtc_star_dials_total', help: 'all dials since server started' }) : fake.counter 28 | const joinsSuccessTotal = hasMetrics ? new client.Counter({ name: 'webrtc_star_joins_total_success', help: 'successfully completed joins since server started' }) : fake.counter 29 | const joinsFailureTotal = hasMetrics ? new client.Counter({ name: 'webrtc_star_joins_total_failure', help: 'failed joins since server started' }) : fake.counter 30 | const joinsTotal = hasMetrics ? new client.Counter({ name: 'webrtc_star_joins_total', help: 'all joins since server started' }) : fake.counter 31 | 32 | const refreshMetrics = (): void => { peersMetric.set(peers.size) } 33 | 34 | function safeEmit (maStr: string, event: any, arg: any): void { 35 | const peer = peers.get(maStr) 36 | 37 | if (peer == null) { 38 | log('trying to emit %s but peer is gone', event) 39 | return 40 | } 41 | 42 | peer.emit(event, arg) 43 | } 44 | 45 | function handle (socket: WebRTCStarSocket): void { 46 | let multiaddr: string 47 | 48 | // join this signaling server network 49 | socket.on('ss-join', (maStr: string) => { 50 | joinsTotal.inc() 51 | 52 | if (maStr == null) { 53 | joinsFailureTotal.inc(); return 54 | } 55 | 56 | multiaddr = maStr 57 | 58 | peers.set(multiaddr, socket) 59 | 60 | socket.once('ss-leave', stopSendingPeers) 61 | socket.once('disconnect', stopSendingPeers) 62 | 63 | let refreshInterval: NodeJS.Timer | undefined = setInterval(sendPeers, refreshPeerListIntervalMS) 64 | sendPeers() 65 | 66 | function sendPeers (): void { 67 | for (const mh of peers.keys()) { 68 | if (mh === multiaddr) { 69 | continue 70 | } 71 | 72 | safeEmit(mh, 'ws-peer', multiaddr) 73 | } 74 | } 75 | 76 | function stopSendingPeers (): void { 77 | if (refreshInterval != null) { 78 | clearInterval(refreshInterval) 79 | refreshInterval = undefined 80 | } 81 | } 82 | 83 | joinsSuccessTotal.inc() 84 | refreshMetrics() 85 | }) 86 | socket.on('ss-leave', () => { 87 | peers.delete(multiaddr) 88 | 89 | refreshMetrics() 90 | }) 91 | 92 | // socket.io own event 93 | socket.on('disconnect', () => { 94 | peers.delete(multiaddr) 95 | 96 | refreshMetrics() 97 | }) 98 | 99 | // forward an WebRTC offer to another peer 100 | socket.on('ss-handshake', (offer: HandshakeSignal) => { 101 | dialsTotal.inc() 102 | 103 | if (offer == null || typeof offer !== 'object' || offer.srcMultiaddr == null || offer.dstMultiaddr == null) { 104 | dialsFailureTotal.inc(); return 105 | } 106 | 107 | if (offer.answer === true) { 108 | dialsSuccessTotal.inc() 109 | safeEmit(offer.srcMultiaddr, 'ws-handshake', offer) 110 | } else { 111 | if (peers.has(offer.dstMultiaddr)) { 112 | safeEmit(offer.dstMultiaddr, 'ws-handshake', offer) 113 | } else { 114 | dialsFailureTotal.inc() 115 | offer.err = 'peer is not available' 116 | safeEmit(offer.srcMultiaddr, 'ws-handshake', offer) 117 | } 118 | } 119 | }) 120 | } 121 | 122 | return io 123 | } 124 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/test/node.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | import sigServerTests from './sig-server.js' 4 | import { connect as socketClientV4 } from 'socket.io-client' 5 | import { io as socketClientV3 } from 'socket.io-client-v3' 6 | // @ts-expect-error no types 7 | import { connect as socketClientV2 } from 'socket.io-client-v2' 8 | 9 | // Test v4, v3 and v2 clients against the socket server 10 | 11 | sigServerTests( 12 | 'socket.io-client@v4 (next path)', 13 | socketClientV4, { 14 | transports: ['websocket'], 15 | forceNew: true, 16 | path: '/socket.io-next/' // TODO: This should be removed when socket.io@2 support is removed 17 | } 18 | ) 19 | sigServerTests( 20 | 'socket.io-client@v3 (next path)', 21 | // @ts-expect-error types are wrong 22 | socketClientV3, { 23 | transports: ['websocket'], 24 | forceNew: true, 25 | path: '/socket.io-next/' // TODO: This should be removed when socket.io@2 support is removed 26 | } 27 | ) 28 | sigServerTests( 29 | 'socket.io-client@v2 (next path)', 30 | socketClientV2, { 31 | transports: ['websocket'], 32 | forceNew: true, 33 | path: '/socket.io-next/' // TODO: This should be removed when socket.io@2 support is removed 34 | } 35 | ) 36 | sigServerTests( 37 | 'socket.io-client@v4 (root path)', 38 | socketClientV4, { 39 | transports: ['websocket'], 40 | forceNew: true 41 | } 42 | ) 43 | sigServerTests( 44 | 'socket.io-client@v3 (root path)', 45 | // @ts-expect-error types are wrong 46 | socketClientV3, { 47 | transports: ['websocket'], 48 | forceNew: true 49 | } 50 | ) 51 | sigServerTests( 52 | 'socket.io-client@v2 (root path)', 53 | socketClientV2, { 54 | transports: ['websocket'], 55 | forceNew: true 56 | } 57 | ) 58 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/test/sig-server.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | import { expect } from 'aegir/chai' 4 | import { multiaddr } from '@multiformats/multiaddr' 5 | import { SigServer, sigServer } from '../src/index.js' 6 | import pWaitFor from 'p-wait-for' 7 | import { pEvent } from 'p-event' 8 | import type { WebRTCStarSocket } from '@libp2p/webrtc-star-protocol' 9 | 10 | export default (clientName: string, io: (url: string, opts: any) => WebRTCStarSocket, sioOptions: any): void => { 11 | describe(`signalling ${clientName}`, () => { 12 | let sioUrl: string 13 | let sigS: SigServer 14 | let c1: WebRTCStarSocket 15 | let c2: WebRTCStarSocket 16 | let c3: WebRTCStarSocket 17 | let c4: WebRTCStarSocket 18 | 19 | const base = (id: string): string => { 20 | return `/ip4/127.0.0.1/tcp/9090/ws/p2p-webrtc-star/ipfs/${id}` 21 | } 22 | 23 | const c1mh = multiaddr(base('QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1')) 24 | const c2mh = multiaddr(base('QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo2')) 25 | const c3mh = multiaddr(base('QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo3')) 26 | const c4mh = multiaddr(base('QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4')) 27 | 28 | it('start and stop signalling server (default port)', async () => { 29 | const server = await sigServer() 30 | 31 | expect(server.info.port).to.equal(13579) 32 | expect(server.info.protocol).to.equal('http') 33 | expect(server.info.address).to.equal('0.0.0.0') 34 | 35 | await server.stop() 36 | }) 37 | 38 | it('start and stop signalling server (default port) and spam it with invalid requests', (done) => { 39 | sigServer().then(server => { 40 | expect(server.info.port).to.equal(13579) 41 | expect(server.info.protocol).to.equal('http') 42 | expect(server.info.address).to.equal('0.0.0.0') 43 | 44 | const cl = io(server.info.uri, sioOptions) 45 | cl.on('connect', async () => { 46 | // @ts-expect-error not a valid handler 47 | cl.emit('ss-handshake', null) 48 | // @ts-expect-error not a valid handler 49 | cl.emit('ss-handshake', 1) 50 | // @ts-expect-error not a valid handler 51 | cl.emit('ss-handshake', [1, 2, 3]) 52 | // @ts-expect-error not a valid handler 53 | cl.emit('ss-handshake', {}) 54 | 55 | await server.stop() 56 | 57 | done() 58 | }) 59 | cl.on('disconnect', () => { 60 | cl.close() 61 | }) 62 | }, done) 63 | }) 64 | 65 | it('start and stop signalling server (custom port)', async () => { 66 | const options = { 67 | port: 12345 68 | } 69 | 70 | const server = await sigServer(options) 71 | 72 | expect(server.info.port).to.equal(12345) 73 | expect(server.info.protocol).to.equal('http') 74 | expect(server.info.address).to.equal('0.0.0.0') 75 | 76 | await server.stop() 77 | }) 78 | 79 | it('start signalling server for client tests', async () => { 80 | const options = { 81 | port: 12345 82 | } 83 | 84 | const server = await sigServer(options) 85 | 86 | expect(server.info.port).to.equal(12345) 87 | expect(server.info.protocol).to.equal('http') 88 | expect(server.info.address).to.equal('0.0.0.0') 89 | sioUrl = server.info.uri 90 | sigS = server 91 | }) 92 | 93 | it('zero peers', () => { 94 | expect(Object.keys(sigS.peers).length).to.equal(0) 95 | }) 96 | 97 | it('connect one client', (done) => { 98 | c1 = io(sioUrl, sioOptions) 99 | c1.on('connect', done) 100 | }) 101 | 102 | it('connect three more clients', (done) => { 103 | let count = 0 104 | 105 | c2 = io(sioUrl, sioOptions) 106 | c3 = io(sioUrl, sioOptions) 107 | c4 = io(sioUrl, sioOptions) 108 | 109 | c2.on('connect', connected) 110 | c3.on('connect', connected) 111 | c4.on('connect', connected) 112 | 113 | function connected (): void { 114 | if (++count === 3) { done() } 115 | } 116 | }) 117 | 118 | it('ss-join first client', async () => { 119 | c1.emit('ss-join', c1mh.toString()) 120 | 121 | await pWaitFor(() => sigS.peers.size === 1) 122 | }) 123 | 124 | it('ss-join and ss-leave second client', async () => { 125 | c2.emit('ss-join', c2mh.toString()) 126 | 127 | await pWaitFor(() => sigS.peers.size === 2) 128 | 129 | c2.emit('ss-leave', c2mh.toString()) 130 | 131 | await pWaitFor(() => sigS.peers.size === 1) 132 | }) 133 | 134 | it('ss-join and disconnect third client', async () => { 135 | c3.emit('ss-join', c3mh.toString()) 136 | 137 | await pWaitFor(() => sigS.peers.size === 2) 138 | 139 | c3.disconnect() 140 | 141 | await pWaitFor(() => sigS.peers.size === 1) 142 | }) 143 | 144 | it('ss-join the fourth', async () => { 145 | c4.emit('ss-join', c4mh.toString()) 146 | 147 | const multiaddr = await pEvent(c1, 'ws-peer') 148 | 149 | expect(multiaddr).to.equal(c4mh.toString()) 150 | expect(sigS.peers.size).to.equal(2) 151 | }) 152 | 153 | it('c1 handshake c4', (done) => { 154 | c4.once('ws-handshake', (offer) => { 155 | offer.answer = true 156 | c4.emit('ss-handshake', offer) 157 | }) 158 | 159 | c1.once('ws-handshake', (offer) => { 160 | expect(offer.err).to.not.exist() 161 | expect(offer.answer).to.equal(true) 162 | done() 163 | }) 164 | 165 | c1.emit('ss-handshake', { 166 | srcMultiaddr: c1mh.toString(), 167 | dstMultiaddr: c4mh.toString(), 168 | intentId: 'intent-id', 169 | signal: { 170 | type: 'offer', 171 | sdp: 'sdp' 172 | } 173 | }) 174 | }) 175 | 176 | it('c1 handshake c2 fail (does not exist() anymore)', (done) => { 177 | c1.once('ws-handshake', (offer) => { 178 | expect(offer.err).to.exist() 179 | done() 180 | }) 181 | 182 | c1.emit('ss-handshake', { 183 | srcMultiaddr: c1mh.toString(), 184 | dstMultiaddr: c2mh.toString(), 185 | intentId: 'intent-id', 186 | signal: { 187 | type: 'offer', 188 | sdp: 'sdp' 189 | } 190 | }) 191 | }) 192 | 193 | it('disconnects every client', (done) => { 194 | [c1, c2, c3, c4].forEach((c) => c.disconnect()) 195 | done() 196 | }) 197 | 198 | it('emits ws-peer every 10 seconds', function (done) { 199 | this.timeout(50000) 200 | let peersEmitted = 0 201 | 202 | c1 = io(sioUrl, sioOptions) 203 | c2 = io(sioUrl, sioOptions) 204 | c1.emit('ss-join', 'c1') 205 | c2.emit('ss-join', 'c2') 206 | 207 | c1.on('ws-peer', (p) => { 208 | expect(p).to.be.equal('c2') 209 | check() 210 | }) 211 | 212 | function check (): void { 213 | if (++peersEmitted === 2) { 214 | done() 215 | } 216 | } 217 | }) 218 | 219 | it('stop signalling server', async () => { 220 | c1.disconnect() 221 | c2.disconnect() 222 | 223 | await sigS.stop() 224 | }) 225 | }) 226 | } 227 | -------------------------------------------------------------------------------- /packages/webrtc-star-signalling-server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "aegir/src/config/tsconfig.aegir.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "emitDeclarationOnly": false, 6 | "module": "ES2020" 7 | }, 8 | "include": [ 9 | "src", 10 | "test" 11 | ], 12 | "references": [ 13 | { 14 | "path": "../webrtc-star-protocol" 15 | } 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/.aegir.js: -------------------------------------------------------------------------------- 1 | // TODO: Temporary fix per wrtc issue 2 | // https://github.com/node-webrtc/node-webrtc/issues/636#issuecomment-774171409 3 | process.on('beforeExit', (code) => process.exit(code)) 4 | 5 | let firstRun = true 6 | 7 | /** @type {import('aegir').PartialOptions} */ 8 | export default { 9 | test: { 10 | async before () { 11 | const { sigServer } = await import('@libp2p/webrtc-star-signalling-server') 12 | 13 | const options1 = { 14 | port: 15555, 15 | host: '127.0.0.1', 16 | metrics: firstRun 17 | } 18 | 19 | const options2 = { 20 | port: 15556, 21 | host: '127.0.0.1', 22 | metrics: false 23 | } 24 | 25 | const options3 = { 26 | port: 15557, 27 | host: '127.0.0.1', 28 | metrics: false 29 | } 30 | 31 | if (firstRun) { 32 | firstRun = false 33 | } 34 | 35 | const sigServers = [] 36 | 37 | sigServers.push(await sigServer(options1)) 38 | sigServers.push(await sigServer(options2)) 39 | sigServers.push(await sigServer(options3)) 40 | 41 | console.log('signalling on:') 42 | sigServers.forEach((sig) => console.log(sig.info.uri)) 43 | 44 | return { 45 | sigServers 46 | } 47 | }, 48 | async after (_, before) { 49 | await Promise.all(before.sigServers.map(s => s.stop())) 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ## [@libp2p/webrtc-star-v7.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v6.0.0...@libp2p/webrtc-star-v7.0.0) (2023-04-24) 2 | 3 | 4 | ### ⚠ BREAKING CHANGES 5 | 6 | * update all dependencies (#506) 7 | 8 | ### Trivial Changes 9 | 10 | * fix tests ([3c4b6f5](https://github.com/libp2p/js-libp2p-webrtc-star/commit/3c4b6f5e9c58c1be16105e8bb4fe69a3092073b4)) 11 | 12 | 13 | ### Dependencies 14 | 15 | * update all dependencies ([#506](https://github.com/libp2p/js-libp2p-webrtc-star/issues/506)) ([417c05f](https://github.com/libp2p/js-libp2p-webrtc-star/commit/417c05f5a85f585699e09ed5d84ee51391697d5e)) 16 | * update sibling dependencies ([b7b011e](https://github.com/libp2p/js-libp2p-webrtc-star/commit/b7b011ef588cafd3db0b60cb4fbf0f13fff05fc0)) 17 | * update sibling dependencies ([ee00041](https://github.com/libp2p/js-libp2p-webrtc-star/commit/ee00041eb262cc79c05644c51688330ea15e9489)) 18 | 19 | ## [@libp2p/webrtc-star-v6.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v5.0.3...@libp2p/webrtc-star-v6.0.0) (2023-01-06) 20 | 21 | 22 | ### ⚠ BREAKING CHANGES 23 | 24 | * update multiformats deps (#490) 25 | 26 | ### Bug Fixes 27 | 28 | * update multiformats deps ([#490](https://github.com/libp2p/js-libp2p-webrtc-star/issues/490)) ([f1acfea](https://github.com/libp2p/js-libp2p-webrtc-star/commit/f1acfeaea8744c392912c837fda504f3a192d970)) 29 | 30 | 31 | ### Dependencies 32 | 33 | * update sibling dependencies ([0867521](https://github.com/libp2p/js-libp2p-webrtc-star/commit/08675210186590ad03f579bf8d078904dbec34d6)) 34 | * update sibling dependencies ([93e035d](https://github.com/libp2p/js-libp2p-webrtc-star/commit/93e035da84643ab0f7379fe336f2051e5c50edf1)) 35 | 36 | ## [@libp2p/webrtc-star-v5.0.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v5.0.2...@libp2p/webrtc-star-v5.0.3) (2022-10-17) 37 | 38 | 39 | ### Dependencies 40 | 41 | * **dev:** bump it-all from 1.0.6 to 2.0.0 ([#481](https://github.com/libp2p/js-libp2p-webrtc-star/issues/481)) ([b88ec72](https://github.com/libp2p/js-libp2p-webrtc-star/commit/b88ec725460941f9140803f221d5b4a7d9e19ec4)) 42 | 43 | ## [@libp2p/webrtc-star-v5.0.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v5.0.1...@libp2p/webrtc-star-v5.0.2) (2022-10-13) 44 | 45 | 46 | ### Bug Fixes 47 | 48 | * update export type ([#479](https://github.com/libp2p/js-libp2p-webrtc-star/issues/479)) ([2b8a924](https://github.com/libp2p/js-libp2p-webrtc-star/commit/2b8a9249e74f1927c97489b3e72112ce77ab97e3)) 49 | 50 | ## [@libp2p/webrtc-star-v5.0.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v5.0.0...@libp2p/webrtc-star-v5.0.1) (2022-10-12) 51 | 52 | 53 | ### Bug Fixes 54 | 55 | * expose discovery as factory ([#478](https://github.com/libp2p/js-libp2p-webrtc-star/issues/478)) ([63c7006](https://github.com/libp2p/js-libp2p-webrtc-star/commit/63c70067b8479d7877264512b66c276d9aa97745)) 56 | 57 | ## [@libp2p/webrtc-star-v5.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v4.0.1...@libp2p/webrtc-star-v5.0.0) (2022-10-12) 58 | 59 | 60 | ### ⚠ BREAKING CHANGES 61 | 62 | * modules no longer implement `Initializable` instead switching to constructor injection 63 | 64 | ### Bug Fixes 65 | 66 | * remove @libp2p/components ([#477](https://github.com/libp2p/js-libp2p-webrtc-star/issues/477)) ([efbcd99](https://github.com/libp2p/js-libp2p-webrtc-star/commit/efbcd99086dcde17c476ecc2e255edbde467599c)) 67 | 68 | ## [@libp2p/webrtc-star-v4.0.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v4.0.0...@libp2p/webrtc-star-v4.0.1) (2022-10-07) 69 | 70 | 71 | ### Dependencies 72 | 73 | * bump @libp2p/components from 2.1.1 to 3.0.0 ([#473](https://github.com/libp2p/js-libp2p-webrtc-star/issues/473)) ([bfb422a](https://github.com/libp2p/js-libp2p-webrtc-star/commit/bfb422a255217fcd3b851a785fa0fd38f382d9f9)) 74 | * **dev:** bump @libp2p/interface-mocks from 4.0.3 to 6.0.0 ([#475](https://github.com/libp2p/js-libp2p-webrtc-star/issues/475)) ([45e62e4](https://github.com/libp2p/js-libp2p-webrtc-star/commit/45e62e440ab70b7bf7b463273543987d8e7b5a25)) 75 | 76 | ## [@libp2p/webrtc-star-v4.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v3.0.3...@libp2p/webrtc-star-v4.0.0) (2022-10-07) 77 | 78 | 79 | ### ⚠ BREAKING CHANGES 80 | 81 | * bump @libp2p/interface-transport from 1.0.4 to 2.0.0 (#474) 82 | 83 | ### Dependencies 84 | 85 | * bump @libp2p/interface-transport from 1.0.4 to 2.0.0 ([#474](https://github.com/libp2p/js-libp2p-webrtc-star/issues/474)) ([de41bf3](https://github.com/libp2p/js-libp2p-webrtc-star/commit/de41bf3b54b328b04e0fdf837925e199baaf7d7e)) 86 | 87 | ## [@libp2p/webrtc-star-v3.0.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v3.0.2...@libp2p/webrtc-star-v3.0.3) (2022-09-21) 88 | 89 | 90 | ### Dependencies 91 | 92 | * update @multiformats/multiaddr to 11.0.0 ([#471](https://github.com/libp2p/js-libp2p-webrtc-star/issues/471)) ([2abc084](https://github.com/libp2p/js-libp2p-webrtc-star/commit/2abc0844537030bd3d248f08e5467f29bba6dec6)) 93 | 94 | ## [@libp2p/webrtc-star-v3.0.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v3.0.1...@libp2p/webrtc-star-v3.0.2) (2022-09-21) 95 | 96 | 97 | ### Bug Fixes 98 | 99 | * do not close connections when sigserver goes away ([#456](https://github.com/libp2p/js-libp2p-webrtc-star/issues/456)) ([206bdd5](https://github.com/libp2p/js-libp2p-webrtc-star/commit/206bdd55e84d92929cf4dec6dd98d9bd6b37f650)), closes [#453](https://github.com/libp2p/js-libp2p-webrtc-star/issues/453) 100 | 101 | ## [@libp2p/webrtc-star-v3.0.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v3.0.0...@libp2p/webrtc-star-v3.0.1) (2022-08-10) 102 | 103 | 104 | ### Bug Fixes 105 | 106 | * update all deps ([#465](https://github.com/libp2p/js-libp2p-webrtc-star/issues/465)) ([01714f7](https://github.com/libp2p/js-libp2p-webrtc-star/commit/01714f73f8b7fee0d515060150604b6edf3ecaa0)) 107 | 108 | 109 | ### Trivial Changes 110 | 111 | * update project config ([#460](https://github.com/libp2p/js-libp2p-webrtc-star/issues/460)) ([02197df](https://github.com/libp2p/js-libp2p-webrtc-star/commit/02197df3f7e65cd8d6cdea81efa137035aa8228e)) 112 | 113 | ## [@libp2p/webrtc-star-v3.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v2.0.1...@libp2p/webrtc-star-v3.0.0) (2022-06-17) 114 | 115 | 116 | ### ⚠ BREAKING CHANGES 117 | 118 | * the registry/connection interfaces have changed 119 | 120 | ### Trivial Changes 121 | 122 | * update deps ([#449](https://github.com/libp2p/js-libp2p-webrtc-star/issues/449)) ([b86c48c](https://github.com/libp2p/js-libp2p-webrtc-star/commit/b86c48c2938a8e8a81ce8b59b43021940db6d8ac)) 123 | 124 | ## [@libp2p/webrtc-star-v2.0.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v2.0.0...@libp2p/webrtc-star-v2.0.1) (2022-06-15) 125 | 126 | 127 | ### Trivial Changes 128 | 129 | * update deps ([#443](https://github.com/libp2p/js-libp2p-webrtc-star/issues/443)) ([ac7f92d](https://github.com/libp2p/js-libp2p-webrtc-star/commit/ac7f92de776bf798849733e6128823c798a416c0)) 130 | 131 | ## [@libp2p/webrtc-star-v2.0.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.12...@libp2p/webrtc-star-v2.0.0) (2022-06-15) 132 | 133 | 134 | ### ⚠ BREAKING CHANGES 135 | 136 | * uses new single-issue libp2p interface modules 137 | 138 | ### Features 139 | 140 | * update to latest interfaces ([#442](https://github.com/libp2p/js-libp2p-webrtc-star/issues/442)) ([d5bf151](https://github.com/libp2p/js-libp2p-webrtc-star/commit/d5bf1519ece9203ed2ab221a3575b3198332c438)) 141 | 142 | ## [@libp2p/webrtc-star-v1.0.12](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.11...@libp2p/webrtc-star-v1.0.12) (2022-05-23) 143 | 144 | 145 | ### Bug Fixes 146 | 147 | * update interfaces ([#434](https://github.com/libp2p/js-libp2p-webrtc-star/issues/434)) ([ccf6839](https://github.com/libp2p/js-libp2p-webrtc-star/commit/ccf683999dfb04e84023f6e3e8c3654a1b17e525)) 148 | 149 | ## [@libp2p/webrtc-star-v1.0.11](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.10...@libp2p/webrtc-star-v1.0.11) (2022-05-21) 150 | 151 | 152 | ### Bug Fixes 153 | 154 | * **webrtc-star-transport/utils:** properly handle legacy protocol edge case [#369](https://github.com/libp2p/js-libp2p-webrtc-star/issues/369) ([#430](https://github.com/libp2p/js-libp2p-webrtc-star/issues/430)) ([4674c1f](https://github.com/libp2p/js-libp2p-webrtc-star/commit/4674c1fb8d949d6762eedc7ac63de20dc8b1219c)) 155 | 156 | ## [@libp2p/webrtc-star-v1.0.10](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.9...@libp2p/webrtc-star-v1.0.10) (2022-05-10) 157 | 158 | 159 | ### Trivial Changes 160 | 161 | * bump sinon from 13.0.2 to 14.0.0 ([#428](https://github.com/libp2p/js-libp2p-webrtc-star/issues/428)) ([70f84b8](https://github.com/libp2p/js-libp2p-webrtc-star/commit/70f84b8a7bf4a493d2187d97ecc11f1bc700b8c1)) 162 | 163 | ## [@libp2p/webrtc-star-v1.0.9](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.8...@libp2p/webrtc-star-v1.0.9) (2022-05-06) 164 | 165 | 166 | ### Bug Fixes 167 | 168 | * update interfaces ([#427](https://github.com/libp2p/js-libp2p-webrtc-star/issues/427)) ([6ecb15c](https://github.com/libp2p/js-libp2p-webrtc-star/commit/6ecb15c41005f8aa47df5c0ccbb55eee7cd78057)) 169 | 170 | ## [@libp2p/webrtc-star-v1.0.8](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.7...@libp2p/webrtc-star-v1.0.8) (2022-05-04) 171 | 172 | 173 | ### Bug Fixes 174 | 175 | * update interfaces ([#426](https://github.com/libp2p/js-libp2p-webrtc-star/issues/426)) ([aff0619](https://github.com/libp2p/js-libp2p-webrtc-star/commit/aff0619a2696734b58293b6c58d43a00b1a9541d)) 176 | 177 | ## [@libp2p/webrtc-star-v1.0.7](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.6...@libp2p/webrtc-star-v1.0.7) (2022-04-08) 178 | 179 | 180 | ### Trivial Changes 181 | 182 | * update aegir ([#425](https://github.com/libp2p/js-libp2p-webrtc-star/issues/425)) ([1cb62cb](https://github.com/libp2p/js-libp2p-webrtc-star/commit/1cb62cb63477f6442fdb6e932198faed62b38188)) 183 | 184 | ## [@libp2p/webrtc-star-v1.0.6](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.5...@libp2p/webrtc-star-v1.0.6) (2022-03-19) 185 | 186 | 187 | ### Trivial Changes 188 | 189 | * enable node testing ([#414](https://github.com/libp2p/js-libp2p-webrtc-star/issues/414)) ([4cdc7b2](https://github.com/libp2p/js-libp2p-webrtc-star/commit/4cdc7b2dbce272cd1ee3b8d1180ce3fdd5e75254)) 190 | 191 | ## [@libp2p/webrtc-star-v1.0.5](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.4...@libp2p/webrtc-star-v1.0.5) (2022-03-19) 192 | 193 | 194 | ### Bug Fixes 195 | 196 | * demand up to date webrtc-peer ([#413](https://github.com/libp2p/js-libp2p-webrtc-star/issues/413)) ([3748e65](https://github.com/libp2p/js-libp2p-webrtc-star/commit/3748e65b020abf68e43cabcf0caa51d3e6e62ded)) 197 | 198 | ## [@libp2p/webrtc-star-v1.0.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.3...@libp2p/webrtc-star-v1.0.4) (2022-03-18) 199 | 200 | 201 | ### Bug Fixes 202 | 203 | * splits webrtc peer out into it's own module ([#412](https://github.com/libp2p/js-libp2p-webrtc-star/issues/412)) ([b50bd81](https://github.com/libp2p/js-libp2p-webrtc-star/commit/b50bd81bed1720673b08643e8064fd55f3024956)) 204 | 205 | ## [@libp2p/webrtc-star-v1.0.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.2...@libp2p/webrtc-star-v1.0.3) (2022-03-17) 206 | 207 | 208 | ### Bug Fixes 209 | 210 | * update interfaces ([#411](https://github.com/libp2p/js-libp2p-webrtc-star/issues/411)) ([bf67a12](https://github.com/libp2p/js-libp2p-webrtc-star/commit/bf67a12b30b8d099b9ad4cf93d6f1fa357326616)) 211 | 212 | ## [@libp2p/webrtc-star-v1.0.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.1...@libp2p/webrtc-star-v1.0.2) (2022-02-21) 213 | 214 | 215 | ### Bug Fixes 216 | 217 | * update interfaces ([#406](https://github.com/libp2p/js-libp2p-webrtc-star/issues/406)) ([fc7b82f](https://github.com/libp2p/js-libp2p-webrtc-star/commit/fc7b82f6a93298cb61fb3219fa9d1a60f70a3b35)) 218 | 219 | ## [@libp2p/webrtc-star-v1.0.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/@libp2p/webrtc-star-v1.0.0...@libp2p/webrtc-star-v1.0.1) (2022-02-12) 220 | 221 | 222 | ### Bug Fixes 223 | 224 | * update to latest interfaces ([#404](https://github.com/libp2p/js-libp2p-webrtc-star/issues/404)) ([8c8a033](https://github.com/libp2p/js-libp2p-webrtc-star/commit/8c8a033f778818085aa581241205f964b99968cb)) 225 | 226 | ## @libp2p/webrtc-star-v1.0.0 (2022-02-10) 227 | 228 | 229 | ### ⚠ BREAKING CHANGES 230 | 231 | * switch to named exports, ESM only 232 | 233 | ### Features 234 | 235 | * convert to typescript ([#401](https://github.com/libp2p/js-libp2p-webrtc-star/issues/401)) ([fb7950c](https://github.com/libp2p/js-libp2p-webrtc-star/commit/fb7950c5d688b62878af8e6538175eb1ff93ec22)) 236 | 237 | # Change Log 238 | 239 | All notable changes to this project will be documented in this file. 240 | See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. 241 | 242 | # [0.25.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/libp2p-webrtc-star@0.24.1...libp2p-webrtc-star@0.25.0) (2021-12-02) 243 | 244 | 245 | ### chore 246 | 247 | * update to new peer-id and libp2p-crypto ([#387](https://github.com/libp2p/js-libp2p-webrtc-star/issues/387)) ([28db4a0](https://github.com/libp2p/js-libp2p-webrtc-star/commit/28db4a0f8fbf78fe4023ac1e2e54dc72e0314d80)) 248 | 249 | 250 | ### BREAKING CHANGES 251 | 252 | * requires node 15+ 253 | 254 | 255 | 256 | 257 | 258 | ## 0.24.1 (2021-11-30) 259 | 260 | 261 | ### Features 262 | 263 | * make into monorepo ([#376](https://github.com/libp2p/js-libp2p-webrtc-star/issues/376)) ([8c7f5de](https://github.com/libp2p/js-libp2p-webrtc-star/commit/8c7f5de7e1bddf1db240bc5d7634722253326b14)) 264 | 265 | 266 | ### BREAKING CHANGES 267 | 268 | * The transport module no longer includes the signalling server 269 | 270 | 271 | 272 | 273 | 274 | # 0.24.0 (2021-09-28) 275 | 276 | 277 | ### Features 278 | 279 | * make into monorepo ([#376](https://github.com/libp2p/js-libp2p-webrtc-star/issues/376)) ([8c7f5de](https://github.com/libp2p/js-libp2p-webrtc-star/commit/8c7f5de7e1bddf1db240bc5d7634722253326b14)) 280 | 281 | 282 | ### BREAKING CHANGES 283 | 284 | * The transport module no longer includes the signalling server 285 | 286 | 287 | 288 | 289 | 290 | # [0.23.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.22.4...v0.23.0) (2021-07-07) 291 | 292 | 293 | ### chore 294 | 295 | * update deps ([#365](https://github.com/libp2p/js-libp2p-webrtc-star/issues/365)) ([e4360f2](https://github.com/libp2p/js-libp2p-webrtc-star/commit/e4360f28fe77fecd1e16568e85c6b17bb6a25ade)) 296 | 297 | 298 | ### BREAKING CHANGES 299 | 300 | * uses new major of multiaddr, mafmt and friends 301 | 302 | 303 | 304 | ## [0.22.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.22.3...v0.22.4) (2021-06-16) 305 | 306 | 307 | 308 | ## [0.22.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.22.2...v0.22.3) (2021-05-04) 309 | 310 | 311 | 312 | ## [0.22.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.22.1...v0.22.2) (2021-04-23) 313 | 314 | 315 | 316 | ## [0.22.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.22.0...v0.22.1) (2021-04-22) 317 | 318 | 319 | ### Features 320 | 321 | * support multiple listeners ([#330](https://github.com/libp2p/js-libp2p-webrtc-star/issues/330)) ([5b7b142](https://github.com/libp2p/js-libp2p-webrtc-star/commit/5b7b14212615cc789836319694cc0b7c16f8dfe4)) 322 | 323 | 324 | 325 | # [0.22.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.21.2...v0.22.0) (2021-04-13) 326 | 327 | 328 | 329 | ## [0.21.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.21.1...v0.21.2) (2021-02-24) 330 | 331 | 332 | 333 | ## [0.21.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.21.0...v0.21.1) (2021-02-10) 334 | 335 | 336 | ### Bug Fixes 337 | 338 | * add error event listener to event emitter ([#303](https://github.com/libp2p/js-libp2p-webrtc-star/issues/303)) ([aa770af](https://github.com/libp2p/js-libp2p-webrtc-star/commit/aa770af369cc215b7981befdbb49f7fee1368f77)) 339 | 340 | 341 | 342 | # [0.21.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.20.8...v0.21.0) (2021-01-25) 343 | 344 | 345 | 346 | ## [0.20.8](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.20.7...v0.20.8) (2021-01-25) 347 | 348 | 349 | ### Reverts 350 | 351 | * Revert "chore: update socket.io to 3 (#292)" ([3c3cd94](https://github.com/libp2p/js-libp2p-webrtc-star/commit/3c3cd94f0e398b1d4f9f6f7a64585fb2066511da)), closes [#292](https://github.com/libp2p/js-libp2p-webrtc-star/issues/292) 352 | 353 | 354 | 355 | ## [0.20.7](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.20.6...v0.20.7) (2021-01-25) 356 | 357 | 358 | 359 | ## [0.20.6](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.20.5...v0.20.6) (2020-12-29) 360 | 361 | 362 | 363 | ## [0.20.5](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.20.4...v0.20.5) (2020-12-14) 364 | 365 | 366 | ### Reverts 367 | 368 | * Revert "chore: update socket io (#285)" ([849fa43](https://github.com/libp2p/js-libp2p-webrtc-star/commit/849fa43f5c5f4f33f76192001b00b9b337e5a225)), closes [#285](https://github.com/libp2p/js-libp2p-webrtc-star/issues/285) 369 | 370 | 371 | 372 | ## [0.20.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.20.3...v0.20.4) (2020-12-10) 373 | 374 | 375 | 376 | ## [0.20.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.20.2...v0.20.3) (2020-12-09) 377 | 378 | 379 | ### Features 380 | 381 | * support webrtc trickle ([#282](https://github.com/libp2p/js-libp2p-webrtc-star/issues/282)) ([d2a2478](https://github.com/libp2p/js-libp2p-webrtc-star/commit/d2a24783c9c3d1c800a6319494fd69926b98a79b)) 382 | 383 | 384 | 385 | ## [0.20.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.20.1...v0.20.2) (2020-12-03) 386 | 387 | 388 | 389 | 390 | ## [0.20.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.20.0...v0.20.1) (2020-09-11) 391 | 392 | 393 | ### Bug Fixes 394 | 395 | * do not assign read-only error.message ([b84dd66](https://github.com/libp2p/js-libp2p-webrtc-star/commit/b84dd66)) 396 | 397 | 398 | 399 | 400 | # [0.20.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.19.0...v0.20.0) (2020-08-25) 401 | 402 | 403 | ### Chores 404 | 405 | * update deps ([#255](https://github.com/libp2p/js-libp2p-webrtc-star/issues/255)) ([bf6fcb0](https://github.com/libp2p/js-libp2p-webrtc-star/commit/bf6fcb0)) 406 | 407 | 408 | ### BREAKING CHANGES 409 | 410 | * - Hapi has dropped support for node < 12 411 | 412 | 413 | 414 | 415 | # [0.19.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.18.6...v0.19.0) (2020-08-12) 416 | 417 | 418 | ### Bug Fixes 419 | 420 | * replace node buffers with uint8arrays ([#244](https://github.com/libp2p/js-libp2p-webrtc-star/issues/244)) ([68805b0](https://github.com/libp2p/js-libp2p-webrtc-star/commit/68805b0)) 421 | * use relaxed webrtc check ([#249](https://github.com/libp2p/js-libp2p-webrtc-star/issues/249)) ([306b453](https://github.com/libp2p/js-libp2p-webrtc-star/commit/306b453)) 422 | 423 | 424 | ### BREAKING CHANGES 425 | 426 | * - All deps used by this module now use Uint8Arrays in place of node Buffers 427 | 428 | * chore: skip know test issues with aegir 429 | 430 | * fix: use simple-peer fork branch 431 | 432 | * chore: update libp2p-webrtc-peer 433 | 434 | Co-authored-by: Jacob Heun 435 | 436 | 437 | 438 | 439 | ## [0.18.6](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.18.5...v0.18.6) (2020-06-25) 440 | 441 | 442 | ### Bug Fixes 443 | 444 | * use simple-peer fork that does not throw when setting error codes ([#231](https://github.com/libp2p/js-libp2p-webrtc-star/issues/231)) ([5795435](https://github.com/libp2p/js-libp2p-webrtc-star/commit/5795435)) 445 | 446 | 447 | 448 | 449 | ## [0.18.5](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.18.4...v0.18.5) (2020-06-18) 450 | 451 | 452 | 453 | 454 | ## [0.18.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.18.3...v0.18.4) (2020-06-11) 455 | 456 | 457 | ### Bug Fixes 458 | 459 | * add error handler for incoming connections ([#224](https://github.com/libp2p/js-libp2p-webrtc-star/issues/224)) ([dc9bfa6](https://github.com/libp2p/js-libp2p-webrtc-star/commit/dc9bfa6)) 460 | * do not signal if channel destroyed ([#226](https://github.com/libp2p/js-libp2p-webrtc-star/issues/226)) ([74e9059](https://github.com/libp2p/js-libp2p-webrtc-star/commit/74e9059)) 461 | 462 | 463 | 464 | 465 | ## [0.18.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.18.2...v0.18.3) (2020-05-06) 466 | 467 | 468 | 469 | 470 | ## [0.18.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.18.1...v0.18.2) (2020-05-06) 471 | 472 | 473 | 474 | 475 | ## [0.18.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.18.0...v0.18.1) (2020-04-29) 476 | 477 | 478 | ### Bug Fixes 479 | 480 | * add buffer ([#217](https://github.com/libp2p/js-libp2p-webrtc-star/issues/217)) ([0eb097e](https://github.com/libp2p/js-libp2p-webrtc-star/commit/0eb097e)) 481 | 482 | 483 | 484 | 485 | # [0.18.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.17.9...v0.18.0) (2020-04-21) 486 | 487 | 488 | ### Chores 489 | 490 | * peer-discovery not using peer-info ([#213](https://github.com/libp2p/js-libp2p-webrtc-star/issues/213)) ([ab4aafe](https://github.com/libp2p/js-libp2p-webrtc-star/commit/ab4aafe)) 491 | 492 | 493 | ### BREAKING CHANGES 494 | 495 | * peer event emits with id and multiaddrs properties instead of peer-info 496 | 497 | 498 | 499 | 500 | ## [0.17.9](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.17.8...v0.17.9) (2020-04-02) 501 | 502 | 503 | ### Bug Fixes 504 | 505 | * check for mdns hostname ips ([#212](https://github.com/libp2p/js-libp2p-webrtc-star/issues/212)) ([ce77e37](https://github.com/libp2p/js-libp2p-webrtc-star/commit/ce77e37)) 506 | 507 | 508 | ### Features 509 | 510 | * support dash case parameters ([#211](https://github.com/libp2p/js-libp2p-webrtc-star/issues/211)) ([08282dd](https://github.com/libp2p/js-libp2p-webrtc-star/commit/08282dd)) 511 | 512 | 513 | 514 | 515 | ## [0.17.8](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.17.7...v0.17.8) (2020-03-16) 516 | 517 | 518 | ### Features 519 | 520 | * create dockerfile for docker hub integration ([#209](https://github.com/libp2p/js-libp2p-webrtc-star/issues/209)) ([ac1eb8a](https://github.com/libp2p/js-libp2p-webrtc-star/commit/ac1eb8a)) 521 | 522 | 523 | 524 | 525 | ## [0.17.7](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.17.6...v0.17.7) (2020-02-13) 526 | 527 | 528 | ### Bug Fixes 529 | 530 | * remove use of assert module ([#202](https://github.com/libp2p/js-libp2p-webrtc-star/issues/202)) ([7563f1f](https://github.com/libp2p/js-libp2p-webrtc-star/commit/7563f1f)) 531 | 532 | 533 | 534 | 535 | ## [0.17.6](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.17.1...v0.17.6) (2020-02-03) 536 | 537 | 538 | ### Bug Fixes 539 | 540 | * dont transform listening addrs ([#195](https://github.com/libp2p/js-libp2p-webrtc-star/issues/195)) ([0e1406b](https://github.com/libp2p/js-libp2p-webrtc-star/commit/0e1406b)), closes [#194](https://github.com/libp2p/js-libp2p-webrtc-star/issues/194) 541 | * ensure dial is rejected with an Error ([#199](https://github.com/libp2p/js-libp2p-webrtc-star/issues/199)) ([41f278e](https://github.com/libp2p/js-libp2p-webrtc-star/commit/41f278e)) 542 | * ensure remoteAddr is always set on inbound conns ([#193](https://github.com/libp2p/js-libp2p-webrtc-star/issues/193)) ([01e5453](https://github.com/libp2p/js-libp2p-webrtc-star/commit/01e5453)) 543 | * signaling vs listening addrs ([#198](https://github.com/libp2p/js-libp2p-webrtc-star/issues/198)) ([91f6a63](https://github.com/libp2p/js-libp2p-webrtc-star/commit/91f6a63)) 544 | * use menoetius to handle metrics ([#197](https://github.com/libp2p/js-libp2p-webrtc-star/issues/197)) ([14086b9](https://github.com/libp2p/js-libp2p-webrtc-star/commit/14086b9)) 545 | * use p2p codec name ([#196](https://github.com/libp2p/js-libp2p-webrtc-star/issues/196)) ([638d3da](https://github.com/libp2p/js-libp2p-webrtc-star/commit/638d3da)) 546 | 547 | 548 | ### Features 549 | 550 | * improve listening address usage ([#194](https://github.com/libp2p/js-libp2p-webrtc-star/issues/194)) ([e45760a](https://github.com/libp2p/js-libp2p-webrtc-star/commit/e45760a)) 551 | 552 | 553 | 554 | 555 | ## [0.17.5](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.17.4...v0.17.5) (2020-01-31) 556 | 557 | 558 | ### Bug Fixes 559 | 560 | * signaling vs listening addrs ([#198](https://github.com/libp2p/js-libp2p-webrtc-star/issues/198)) ([91f6a63](https://github.com/libp2p/js-libp2p-webrtc-star/commit/91f6a63)) 561 | * use menoetius to handle metrics ([#197](https://github.com/libp2p/js-libp2p-webrtc-star/issues/197)) ([14086b9](https://github.com/libp2p/js-libp2p-webrtc-star/commit/14086b9)) 562 | * use p2p codec name ([#196](https://github.com/libp2p/js-libp2p-webrtc-star/issues/196)) ([638d3da](https://github.com/libp2p/js-libp2p-webrtc-star/commit/638d3da)) 563 | 564 | 565 | 566 | 567 | ## [0.17.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.17.3...v0.17.4) (2020-01-31) 568 | 569 | 570 | ### Bug Fixes 571 | 572 | * dont transform listening addrs ([#195](https://github.com/libp2p/js-libp2p-webrtc-star/issues/195)) ([0e1406b](https://github.com/libp2p/js-libp2p-webrtc-star/commit/0e1406b)), closes [#194](https://github.com/libp2p/js-libp2p-webrtc-star/issues/194) 573 | 574 | 575 | 576 | 577 | ## [0.17.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.17.2...v0.17.3) (2020-01-23) 578 | 579 | 580 | ### Features 581 | 582 | * improve listening address usage ([#194](https://github.com/libp2p/js-libp2p-webrtc-star/issues/194)) ([e45760a](https://github.com/libp2p/js-libp2p-webrtc-star/commit/e45760a)) 583 | 584 | 585 | 586 | 587 | ## [0.17.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.17.1...v0.17.2) (2020-01-21) 588 | 589 | 590 | ### Bug Fixes 591 | 592 | * ensure remoteAddr is always set on inbound conns ([#193](https://github.com/libp2p/js-libp2p-webrtc-star/issues/193)) ([01e5453](https://github.com/libp2p/js-libp2p-webrtc-star/commit/01e5453)) 593 | 594 | 595 | 596 | 597 | ## [0.17.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.17.0...v0.17.1) (2020-01-01) 598 | 599 | 600 | ### Bug Fixes 601 | 602 | * transport should not handle connection if upgradeInbound throws ([#191](https://github.com/libp2p/js-libp2p-webrtc-star/issues/191)) ([865a2a7](https://github.com/libp2p/js-libp2p-webrtc-star/commit/865a2a7)) 603 | 604 | 605 | 606 | 607 | # [0.17.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.16.1...v0.17.0) (2019-10-02) 608 | 609 | 610 | ### Code Refactoring 611 | 612 | * switch to async iterators ([#183](https://github.com/libp2p/js-libp2p-webrtc-star/issues/183)) ([db5c97e](https://github.com/libp2p/js-libp2p-webrtc-star/commit/db5c97e)) 613 | 614 | 615 | ### BREAKING CHANGES 616 | 617 | * Switch to using async/await and async iterators. The transport and connection interfaces have changed. 618 | 619 | 620 | 621 | 622 | ## [0.16.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.16.0...v0.16.1) (2019-05-12) 623 | 624 | 625 | ### Features 626 | 627 | * start/stop discovery events when start/stop called ([#176](https://github.com/libp2p/js-libp2p-webrtc-star/issues/176)) ([f4dc087](https://github.com/libp2p/js-libp2p-webrtc-star/commit/f4dc087)) 628 | 629 | 630 | 631 | 632 | # [0.16.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.15.8...v0.16.0) (2019-05-08) 633 | 634 | 635 | ### Bug Fixes 636 | 637 | * update hapi ([#173](https://github.com/libp2p/js-libp2p-webrtc-star/issues/173)) ([f7dc83a](https://github.com/libp2p/js-libp2p-webrtc-star/commit/f7dc83a)) 638 | 639 | 640 | ### BREAKING CHANGES 641 | 642 | * signaling server api with async await instead of callbacks 643 | 644 | 645 | 646 | 647 | ## [0.15.8](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.15.7...v0.15.8) (2019-01-10) 648 | 649 | 650 | ### Bug Fixes 651 | 652 | * reduce bundle size ([#165](https://github.com/libp2p/js-libp2p-webrtc-star/issues/165)) ([cb96de8](https://github.com/libp2p/js-libp2p-webrtc-star/commit/cb96de8)) 653 | 654 | 655 | 656 | 657 | ## [0.15.7](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.15.6...v0.15.7) (2019-01-04) 658 | 659 | 660 | ### Features 661 | 662 | * only send new peers, not the whole peer list ([e12089b](https://github.com/libp2p/js-libp2p-webrtc-star/commit/e12089b)) 663 | 664 | 665 | 666 | 667 | ## [0.15.6](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.15.3...v0.15.6) (2018-11-26) 668 | 669 | 670 | ### Bug Fixes 671 | 672 | * catch RTCPeerConnection failed connections ([b65d509](https://github.com/libp2p/js-libp2p-webrtc-star/commit/b65d509)) 673 | 674 | 675 | 676 | 677 | ## [0.15.5](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.15.4...v0.15.5) (2018-09-17) 678 | 679 | 680 | ### Bug Fixes 681 | 682 | * catch RTCPeerConnection failed connections ([b65d509](https://github.com/libp2p/js-libp2p-webrtc-star/commit/b65d509)) 683 | 684 | 685 | 686 | 687 | ## [0.15.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.15.3...v0.15.4) (2018-08-27) 688 | 689 | 690 | 691 | 692 | ## [0.15.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.15.2...v0.15.3) (2018-06-19) 693 | 694 | 695 | ### Features 696 | 697 | * add tag ([03983f2](https://github.com/libp2p/js-libp2p-webrtc-star/commit/03983f2)) 698 | 699 | 700 | 701 | 702 | ## [0.15.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.15.0...v0.15.1) (2018-06-01) 703 | 704 | 705 | 706 | 707 | # [0.15.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.14.0...v0.15.0) (2018-05-12) 708 | 709 | 710 | 711 | 712 | # [0.14.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.13.4...v0.14.0) (2018-04-06) 713 | 714 | 715 | ### Features 716 | 717 | * add class-is module ([27f5865](https://github.com/libp2p/js-libp2p-webrtc-star/commit/27f5865)) 718 | 719 | 720 | 721 | 722 | ## [0.13.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.13.3...v0.13.4) (2018-02-20) 723 | 724 | 725 | 726 | 727 | ## [0.13.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.13.2...v0.13.3) (2017-11-30) 728 | 729 | 730 | ### Bug Fixes 731 | 732 | * /dns4 multiaddr explicit tcp/port support ([#130](https://github.com/libp2p/js-libp2p-webrtc-star/issues/130)) ([dce5ff8](https://github.com/libp2p/js-libp2p-webrtc-star/commit/dce5ff8)) 733 | 734 | 735 | ### Features 736 | 737 | * Add metrics and about page ([#127](https://github.com/libp2p/js-libp2p-webrtc-star/issues/127)) ([171dc9b](https://github.com/libp2p/js-libp2p-webrtc-star/commit/171dc9b)) 738 | * skip circuit addresses ([#121](https://github.com/libp2p/js-libp2p-webrtc-star/issues/121)) ([43f752b](https://github.com/libp2p/js-libp2p-webrtc-star/commit/43f752b)) 739 | 740 | 741 | 742 | 743 | ## [0.13.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.13.1...v0.13.2) (2017-09-08) 744 | 745 | 746 | ### Bug Fixes 747 | 748 | * stricter type checking to prevent crashes ([#120](https://github.com/libp2p/js-libp2p-webrtc-star/issues/120)) ([599bdeb](https://github.com/libp2p/js-libp2p-webrtc-star/commit/599bdeb)) 749 | 750 | 751 | 752 | 753 | ## [0.13.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.13.0...v0.13.1) (2017-09-04) 754 | 755 | 756 | ### Bug Fixes 757 | 758 | * now properly handles legacy libp2p-webrtc-multiaddrs ([#119](https://github.com/libp2p/js-libp2p-webrtc-star/issues/119)) ([06ba5d2](https://github.com/libp2p/js-libp2p-webrtc-star/commit/06ba5d2)) 759 | 760 | 761 | 762 | 763 | # [0.13.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.12.0...v0.13.0) (2017-09-03) 764 | 765 | 766 | ### Features 767 | 768 | * p2p addrs situation ([#118](https://github.com/libp2p/js-libp2p-webrtc-star/issues/118)) ([9ee3a51](https://github.com/libp2p/js-libp2p-webrtc-star/commit/9ee3a51)) 769 | 770 | 771 | 772 | 773 | # [0.12.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.11.0...v0.12.0) (2017-07-22) 774 | 775 | 776 | 777 | 778 | # [0.11.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.10.1...v0.11.0) (2017-06-28) 779 | 780 | 781 | ### Features 782 | 783 | * removed wrtc by default, added option for DI, added tests with electron-webrtc as well ([33dbaf4](https://github.com/libp2p/js-libp2p-webrtc-star/commit/33dbaf4)) 784 | 785 | 786 | 787 | 788 | ## [0.10.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.10.0...v0.10.1) (2017-05-19) 789 | 790 | 791 | ### Bug Fixes 792 | 793 | * use webworker friendly version of webrtcsupport ([0892a92](https://github.com/libp2p/js-libp2p-webrtc-star/commit/0892a92)) 794 | 795 | 796 | 797 | 798 | # [0.10.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.9.0...v0.10.0) (2017-05-19) 799 | 800 | 801 | ### Bug Fixes 802 | 803 | * **package:** update simple-peer to version 8.0.0 ([9138acf](https://github.com/libp2p/js-libp2p-webrtc-star/commit/9138acf)) 804 | * handle reconnection to signaling server ([939aa8d](https://github.com/libp2p/js-libp2p-webrtc-star/commit/939aa8d)) 805 | 806 | 807 | 808 | 809 | # [0.9.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.8.10...v0.9.0) (2017-03-30) 810 | 811 | 812 | ### Features 813 | 814 | * update peer-info calls ([19f5930](https://github.com/libp2p/js-libp2p-webrtc-star/commit/19f5930)) 815 | 816 | 817 | 818 | 819 | ## [0.8.10](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.8.8...v0.8.10) (2017-03-21) 820 | 821 | 822 | 823 | 824 | ## [0.8.8](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.8.7...v0.8.8) (2017-02-12) 825 | 826 | 827 | ### Bug Fixes 828 | 829 | * make webrtcsupport a dep instead of a devDep ([815572d](https://github.com/libp2p/js-libp2p-webrtc-star/commit/815572d)) 830 | 831 | 832 | 833 | 834 | ## [0.8.7](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.8.6...v0.8.7) (2017-02-11) 835 | 836 | 837 | ### Bug Fixes 838 | 839 | * error if webrtc is not supported ([7217ebf](https://github.com/libp2p/js-libp2p-webrtc-star/commit/7217ebf)) 840 | 841 | 842 | 843 | 844 | ## [0.8.6](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.8.5...v0.8.6) (2017-02-10) 845 | 846 | 847 | ### Bug Fixes 848 | 849 | * use async.setImmediate because browserify does not shim automatilly it ([4790fe3](https://github.com/libp2p/js-libp2p-webrtc-star/commit/4790fe3)) 850 | 851 | 852 | 853 | 854 | ## [0.8.5](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.8.4...v0.8.5) (2017-02-09) 855 | 856 | 857 | 858 | 859 | ## [0.8.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.8.3...v0.8.4) (2017-02-09) 860 | 861 | 862 | 863 | 864 | ## [0.8.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.8.1...v0.8.3) (2017-01-28) 865 | 866 | 867 | ### Features 868 | 869 | * new peer-discovery interface compatible ([011ada5](https://github.com/libp2p/js-libp2p-webrtc-star/commit/011ada5)) 870 | 871 | 872 | 873 | 874 | ## [0.8.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.8.0...v0.8.1) (2017-01-23) 875 | 876 | 877 | ### Bug Fixes 878 | 879 | * README typo ([7e1f7b8](https://github.com/libp2p/js-libp2p-webrtc-star/commit/7e1f7b8)) 880 | 881 | 882 | 883 | 884 | # [0.8.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.7.5...v0.8.0) (2017-01-22) 885 | 886 | 887 | ### Bug Fixes 888 | 889 | * update Procfile ([81fff7e](https://github.com/libp2p/js-libp2p-webrtc-star/commit/81fff7e)) 890 | 891 | 892 | ### Features 893 | 894 | * it works with DNS \o/ ([d47197b](https://github.com/libp2p/js-libp2p-webrtc-star/commit/d47197b)) 895 | 896 | 897 | 898 | 899 | ## [0.7.5](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.7.4...v0.7.5) (2017-01-20) 900 | 901 | 902 | 903 | 904 | ## [0.7.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.7.3...v0.7.4) (2017-01-18) 905 | 906 | 907 | ### Bug Fixes 908 | 909 | * s/listeners/listenersRefs because swarm overloads that key ([82d9bab](https://github.com/libp2p/js-libp2p-webrtc-star/commit/82d9bab)) 910 | 911 | 912 | 913 | 914 | ## [0.7.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.7.2...v0.7.3) (2017-01-18) 915 | 916 | 917 | ### Bug Fixes 918 | 919 | * **tests:** detect correctly support ([2818dd2](https://github.com/libp2p/js-libp2p-webrtc-star/commit/2818dd2)) 920 | * segfaults, aegir does not like for us to constrain socket.io events ([529653f](https://github.com/libp2p/js-libp2p-webrtc-star/commit/529653f)) 921 | 922 | 923 | 924 | 925 | ## [0.7.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.7.1...v0.7.2) (2017-01-16) 926 | 927 | 928 | 929 | 930 | ## [0.7.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.7.0...v0.7.1) (2017-01-16) 931 | 932 | 933 | 934 | 935 | # [0.7.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.6.1...v0.7.0) (2016-12-06) 936 | 937 | 938 | 939 | 940 | ## [0.6.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.6.0...v0.6.1) (2016-12-06) 941 | 942 | 943 | 944 | 945 | # [0.6.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.5.0...v0.6.0) (2016-11-17) 946 | 947 | 948 | ### Bug Fixes 949 | 950 | * use false not null to disable wrtc in the browser ([3097589](https://github.com/libp2p/js-libp2p-webrtc-star/commit/3097589)) 951 | 952 | 953 | ### Features 954 | 955 | * webrtc in browser and nodejs complete ([942d501](https://github.com/libp2p/js-libp2p-webrtc-star/commit/942d501)) 956 | * WebRTC in Nodejs wooooot! ([71018bf](https://github.com/libp2p/js-libp2p-webrtc-star/commit/71018bf)) 957 | 958 | 959 | 960 | 961 | # [0.5.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.4.5...v0.5.0) (2016-11-03) 962 | 963 | 964 | 965 | 966 | ## [0.4.5](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.4.4...v0.4.5) (2016-10-12) 967 | 968 | 969 | 970 | 971 | ## [0.4.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.4.3...v0.4.4) (2016-09-07) 972 | 973 | 974 | ### Bug Fixes 975 | 976 | * **webrtc-star:** use destroy instead of emit for closing a conn ([90c93f0](https://github.com/libp2p/js-libp2p-webrtc-star/commit/90c93f0)) 977 | 978 | 979 | 980 | 981 | ## [0.4.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.4.1...v0.4.3) (2016-09-07) 982 | 983 | 984 | ### Bug Fixes 985 | 986 | * **listener:** close events are propagated naturally ([590c67f](https://github.com/libp2p/js-libp2p-webrtc-star/commit/590c67f)) 987 | 988 | 989 | 990 | 991 | ## [0.4.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.4.0...v0.4.1) (2016-09-06) 992 | 993 | 994 | ### Features 995 | 996 | * **readme:** update pull-streams section ([c629a83](https://github.com/libp2p/js-libp2p-webrtc-star/commit/c629a83)) 997 | 998 | 999 | 1000 | 1001 | # [0.4.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.3.2...v0.4.0) (2016-09-05) 1002 | 1003 | 1004 | ### Bug Fixes 1005 | 1006 | * **deps:** downgrade aegir to v6 ([bd3e52e](https://github.com/libp2p/js-libp2p-webrtc-star/commit/bd3e52e)) 1007 | 1008 | 1009 | ### Features 1010 | 1011 | * **pull-api:** update the tests accordingly ([0aa7761](https://github.com/libp2p/js-libp2p-webrtc-star/commit/0aa7761)) 1012 | * **pull-api:** update to pull-api and the next interface-transport ([67aff97](https://github.com/libp2p/js-libp2p-webrtc-star/commit/67aff97)) 1013 | * **readme:** complete the readme and add note about pull-streams ([b0821d3](https://github.com/libp2p/js-libp2p-webrtc-star/commit/b0821d3)) 1014 | 1015 | 1016 | 1017 | 1018 | ## [0.3.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.3.1...v0.3.2) (2016-08-03) 1019 | 1020 | 1021 | 1022 | 1023 | ## [0.3.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.3.0...v0.3.1) (2016-06-22) 1024 | 1025 | 1026 | 1027 | 1028 | # [0.3.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.2.3...v0.3.0) (2016-06-22) 1029 | 1030 | 1031 | 1032 | 1033 | ## [0.2.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.2.2...v0.2.3) (2016-06-01) 1034 | 1035 | 1036 | ### Bug Fixes 1037 | 1038 | * ensure emits are possible ([7631212](https://github.com/libp2p/js-libp2p-webrtc-star/commit/7631212)) 1039 | 1040 | 1041 | 1042 | 1043 | ## [0.2.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.2.1...v0.2.2) (2016-05-30) 1044 | 1045 | 1046 | 1047 | 1048 | ## [0.2.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.2.0...v0.2.1) (2016-05-28) 1049 | 1050 | 1051 | 1052 | 1053 | # [0.2.0](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.1.4...v0.2.0) (2016-05-27) 1054 | 1055 | 1056 | 1057 | 1058 | ## [0.1.4](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.1.3...v0.1.4) (2016-05-23) 1059 | 1060 | 1061 | 1062 | 1063 | ## [0.1.3](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.1.2...v0.1.3) (2016-05-22) 1064 | 1065 | 1066 | 1067 | 1068 | ## [0.1.2](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.1.1...v0.1.2) (2016-05-22) 1069 | 1070 | 1071 | 1072 | 1073 | ## [0.1.1](https://github.com/libp2p/js-libp2p-webrtc-star/compare/v0.1.0...v0.1.1) (2016-05-22) 1074 | 1075 | 1076 | 1077 | 1078 | # 0.1.0 (2016-05-22) 1079 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/DEPLOYMENT.md: -------------------------------------------------------------------------------- 1 | # Deployment 2 | 3 | libp2p-webrtc-star is integrated with the [libp2p Docker Hub](https://hub.docker.com/u/libp2p) organization. Docker containers are built for passing CI to the `master` branch and to `tags`. The libp2p infra team leverages these containers to deploy and host webrtc-star services for users to test with. These servers should **not be relied on for Production applications**. If you wish to leverage webrtc-star servers for your application, we recommend running your own as we currently do not guarantee uptime of these servers. 4 | 5 | ## SSL & Localhost Development 6 | 7 | Since working with localhost is a bit tricky at the time of writing, we recommend using proxy servers for the deployment. Here's a turnkey build for a signalling server which supports SSL. 8 | 9 | 1. `touch docker-compose.yml`, paste in the compose file below, and run `DOMAIN= docker-compose up`. 10 | 2. Visit yourdomain.com. Voila! 11 | 12 | ``` 13 | version: "3.3" 14 | services: 15 | 16 | js-libp2p-webrtc-star: 17 | image: libp2p/js-libp2p-webrtc-star 18 | environment: 19 | - VIRTUAL_HOST=${DOMAIN} 20 | - LETSENCRYPT_HOST=${DOMAIN} 21 | - VIRTUAL_PORT=9090 22 | networks: 23 | service_network: 24 | 25 | nginx-proxy: 26 | image: jwilder/nginx-proxy 27 | ports: 28 | - 443:443 29 | - 80:80 30 | container_name: nginx-proxy 31 | networks: 32 | service_network: 33 | volumes: 34 | - /var/run/docker.sock:/tmp/docker.sock:ro 35 | - nginx-certs:/etc/nginx/certs 36 | - nginx-vhost:/etc/nginx/vhost.d 37 | - nginx-html:/usr/share/nginx/html 38 | depends_on: 39 | - js-libp2p-webrtc-star 40 | 41 | nginx-proxy-letsencrypt: 42 | image: jrcs/letsencrypt-nginx-proxy-companion 43 | environment: 44 | NGINX_PROXY_CONTAINER: "nginx-proxy" 45 | networks: 46 | service_network: 47 | volumes: 48 | - /var/run/docker.sock:/var/run/docker.sock:ro 49 | - nginx-certs:/etc/nginx/certs 50 | - nginx-vhost:/etc/nginx/vhost.d 51 | - nginx-html:/usr/share/nginx/html 52 | 53 | networks: 54 | service_network: 55 | 56 | volumes: 57 | nginx-certs: 58 | nginx-vhost: 59 | nginx-html: 60 | ``` 61 | 62 | Kudos to @jjperezaguinaga for the initial proxy-wrap. 63 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/LICENSE: -------------------------------------------------------------------------------- 1 | This project is dual licensed under MIT and Apache-2.0. 2 | 3 | MIT: https://www.opensource.org/licenses/mit 4 | Apache-2.0: https://www.apache.org/licenses/license-2.0 5 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/LICENSE-APACHE: -------------------------------------------------------------------------------- 1 | Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at 2 | 3 | http://www.apache.org/licenses/LICENSE-2.0 4 | 5 | Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 6 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/LICENSE-MIT: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/README.md: -------------------------------------------------------------------------------- 1 | # @libp2p/webrtc-star 2 | 3 | [![libp2p.io](https://img.shields.io/badge/project-libp2p-yellow.svg?style=flat-square)](http://libp2p.io/) 4 | [![Discuss](https://img.shields.io/discourse/https/discuss.libp2p.io/posts.svg?style=flat-square)](https://discuss.libp2p.io) 5 | [![codecov](https://img.shields.io/codecov/c/github/libp2p/js-libp2p-webrtc-star.svg?style=flat-square)](https://codecov.io/gh/libp2p/js-libp2p-webrtc-star) 6 | [![CI](https://img.shields.io/github/actions/workflow/status/libp2p/js-libp2p-webrtc-star/js-test-and-release.yml?branch=master\&style=flat-square)](https://github.com/libp2p/js-libp2p-webrtc-star/actions/workflows/js-test-and-release.yml?query=branch%3Amaster) 7 | 8 | > libp2p WebRTC transport that includes a discovery mechanism provided by the signalling-star 9 | 10 | ## Table of contents 11 | 12 | - [Install](#install) 13 | - [Browser ` 38 | ``` 39 | 40 | [![](https://raw.githubusercontent.com/libp2p/interface-transport/master/img/badge.png)](https://github.com/libp2p/js-libp2p-interfaces/blob/master/packages/libp2p-interfaces/src/transport/README.md) 41 | [![](https://raw.githubusercontent.com/libp2p/interface-connection/master/img/badge.png)](https://github.com/libp2p/js-libp2p-interfaces/blob/master/packages/libp2p-interfaces/src/connection/README.md) 42 | [![](https://raw.githubusercontent.com/libp2p/interface-peer-discovery/master/img/badge.png)](https://github.com/libp2p/js-libp2p-interfaces/blob/master/packages/libp2p-interfaces/src/peer-discovery/README.md) 43 | 44 | ## Description 45 | 46 | `libp2p-webrtc-star` is one of the WebRTC transports available for libp2p. 47 | 48 | ## Usage 49 | 50 | ### Using this module in Node.js (read: not in the browser) 51 | 52 | To use this module in Node.js, you have to BYOI of WebRTC, there are multiple options out there, unfortunately, none of them are 100% solid. The ones we recommend are: [wrtc](http://npmjs.org/wrtc) and [electron-webrtc](https://www.npmjs.com/package/electron-webrtc). 53 | 54 | Instead of just creating the WebRTCStar instance without arguments, you need to pass an options object with the WebRTC implementation: 55 | 56 | ```JavaScript 57 | import { createLibp2pNode } from 'libp2p' 58 | import { webRTCStar } from '@libp2p/webrtc-star' 59 | import wrtc from 'wrtc' 60 | import electronWebRTC from 'electron-webrtc' 61 | 62 | // Using wrtc in node 63 | const star = webRTCStar({ wrtc }) 64 | 65 | // Using electron-webrtc in electron 66 | const star = webRTCStar({ wrtc: electronWebRTC() }) 67 | 68 | const node = await createLibp2pNode({ 69 | addresses: { 70 | listen: [ 71 | '/ip4/188.166.203.82/tcp/20000/wss/p2p-webrtc-star' 72 | ] 73 | }, 74 | transports: [ 75 | star.transport 76 | ], 77 | peerDiscovery: [ 78 | star.discovery 79 | ] 80 | }) 81 | await node.start() 82 | 83 | await node.dial('/ip4/188.166.203.82/tcp/20000/wss/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo2a') 84 | ``` 85 | 86 | ### Using this module in the Browser 87 | 88 | ```JavaScript 89 | import { createLibp2pNode } from 'libp2p' 90 | import { webRTCStar } from '@libp2p/webrtc-star' 91 | 92 | const star = webRTCStar() 93 | 94 | const node = await createLibp2pNode({ 95 | addresses: { 96 | listen: [ 97 | '/ip4/188.166.203.82/tcp/20000/wss/p2p-webrtc-star' 98 | ] 99 | }, 100 | transports: [ 101 | star.transport 102 | ], 103 | peerDiscovery: [ 104 | star.discovery 105 | ] 106 | }) 107 | await node.start() 108 | 109 | await node.dial('/ip4/188.166.203.82/tcp/20000/wss/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo2a') 110 | ``` 111 | 112 | ## Signalling server 113 | 114 | This module has an accompanying signalling server which is used to discover other peers running the libp2p-webrtc-star transport. 115 | 116 | Please see the [libp2p-webrtc-star-signalling-server](https://npmjs.com/package/libp2p-webrtc-star-signalling-server) module for more information. 117 | 118 | ## API 119 | 120 | ### Transport 121 | 122 | [![](https://raw.githubusercontent.com/libp2p/interface-transport/master/img/badge.png)](https://github.com/libp2p/js-libp2p-interfaces/blob/master/packages/libp2p-interfaces/src/transport/README.md) 123 | 124 | ### Connection 125 | 126 | [![](https://raw.githubusercontent.com/libp2p/interface-connection/master/img/badge.png)](https://github.com/libp2p/js-libp2p-interfaces/blob/master/packages/libp2p-interfaces/src/connection/README.md) 127 | 128 | ### Peer Discovery - `ws.discovery` 129 | 130 | [![](https://raw.githubusercontent.com/libp2p/interface-peer-discovery/master/img/badge.png)](https://github.com/libp2p/js-libp2p-interfaces/blob/master/packages/libp2p-interfaces/src/peer-discovery/README.md) 131 | 132 | ## License 133 | 134 | Licensed under either of 135 | 136 | - Apache 2.0, ([LICENSE-APACHE](LICENSE-APACHE) / ) 137 | - MIT ([LICENSE-MIT](LICENSE-MIT) / ) 138 | 139 | ## Contribution 140 | 141 | Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. 142 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@libp2p/webrtc-star", 3 | "version": "7.0.0", 4 | "description": "libp2p WebRTC transport that includes a discovery mechanism provided by the signalling-star", 5 | "license": "Apache-2.0 OR MIT", 6 | "homepage": "https://github.com/libp2p/js-libp2p-webrtc-star/tree/master/packages/webrtc-star-transport#readme", 7 | "repository": { 8 | "type": "git", 9 | "url": "git+https://github.com/libp2p/js-libp2p-webrtc-star.git" 10 | }, 11 | "bugs": { 12 | "url": "https://github.com/libp2p/js-libp2p-webrtc-star/issues" 13 | }, 14 | "keywords": [ 15 | "IPFS", 16 | "libp2p" 17 | ], 18 | "engines": { 19 | "node": ">=16.0.0", 20 | "npm": ">=7.0.0" 21 | }, 22 | "type": "module", 23 | "types": "./dist/src/index.d.ts", 24 | "files": [ 25 | "src", 26 | "dist", 27 | "!dist/test", 28 | "!**/*.tsbuildinfo" 29 | ], 30 | "exports": { 31 | ".": { 32 | "types": "./dist/src/index.d.ts", 33 | "import": "./dist/src/index.js" 34 | } 35 | }, 36 | "eslintConfig": { 37 | "extends": "ipfs", 38 | "parserOptions": { 39 | "sourceType": "module" 40 | } 41 | }, 42 | "release": { 43 | "branches": [ 44 | "master" 45 | ], 46 | "plugins": [ 47 | [ 48 | "@semantic-release/commit-analyzer", 49 | { 50 | "preset": "conventionalcommits", 51 | "releaseRules": [ 52 | { 53 | "breaking": true, 54 | "release": "major" 55 | }, 56 | { 57 | "revert": true, 58 | "release": "patch" 59 | }, 60 | { 61 | "type": "feat", 62 | "release": "minor" 63 | }, 64 | { 65 | "type": "fix", 66 | "release": "patch" 67 | }, 68 | { 69 | "type": "docs", 70 | "release": "patch" 71 | }, 72 | { 73 | "type": "test", 74 | "release": "patch" 75 | }, 76 | { 77 | "type": "deps", 78 | "release": "patch" 79 | }, 80 | { 81 | "scope": "no-release", 82 | "release": false 83 | } 84 | ] 85 | } 86 | ], 87 | [ 88 | "@semantic-release/release-notes-generator", 89 | { 90 | "preset": "conventionalcommits", 91 | "presetConfig": { 92 | "types": [ 93 | { 94 | "type": "feat", 95 | "section": "Features" 96 | }, 97 | { 98 | "type": "fix", 99 | "section": "Bug Fixes" 100 | }, 101 | { 102 | "type": "chore", 103 | "section": "Trivial Changes" 104 | }, 105 | { 106 | "type": "docs", 107 | "section": "Documentation" 108 | }, 109 | { 110 | "type": "deps", 111 | "section": "Dependencies" 112 | }, 113 | { 114 | "type": "test", 115 | "section": "Tests" 116 | } 117 | ] 118 | } 119 | } 120 | ], 121 | "@semantic-release/changelog", 122 | "@semantic-release/npm", 123 | "@semantic-release/github", 124 | "@semantic-release/git" 125 | ] 126 | }, 127 | "scripts": { 128 | "clean": "aegir clean", 129 | "lint": "aegir lint", 130 | "dep-check": "aegir dep-check -i @mapbox/node-pre-gyp", 131 | "build": "aegir build", 132 | "test": "aegir test", 133 | "test:node": "aegir test -t node -f ./dist/test/node.js --cov", 134 | "test:chrome": "aegir test -t browser -f ./dist/test/browser.js --cov", 135 | "test:firefox": "aegir test -t browser -- --browser firefox -f ./dist/test/browser.js", 136 | "test:dns": "WEBRTC_STAR_REMOTE_SIGNAL_DNS=1 aegir test -t browser", 137 | "test:ip": "WEBRTC_STAR_REMOTE_SIGNAL_IP=1 aegir test -t browser", 138 | "release": "aegir release" 139 | }, 140 | "dependencies": { 141 | "@libp2p/interface-connection": "^5.0.1", 142 | "@libp2p/interface-peer-discovery": "^1.0.0", 143 | "@libp2p/interface-peer-id": "^2.0.0", 144 | "@libp2p/interface-transport": "^4.0.0", 145 | "@libp2p/interfaces": "^3.0.2", 146 | "@libp2p/logger": "^2.0.0", 147 | "@libp2p/peer-id": "^2.0.0", 148 | "@libp2p/webrtc-peer": "^2.0.0", 149 | "@libp2p/webrtc-star-protocol": "^4.0.0", 150 | "@multiformats/mafmt": "^12.1.0", 151 | "@multiformats/multiaddr": "^12.1.2", 152 | "abortable-iterator": "^5.0.1", 153 | "delay": "^5.0.0", 154 | "err-code": "^3.0.1", 155 | "iso-random-stream": "^2.0.2", 156 | "p-defer": "^4.0.0", 157 | "socket.io-client": "^4.1.2", 158 | "uint8arrays": "^4.0.2" 159 | }, 160 | "devDependencies": { 161 | "@libp2p/interface-mocks": "^11.0.0", 162 | "@libp2p/interface-peer-discovery-compliance-tests": "^2.0.0", 163 | "@libp2p/interface-registrar": "^2.0.10", 164 | "@libp2p/interface-transport-compliance-tests": "^4.0.0", 165 | "@libp2p/peer-id-factory": "^2.0.0", 166 | "@libp2p/webrtc-star-signalling-server": "^4.0.0", 167 | "@mapbox/node-pre-gyp": "^1.0.5", 168 | "aegir": "^38.1.8", 169 | "electron-webrtc": "~0.3.0", 170 | "it-all": "^3.0.1", 171 | "it-pipe": "^3.0.1", 172 | "it-pushable": "^3.0.0", 173 | "it-stream-types": "^2.0.1", 174 | "p-event": "^5.0.1", 175 | "p-wait-for": "^5.0.0", 176 | "sinon": "^15.0.1", 177 | "uint8arraylist": "^2.3.2", 178 | "wrtc": "^0.4.6" 179 | } 180 | } 181 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/src/constants.ts: -------------------------------------------------------------------------------- 1 | // p2p multi-address code 2 | export const CODE_P2P = 421 3 | export const CODE_CIRCUIT = 290 4 | 5 | // Time to wait for a connection to close gracefully before destroying it manually 6 | export const CLOSE_TIMEOUT = 2000 7 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/src/index.ts: -------------------------------------------------------------------------------- 1 | import type { PeerDiscovery } from '@libp2p/interface-peer-discovery' 2 | import type { Transport } from '@libp2p/interface-transport' 3 | import { WebRTCStar, WebRTCStarComponents, WebRTCStarInit } from './transport.js' 4 | 5 | export interface WebRTCStarTuple { 6 | transport: (components: WebRTCStarComponents) => Transport 7 | discovery: (components?: WebRTCStarComponents) => PeerDiscovery 8 | } 9 | 10 | export function webRTCStar (init: WebRTCStarInit = {}): WebRTCStarTuple { 11 | const transport = new WebRTCStar(init) 12 | 13 | return { 14 | transport: (components: WebRTCStarComponents) => { 15 | transport.peerId = components.peerId 16 | return transport 17 | }, 18 | discovery: transport.discovery 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/src/listener.ts: -------------------------------------------------------------------------------- 1 | import { logger } from '@libp2p/logger' 2 | import errCode from 'err-code' 3 | import { connect, ManagerOptions, SocketOptions } from 'socket.io-client' 4 | import pDefer from 'p-defer' 5 | import { WebRTCReceiver } from '@libp2p/webrtc-peer' 6 | import { toMultiaddrConnection } from './socket-to-conn.js' 7 | import { cleanUrlSIO } from './utils.js' 8 | import { CODE_P2P } from './constants.js' 9 | import type { PeerId } from '@libp2p/interface-peer-id' 10 | import type { Multiaddr } from '@multiformats/multiaddr' 11 | import type { MultiaddrConnection } from '@libp2p/interface-connection' 12 | import type { Upgrader, ConnectionHandler, Listener, ListenerEvents } from '@libp2p/interface-transport' 13 | import type { WebRTCStar, WebRTCStarListenerOptions, SignalServer, SignalServerServerEvents } from './transport.js' 14 | import type { WebRTCReceiverInit } from '@libp2p/webrtc-peer' 15 | import type { WebRTCStarSocket, HandshakeSignal } from '@libp2p/webrtc-star-protocol' 16 | import { EventEmitter, CustomEvent } from '@libp2p/interfaces/events' 17 | 18 | const log = logger('libp2p:webrtc-star:listener') 19 | 20 | const sioOptions: Partial = { 21 | transports: ['websocket'], 22 | path: '/socket.io-next/' // This should be removed when socket.io@2 support is removed 23 | } 24 | 25 | class SigServer extends EventEmitter implements SignalServer { 26 | public signallingAddr: Multiaddr 27 | public socket: WebRTCStarSocket 28 | public connections: MultiaddrConnection[] 29 | public channels: Map 30 | public pendingSignals: Map 31 | 32 | private readonly upgrader: Upgrader 33 | private readonly handler: ConnectionHandler 34 | private readonly channelOptions?: WebRTCReceiverInit 35 | 36 | constructor (signallingUrl: string, signallingAddr: Multiaddr, upgrader: Upgrader, handler: ConnectionHandler, channelOptions?: WebRTCReceiverInit) { 37 | super() 38 | 39 | this.signallingAddr = signallingAddr 40 | this.socket = connect(signallingUrl, sioOptions) 41 | this.connections = [] 42 | this.channels = new Map() 43 | this.pendingSignals = new Map() 44 | 45 | this.upgrader = upgrader 46 | this.handler = handler 47 | this.channelOptions = channelOptions 48 | 49 | this.handleWsHandshake = this.handleWsHandshake.bind(this) 50 | 51 | let previouslyConnected = false 52 | 53 | this.socket.on('connect_error', err => { 54 | // @ts-expect-error `.type` is missing from the types 55 | if (previouslyConnected && err.type === 'TransportError') { 56 | // if we've had an open connection before, and this is a 57 | // transport error, let socket.io's reconnect logic take over 58 | return 59 | } 60 | 61 | this.dispatchEvent(new CustomEvent('error', { 62 | detail: err 63 | })) 64 | }) 65 | this.socket.on('error', (err: Error) => { 66 | this.dispatchEvent(new CustomEvent('error', { 67 | detail: err 68 | })) 69 | }) 70 | this.socket.on('ws-handshake', this.handleWsHandshake) 71 | this.socket.on('ws-peer', (maStr) => { 72 | this.dispatchEvent(new CustomEvent('peer', { 73 | detail: maStr 74 | })) 75 | }) 76 | this.socket.on('connect', () => { 77 | this.socket.emit('ss-join', this.signallingAddr.toString()) 78 | 79 | if (previouslyConnected) { 80 | this.dispatchEvent(new CustomEvent('reconnect')) 81 | } 82 | }) 83 | this.socket.once('connect', () => { 84 | // make sure we can reconnect in future 85 | previouslyConnected = true 86 | this.dispatchEvent(new CustomEvent('listening')) 87 | }) 88 | this.socket.on('disconnect', () => { 89 | this.dispatchEvent(new CustomEvent('disconnect')) 90 | }) 91 | } 92 | 93 | _createChannel (intentId: string, srcMultiaddr: string, dstMultiaddr: string): WebRTCReceiver { 94 | const channelOptions: WebRTCReceiverInit = { 95 | ...this.channelOptions 96 | } 97 | 98 | const channel = new WebRTCReceiver(channelOptions) 99 | 100 | const onError = (evt: CustomEvent): void => { 101 | const err = evt.detail 102 | 103 | log.error('incoming connection errored', err) 104 | } 105 | 106 | channel.addEventListener('error', onError) 107 | channel.addEventListener('close', () => { 108 | channel.removeEventListener('error', onError) 109 | }, { 110 | once: true 111 | }) 112 | 113 | channel.addEventListener('signal', (evt) => { 114 | const signal = evt.detail 115 | 116 | this.socket.emit('ss-handshake', { 117 | intentId, 118 | srcMultiaddr, 119 | dstMultiaddr, 120 | answer: true, 121 | signal 122 | }) 123 | }) 124 | 125 | channel.addEventListener('ready', () => { 126 | const maConn = toMultiaddrConnection(channel, { remoteAddr: this.signallingAddr }) 127 | log('new inbound connection %s', maConn.remoteAddr) 128 | 129 | try { 130 | this.upgrader.upgradeInbound(maConn) 131 | .then(conn => { 132 | log('inbound connection %s upgraded', maConn.remoteAddr) 133 | 134 | this.connections.push(maConn) 135 | 136 | const untrackConn = (): void => { 137 | this.connections = this.connections.filter(c => c !== maConn) 138 | this.channels.delete(intentId) 139 | this.pendingSignals.delete(intentId) 140 | } 141 | 142 | channel.addEventListener('close', untrackConn, { 143 | once: true 144 | }) 145 | 146 | this.dispatchEvent(new CustomEvent('connection', { 147 | detail: conn 148 | })) 149 | this.handler(conn) 150 | }) 151 | .catch(err => { 152 | log.error('inbound connection failed to upgrade', err) 153 | maConn.close().catch(err => { 154 | log.error('inbound connection failed to close after failing to upgrade', err) 155 | }) 156 | }) 157 | } catch (err: any) { 158 | log.error('inbound connection failed to upgrade', err) 159 | maConn.close().catch(err => { 160 | log.error('inbound connection failed to close after failing to upgrade', err) 161 | }) 162 | } 163 | }, { 164 | once: true 165 | }) 166 | 167 | return channel 168 | } 169 | 170 | handleWsHandshake (offer: HandshakeSignal): void { 171 | log('incoming handshake. signal type "%s" is answer %s', offer.signal.type, offer.answer) 172 | 173 | if (offer.answer === true || offer.err != null || offer.intentId == null) { 174 | return 175 | } 176 | 177 | const intentId = offer.intentId 178 | let pendingSignals = this.pendingSignals.get(intentId) 179 | 180 | if (pendingSignals == null) { 181 | pendingSignals = [] 182 | this.pendingSignals.set(intentId, pendingSignals) 183 | } 184 | 185 | pendingSignals.push(offer) 186 | 187 | let channel = this.channels.get(intentId) 188 | 189 | if (channel == null) { 190 | if (offer.signal.type !== 'offer') { 191 | log('handshake is not an offer and channel does not exist, buffering until we receive an offer') 192 | return 193 | } 194 | 195 | log('creating new channel to handle offer handshake') 196 | channel = this._createChannel(offer.intentId, offer.srcMultiaddr, offer.dstMultiaddr) 197 | this.channels.set(intentId, channel) 198 | } else { 199 | log('channel already exists, using it to handle handshake') 200 | } 201 | 202 | while (pendingSignals.length > 0) { 203 | const handshake = pendingSignals.shift() 204 | 205 | if (handshake?.signal != null) { 206 | channel.handleSignal(handshake.signal) 207 | } 208 | } 209 | } 210 | 211 | async close (): Promise { 212 | // Close listener 213 | this.socket.emit('ss-leave', this.signallingAddr.toString()) 214 | this.socket.removeAllListeners() 215 | this.socket.close() 216 | 217 | await Promise.all([ 218 | ...this.connections.map(async maConn => { await maConn.close() }), 219 | ...Array.from(this.channels.values()).map(async channel => { await channel.close() }) 220 | ]) 221 | 222 | this.dispatchEvent(new CustomEvent('close')) 223 | } 224 | } 225 | 226 | class WebRTCListener extends EventEmitter implements Listener { 227 | private listeningAddr?: Multiaddr 228 | private signallingUrl?: string 229 | private readonly upgrader: Upgrader 230 | private readonly handler: ConnectionHandler 231 | private readonly peerId: PeerId 232 | private readonly transport: WebRTCStar 233 | private readonly options: WebRTCStarListenerOptions 234 | 235 | constructor (upgrader: Upgrader, handler: ConnectionHandler, peerId: PeerId, transport: WebRTCStar, options: WebRTCStarListenerOptions) { 236 | super() 237 | 238 | this.upgrader = upgrader 239 | this.handler = handler 240 | this.peerId = peerId 241 | this.transport = transport 242 | this.options = options 243 | } 244 | 245 | async listen (ma: Multiaddr): Promise { 246 | // Should only be used if not already listening 247 | if (this.listeningAddr != null) { 248 | throw errCode(new Error('listener already in use'), 'ERR_ALREADY_LISTENING') 249 | } 250 | 251 | const defer = pDefer() // eslint-disable-line @typescript-eslint/no-invalid-void-type 252 | 253 | // Should be kept unmodified 254 | this.listeningAddr = ma 255 | 256 | let signallingAddr: Multiaddr 257 | if (!ma.protoCodes().includes(CODE_P2P)) { 258 | signallingAddr = ma.encapsulate(`/p2p/${this.peerId.toString()}`) 259 | } else { 260 | signallingAddr = ma 261 | } 262 | 263 | const signallingUrl = this.signallingUrl = cleanUrlSIO(ma) 264 | 265 | log('connecting to signalling server on: %s', this.signallingUrl) 266 | const server: SignalServer = new SigServer(this.signallingUrl, signallingAddr, this.upgrader, this.handler, this.options.channelOptions) 267 | server.addEventListener('error', (evt) => { 268 | const err = evt.detail 269 | 270 | log('error connecting to signalling server %o', err) 271 | server.close().catch(err => { 272 | log.error('error closing server after error', err) 273 | }) 274 | defer.reject(err) 275 | }) 276 | server.addEventListener('listening', () => { 277 | log('connected to signalling server') 278 | this.dispatchEvent(new CustomEvent('listening')) 279 | defer.resolve() 280 | }) 281 | server.addEventListener('peer', (evt) => { 282 | this.transport.peerDiscovered(evt.detail) 283 | }) 284 | server.addEventListener('connection', (evt) => { 285 | const conn = evt.detail 286 | 287 | if (conn.remoteAddr == null) { 288 | try { 289 | conn.remoteAddr = ma.decapsulateCode(CODE_P2P).encapsulate(`/p2p/${conn.remotePeer.toString()}`) 290 | } catch (err) { 291 | log.error('could not determine remote address', err) 292 | } 293 | } 294 | 295 | this.dispatchEvent(new CustomEvent('connection', { 296 | detail: conn 297 | })) 298 | }) 299 | server.addEventListener('disconnect', () => { 300 | // Ensure we error if we try to dial while we are disconnected from 301 | // the signalling server 302 | this.transport.sigServers.delete(signallingUrl) 303 | }) 304 | server.addEventListener('reconnect', () => { 305 | // We can dial via the signalling server again 306 | this.transport.sigServers.set(signallingUrl, server) 307 | }) 308 | 309 | // Store listen and signal reference addresses 310 | this.transport.sigServers.set(this.signallingUrl, server) 311 | 312 | await defer.promise 313 | } 314 | 315 | async close (): Promise { 316 | if (this.signallingUrl != null) { 317 | const server = this.transport.sigServers.get(this.signallingUrl) 318 | 319 | if (server != null) { 320 | await server.close() 321 | this.transport.sigServers.delete(this.signallingUrl) 322 | } 323 | } 324 | 325 | this.dispatchEvent(new CustomEvent('close')) 326 | 327 | // Reset state 328 | this.listeningAddr = undefined 329 | } 330 | 331 | getAddrs (): Multiaddr[] { 332 | if (this.listeningAddr != null) { 333 | return [ 334 | this.listeningAddr 335 | ] 336 | } 337 | 338 | return [] 339 | } 340 | } 341 | 342 | export function createListener (upgrader: Upgrader, handler: ConnectionHandler, peerId: PeerId, transport: WebRTCStar, options: WebRTCStarListenerOptions): Listener { 343 | return new WebRTCListener(upgrader, handler, peerId, transport, options) 344 | } 345 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/src/socket-to-conn.ts: -------------------------------------------------------------------------------- 1 | import { abortableSource } from 'abortable-iterator' 2 | import { CLOSE_TIMEOUT } from './constants.js' 3 | import { logger } from '@libp2p/logger' 4 | import type { MultiaddrConnection } from '@libp2p/interface-connection' 5 | import type { WebRTCPeer } from '@libp2p/webrtc-peer' 6 | import type { AbortOptions } from '@libp2p/interfaces' 7 | import type { Multiaddr } from '@multiformats/multiaddr' 8 | 9 | const log = logger('libp2p:webrtc-star:socket') 10 | 11 | export interface ToMultiaddrConnectionOptions extends AbortOptions { 12 | remoteAddr: Multiaddr 13 | } 14 | 15 | /** 16 | * Convert a socket into a MultiaddrConnection 17 | * https://github.com/libp2p/js-libp2p-interfaces/tree/master/src/transport#multiaddrconnection 18 | */ 19 | export function toMultiaddrConnection (socket: WebRTCPeer, options: ToMultiaddrConnectionOptions): MultiaddrConnection { 20 | const { sink, source } = socket 21 | 22 | const maConn: MultiaddrConnection = { 23 | remoteAddr: options.remoteAddr, 24 | 25 | async sink (source) { 26 | if (options.signal != null) { 27 | source = abortableSource(source, options.signal) 28 | } 29 | 30 | try { 31 | await sink(source) 32 | } catch (err: any) { 33 | // If aborted we can safely ignore 34 | if (err.type !== 'aborted') { 35 | // If the source errored the socket will already have been destroyed by 36 | // toIterable.duplex(). If the socket errored it will already be 37 | // destroyed. There's nothing to do here except log the error & return. 38 | log.error(err) 39 | } 40 | } 41 | }, 42 | 43 | source: (options.signal != null) ? abortableSource(source, options.signal) : source, 44 | 45 | timeline: { open: Date.now() }, 46 | 47 | async close () { 48 | if (socket.closed) { 49 | return 50 | } 51 | 52 | const start = Date.now() 53 | 54 | // Attempt to end the socket. If it takes longer to close than the 55 | // timeout, destroy it manually. 56 | const timeout = setTimeout(() => { 57 | if (maConn.remoteAddr != null) { 58 | const { host, port } = maConn.remoteAddr.toOptions() 59 | log('timeout closing socket to %s:%s after %dms, destroying it manually', 60 | host, port, Date.now() - start) 61 | } 62 | 63 | if (!socket.closed) { 64 | socket.close().catch(err => { 65 | log.error('could not close socket', err) 66 | }) 67 | } 68 | }, CLOSE_TIMEOUT) 69 | 70 | try { 71 | await socket.close() 72 | } finally { 73 | clearTimeout(timeout) 74 | } 75 | } 76 | } 77 | 78 | socket.addEventListener('close', () => { 79 | // In instances where `close` was not explicitly called, 80 | // such as an iterable stream ending, ensure we have set the close 81 | // timeline 82 | if (maConn.timeline.close == null) { 83 | maConn.timeline.close = Date.now() 84 | } 85 | }, { 86 | once: true 87 | }) 88 | 89 | return maConn 90 | } 91 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/src/transport.ts: -------------------------------------------------------------------------------- 1 | import { logger } from '@libp2p/logger' 2 | import errcode from 'err-code' 3 | import { AbortError } from 'abortable-iterator' 4 | import type { Multiaddr } from '@multiformats/multiaddr' 5 | import { multiaddr } from '@multiformats/multiaddr' 6 | import * as mafmt from '@multiformats/mafmt' 7 | import { CODE_CIRCUIT } from './constants.js' 8 | import { createListener } from './listener.js' 9 | import { toMultiaddrConnection } from './socket-to-conn.js' 10 | import { cleanMultiaddr, cleanUrlSIO } from './utils.js' 11 | import { WebRTCInitiator } from '@libp2p/webrtc-peer' 12 | import randomBytes from 'iso-random-stream/src/random.js' 13 | import { toString as uint8ArrayToString } from 'uint8arrays' 14 | import { EventEmitter, CustomEvent } from '@libp2p/interfaces/events' 15 | import type { Startable } from '@libp2p/interfaces/startable' 16 | import { peerIdFromString } from '@libp2p/peer-id' 17 | import { symbol } from '@libp2p/interface-transport' 18 | import type { WRTC, WebRTCInitiatorInit, WebRTCReceiver, WebRTCReceiverInit } from '@libp2p/webrtc-peer' 19 | import type { Connection, MultiaddrConnection } from '@libp2p/interface-connection' 20 | import type { Transport, Listener, DialOptions, CreateListenerOptions } from '@libp2p/interface-transport' 21 | import type { PeerDiscovery, PeerDiscoveryEvents } from '@libp2p/interface-peer-discovery' 22 | import type { WebRTCStarSocket, HandshakeSignal } from '@libp2p/webrtc-star-protocol' 23 | import { symbol as peerDiscoverySymbol } from '@libp2p/interface-peer-discovery' 24 | import type { PeerId } from '@libp2p/interface-peer-id' 25 | 26 | const webrtcSupport = 'RTCPeerConnection' in globalThis 27 | const log = logger('libp2p:webrtc-star') 28 | 29 | const noop = (): void => {} 30 | 31 | export class WebRTCStarDiscovery extends EventEmitter implements PeerDiscovery, Startable { 32 | private started = false 33 | 34 | get [peerDiscoverySymbol] (): true { 35 | return true 36 | } 37 | 38 | get [Symbol.toStringTag] (): string { 39 | return '@libp2p/webrtc-star-discovery' 40 | } 41 | 42 | isStarted (): boolean { 43 | return this.started 44 | } 45 | 46 | async start (): Promise { 47 | this.started = true 48 | } 49 | 50 | async stop (): Promise { 51 | this.started = false 52 | } 53 | 54 | dispatchEvent (event: CustomEvent): boolean { 55 | if (!this.isStarted()) { 56 | return false 57 | } 58 | 59 | return super.dispatchEvent(event) 60 | } 61 | } 62 | 63 | export interface WebRTCStarInit { 64 | wrtc?: WRTC 65 | } 66 | 67 | export interface WebRTCStarDialOptions extends DialOptions { 68 | channelOptions?: WebRTCInitiatorInit 69 | } 70 | 71 | export interface WebRTCStarListenerOptions extends CreateListenerOptions, WebRTCInitiatorInit { 72 | channelOptions?: WebRTCReceiverInit 73 | } 74 | 75 | export interface SignalServerServerEvents { 76 | 'error': CustomEvent 77 | 'listening': CustomEvent 78 | 'peer': CustomEvent 79 | 'connection': CustomEvent 80 | 'disconnect': CustomEvent 81 | 'reconnect': CustomEvent 82 | } 83 | 84 | export interface SignalServer extends EventEmitter { 85 | signallingAddr: Multiaddr 86 | socket: WebRTCStarSocket 87 | connections: MultiaddrConnection[] 88 | channels: Map 89 | pendingSignals: Map 90 | close: () => Promise 91 | } 92 | 93 | export interface WebRTCStarComponents { 94 | peerId: PeerId 95 | } 96 | 97 | /** 98 | * @class WebRTCStar 99 | */ 100 | export class WebRTCStar implements Transport { 101 | public wrtc?: WRTC 102 | public discovery: () => PeerDiscovery & Startable 103 | public sigServers: Map 104 | private readonly _discovery: WebRTCStarDiscovery 105 | public peerId?: PeerId 106 | 107 | constructor (init?: WebRTCStarInit) { 108 | if (init?.wrtc != null) { 109 | this.wrtc = init.wrtc 110 | } 111 | 112 | // Keep Signalling references 113 | this.sigServers = new Map() 114 | 115 | // Discovery 116 | this._discovery = new WebRTCStarDiscovery() 117 | this.discovery = () => this._discovery 118 | this.peerDiscovered = this.peerDiscovered.bind(this) 119 | } 120 | 121 | get [symbol] (): true { 122 | return true 123 | } 124 | 125 | get [Symbol.toStringTag] (): string { 126 | return '@libp2p/webrtc-star' 127 | } 128 | 129 | async dial (ma: Multiaddr, options: WebRTCStarDialOptions): Promise { 130 | const rawConn = await this._connect(ma, options) 131 | const maConn = toMultiaddrConnection(rawConn, { remoteAddr: ma, signal: options.signal }) 132 | log('new outbound connection %s', maConn.remoteAddr) 133 | const conn = await options.upgrader.upgradeOutbound(maConn) 134 | log('outbound connection %s upgraded', maConn.remoteAddr) 135 | return conn 136 | } 137 | 138 | async _connect (ma: Multiaddr, options: WebRTCStarDialOptions): Promise { 139 | if (options.signal?.aborted === true) { 140 | throw new AbortError() 141 | } 142 | 143 | const channelOptions = { 144 | ...(options.channelOptions ?? {}) 145 | } 146 | 147 | // Use custom WebRTC implementation 148 | if (this.wrtc != null) { 149 | channelOptions.wrtc = this.wrtc 150 | } 151 | 152 | const cOpts = ma.toOptions() 153 | const intentId = uint8ArrayToString(randomBytes(36), 'hex') 154 | 155 | return await new Promise((resolve, reject) => { 156 | const sio = this.sigServers.get(cleanUrlSIO(ma)) 157 | 158 | if (sio?.socket == null) { 159 | reject(errcode(new Error('unknown signal server to use'), 'ERR_UNKNOWN_SIGNAL_SERVER')); return 160 | } 161 | 162 | let connected: boolean = false 163 | 164 | log('dialing %s:%s', cOpts.host, cOpts.port) 165 | const channel = new WebRTCInitiator(channelOptions) 166 | 167 | const onError = (evt: CustomEvent): void => { 168 | const err = evt.detail 169 | 170 | if (!connected) { 171 | const msg = `connection error ${cOpts.host}:${cOpts.port}: ${err.message}` 172 | log.error(msg) 173 | done(err) 174 | } 175 | } 176 | 177 | const onReady = (): void => { 178 | connected = true 179 | 180 | log('connection opened %s:%s', cOpts.host, cOpts.port) 181 | done() 182 | } 183 | 184 | const onAbort = (): void => { 185 | log.error('connection aborted %s:%s', cOpts.host, cOpts.port) 186 | channel.close().finally(() => { 187 | done(new AbortError()) 188 | }) 189 | } 190 | 191 | const done = (err?: Error): void => { 192 | channel.removeEventListener('ready', onReady) 193 | options.signal?.removeEventListener('abort', onAbort) 194 | 195 | if (err == null) { 196 | resolve(channel) 197 | } else { 198 | reject(err) 199 | } 200 | } 201 | 202 | channel.addEventListener('ready', onReady, { 203 | once: true 204 | }) 205 | channel.addEventListener('close', () => { 206 | channel.removeEventListener('error', onError) 207 | }) 208 | options.signal?.addEventListener('abort', onAbort) 209 | 210 | channel.addEventListener('signal', (evt) => { 211 | const signal = evt.detail 212 | 213 | sio.socket.emit('ss-handshake', { 214 | intentId, 215 | srcMultiaddr: sio.signallingAddr.toString(), 216 | dstMultiaddr: ma.toString(), 217 | signal 218 | }) 219 | }) 220 | 221 | sio.socket.on('ws-handshake', (offer) => { 222 | if (offer.intentId === intentId && offer.err != null) { 223 | channel.close().finally(() => { 224 | reject(errcode(new Error(offer.err), 'ERR_SIGNALLING_FAILED')) 225 | }) 226 | } 227 | 228 | if (offer.intentId !== intentId || offer.answer == null || channel.closed) { 229 | return 230 | } 231 | 232 | channel.handleSignal(offer.signal) 233 | }) 234 | }) 235 | } 236 | 237 | /** 238 | * Creates a WebrtcStar listener. The provided `handler` function will be called 239 | * anytime a new incoming Connection has been successfully upgraded via 240 | * `upgrader.upgradeInbound`. 241 | */ 242 | createListener (options: WebRTCStarListenerOptions): Listener { 243 | if (!webrtcSupport && this.wrtc == null) { 244 | throw errcode(new Error('no WebRTC support'), 'ERR_NO_WEBRTC_SUPPORT') 245 | } 246 | 247 | options.channelOptions = options.channelOptions ?? {} 248 | 249 | if (this.wrtc != null) { 250 | options.channelOptions.wrtc = this.wrtc 251 | } 252 | 253 | if (this.peerId == null) { 254 | throw errcode(new Error('PeerId not set'), 'ERR_MISSING_PEER_ID') 255 | } 256 | 257 | return createListener(options.upgrader, options.handler ?? noop, this.peerId, this, options) 258 | } 259 | 260 | /** 261 | * Takes a list of `Multiaddr`s and returns only valid TCP addresses 262 | */ 263 | filter (multiaddrs: Multiaddr[]): Multiaddr[] { 264 | multiaddrs = Array.isArray(multiaddrs) ? multiaddrs : [multiaddrs] 265 | 266 | return multiaddrs.filter((ma) => { 267 | if (ma.protoCodes().includes(CODE_CIRCUIT)) { 268 | return false 269 | } 270 | 271 | return mafmt.P2PWebRTCStar.matches(ma) 272 | }) 273 | } 274 | 275 | peerDiscovered (maStr: string): void { 276 | log('peer discovered: %s', maStr) 277 | maStr = cleanMultiaddr(maStr) 278 | 279 | const ma = multiaddr(maStr) 280 | const peerIdStr = ma.getPeerId() 281 | 282 | if (peerIdStr == null) { 283 | return 284 | } 285 | 286 | const peerId = peerIdFromString(peerIdStr) 287 | 288 | this._discovery.dispatchEvent(new CustomEvent('peer', { 289 | detail: { 290 | id: peerId, 291 | multiaddrs: [ma], 292 | protocols: [] 293 | } 294 | })) 295 | } 296 | } 297 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/src/utils.ts: -------------------------------------------------------------------------------- 1 | import { multiaddr, isName } from '@multiformats/multiaddr' 2 | import type { Multiaddr } from '@multiformats/multiaddr' 3 | 4 | export function cleanUrlSIO (ma: Multiaddr): string { 5 | const maStrSplit = ma.toString().split('/') 6 | const tcpProto = ma.protos()[1].name 7 | const wsProto = ma.protos()[2].name 8 | const tcpPort = ma.stringTuples()[1][1] 9 | 10 | if (tcpProto !== 'tcp' || (wsProto !== 'ws' && wsProto !== 'wss')) { 11 | throw new Error(`invalid multiaddr: ${ma.toString()}`) 12 | } 13 | 14 | if (!isName(ma)) { 15 | return `http://${maStrSplit[2]}:${maStrSplit[4]}` 16 | } 17 | 18 | if (wsProto === 'ws') { 19 | return `http://${maStrSplit[2]}${tcpPort == null || tcpPort === '80' ? '' : `:${tcpPort}`}` 20 | } 21 | 22 | if (wsProto === 'wss') { 23 | return `https://${maStrSplit[2]}${tcpPort == null || tcpPort === '443' ? '' : `:${tcpPort}`}` 24 | } 25 | 26 | throw new Error('invalid multiaddr: ' + ma.toString()) 27 | } 28 | 29 | export function cleanMultiaddr (maStr: string): string { 30 | const legacy = '/libp2p-webrtc-star' 31 | 32 | if (maStr.startsWith(legacy)) { 33 | maStr = maStr.substring(legacy.length, maStr.length) 34 | let ma = multiaddr(maStr) 35 | const tuppleIPFS = ma.stringTuples().filter((tupple) => { 36 | return tupple[0] === 421 // ipfs code 37 | })[0] 38 | 39 | if (tuppleIPFS[1] == null) { 40 | throw new Error('invalid multiaddr: ' + maStr) 41 | } 42 | 43 | ma = ma.decapsulate('p2p') 44 | ma = ma.encapsulate('/p2p-webrtc-star') 45 | ma = ma.encapsulate(`/p2p/${tuppleIPFS[1]}`) 46 | maStr = ma.toString() 47 | } 48 | 49 | return maStr 50 | } 51 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/browser.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | import { webRTCStar } from '../src/index.js' 4 | import { createEd25519PeerId } from '@libp2p/peer-id-factory' 5 | import dialTests from './transport/dial.js' 6 | import listenTests from './transport/listen.js' 7 | import discoveryTests from './transport/discovery.js' 8 | import filterTests from './transport/filter.js' 9 | import { mockRegistrar, mockUpgrader } from '@libp2p/interface-mocks' 10 | import type { PeerTransport } from './index.js' 11 | import type { WebRTCStar, WebRTCStarDiscovery } from '../src/transport.js' 12 | import { EventEmitter } from '@libp2p/interfaces/events' 13 | 14 | describe('browser RTC', () => { 15 | const create = async (): Promise => { 16 | const peerId = await createEd25519PeerId() 17 | const wrtcStar = webRTCStar() 18 | const transport = wrtcStar.transport({ peerId }) as WebRTCStar 19 | const discovery = wrtcStar.discovery() as WebRTCStarDiscovery 20 | 21 | const registrar = mockRegistrar() 22 | const upgrader = mockUpgrader({ 23 | registrar, 24 | events: new EventEmitter() 25 | }) 26 | 27 | const peerTransport: PeerTransport = { 28 | peerId, 29 | transport, 30 | discovery, 31 | registrar, 32 | upgrader 33 | } 34 | 35 | return peerTransport 36 | } 37 | 38 | dialTests(create) 39 | listenTests(create) 40 | discoveryTests(create) 41 | filterTests(create) 42 | }) 43 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/compliance.spec.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | // @ts-expect-error no types 4 | import wrtc from 'wrtc' 5 | import sinon from 'sinon' 6 | import { multiaddr } from '@multiformats/multiaddr' 7 | import testsTransport from '@libp2p/interface-transport-compliance-tests' 8 | import testsDiscovery from '@libp2p/interface-peer-discovery-compliance-tests' 9 | import { webRTCStar } from '../src/index.js' 10 | import pWaitFor from 'p-wait-for' 11 | import { peerIdFromString } from '@libp2p/peer-id' 12 | import type { WebRTCStar } from '../src/transport.js' 13 | 14 | describe('interface-transport compliance', function () { 15 | testsTransport({ 16 | async setup () { 17 | const peerId = peerIdFromString('QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo2a') 18 | const ws = webRTCStar({ wrtc }).transport({ peerId }) 19 | 20 | const base = (id: string): string => { 21 | return `/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/p2p/${id}` 22 | } 23 | 24 | const addrs = [ 25 | multiaddr(base('QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo2a')), 26 | multiaddr(base('QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo2b')), 27 | multiaddr(base('QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo2c')) 28 | ] 29 | 30 | // Used by the dial tests to simulate a delayed connect 31 | const connector = { 32 | delay () {}, 33 | restore () { 34 | sinon.restore() 35 | } 36 | } 37 | 38 | return { transport: ws, addrs, connector } 39 | }, 40 | async teardown () {} 41 | }) 42 | }) 43 | 44 | describe('interface-discovery compliance', () => { 45 | let intervalId: ReturnType 46 | let running: boolean = false 47 | 48 | testsDiscovery({ 49 | async setup () { 50 | const peerId = peerIdFromString('QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo2d') 51 | const ws = webRTCStar({ wrtc }).transport({ peerId }) as WebRTCStar 52 | const maStr = '/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo2d' 53 | 54 | const discovery = ws.discovery() 55 | running = true 56 | 57 | // only discover peers while the test is running and after discovery has been started 58 | void pWaitFor(() => !running || discovery.isStarted()) 59 | .then(() => { 60 | if (!running) { 61 | return 62 | } 63 | 64 | intervalId = setInterval(() => { 65 | if (discovery.isStarted()) { 66 | ws.peerDiscovered(maStr) 67 | } 68 | }, 1000) 69 | 70 | if (intervalId.unref != null) { 71 | intervalId.unref() 72 | } 73 | }) 74 | 75 | return discovery 76 | }, 77 | async teardown () { 78 | running = false 79 | clearInterval(intervalId) 80 | } 81 | }) 82 | }) 83 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/index.ts: -------------------------------------------------------------------------------- 1 | import type { Registrar } from '@libp2p/interface-registrar' 2 | import type { PeerId } from '@libp2p/interface-peer-id' 3 | import type { Upgrader } from '@libp2p/interface-transport' 4 | import type { WebRTCStar, WebRTCStarDiscovery } from '../src/transport.js' 5 | 6 | export interface PeerTransport { 7 | peerId: PeerId 8 | transport: WebRTCStar 9 | discovery: WebRTCStarDiscovery 10 | upgrader: Upgrader 11 | registrar: Registrar 12 | } 13 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/node.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | // @ts-expect-error no types 4 | import wrtc from 'wrtc' 5 | // @ts-expect-error no types 6 | import electronWebRTC from 'electron-webrtc' 7 | import { createEd25519PeerId } from '@libp2p/peer-id-factory' 8 | import { webRTCStar } from '../src/index.js' 9 | import dialTests from './transport/dial.js' 10 | import listenTests from './transport/listen.js' 11 | import discoveryTests from './transport/discovery.js' 12 | import filterTests from './transport/filter.js' 13 | import multipleSignalServersTests from './transport/multiple-signal-servers.js' 14 | import trackTests from './transport/track.js' 15 | import reconnectTests from './transport/reconnect.node.js' 16 | import type { PeerTransport } from './index.js' 17 | import { mockRegistrar, mockUpgrader } from '@libp2p/interface-mocks' 18 | import type { WebRTCStar, WebRTCStarDiscovery } from '../src/transport.js' 19 | import { EventEmitter } from '@libp2p/interfaces/events' 20 | 21 | // TODO: Temporary fix per wrtc issue 22 | // https://github.com/node-webrtc/node-webrtc/issues/636#issuecomment-774171409 23 | process.on('beforeExit', (code) => process.exit(code)) 24 | 25 | describe('transport: with wrtc', () => { 26 | const create = async (): Promise => { 27 | const peerId = await createEd25519PeerId() 28 | const wrtcStar = webRTCStar({ wrtc }) 29 | const transport = wrtcStar.transport({ peerId }) as WebRTCStar 30 | const discovery = wrtcStar.discovery() as WebRTCStarDiscovery 31 | 32 | const registrar = mockRegistrar() 33 | const upgrader = mockUpgrader({ 34 | registrar, 35 | events: new EventEmitter() 36 | }) 37 | 38 | const peerTransport: PeerTransport = { 39 | peerId, 40 | transport, 41 | discovery, 42 | registrar, 43 | upgrader 44 | } 45 | 46 | return peerTransport 47 | } 48 | 49 | dialTests(create) 50 | listenTests(create) 51 | multipleSignalServersTests(create) 52 | trackTests(create) 53 | discoveryTests(create) 54 | filterTests(create) 55 | reconnectTests(create) 56 | }) 57 | 58 | // TODO: Electron-webrtc is currently unreliable on linux 59 | describe.skip('transport: with electron-webrtc', () => { 60 | const create = async (): Promise => { 61 | const peerId = await createEd25519PeerId() 62 | const wrtcStar = webRTCStar({ wrtc: electronWebRTC() }) 63 | const transport = wrtcStar.transport({ peerId }) as WebRTCStar 64 | const discovery = wrtcStar.discovery() as WebRTCStarDiscovery 65 | 66 | const registrar = mockRegistrar() 67 | const upgrader = mockUpgrader({ 68 | registrar, 69 | events: new EventEmitter() 70 | }) 71 | 72 | const peerTransport: PeerTransport = { 73 | peerId, 74 | transport, 75 | discovery, 76 | registrar, 77 | upgrader 78 | } 79 | 80 | return peerTransport 81 | } 82 | 83 | dialTests(create) 84 | listenTests(create) 85 | multipleSignalServersTests(create) 86 | trackTests(create) 87 | discoveryTests(create) 88 | filterTests(create) 89 | reconnectTests(create) 90 | }) 91 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/transport/dial.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | import { expect } from 'aegir/chai' 3 | import { multiaddr } from '@multiformats/multiaddr' 4 | import type { Multiaddr } from '@multiformats/multiaddr' 5 | import { pipe } from 'it-pipe' 6 | import all from 'it-all' 7 | import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string' 8 | import sinon from 'sinon' 9 | import { WebRTCReceiver } from '@libp2p/webrtc-peer' 10 | import { cleanUrlSIO } from '../../src/utils.js' 11 | import type { WebRTCStar } from '../../src/transport.js' 12 | import type { Listener, Upgrader } from '@libp2p/interface-transport' 13 | import pWaitFor from 'p-wait-for' 14 | import type { HandshakeSignal } from '@libp2p/webrtc-star-protocol' 15 | import { mockRegistrar, mockUpgrader } from '@libp2p/interface-mocks' 16 | import type { PeerTransport } from '../index.js' 17 | import type { Source } from 'it-stream-types' 18 | import type { Uint8ArrayList } from 'uint8arraylist' 19 | import { EventEmitter } from '@libp2p/interfaces/events' 20 | 21 | async function * toBytes (source: Source): AsyncGenerator { 22 | for await (const list of source) { 23 | yield * list 24 | } 25 | } 26 | 27 | export default (create: () => Promise): void => { 28 | describe('dial', () => { 29 | let ws1: WebRTCStar 30 | let ws2: WebRTCStar 31 | let ma1: Multiaddr 32 | let ma2: Multiaddr 33 | let listener1: Listener 34 | let listener2: Listener 35 | let upgrader: Upgrader 36 | 37 | const maHSDNS = multiaddr('/dns/star-signal.cloud.ipfs.team/wss/p2p-webrtc-star') 38 | const maHSIP = multiaddr('/ip4/188.166.203.82/tcp/20000/wss/p2p-webrtc-star') 39 | const maLS = multiaddr('/ip4/127.0.0.1/tcp/15555/wss/p2p-webrtc-star') 40 | 41 | if (process.env.WEBRTC_STAR_REMOTE_SIGNAL_DNS != null) { 42 | // test with deployed signalling server using DNS 43 | console.log('Using DNS:', maHSDNS) // eslint-disable-line no-console 44 | ma1 = maHSDNS 45 | ma2 = maHSDNS 46 | } else if (process.env.WEBRTC_STAR_REMOTE_SIGNAL_IP != null) { 47 | // test with deployed signalling server using IP 48 | console.log('Using IP:', maHSIP) // eslint-disable-line no-console 49 | ma1 = maHSIP 50 | ma2 = maHSIP 51 | } else { 52 | ma1 = maLS 53 | ma2 = maLS 54 | } 55 | 56 | beforeEach(async () => { 57 | const protocol = '/echo/1.0.0' 58 | const registrar = mockRegistrar() 59 | void registrar.handle(protocol, ({ stream }) => { 60 | void pipe( 61 | stream, 62 | stream 63 | ) 64 | }) 65 | upgrader = mockUpgrader({ 66 | registrar, 67 | events: new EventEmitter() 68 | }) 69 | 70 | // first 71 | ;({ transport: ws1 } = await create()) 72 | listener1 = ws1.createListener({ 73 | upgrader, 74 | handler: (conn) => { 75 | expect(conn.remoteAddr).to.exist() 76 | 77 | void conn.newStream([protocol]) 78 | .then((stream) => { 79 | void pipe(stream, stream) 80 | }) 81 | } 82 | }) 83 | 84 | // second 85 | ;({ transport: ws2 } = await create()) 86 | listener2 = ws2.createListener({ 87 | upgrader, 88 | handler: (conn) => { 89 | expect(conn.remoteAddr).to.exist() 90 | 91 | void conn.newStream([protocol]) 92 | .then((stream) => { 93 | void pipe(stream, stream) 94 | }) 95 | } 96 | }) 97 | 98 | await Promise.all([ 99 | listener1.listen(ma1), 100 | listener2.listen(ma2) 101 | ]) 102 | }) 103 | 104 | afterEach(async () => { 105 | await Promise.all( 106 | [listener1, listener2].map(async l => { await l.close() }) 107 | ) 108 | }) 109 | 110 | it('dial on IPv4, check promise', async function () { 111 | // Use one of the signal addresses 112 | const [sigRefs] = ws2.sigServers.values() 113 | 114 | const conn = await ws1.dial(sigRefs.signallingAddr, { upgrader }) 115 | const stream = await conn.newStream(['/echo/1.0.0']) 116 | const data = uint8ArrayFromString('some data') 117 | const values = await pipe( 118 | [data], 119 | stream, 120 | toBytes, 121 | async (source) => await all(source) 122 | ) 123 | 124 | expect(values).to.deep.equal([data]) 125 | }) 126 | 127 | it('dial offline / non-exist()ent node on IPv4, check promise rejected', function () { 128 | const maOffline = multiaddr('/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo2f') 129 | 130 | return expect(ws1.dial(maOffline, { upgrader })).to.eventually.be.rejected().and.have.property('code', 'ERR_SIGNALLING_FAILED') 131 | }) 132 | 133 | it('dial unknown signal server, check promise rejected', function () { 134 | const maOffline = multiaddr('/ip4/127.0.0.1/tcp/15559/ws/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooo2f') 135 | 136 | return expect(ws1.dial(maOffline, { upgrader })).to.eventually.be.rejected().and.have.property('code', 'ERR_UNKNOWN_SIGNAL_SERVER') 137 | }) 138 | 139 | it.skip('dial on IPv6', (done) => { 140 | // TODO IPv6 not supported yet 141 | }) 142 | 143 | it('receive ws-handshake event without intentId, check channel not created', () => { 144 | const server = ws2.sigServers.get(cleanUrlSIO(ma2)) 145 | 146 | if (server == null) { 147 | throw new Error(`No sigserver found for ma ${ma2.toString()}`) 148 | } 149 | 150 | server.socket.emit('ws-handshake', { 151 | // @ts-expect-error invalid field 152 | intentId: null, 153 | srcMultiaddr: ma1.toString(), 154 | dstMultiaddr: ma2.toString(), 155 | // @ts-expect-error invalid field 156 | signal: {} 157 | }) 158 | 159 | expect(server.channels.size).to.equal(0) 160 | }) 161 | 162 | it('receive ws-handshake event but channel already exists, check channel.handleSignal called', async () => { 163 | const server = ws2.sigServers.get(cleanUrlSIO(ma2)) 164 | 165 | if (server == null) { 166 | throw new Error(`No sigserver found for ma ${ma2.toString()}`) 167 | } 168 | 169 | const channel = { handleSignal: sinon.fake(), close: () => {} } 170 | // @ts-expect-error invalid field 171 | server.channels.set('intent-id', channel) 172 | 173 | const listeners = server.socket.listeners('ws-handshake') 174 | expect(listeners.length).to.equal(1) 175 | 176 | const message: HandshakeSignal = { 177 | intentId: 'intent-id', 178 | srcMultiaddr: ma1.toString(), 179 | dstMultiaddr: ma2.toString(), 180 | signal: { 181 | type: 'candidate', 182 | candidate: { 183 | candidate: 'derp' 184 | } 185 | } 186 | } 187 | 188 | listeners[0](message) 189 | 190 | await pWaitFor(() => channel.handleSignal.callCount === 1) 191 | 192 | expect(channel.handleSignal.callCount).to.equal(1) 193 | }) 194 | 195 | it('receive ws-handshake event but signal type is not offer, check message saved to pendingIntents', () => { 196 | const server = ws2.sigServers.get(cleanUrlSIO(ma2)) 197 | 198 | if (server == null) { 199 | throw new Error(`No sigserver found for ma ${ma2.toString()}`) 200 | } 201 | 202 | const message: HandshakeSignal = { 203 | intentId: 'intent-id', 204 | srcMultiaddr: ma1.toString(), 205 | dstMultiaddr: ma2.toString(), 206 | signal: { 207 | type: 'candidate', 208 | candidate: { 209 | candidate: 'derp' 210 | } 211 | } 212 | } 213 | 214 | const listeners = server.socket.listeners('ws-handshake') 215 | expect(listeners.length).to.equal(1) 216 | listeners[0](message) 217 | 218 | expect(server.pendingSignals.get('intent-id')).to.deep.equal([message]) 219 | }) 220 | 221 | it('receive ws-handshake event, the signal type is offer and exists pending intents, check pending intents consumed', () => { 222 | const server = ws2.sigServers.get(cleanUrlSIO(ma2)) 223 | 224 | if (server == null) { 225 | throw new Error(`No sigserver found for ma ${ma2.toString()}`) 226 | } 227 | 228 | const message1: HandshakeSignal = { 229 | intentId: 'intent-id', 230 | srcMultiaddr: ma1.toString(), 231 | dstMultiaddr: ma2.toString(), 232 | signal: { 233 | type: 'candidate', 234 | candidate: { 235 | candidate: 'derp' 236 | } 237 | } 238 | } 239 | 240 | server.pendingSignals.set('intent-id', [message1]) 241 | 242 | const fake = sinon.fake() 243 | const stub = sinon.stub(WebRTCReceiver.prototype, 'handleSignal').callsFake(fake) 244 | const message2: HandshakeSignal = { 245 | intentId: 'intent-id', 246 | srcMultiaddr: ma1.toString(), 247 | dstMultiaddr: ma2.toString(), 248 | signal: { 249 | type: 'offer', 250 | sdp: 'v=hello' 251 | } 252 | } 253 | 254 | const listeners = server.socket.listeners('ws-handshake') 255 | expect(listeners.length).to.equal(1) 256 | listeners[0](message2) 257 | 258 | expect(server.channels.size).to.equal(1) 259 | expect(server.pendingSignals.get('intent-id')).to.have.lengthOf(0) 260 | // create the channel and consume the pending intent 261 | expect(fake.callCount).to.equal(2) 262 | stub.restore() 263 | }) 264 | }) 265 | } 266 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/transport/discovery.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | import { expect } from 'aegir/chai' 4 | import { multiaddr } from '@multiformats/multiaddr' 5 | import type { Multiaddr } from '@multiformats/multiaddr' 6 | import { pEvent } from 'p-event' 7 | import { cleanUrlSIO } from '../../src/utils.js' 8 | import type { WebRTCStar } from '../../src/transport.js' 9 | import type { Listener } from '@libp2p/interface-transport' 10 | import { mockUpgrader } from '@libp2p/interface-mocks' 11 | import type { PeerTransport } from '../index.js' 12 | import { EventEmitter } from '@libp2p/interfaces/events' 13 | 14 | export default (create: () => Promise): void => { 15 | describe('peer discovery', () => { 16 | let ws1: WebRTCStar 17 | let ws2: WebRTCStar 18 | let ws3: WebRTCStar 19 | let ws4: WebRTCStar 20 | let ws1Listener: Listener 21 | const signallerAddr = multiaddr('/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star') 22 | 23 | after(async () => { 24 | if (ws1Listener != null) { 25 | await ws1Listener.close() 26 | } 27 | }) 28 | 29 | it('listen on the first', async () => { 30 | ({ transport: ws1 } = await create()) 31 | ws1Listener = ws1.createListener({ 32 | upgrader: mockUpgrader({ 33 | events: new EventEmitter() 34 | }) 35 | }) 36 | await ws1.discovery().start() 37 | 38 | await ws1Listener.listen(signallerAddr) 39 | }) 40 | 41 | it('listen on the second, discover the first', async () => { 42 | ({ transport: ws2 } = await create()) 43 | const listener = ws2.createListener({ 44 | upgrader: mockUpgrader({ 45 | events: new EventEmitter() 46 | }) 47 | }) 48 | await ws2.discovery().start() 49 | 50 | await listener.listen(signallerAddr) 51 | const { detail: { multiaddrs } } = await pEvent<'peer', { detail: { multiaddrs: Multiaddr[] } }>(ws1.discovery(), 'peer') 52 | 53 | // Check first of the signal addresses 54 | const [sigRefs] = ws2.sigServers.values() 55 | 56 | expect(multiaddrs.map(m => m.toString())).to.include(sigRefs.signallingAddr.toString()) 57 | 58 | await listener.close() 59 | }) 60 | 61 | // this test is mostly validating the non-discovery test mechanism works 62 | it('listen on the third, verify ws-peer is discovered', async () => { 63 | const server = ws1.sigServers.get(cleanUrlSIO(signallerAddr)) 64 | 65 | if (server == null) { 66 | throw new Error(`No sigserver found for ma ${signallerAddr.toString()}`) 67 | } 68 | 69 | let discoveredPeer = false 70 | 71 | ws1.discovery().addEventListener('peer', () => { 72 | discoveredPeer = true 73 | }, { 74 | once: true 75 | }) 76 | 77 | ;({ transport: ws3 } = await create()) 78 | const listener = ws3.createListener({ 79 | upgrader: mockUpgrader({ 80 | events: new EventEmitter() 81 | }) 82 | }) 83 | await ws3.discovery().start() 84 | 85 | await listener.listen(signallerAddr) 86 | await pEvent(server.socket, 'ws-peer') 87 | 88 | expect(discoveredPeer).to.equal(true) 89 | 90 | await listener.close() 91 | }) 92 | 93 | it('listen on the fourth, ws-peer is not discovered', async () => { 94 | const server = ws1.sigServers.get(cleanUrlSIO(signallerAddr)) 95 | 96 | if (server == null) { 97 | throw new Error(`No sigserver found for ma ${signallerAddr.toString()}`) 98 | } 99 | 100 | let discoveredPeer = false 101 | 102 | ws1.discovery().addEventListener('peer', () => { 103 | discoveredPeer = true 104 | }, { 105 | once: true 106 | }) 107 | 108 | void ws1.discovery().stop() 109 | ;({ transport: ws4 } = await create()) 110 | const listener = ws4.createListener({ 111 | upgrader: mockUpgrader({ 112 | events: new EventEmitter() 113 | }) 114 | }) 115 | void ws4.discovery().start() 116 | 117 | await listener.listen(signallerAddr) 118 | await pEvent(server.socket, 'ws-peer') 119 | 120 | expect(discoveredPeer).to.equal(false) 121 | 122 | await listener.close() 123 | }) 124 | }) 125 | } 126 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/transport/filter.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | import { expect } from 'aegir/chai' 4 | import { multiaddr } from '@multiformats/multiaddr' 5 | import type { PeerTransport } from '../index.js' 6 | 7 | export default (create: () => Promise): void => { 8 | describe('filter', () => { 9 | it('filters non valid webrtc-star multiaddrs', async () => { 10 | const peer = await create() 11 | 12 | const maArr = [ 13 | multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1'), 14 | multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-webrtc-star'), 15 | multiaddr('/dnsaddr/libp2p.io/ws/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1'), 16 | multiaddr('/dnsaddr/signal.libp2p.io/ws/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1'), 17 | multiaddr('/dnsaddr/signal.libp2p.io/wss/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1'), 18 | multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo2'), 19 | multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo3'), 20 | multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4'), 21 | multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4'), 22 | multiaddr('/ip4/127.0.0.1/tcp/9090/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4'), 23 | multiaddr('/ip4/127.0.0.1/tcp/9090/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo4' + 24 | '/p2p-circuit/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1') 25 | ] 26 | 27 | const filtered = peer.transport.filter(maArr) 28 | expect(filtered.length).to.equal(8) 29 | }) 30 | 31 | it('filter a single addr for this transport', async () => { 32 | const peer = await create() 33 | const ma = multiaddr('/ip4/127.0.0.1/tcp/9090/ws/p2p-webrtc-star/p2p/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSoooo1') 34 | 35 | const filtered = peer.transport.filter([ma]) 36 | expect(filtered.length).to.equal(1) 37 | }) 38 | }) 39 | } 40 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/transport/instance.spec.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | import { createEd25519PeerId } from '@libp2p/peer-id-factory' 4 | import { expect } from 'aegir/chai' 5 | import { webRTCStar } from '../../src/index.js' 6 | 7 | describe('instantiate the transport', () => { 8 | it('create transport', async () => { 9 | const wstar = webRTCStar().transport({ peerId: await createEd25519PeerId() }) 10 | expect(wstar).to.exist() 11 | }) 12 | 13 | it('create discovery', async () => { 14 | const wstar = webRTCStar().discovery({ peerId: await createEd25519PeerId() }) 15 | expect(wstar).to.exist() 16 | }) 17 | }) 18 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/transport/listen.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | import { expect } from 'aegir/chai' 4 | import { multiaddr } from '@multiformats/multiaddr' 5 | import { pEvent } from 'p-event' 6 | import type { WebRTCStar } from '../../src/transport.js' 7 | import { mockUpgrader } from '@libp2p/interface-mocks' 8 | import type { PeerTransport } from '../index.js' 9 | import { EventEmitter } from '@libp2p/interfaces/events' 10 | 11 | export default (create: () => Promise): void => { 12 | describe('listen', () => { 13 | let ws: WebRTCStar 14 | const ma = multiaddr('/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star') 15 | 16 | before(async () => { 17 | ({ transport: ws } = await create()) 18 | }) 19 | 20 | it('listen, check for promise', async () => { 21 | const listener = ws.createListener({ 22 | upgrader: mockUpgrader({ 23 | events: new EventEmitter() 24 | }) 25 | }) 26 | 27 | await listener.listen(ma) 28 | await listener.close() 29 | }) 30 | 31 | it('listen, check for listening event', async () => { 32 | const listener = ws.createListener({ 33 | upgrader: mockUpgrader({ 34 | events: new EventEmitter() 35 | }) 36 | }) 37 | 38 | void listener.listen(ma) 39 | await pEvent(listener, 'listening') 40 | await listener.close() 41 | }) 42 | 43 | it('listen, check for the close event', async () => { 44 | const listener = ws.createListener({ 45 | upgrader: mockUpgrader({ 46 | events: new EventEmitter() 47 | }) 48 | }) 49 | 50 | await listener.listen(ma) 51 | void listener.close() 52 | await pEvent(listener, 'close') 53 | }) 54 | 55 | it.skip('listen on IPv6 addr', () => { 56 | // TODO IPv6 not supported yet 57 | }) 58 | 59 | it('should throw an error if it cannot listen on the given multiaddr', async () => { 60 | const listener = ws.createListener({ 61 | upgrader: mockUpgrader({ 62 | events: new EventEmitter() 63 | }) 64 | }) 65 | const ma = multiaddr('/ip4/127.0.0.1/tcp/15554/ws/p2p-webrtc-star') 66 | 67 | await expect(listener.listen(ma)) 68 | .to.eventually.be.rejected() 69 | }) 70 | 71 | it('getAddrs', async () => { 72 | const listener = ws.createListener({ 73 | upgrader: mockUpgrader({ 74 | events: new EventEmitter() 75 | }) 76 | }) 77 | const ma = multiaddr('/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star') 78 | 79 | await listener.listen(ma) 80 | 81 | const addrs = listener.getAddrs() 82 | expect(addrs[0]).to.deep.equal(ma) 83 | 84 | await listener.close() 85 | }) 86 | 87 | it('getAddrs with peer id', async () => { 88 | const listener = ws.createListener({ 89 | upgrader: mockUpgrader({ 90 | events: new EventEmitter() 91 | }) 92 | }) 93 | const ma = multiaddr('/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star/ipfs/QmcgpsyWgH8Y8ajJz1Cu72KnS5uo2Aa2LpzU7kinSooooA') 94 | 95 | await listener.listen(ma) 96 | 97 | const addrs = listener.getAddrs() 98 | expect(addrs[0]).to.deep.equal(ma) 99 | 100 | await listener.close() 101 | }) 102 | 103 | it('can only listen on one address per listener', async () => { 104 | const listener = ws.createListener({ 105 | upgrader: mockUpgrader({ 106 | events: new EventEmitter() 107 | }) 108 | }) 109 | 110 | await listener.listen(ma) 111 | 112 | try { 113 | await listener.listen(ma) 114 | } catch (err) { 115 | expect(err).to.exist() 116 | await listener.close() 117 | return 118 | } 119 | throw new Error('can only listen on one address per listener') 120 | }) 121 | }) 122 | } 123 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/transport/multiple-signal-servers.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | import { expect } from 'aegir/chai' 4 | import { multiaddr } from '@multiformats/multiaddr' 5 | import { pipe } from 'it-pipe' 6 | import type { WebRTCStar } from '../../src/transport.js' 7 | import { mockRegistrar, mockUpgrader } from '@libp2p/interface-mocks' 8 | import type { Upgrader } from '@libp2p/interface-transport' 9 | import type { PeerTransport } from '../index.js' 10 | import { EventEmitter } from '@libp2p/interfaces/events' 11 | 12 | const ma1 = multiaddr('/ip4/127.0.0.1/tcp/15555/ws/p2p-webrtc-star') 13 | const ma2 = multiaddr('/ip4/127.0.0.1/tcp/15556/ws/p2p-webrtc-star') 14 | const protocol = '/echo/1.0.0' 15 | 16 | export default (create: () => Promise): void => { 17 | describe('multiple signal servers', () => { 18 | let ws1: WebRTCStar 19 | let ws2: WebRTCStar 20 | let upgrader: Upgrader 21 | 22 | beforeEach(async () => { 23 | ({ transport: ws1 } = await create()) 24 | ;({ transport: ws2 } = await create()) 25 | 26 | const registrar = mockRegistrar() 27 | void registrar.handle(protocol, ({ stream }) => { 28 | void pipe( 29 | stream, 30 | stream 31 | ) 32 | }) 33 | upgrader = mockUpgrader({ 34 | registrar, 35 | events: new EventEmitter() 36 | }) 37 | }) 38 | 39 | it('can listen on multiple signal servers with the same transport', async () => { 40 | const listener1 = ws1.createListener({ upgrader }) 41 | await listener1.listen(ma1) 42 | 43 | const listener2 = ws1.createListener({ upgrader }) 44 | await listener2.listen(ma2) 45 | 46 | expect(Array.from(ws1.sigServers.keys())).to.have.lengthOf(2) 47 | 48 | await Promise.all([ 49 | listener1.close(), 50 | listener2.close() 51 | ]) 52 | 53 | expect(Array.from(ws1.sigServers.keys())).to.have.lengthOf(0) 54 | }) 55 | 56 | it('can dial the first listener using multiple signal servers in one listener', async function () { 57 | // Listen on two signalling servers in one instance 58 | const listener1m1 = ws1.createListener({ 59 | upgrader, 60 | handler: (conn) => { 61 | void conn.newStream([protocol]) 62 | .then((stream) => { 63 | void pipe(stream, stream) 64 | }) 65 | } 66 | }) 67 | await listener1m1.listen(ma1) 68 | 69 | const listener1m2 = ws1.createListener({ 70 | upgrader, 71 | handler: (conn) => { 72 | void conn.newStream([protocol]) 73 | .then((stream) => { 74 | void pipe(stream, stream) 75 | }) 76 | } 77 | }) 78 | await listener1m2.listen(ma2) 79 | 80 | expect(Array.from(ws1.sigServers.keys())).to.have.lengthOf(2) 81 | 82 | // Create Listener 2 listening on the first signalling server 83 | const listener2 = ws2.createListener({ 84 | upgrader, 85 | handler: (conn) => { 86 | void conn.newStream([protocol]) 87 | .then((stream) => { 88 | void pipe(stream, stream) 89 | }) 90 | } 91 | }) 92 | await listener2.listen(ma1) 93 | 94 | expect(Array.from(ws2.sigServers.keys())).to.have.lengthOf(1) 95 | 96 | // // Use first of the signal addresses 97 | const [sigRefs1] = ws1.sigServers.values() 98 | 99 | await ws2.dial(sigRefs1.signallingAddr, { upgrader }) 100 | 101 | await Promise.all([ 102 | listener1m1.close(), 103 | listener1m2.close(), 104 | listener2.close() 105 | ]) 106 | }) 107 | 108 | it('can dial the last listener using multiple signal servers in one listener', async function () { 109 | // Listen on two signalling servers in one instance 110 | const listener1m1 = ws1.createListener({ 111 | upgrader, 112 | handler: (conn) => { 113 | void conn.newStream([protocol]) 114 | .then((stream) => { 115 | void pipe(stream, stream) 116 | }) 117 | } 118 | }) 119 | await listener1m1.listen(ma1) 120 | 121 | const listener1m2 = ws1.createListener({ 122 | upgrader, 123 | handler: (conn) => { 124 | void conn.newStream([protocol]) 125 | .then((stream) => { 126 | void pipe(stream, stream) 127 | }) 128 | } 129 | }) 130 | await listener1m2.listen(ma2) 131 | 132 | expect(Array.from(ws1.sigServers.keys())).to.have.lengthOf(2) 133 | 134 | // Create Listener 2 listening on the last signalling server 135 | const listener2 = ws2.createListener({ 136 | upgrader, 137 | handler: (conn) => { 138 | void conn.newStream([protocol]) 139 | .then((stream) => { 140 | void pipe(stream, stream) 141 | }) 142 | } 143 | }) 144 | await listener2.listen(ma2) 145 | 146 | expect(Array.from(ws2.sigServers.keys())).to.have.lengthOf(1) 147 | 148 | // // Use last of the signal addresses 149 | const [, sigRefs2] = ws1.sigServers.values() 150 | 151 | await ws2.dial(sigRefs2.signallingAddr, { upgrader }) 152 | 153 | await Promise.all([ 154 | listener1m1.close(), 155 | listener1m2.close(), 156 | listener2.close() 157 | ]) 158 | }) 159 | 160 | it('can close a single listener', async function () { 161 | const listener1m1 = ws1.createListener({ upgrader }) 162 | await listener1m1.listen(ma1) 163 | 164 | const listener1m2 = ws1.createListener({ upgrader }) 165 | await listener1m2.listen(ma2) 166 | 167 | expect(Array.from(ws1.sigServers.keys())).to.have.lengthOf(2) 168 | 169 | await listener1m1.close() 170 | expect(Array.from(ws1.sigServers.keys())).to.have.lengthOf(1) 171 | 172 | // Use the second multiaddr to dial 173 | const listener2 = ws2.createListener({ 174 | upgrader, 175 | handler: (conn) => { 176 | void conn.newStream([protocol]) 177 | .then((stream) => { 178 | void pipe(stream, stream) 179 | }) 180 | } 181 | }) 182 | await listener2.listen(ma2) 183 | 184 | // The first was cleaned up on close 185 | const [sigRefs] = ws1.sigServers.values() 186 | 187 | await ws2.dial(sigRefs.signallingAddr, { upgrader }) 188 | 189 | await Promise.all([ 190 | listener1m2.close(), 191 | listener2.close() 192 | ]) 193 | }) 194 | }) 195 | } 196 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/transport/reconnect.node.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | import { expect } from 'aegir/chai' 4 | import { multiaddr } from '@multiformats/multiaddr' 5 | import type { Multiaddr } from '@multiformats/multiaddr' 6 | import { sigServer } from '@libp2p/webrtc-star-signalling-server' 7 | import type { SigServer } from '@libp2p/webrtc-star-signalling-server' 8 | import type { Listener } from '@libp2p/interface-transport' 9 | import { mockUpgrader } from '@libp2p/interface-mocks' 10 | import { fromString as uint8ArrayFromString } from 'uint8arrays/from-string' 11 | import { pushable } from 'it-pushable' 12 | import pWaitFor from 'p-wait-for' 13 | import type { PeerTransport } from '../index.js' 14 | import pDefer from 'p-defer' 15 | import delay from 'delay' 16 | import type { WebRTCStar } from '../../src/transport.js' 17 | import { pEvent } from 'p-event' 18 | import { EventEmitter } from '@libp2p/interfaces/events' 19 | 20 | const SERVER_PORT = 13580 21 | 22 | export default (create: () => Promise): void => { 23 | describe('reconnect to signaling server', () => { 24 | let sigS: SigServer 25 | let ws1: WebRTCStar 26 | let ws2: WebRTCStar 27 | let ws3: WebRTCStar 28 | let listener1: Listener 29 | let listener2: Listener 30 | let listener3: Listener 31 | const signallerAddr = multiaddr(`/ip4/127.0.0.1/tcp/${SERVER_PORT}/ws/p2p-webrtc-star`) 32 | 33 | before(async () => { 34 | sigS = await sigServer({ port: SERVER_PORT }) 35 | }) 36 | 37 | after(async () => { 38 | if (listener1 != null) { 39 | await listener1.close() 40 | } 41 | 42 | if (listener2 != null) { 43 | await listener2.close() 44 | } 45 | 46 | if (listener3 != null) { 47 | await listener3.close() 48 | } 49 | 50 | await sigS.stop() 51 | }) 52 | 53 | it('listen on the first', async () => { 54 | ({ transport: ws1 } = await create()) 55 | 56 | listener1 = ws1.createListener({ 57 | upgrader: mockUpgrader({ 58 | events: new EventEmitter() 59 | }) 60 | }) 61 | await ws1.discovery().start() 62 | 63 | await listener1.listen(signallerAddr) 64 | }) 65 | 66 | it('listen on the second, discover the first', async () => { 67 | ({ transport: ws2 } = await create()) 68 | 69 | listener2 = ws2.createListener({ 70 | upgrader: mockUpgrader({ 71 | events: new EventEmitter() 72 | }) 73 | }) 74 | 75 | await listener2.listen(signallerAddr) 76 | const { detail: { multiaddrs } } = await pEvent<'peer', { detail: { multiaddrs: Multiaddr[] } }>(ws1.discovery(), 'peer') 77 | 78 | // Check first of the signal addresses 79 | const [sigRefs] = ws2.sigServers.values() 80 | 81 | expect(multiaddrs.map(m => m.toString())).to.include(sigRefs.signallingAddr.toString()) 82 | }) 83 | 84 | it('stops the server', async () => { 85 | await sigS.stop() 86 | }) 87 | 88 | it('starts the server again', async () => { 89 | sigS = await sigServer({ port: SERVER_PORT }) 90 | }) 91 | 92 | it('wait a bit for clients to reconnect', (done) => { 93 | setTimeout(done, 2000) 94 | }) 95 | 96 | it('listen on the third, first discovers it', async () => { 97 | ({ transport: ws3 } = await create()) 98 | 99 | listener3 = ws3.createListener({ 100 | upgrader: mockUpgrader({ 101 | events: new EventEmitter() 102 | }) 103 | }) 104 | await listener3.listen(signallerAddr) 105 | 106 | const { detail: { multiaddrs } } = await pEvent<'peer', { detail: { multiaddrs: Multiaddr[] } }>(ws1.discovery(), 'peer') 107 | 108 | // Check first of the signal addresses 109 | const [sigRefs] = ws3.sigServers.values() 110 | 111 | expect(multiaddrs.some((m) => m.equals(sigRefs.signallingAddr))).to.equal(true) 112 | }) 113 | }) 114 | 115 | describe('can close signaling server without dropping existing connections or streams', () => { 116 | let sigS: SigServer 117 | let listener1: Listener 118 | let listener2: Listener 119 | let listener3: Listener 120 | const signallerAddr = multiaddr(`/ip4/127.0.0.1/tcp/${SERVER_PORT}/ws/p2p-webrtc-star`) 121 | 122 | before(async () => { 123 | sigS = await sigServer({ 124 | port: SERVER_PORT, 125 | refreshPeerListIntervalMS: 100 126 | }) 127 | }) 128 | 129 | after(async () => { 130 | if (listener1 != null) { 131 | await listener1.close() 132 | } 133 | 134 | if (listener2 != null) { 135 | await listener2.close() 136 | } 137 | 138 | if (listener3 != null) { 139 | await listener3.close() 140 | } 141 | 142 | await sigS.stop() 143 | }) 144 | 145 | it('does not drop connections when the signalling server disconnects', async () => { 146 | const peer1 = await create() 147 | const peer2 = await create() 148 | const peer3 = await create() 149 | 150 | // returns a promise that resolves when peer1 has discovered peer2 and peer3 151 | async function discoverPeers (): Promise { 152 | const peer2Discovered = pDefer() 153 | const peer3Discovered = pDefer() 154 | 155 | peer1.transport.discovery().addEventListener('peer', event => { 156 | const discoveredPeer = event.detail.id 157 | 158 | if (discoveredPeer.equals(peer2.peerId)) { 159 | peer2Discovered.resolve() 160 | } 161 | 162 | if (discoveredPeer.equals(peer3.peerId)) { 163 | peer3Discovered.resolve() 164 | } 165 | }) 166 | 167 | await Promise.all([ 168 | peer2Discovered.promise, 169 | peer3Discovered.promise 170 | ]) 171 | } 172 | 173 | const protocol = '/test/protocol/1.0.0' 174 | const received: Uint8Array[] = [] 175 | 176 | listener1 = peer1.transport.createListener({ 177 | upgrader: mockUpgrader({ 178 | events: new EventEmitter() 179 | }) 180 | }) 181 | await peer1.transport.discovery().start() 182 | await listener1.listen(signallerAddr) 183 | 184 | // wait for peer discovery 185 | let discover = discoverPeers() 186 | 187 | // collect messages sent from peer 1 -> peer 2 188 | void peer2.registrar.handle(protocol, ({ stream }) => { 189 | void Promise.resolve().then(async () => { 190 | for await (const data of stream.source) { 191 | received.push(data.subarray()) 192 | } 193 | }) 194 | }) 195 | listener2 = peer2.transport.createListener({ upgrader: peer2.upgrader }) 196 | await listener2.listen(signallerAddr) 197 | 198 | listener3 = peer3.transport.createListener({ upgrader: peer3.upgrader }) 199 | await listener3.listen(signallerAddr) 200 | 201 | // wait for peer discovery 202 | await discover 203 | 204 | // ws1 dial ws2 205 | const connection = await peer1.transport.dial(signallerAddr.encapsulate(`/p2p/${peer2.peerId.toString()}`), { 206 | upgrader: peer1.upgrader 207 | }) 208 | const stream = await connection.newStream(protocol) 209 | 210 | // send messages from peer 1 -> peer 2 211 | const sender = pushable() 212 | void stream.sink(sender) 213 | 214 | expect(received).to.be.empty() 215 | 216 | sender.push(uint8ArrayFromString('message 1')) 217 | 218 | await pWaitFor(() => { 219 | return received.length === 1 220 | }) 221 | 222 | // stop the signalling server 223 | await sigS.stop({ timeout: 1 }) 224 | 225 | // wait for all connections to close 226 | await delay(1000) 227 | 228 | // send another message 229 | sender.push(uint8ArrayFromString('message 2')) 230 | 231 | // should still receive the message 232 | await pWaitFor(() => { 233 | return received.length === 2 234 | }) 235 | 236 | // should not have closed connection or stream 237 | expect(connection.stat.timeline.close).to.not.be.ok() 238 | expect(stream.stat.timeline.close).to.not.be.ok() 239 | 240 | // fail to dial a peer through the signalling server 241 | await expect(peer1.transport.dial(signallerAddr.encapsulate(`/p2p/${peer3.peerId.toString()}`), { 242 | upgrader: peer1.upgrader 243 | })).to.eventually.be.rejected() 244 | 245 | // setup promise that resolves after we rediscover peers 246 | discover = discoverPeers() 247 | 248 | // start the signalling server again 249 | await sigS.start() 250 | 251 | // wait to reconnect to the server 252 | await delay(1000) 253 | 254 | // send a final message 255 | sender.push(uint8ArrayFromString('message 3')) 256 | 257 | await pWaitFor(() => { 258 | return received.length === 3 259 | }) 260 | 261 | // wait for peer rediscovery 262 | await discover 263 | 264 | // can dial again 265 | await expect(peer1.transport.dial(signallerAddr.encapsulate(`/p2p/${peer3.peerId.toString()}`), { 266 | upgrader: peer1.upgrader 267 | })).to.eventually.be.ok() 268 | }) 269 | }) 270 | } 271 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/transport/track.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | /* eslint-disable no-console */ 3 | 4 | import { expect } from 'aegir/chai' 5 | import { multiaddr } from '@multiformats/multiaddr' 6 | import type { Multiaddr } from '@multiformats/multiaddr' 7 | import { pipe } from 'it-pipe' 8 | import pWaitFor from 'p-wait-for' 9 | import { cleanUrlSIO } from '../../src/utils.js' 10 | import type { WebRTCStar } from '../../src/transport.js' 11 | import type { Listener, Upgrader } from '@libp2p/interface-transport' 12 | import { mockRegistrar, mockUpgrader } from '@libp2p/interface-mocks' 13 | import type { PeerTransport } from '../index.js' 14 | import { EventEmitter } from '@libp2p/interfaces/events' 15 | 16 | const protocol = '/echo/1.0.0' 17 | 18 | export default (create: () => Promise): void => { 19 | describe('track connections', () => { 20 | let ws1: WebRTCStar 21 | let ws2: WebRTCStar 22 | let ma: Multiaddr 23 | let listener: Listener 24 | let remoteListener: Listener 25 | let upgrader: Upgrader 26 | 27 | const maHSDNS = multiaddr('/dns/star-signal.cloud.ipfs.team/wss/p2p-webrtc-star') 28 | const maHSIP = multiaddr('/ip4/188.166.203.82/tcp/20000/wss/p2p-webrtc-star') 29 | const maLS = multiaddr('/ip4/127.0.0.1/tcp/15555/wss/p2p-webrtc-star') 30 | 31 | if (process.env.WEBRTC_STAR_REMOTE_SIGNAL_DNS != null) { 32 | // test with deployed signalling server using DNS 33 | console.log('Using DNS:', maHSDNS) 34 | ma = maHSDNS 35 | } else if (process.env.WEBRTC_STAR_REMOTE_SIGNAL_IP != null) { 36 | // test with deployed signalling server using IP 37 | console.log('Using IP:', maHSIP) 38 | ma = maHSIP 39 | } else { 40 | ma = maLS 41 | } 42 | 43 | beforeEach(async () => { 44 | const registrar = mockRegistrar() 45 | void registrar.handle(protocol, ({ stream }) => { 46 | void pipe( 47 | stream, 48 | stream 49 | ) 50 | }) 51 | upgrader = mockUpgrader({ 52 | registrar, 53 | events: new EventEmitter() 54 | }) 55 | 56 | // first 57 | ;({ transport: ws1 } = await create()) 58 | listener = ws1.createListener({ 59 | upgrader, 60 | handler: (conn) => { 61 | void conn.newStream([protocol]) 62 | .then((stream) => { 63 | void pipe(stream, stream) 64 | }) 65 | } 66 | }) 67 | 68 | // second 69 | ;({ transport: ws2 } = await create()) 70 | remoteListener = ws2.createListener({ 71 | upgrader, 72 | handler: (conn) => { 73 | void conn.newStream([protocol]) 74 | .then((stream) => { 75 | void pipe(stream, stream) 76 | }) 77 | } 78 | }) 79 | 80 | await Promise.all([listener.listen(ma), remoteListener.listen(ma)]) 81 | }) 82 | 83 | afterEach(async () => { 84 | await Promise.all([listener, remoteListener].map(async l => { await l.close() })) 85 | }) 86 | 87 | it('should untrack conn after being closed', async function () { 88 | const server = ws1.sigServers.get(cleanUrlSIO(ma)) 89 | 90 | if (server == null) { 91 | throw new Error(`No sigserver found for ma ${ma.toString()}`) 92 | } 93 | 94 | expect(server.connections).to.have.lengthOf(0) 95 | 96 | // Use one of the signal addresses 97 | const [sigRef] = ws2.sigServers.values() 98 | 99 | const conn = await ws1.dial(sigRef.signallingAddr, { upgrader }) 100 | 101 | const remoteServer = ws2.sigServers.get(cleanUrlSIO(ma)) 102 | 103 | if (remoteServer == null) { 104 | throw new Error(`No sigserver found for ma ${ma.toString()}`) 105 | } 106 | 107 | // Wait for the listener to begin tracking, this happens after signaling is complete 108 | await pWaitFor(() => remoteServer.connections.length === 1) 109 | expect(remoteServer.channels.size).to.equal(1) 110 | expect(remoteServer.pendingSignals.size).to.equal(1) 111 | 112 | await conn.close() 113 | 114 | // Wait for tracking to clear 115 | await pWaitFor(() => remoteServer.connections.length === 0) 116 | expect(remoteServer.channels.size).to.equal(0) 117 | expect(remoteServer.pendingSignals.size).to.equal(0) 118 | }) 119 | }) 120 | } 121 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/test/utils.spec.ts: -------------------------------------------------------------------------------- 1 | /* eslint-env mocha */ 2 | 3 | import { expect } from 'aegir/chai' 4 | import { multiaddr } from '@multiformats/multiaddr' 5 | import { cleanMultiaddr, cleanUrlSIO } from '../src/utils.js' 6 | 7 | describe('utils', () => { 8 | const legacyMultiaddrStringDNS = '/libp2p-webrtc-star/dns4/star-signal.cloud.ipfs.team/tcp/443/wss/p2p/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' 9 | const legacyMultiaddrStringIP = '/libp2p-webrtc-star/ip4/127.0.0.1/tcp/1212/wss/p2p/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' 10 | 11 | const modernMultiaddrStringDNS = '/dns4/star-signal.cloud.ipfs.team/tcp/443/wss/p2p-webrtc-star/p2p/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' 12 | const modernMultiaddrStringIP = '/ip4/127.0.0.1/tcp/1212/wss/p2p-webrtc-star/p2p/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' 13 | 14 | const modernMultiaddrStringDNS2 = '/dns4/star-signal.cloud.ipfs.team/tcp/9999/wss/p2p-webrtc-star/p2p/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' 15 | const modernMultiaddrStringDNS3 = '/dns4/star-signal.cloud.ipfs.team/tcp/80/ws/p2p-webrtc-star/p2p/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' 16 | const modernMultiaddrStringDNS4 = '/dns4/star-signal.cloud.ipfs.team/tcp/8080/ws/p2p-webrtc-star/p2p/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' 17 | const modernMultiaddrStringDNS5 = '/dns4/libp2p-webrtc-star-signal.cloud.ipfs.team/tcp/8080/ws/p2p-webrtc-star/p2p/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' 18 | 19 | const invalidMultiaddrStringDNS = '/dns4/star-signal.cloud.ipfs.team/udp/8080/wss/p2p-webrtc-star/p2p/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' 20 | const invalidMultiaddrStringDNS2 = '/dns4/star-signal.cloud.ipfs.team/tcp/8080/p2p-webrtc-star/p2p/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' 21 | const invalidMultiaddrStringDNS3 = '/dns4/star-signal.cloud.ipfs.team/ws/p2p-webrtc-star/p2p/QmWxLfixekyv6GAzvDEtXfXjj7gb1z3G8i5aQNHLhw1zA1' 22 | 23 | // Create actual multiaddrs 24 | const modernMultiaddrDNS = multiaddr(modernMultiaddrStringDNS) 25 | const modernMultiaddrDNS2 = multiaddr(modernMultiaddrStringDNS2) 26 | const modernMultiaddrDNS3 = multiaddr(modernMultiaddrStringDNS3) 27 | const modernMultiaddrDNS4 = multiaddr(modernMultiaddrStringDNS4) 28 | const modernMultiaddrDNS5 = multiaddr(modernMultiaddrStringDNS5) 29 | 30 | const invalidMultiaddrDNS = multiaddr(invalidMultiaddrStringDNS) 31 | const invalidMultiaddrDNS2 = multiaddr(invalidMultiaddrStringDNS2) 32 | const invalidMultiaddrDNS3 = multiaddr(invalidMultiaddrStringDNS3) 33 | 34 | it('cleanUrlSIO webrtc-star modern', () => { 35 | const newUrlSIOStringDNS = cleanUrlSIO(modernMultiaddrDNS) 36 | const newUrlSIOStringDNS2 = cleanUrlSIO(modernMultiaddrDNS2) 37 | const newUrlSIOStringDNS3 = cleanUrlSIO(modernMultiaddrDNS3) 38 | const newUrlSIOStringDNS4 = cleanUrlSIO(modernMultiaddrDNS4) 39 | const newUrlSIOStringDNS5 = cleanUrlSIO(modernMultiaddrDNS5) 40 | 41 | expect(() => cleanUrlSIO(modernMultiaddrDNS)).to.not.throw() 42 | expect(() => cleanUrlSIO(invalidMultiaddrDNS)).to.throw(Error, 'invalid multiaddr') 43 | expect(() => cleanUrlSIO(invalidMultiaddrDNS2)).to.throw(Error, 'invalid multiaddr') 44 | expect(() => cleanUrlSIO(invalidMultiaddrDNS3)).to.throw(Error, 'invalid multiaddr') 45 | 46 | expect(newUrlSIOStringDNS).to.equal('https://star-signal.cloud.ipfs.team') 47 | expect(newUrlSIOStringDNS2).to.equal('https://star-signal.cloud.ipfs.team:9999') 48 | expect(newUrlSIOStringDNS3).to.equal('http://star-signal.cloud.ipfs.team') 49 | expect(newUrlSIOStringDNS4).to.equal('http://star-signal.cloud.ipfs.team:8080') 50 | expect(newUrlSIOStringDNS5).to.equal('http://libp2p-webrtc-star-signal.cloud.ipfs.team:8080') 51 | }) 52 | 53 | it('cleanMultiaddr webrtc-star legacy', () => { 54 | const newMultiaddrStringDNS = cleanMultiaddr(legacyMultiaddrStringDNS) 55 | const newMultiaddrStringIP = cleanMultiaddr(legacyMultiaddrStringIP) 56 | 57 | expect(newMultiaddrStringDNS).to.not.equal(legacyMultiaddrStringDNS) 58 | expect(newMultiaddrStringIP).to.not.equal(legacyMultiaddrStringIP) 59 | expect(newMultiaddrStringDNS).to.equal(modernMultiaddrStringDNS) 60 | expect(newMultiaddrStringIP).to.equal(modernMultiaddrStringIP) 61 | }) 62 | 63 | it('cleanMultiaddr webrtc-star modern', () => { 64 | const newMultiaddrStringDNS = cleanMultiaddr(modernMultiaddrStringDNS) 65 | const newMultiaddrStringDNS5 = cleanMultiaddr(modernMultiaddrStringDNS5) // fix issue #369 66 | const newMultiaddrStringIP = cleanMultiaddr(modernMultiaddrStringIP) 67 | 68 | expect(newMultiaddrStringDNS).to.equal(modernMultiaddrStringDNS) 69 | expect(newMultiaddrStringDNS5).to.equal(modernMultiaddrStringDNS5) 70 | expect(newMultiaddrStringIP).to.equal(modernMultiaddrStringIP) 71 | }) 72 | }) 73 | -------------------------------------------------------------------------------- /packages/webrtc-star-transport/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "aegir/src/config/tsconfig.aegir.json", 3 | "compilerOptions": { 4 | "outDir": "dist", 5 | "emitDeclarationOnly": false, 6 | "module": "ES2020" 7 | }, 8 | "include": [ 9 | "src", 10 | "test" 11 | ], 12 | "references": [ 13 | { 14 | "path": "../webrtc-star-protocol" 15 | }, 16 | { 17 | "path": "../webrtc-star-signalling-server" 18 | } 19 | ] 20 | } 21 | --------------------------------------------------------------------------------