node-datachannel 0.11.0 → 0.20.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/.eslintignore +5 -1
  2. package/.eslintrc.json +27 -0
  3. package/.prettierrc +12 -0
  4. package/CMakeLists.txt +13 -13
  5. package/jest.config.ts +14 -0
  6. package/package.json +47 -44
  7. package/rollup.config.mjs +63 -0
  8. package/src/index.ts +10 -0
  9. package/{lib/datachannel-stream.js → src/lib/datachannel-stream.ts} +16 -11
  10. package/src/lib/index.ts +180 -0
  11. package/src/lib/node-datachannel.ts +13 -0
  12. package/src/lib/types.ts +126 -0
  13. package/{lib/websocket-server.js → src/lib/websocket-server.ts} +10 -8
  14. package/src/lib/websocket.ts +26 -0
  15. package/src/polyfill/Events.ts +33 -0
  16. package/src/polyfill/Exception.ts +37 -0
  17. package/src/polyfill/RTCCertificate.ts +17 -0
  18. package/{polyfill/RTCDataChannel.js → src/polyfill/RTCDataChannel.ts} +43 -40
  19. package/src/polyfill/RTCDtlsTransport.ts +47 -0
  20. package/src/polyfill/RTCError.ts +71 -0
  21. package/src/polyfill/RTCIceCandidate.ts +125 -0
  22. package/{polyfill/RTCIceTransport.js → src/polyfill/RTCIceTransport.ts} +22 -20
  23. package/{polyfill/RTCPeerConnection.js → src/polyfill/RTCPeerConnection.ts} +137 -115
  24. package/{polyfill/RTCSctpTransport.js → src/polyfill/RTCSctpTransport.ts} +16 -14
  25. package/{polyfill/RTCSessionDescription.js → src/polyfill/RTCSessionDescription.ts} +7 -12
  26. package/{polyfill/index.js → src/polyfill/index.ts} +12 -9
  27. package/tsconfig.json +20 -13
  28. package/.eslintrc.cjs +0 -8
  29. package/.github/FUNDING.yml +0 -2
  30. package/.github/workflows/build-linux.yml +0 -104
  31. package/.github/workflows/build-mac-m1.yml +0 -38
  32. package/.github/workflows/build-mac-x64.yml +0 -40
  33. package/.github/workflows/build-win.yml +0 -74
  34. package/.github/workflows/lint.yml +0 -20
  35. package/.github/workflows/npm-publish-manual.yml +0 -23
  36. package/.prettierrc.cjs +0 -8
  37. package/build-containers/Dockerfile.alpine +0 -6
  38. package/build-containers/Dockerfile.debian +0 -7
  39. package/cmake/toolchain/ci.cmake +0 -23
  40. package/examples/client-server/README.md +0 -22
  41. package/examples/client-server/client-benchmark.js +0 -230
  42. package/examples/client-server/client-periodic.js +0 -189
  43. package/examples/client-server/client.js +0 -111
  44. package/examples/client-server/package-lock.json +0 -289
  45. package/examples/client-server/package.json +0 -16
  46. package/examples/client-server/signaling-server.js +0 -39
  47. package/examples/electron-demo/README.md +0 -58
  48. package/examples/electron-demo/forge.config.js +0 -49
  49. package/examples/electron-demo/package-lock.json +0 -15933
  50. package/examples/electron-demo/package.json +0 -43
  51. package/examples/electron-demo/src/index.css +0 -7
  52. package/examples/electron-demo/src/index.html +0 -29
  53. package/examples/electron-demo/src/main.js +0 -53
  54. package/examples/electron-demo/src/node-datachannel.js +0 -123
  55. package/examples/electron-demo/src/preload.js +0 -28
  56. package/examples/electron-demo/src/renderer.js +0 -58
  57. package/examples/electron-demo/webpack.main.config.js +0 -11
  58. package/examples/electron-demo/webpack.renderer.config.js +0 -13
  59. package/examples/electron-demo/webpack.rules.js +0 -35
  60. package/examples/media/README.md +0 -34
  61. package/examples/media/main.html +0 -45
  62. package/examples/media/media.js +0 -54
  63. package/examples/simple-peer-usage/main.js +0 -28
  64. package/examples/simple-peer-usage/package-lock.json +0 -317
  65. package/examples/simple-peer-usage/package.json +0 -16
  66. package/examples/websocket/websocket-client.js +0 -20
  67. package/examples/websocket/websocket-server.js +0 -22
  68. package/jest.config.cjs +0 -7
  69. package/lib/index.cjs +0 -194
  70. package/lib/index.d.cts +0 -300
  71. package/lib/index.d.ts +0 -300
  72. package/lib/index.js +0 -58
  73. package/lib/node-datachannel.js +0 -7
  74. package/polyfill/Events.d.ts +0 -9
  75. package/polyfill/Events.js +0 -29
  76. package/polyfill/Exception.js +0 -23
  77. package/polyfill/RTCCertificate.d.ts +0 -7
  78. package/polyfill/RTCCertificate.js +0 -17
  79. package/polyfill/RTCDataChannel.d.ts +0 -35
  80. package/polyfill/RTCDtlsTransport.d.ts +0 -10
  81. package/polyfill/RTCDtlsTransport.js +0 -47
  82. package/polyfill/RTCIceCandidate.d.ts +0 -20
  83. package/polyfill/RTCIceCandidate.js +0 -126
  84. package/polyfill/RTCIceTransport.d.ts +0 -18
  85. package/polyfill/RTCPeerConnection.d.ts +0 -62
  86. package/polyfill/RTCSctpTransport.d.ts +0 -10
  87. package/polyfill/RTCSessionDescription.d.ts +0 -8
  88. package/polyfill/index.cjs +0 -1258
  89. package/polyfill/index.d.cts +0 -37
  90. package/polyfill/index.d.ts +0 -37
  91. package/test/connectivity.js +0 -86
  92. package/test/jest-tests/basic.test.js +0 -37
  93. package/test/jest-tests/multiple-run.test.js +0 -73
  94. package/test/jest-tests/p2p.test.js +0 -99
  95. package/test/jest-tests/polyfill.test.js +0 -10
  96. package/test/jest-tests/streams.test.js +0 -48
  97. package/test/jest-tests/websocket.test.js +0 -69
  98. package/test/polyfill-connectivity.js +0 -89
  99. package/test/websockets.js +0 -50
  100. package/test/wpt-tests/README.md +0 -46
  101. package/test/wpt-tests/chrome-failed-tests.js +0 -42
  102. package/test/wpt-tests/index.js +0 -96
  103. package/test/wpt-tests/last-test-results.md +0 -205
  104. package/test/wpt-tests/package-lock.json +0 -1712
  105. package/test/wpt-tests/package.json +0 -19
  106. package/test/wpt-tests/wpt-test-list.js +0 -137
  107. package/test/wpt-tests/wpt.js +0 -131
  108. /package/src/{data-channel-wrapper.cpp → cpp/data-channel-wrapper.cpp} +0 -0
  109. /package/src/{data-channel-wrapper.h → cpp/data-channel-wrapper.h} +0 -0
  110. /package/src/{main.cpp → cpp/main.cpp} +0 -0
  111. /package/src/{media-audio-wrapper.cpp → cpp/media-audio-wrapper.cpp} +0 -0
  112. /package/src/{media-audio-wrapper.h → cpp/media-audio-wrapper.h} +0 -0
  113. /package/src/{media-direction.cpp → cpp/media-direction.cpp} +0 -0
  114. /package/src/{media-direction.h → cpp/media-direction.h} +0 -0
  115. /package/src/{media-rtcpreceivingsession-wrapper.cpp → cpp/media-rtcpreceivingsession-wrapper.cpp} +0 -0
  116. /package/src/{media-rtcpreceivingsession-wrapper.h → cpp/media-rtcpreceivingsession-wrapper.h} +0 -0
  117. /package/src/{media-track-wrapper.cpp → cpp/media-track-wrapper.cpp} +0 -0
  118. /package/src/{media-track-wrapper.h → cpp/media-track-wrapper.h} +0 -0
  119. /package/src/{media-video-wrapper.cpp → cpp/media-video-wrapper.cpp} +0 -0
  120. /package/src/{media-video-wrapper.h → cpp/media-video-wrapper.h} +0 -0
  121. /package/src/{peer-connection-wrapper.cpp → cpp/peer-connection-wrapper.cpp} +0 -0
  122. /package/src/{peer-connection-wrapper.h → cpp/peer-connection-wrapper.h} +0 -0
  123. /package/src/{rtc-wrapper.cpp → cpp/rtc-wrapper.cpp} +0 -0
  124. /package/src/{rtc-wrapper.h → cpp/rtc-wrapper.h} +0 -0
  125. /package/src/{thread-safe-callback.cpp → cpp/thread-safe-callback.cpp} +0 -0
  126. /package/src/{thread-safe-callback.h → cpp/thread-safe-callback.h} +0 -0
  127. /package/src/{web-socket-server-wrapper.cpp → cpp/web-socket-server-wrapper.cpp} +0 -0
  128. /package/src/{web-socket-server-wrapper.h → cpp/web-socket-server-wrapper.h} +0 -0
  129. /package/src/{web-socket-wrapper.cpp → cpp/web-socket-wrapper.cpp} +0 -0
  130. /package/src/{web-socket-wrapper.h → cpp/web-socket-wrapper.h} +0 -0
  131. /package/{polyfill → src/polyfill}/README.md +0 -0
package/.eslintrc.cjs DELETED
@@ -1,8 +0,0 @@
1
- module.exports = {
2
- parser: '@typescript-eslint/parser',
3
- plugins: ['@typescript-eslint'],
4
- extends: ['plugin:@typescript-eslint/recommended', 'plugin:prettier/recommended'],
5
- env: {
6
- node: true,
7
- },
8
- };
@@ -1,2 +0,0 @@
1
- # These are supported funding model platforms
2
- open_collective: node-datachannel
@@ -1,104 +0,0 @@
1
- name: Build - Linux
2
-
3
- on:
4
- workflow_dispatch:
5
- # push:
6
- # tags:
7
- # - v*
8
-
9
- env:
10
- ACTIONS_ALLOW_UNSECURE_COMMANDS: true
11
-
12
- jobs:
13
- build-linux:
14
- runs-on: ubuntu-20.04
15
- strategy:
16
- matrix:
17
- node-version: [16]
18
- arch: [amd64, arm64, arm]
19
- platform: [debian, alpine]
20
- include:
21
- # Set baselines per platform
22
- - triple: "alpine-linux-musl"
23
- platform: alpine
24
- version: 3.16
25
- libc: musl
26
- gcc_install: clang lld
27
- gcc: clang
28
- # libc is intentionally not set here, as prebuild-install requires libc to not be set for glibc builds
29
- - triple: "linux-gnu"
30
- platform: debian
31
- version: bullseye
32
- # Set baselines per architecture
33
- - triple_arch: x86_64
34
- node_arch: x64
35
- arch: amd64
36
- - triple_arch: armv7
37
- node_arch: arm
38
- triple_postfix: eabihf
39
- arch: arm
40
- flags: -march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard -fPIC
41
- - triple_arch: aarch64
42
- node_arch: arm64
43
- arch: arm64
44
- flags: -march=armv8-a -fPIC
45
- # Set edge case overrides for specific platform + architecture
46
- # also define gcc commands for each architecture
47
- - arch: amd64
48
- platform: debian
49
- gcc_install: gcc g++
50
- gcc: gcc
51
- - arch: arm64
52
- platform: debian
53
- gcc_install: gcc-aarch64-linux-gnu g++-aarch64-linux-gnu
54
- gcc: aarch64-linux-gnu-gcc
55
- # debian uses the triple `arm-linux-gnueabihf` instead of alpine's `armv7-alpine-linux-musleabihf`
56
- # because of this, we explicitly override triple_arch for debian arm
57
- - triple_arch: arm
58
- arch: arm
59
- platform: debian
60
- gcc_install: gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf
61
- gcc: arm-linux-gnueabihf-gcc
62
-
63
- steps:
64
- - uses: actions/checkout@v4
65
- - name: Use Node.js ${{ matrix.node-version }}
66
- uses: actions/setup-node@v4
67
- with:
68
- node-version: ${{ matrix.node-version }}
69
- - name: Install node dependencies
70
- run: npm install --ignore-scripts
71
- env:
72
- CI: true
73
- - if: matrix.arch != 'amd64'
74
- name: Set up QEMU
75
- uses: docker/setup-qemu-action@v3
76
- with:
77
- platforms: ${{ matrix.arch }}
78
- - name: Install system dependencies
79
- run: |
80
- sudo apt update
81
- sudo apt install -y podman ninja-build ${{ matrix.gcc_install }}
82
- - name: List installed libc
83
- run: apt list --installed | grep libc6-dev
84
- - name: Build sysroot
85
- run: sudo podman build --isolation=chroot -t ndc-buildroot:${{ matrix.platform }}-${{ matrix.arch }} ./build-containers --file Dockerfile.${{ matrix.platform }} --platform linux/${{ matrix.arch }} --build-arg="version=${{ matrix.version }}" --build-arg="node_version=${{ matrix.node-version }}"
86
- - name: Mount sysroot
87
- id: sysroot
88
- run: echo "sysroot=$(sudo podman image mount ndc-buildroot:${{ matrix.platform }}-${{ matrix.arch }})" >> $GITHUB_OUTPUT
89
- - name: Build
90
- run: sudo --preserve-env=SYSROOT,TRIPLE,COMPILER_FLAGS,LIBC,GCC,CI,PATH node_modules/.bin/prebuild --arch ${{ matrix.node_arch }} -r napi --backend cmake-js -- --CDCMAKE_TOOLCHAIN_FILE:FILEPATH=./cmake/toolchain/ci.cmake
91
- env:
92
- SYSROOT: ${{ steps.sysroot.outputs.sysroot }}
93
- TRIPLE: ${{ matrix.triple_arch }}-${{ matrix.triple }}${{ matrix.triple_postfix }}
94
- COMPILER_FLAGS: ${{ matrix.flags }}
95
- LIBC: ${{ matrix.libc }}
96
- GCC: ${{ matrix.gcc }}
97
- CI: true
98
- - name: Test
99
- run: sudo podman run --rm -v $(pwd):/usr/app/ -e CI=true --platform linux/${{ matrix.arch }} -t ndc-buildroot:${{ matrix.platform }}-${{ matrix.arch }} npm run test
100
- - name: Upload
101
- run: sudo --preserve-env=CI,LIBC node_modules/.bin/prebuild --arch ${{ matrix.node_arch }} -r napi --upload -u ${{ secrets.GITHUB_TOKEN }}
102
- env:
103
- LIBC: ${{ matrix.libc }}
104
- CI: true
@@ -1,38 +0,0 @@
1
- name: Build - Mac M1
2
-
3
- on:
4
- workflow_dispatch:
5
- # push:
6
- # tags:
7
- # - v*
8
-
9
-
10
- env:
11
- ACTIONS_ALLOW_UNSECURE_COMMANDS: true
12
-
13
- jobs:
14
- build-macos:
15
- runs-on: macos-13
16
- strategy:
17
- matrix:
18
- node-version: [16.x]
19
-
20
- steps:
21
- - uses: actions/checkout@v4
22
- - name: Install OpenSSL
23
- run: |
24
- wget https://mac.r-project.org/bin/darwin20/arm64/openssl-1.1.1t-darwin.20-arm64.tar.xz
25
- tar -xf openssl-1.1.1t-darwin.20-arm64.tar.xz -C /tmp
26
- rm -rf openssl-1.1.1t-darwin.20-arm64.tar.xz
27
- - name: Use Node.js ${{ matrix.node-version }}
28
- uses: actions/setup-node@v4
29
- with:
30
- node-version: ${{ matrix.node-version }}
31
- - name: Build
32
- run: |
33
- npm install --ignore-scripts
34
- node_modules/.bin/prebuild -r napi --backend cmake-js --arch arm64 --upload -u ${{ secrets.GITHUB_TOKEN }} -- --CDCMAKE_OSX_ARCHITECTURES="arm64"
35
- env:
36
- CI: true
37
- OPENSSL_ROOT_DIR: /tmp/opt/R/arm64
38
- OPENSSL_LIBRARIES: /tmp/opt/R/arm64/lib
@@ -1,40 +0,0 @@
1
- name: Build - Mac x64
2
-
3
- on:
4
- workflow_dispatch:
5
- # push:
6
- # tags:
7
- # - v*
8
-
9
- env:
10
- ACTIONS_ALLOW_UNSECURE_COMMANDS: true
11
-
12
- jobs:
13
- build-macos:
14
- runs-on: macos-13
15
- strategy:
16
- matrix:
17
- node-version: [16.x]
18
-
19
- steps:
20
- - uses: actions/checkout@v4
21
- - name: Install OpenSSL
22
- run: HOMEBREW_NO_INSTALL_CLEANUP=1 brew reinstall openssl@1.1
23
- - name: Use Node.js ${{ matrix.node-version }}
24
- uses: actions/setup-node@v4
25
- with:
26
- node-version: ${{ matrix.node-version }}
27
- - name: Build
28
- run: npm install --build-from-source
29
- env:
30
- CI: true
31
- OPENSSL_ROOT_DIR: /usr/local/opt/openssl@1.1
32
- OPENSSL_LIBRARIES: /usr/local/opt/openssl@1.1/lib
33
- - name: Test
34
- run: npm run test
35
- env:
36
- CI: true
37
- - name: Upload
38
- run: node_modules/.bin/prebuild -r napi --upload -u ${{ secrets.GITHUB_TOKEN }}
39
- env:
40
- CI: true
@@ -1,74 +0,0 @@
1
- name: Build - Win
2
-
3
- on:
4
- workflow_dispatch:
5
- # push:
6
- # tags:
7
- # - v*
8
-
9
- env:
10
- ACTIONS_ALLOW_UNSECURE_COMMANDS: true
11
-
12
- jobs:
13
- build-windows-x64:
14
- runs-on: windows-2019
15
- strategy:
16
- matrix:
17
- node-version: [16.x]
18
-
19
- steps:
20
- - uses: actions/checkout@v4
21
- - uses: ilammy/msvc-dev-cmd@v1
22
- - name: Install OpenSSL
23
- run: choco install openssl
24
- - name: Use Node.js ${{ matrix.node-version }}
25
- uses: actions/setup-node@v4
26
- with:
27
- node-version: ${{ matrix.node-version }}
28
- - name: Build
29
- run: set npm_config_cache= && set NPM_CONFIG_CACHE= && npm install --build-from-source
30
- env:
31
- CI: true
32
- # - name: Test
33
- # run: npm run test
34
- # env:
35
- # CI: true
36
- - name: Upload
37
- run: node_modules/.bin/prebuild -r napi --upload -u ${{ secrets.GITHUB_TOKEN }}
38
- env:
39
- CI: true
40
-
41
- build-windows-x86:
42
- runs-on: windows-2019
43
- strategy:
44
- matrix:
45
- node_version: [16.x]
46
- node_arch:
47
- - x86
48
- steps:
49
- - uses: actions/checkout@v4
50
- - uses: ilammy/msvc-dev-cmd@v1
51
- with:
52
- arch: x86
53
- - name: Install OpenSSL
54
- # openssl v3.1.1 [Approved]
55
- # openssl package files install completed. Performing other installation steps.
56
- # ERROR: 32-bit installation is not supported for openssl
57
- run: choco install openssl --x86=true --version=1.1.1.2100
58
- - name: Use Node.js ${{ matrix.node_version }}
59
- uses: aminya/setup-node@x86
60
- with:
61
- node-version: ${{ matrix.node_version }}
62
- node-arch: ${{ matrix.node_arch }}
63
- - name: Build
64
- run: set npm_config_cache= && set NPM_CONFIG_CACHE= && npm install --build-from-source
65
- env:
66
- CI: true
67
- # - name: Test
68
- # run: npm run test
69
- # env:
70
- # CI: true
71
- - name: Upload
72
- run: node_modules/.bin/prebuild -r napi --upload -u ${{ secrets.GITHUB_TOKEN }}
73
- env:
74
- CI: true
@@ -1,20 +0,0 @@
1
- name: Lint
2
-
3
- on:
4
- pull_request:
5
- workflow_dispatch:
6
-
7
- jobs:
8
- build:
9
-
10
- runs-on: ubuntu-latest
11
-
12
- steps:
13
- - uses: actions/checkout@v3
14
- - name: Use Node.js
15
- uses: actions/setup-node@v3
16
- with:
17
- node-version: '16.x'
18
- - run: npm ci
19
- - run: npm run lint
20
- - run: npm run test-types
@@ -1,23 +0,0 @@
1
- name: npm Publish
2
-
3
- on:
4
- workflow_dispatch:
5
-
6
- jobs:
7
- npm-publish:
8
- name: npm-publish
9
- runs-on: ubuntu-latest
10
- steps:
11
- - name: Checkout repository
12
- uses: actions/checkout@v2
13
- - name: Set up Node.js
14
- uses: actions/setup-node@v1
15
- with:
16
- node-version: 20.x
17
- registry-url: "https://registry.npmjs.org"
18
- - name: Publish
19
- run: |
20
- npm install
21
- npm publish
22
- env:
23
- NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }}
package/.prettierrc.cjs DELETED
@@ -1,8 +0,0 @@
1
- module.exports = {
2
- semi: true,
3
- trailingComma: 'all',
4
- singleQuote: true,
5
- printWidth: 120,
6
- tabWidth: 4,
7
- endOfLine: 'auto'
8
- };
@@ -1,6 +0,0 @@
1
- ARG version=3.16
2
- ARG node_version=16
3
- FROM node:${node_version}-alpine${version}
4
- RUN apk add build-base openssl-libs-static openssl-dev
5
-
6
- WORKDIR /usr/app/
@@ -1,7 +0,0 @@
1
- ARG version=bullseye
2
- ARG node_version=16
3
- FROM node:${node_version}-${version}
4
- RUN apt update
5
- RUN apt install -y build-essential libssl-dev
6
-
7
- WORKDIR /usr/app/
@@ -1,23 +0,0 @@
1
- set(CMAKE_SYSTEM_NAME Linux)
2
- set(triple $ENV{TRIPLE})
3
-
4
- # use clang and lld
5
- set(CMAKE_C_COMPILER $ENV{GCC})
6
- set(CMAKE_CXX_COMPILER $ENV{GCC})
7
- if (CMAKE_C_COMPILER MATCHES clang)
8
- add_link_options("-fuse-ld=lld")
9
- endif()
10
-
11
- set(CMAKE_SYSROOT "$ENV{SYSROOT}")
12
- message(STATUS "Using sysroot: ${CMAKE_SYSROOT}")
13
-
14
- set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
15
- set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
16
- set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
17
-
18
- set(CMAKE_C_COMPILER_TARGET ${triple})
19
- set(CMAKE_CXX_COMPILER_TARGET ${triple})
20
- message(STATUS "Compiling for: ${triple}")
21
-
22
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} $ENV{COMPILER_FLAGS}")
23
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} $ENV{COMPILER_FLAGS}")
@@ -1,22 +0,0 @@
1
- # client-server Example
2
-
3
- - You can use client-server example project to test WebRTC Data Channels with WebSocket signaling.
4
- - It uses same logic of [libdatachannel/examples/client](https://github.com/paullouisageneau/libdatachannel/tree/master/examples) project.
5
- - Contains an equivalent implementation for a node.js signaling server
6
-
7
- ## How to Use?
8
-
9
- - Prepare Project
10
- - cd examples/client-server
11
- - npm i
12
- - Start ws signaling server;
13
- - node signaling-server.js
14
- - Start answerer (On a new Console);
15
- - node client.js
16
- - Note local ID
17
- - Start Offerer (On a new Console);
18
-
19
- - node client.js
20
- - Enter answerer ID
21
-
22
- > You can also use [libdatachannel/examples/client](https://github.com/paullouisageneau/libdatachannel/tree/master/examples) project's client & signaling server
@@ -1,230 +0,0 @@
1
- // createRequire is native in node version >= 12
2
- import { createRequire } from 'module';
3
- const require = createRequire(import.meta.url);
4
-
5
- // yargs down not supports ES Modules
6
- const yargs = require('yargs/yargs');
7
- const { hideBin } = require('yargs/helpers');
8
-
9
- import readline from 'readline';
10
- import nodeDataChannel from '../../lib/index.js';
11
-
12
- // Init Logger
13
- nodeDataChannel.initLogger('Info');
14
-
15
- // PeerConnection Map
16
- const pcMap = {};
17
-
18
- const dcArr = [];
19
-
20
- // Local ID
21
- const id = randomId(4);
22
-
23
- // Message Size
24
- const MESSAGE_SIZE = 65535;
25
-
26
- // Buffer Size
27
- const BUFFER_SIZE = MESSAGE_SIZE * 0;
28
-
29
- // Args
30
- const argv = yargs(hideBin(process.argv))
31
- .option('disableSend', {
32
- type: 'boolean',
33
- description: 'Disable Send',
34
- default: false,
35
- })
36
- .option('wsUrl', {
37
- type: 'string',
38
- description: 'Web Socket URL',
39
- default: 'ws://localhost:8000',
40
- })
41
- .option('dataChannelCount', {
42
- type: 'number',
43
- description: 'Data Channel Count To Create',
44
- default: 1,
45
- }).argv;
46
-
47
- // Disable Send
48
- const disableSend = argv.disableSend;
49
- if (disableSend) console.log('Send Disabled!');
50
-
51
- // Signaling Server
52
- const wsUrl = process.env.WS_URL || argv.wsUrl;
53
- console.log(wsUrl);
54
- const dataChannelCount = argv.dataChannelCount;
55
-
56
- // Read Line Interface
57
- const rl = readline.createInterface({
58
- input: process.stdin,
59
- output: process.stdout,
60
- });
61
-
62
- const ws = new nodeDataChannel.WebSocket();
63
- ws.open(wsUrl + '/' + id);
64
-
65
- console.log(`The local ID is: ${id}`);
66
- console.log(`Waiting for signaling to be connected...`);
67
-
68
- ws.onOpen(() => {
69
- console.log('WebSocket connected, signaling ready');
70
- readUserInput();
71
- });
72
-
73
- ws.onError((err) => {
74
- console.log('WebSocket Error: ', err);
75
- });
76
-
77
- ws.onMessage((msgStr) => {
78
- let msg = JSON.parse(msgStr);
79
- switch (msg.type) {
80
- case 'offer':
81
- createPeerConnection(msg.id);
82
- pcMap[msg.id].setRemoteDescription(msg.description, msg.type);
83
- break;
84
- case 'answer':
85
- pcMap[msg.id].setRemoteDescription(msg.description, msg.type);
86
- break;
87
- case 'candidate':
88
- pcMap[msg.id].addRemoteCandidate(msg.candidate, msg.mid);
89
- break;
90
-
91
- default:
92
- break;
93
- }
94
- });
95
-
96
- function readUserInput() {
97
- rl.question('Enter a remote ID to send an offer: ', (peerId) => {
98
- if (peerId && peerId.length > 2) {
99
- rl.close();
100
- console.log('Offering to ', peerId);
101
- createPeerConnection(peerId);
102
-
103
- let msgToSend = randomId(MESSAGE_SIZE);
104
-
105
- for (let i = 1; i <= dataChannelCount; i++) {
106
- let dcArrItem = {
107
- dc: null,
108
- bytesSent: 0,
109
- bytesReceived: 0,
110
- };
111
- console.log('Creating DataChannel with label "test-' + i + '"');
112
- dcArrItem.dc = pcMap[peerId].createDataChannel('test-' + i);
113
-
114
- dcArrItem.dc.setBufferedAmountLowThreshold(BUFFER_SIZE);
115
- dcArrItem.dc.onOpen(() => {
116
- while (!disableSend && dcArrItem.dc.bufferedAmount() <= BUFFER_SIZE) {
117
- dcArrItem.dc.sendMessage(msgToSend);
118
- dcArrItem.bytesSent += msgToSend.length;
119
- }
120
- });
121
-
122
- dcArrItem.dc.onBufferedAmountLow(() => {
123
- while (!disableSend && dcArrItem.dc.bufferedAmount() <= BUFFER_SIZE) {
124
- dcArrItem.dc.sendMessage(msgToSend);
125
- dcArrItem.bytesSent += msgToSend.length;
126
- }
127
- });
128
-
129
- dcArrItem.dc.onMessage((msg) => {
130
- dcArrItem.bytesReceived += msg.length;
131
- });
132
-
133
- dcArr.push(dcArrItem);
134
- }
135
-
136
- // Report
137
- let i = 0;
138
- setInterval(() => {
139
- let totalBytesSent = 0;
140
- let totalBytesReceived = 0;
141
- for (let j = 0; j < dcArr.length; j++) {
142
- console.log(
143
- `${j == 0 ? i + '#' : ''} DC-${j + 1} Sent: ${byte2KB(
144
- dcArr[j].bytesSent,
145
- )} KB/s / Received: ${byte2KB(dcArr[j].bytesReceived)} KB/s / SendBufferAmount: ${dcArr[
146
- j
147
- ].dc.bufferedAmount()} / DataChannelOpen: ${dcArr[j].dc.isOpen()}`,
148
- );
149
- totalBytesSent += dcArr[j].bytesSent;
150
- totalBytesReceived += dcArr[j].bytesReceived;
151
- dcArr[j].bytesSent = 0;
152
- dcArr[j].bytesReceived = 0;
153
- }
154
- console.log(
155
- `Total Sent: ${byte2KB(totalBytesSent)} KB/s / Total Received: ${byte2KB(
156
- totalBytesReceived,
157
- )} KB/s`,
158
- );
159
-
160
- if (i % 5 == 0) {
161
- console.log(
162
- `Stats# Sent: ${byte2MB(pcMap[peerId].bytesSent())} MB / Received: ${byte2MB(
163
- pcMap[peerId].bytesReceived(),
164
- )} MB / rtt: ${pcMap[peerId].rtt()} ms`,
165
- );
166
- console.log(`Selected Candidates# ${JSON.stringify(pcMap[peerId].getSelectedCandidatePair())}`);
167
- console.log(``);
168
- }
169
- i++;
170
- }, 1000);
171
- }
172
- });
173
- }
174
-
175
- function createPeerConnection(peerId) {
176
- // Create PeerConnection
177
- let peerConnection = new nodeDataChannel.PeerConnection('pc', { iceServers: ['stun:stun.l.google.com:19302'] });
178
- peerConnection.onStateChange((state) => {
179
- console.log('State: ', state);
180
- });
181
- peerConnection.onGatheringStateChange((state) => {
182
- console.log('GatheringState: ', state);
183
- });
184
- peerConnection.onLocalDescription((description, type) => {
185
- ws.sendMessage(JSON.stringify({ id: peerId, type, description }));
186
- });
187
- peerConnection.onLocalCandidate((candidate, mid) => {
188
- ws.sendMessage(JSON.stringify({ id: peerId, type: 'candidate', candidate, mid }));
189
- });
190
- peerConnection.onDataChannel((dc) => {
191
- rl.close();
192
- console.log('DataChannel from ' + peerId + ' received with label "', dc.getLabel() + '"');
193
-
194
- let msgToSend = randomId(MESSAGE_SIZE);
195
-
196
- while (!disableSend && dc.bufferedAmount() <= BUFFER_SIZE) {
197
- dc.sendMessage(msgToSend);
198
- }
199
-
200
- dc.onBufferedAmountLow(() => {
201
- while (!disableSend && dc.bufferedAmount() <= BUFFER_SIZE) {
202
- dc.sendMessage(msgToSend);
203
- }
204
- });
205
-
206
- dc.onMessage((msg) => {
207
- // bytesReceived += msg.length;
208
- });
209
- });
210
-
211
- pcMap[peerId] = peerConnection;
212
- }
213
-
214
- function randomId(length) {
215
- var result = '';
216
- var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
217
- var charactersLength = characters.length;
218
- for (var i = 0; i < length; i++) {
219
- result += characters.charAt(Math.floor(Math.random() * charactersLength));
220
- }
221
- return result;
222
- }
223
-
224
- function byte2KB(bytes) {
225
- return `${Math.round(bytes / 1000)}`;
226
- }
227
-
228
- function byte2MB(bytes) {
229
- return `${Math.round(bytes / (1000 * 1000))}`;
230
- }