node-datachannel 0.12.0 → 0.20.0-alpha.2

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 (219) 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/dist/cjs/index.cjs +11 -0
  6. package/dist/cjs/index.cjs.map +1 -0
  7. package/dist/cjs/lib/datachannel-stream.cjs +101 -0
  8. package/dist/cjs/lib/datachannel-stream.cjs.map +1 -0
  9. package/dist/cjs/lib/index.cjs +61 -0
  10. package/dist/cjs/lib/index.cjs.map +1 -0
  11. package/dist/cjs/lib/node-datachannel.cjs +14 -0
  12. package/dist/cjs/lib/node-datachannel.cjs.map +1 -0
  13. package/dist/cjs/lib/websocket-server.cjs +44 -0
  14. package/dist/cjs/lib/websocket-server.cjs.map +1 -0
  15. package/dist/cjs/lib/websocket.cjs +8 -0
  16. package/dist/cjs/lib/websocket.cjs.map +1 -0
  17. package/dist/cjs/polyfill/Events.cjs +37 -0
  18. package/dist/cjs/polyfill/Events.cjs.map +1 -0
  19. package/dist/cjs/polyfill/Exception.cjs +34 -0
  20. package/dist/cjs/polyfill/Exception.cjs.map +1 -0
  21. package/dist/cjs/polyfill/RTCCertificate.cjs +31 -0
  22. package/dist/cjs/polyfill/RTCCertificate.cjs.map +1 -0
  23. package/dist/cjs/polyfill/RTCDataChannel.cjs +179 -0
  24. package/dist/cjs/polyfill/RTCDataChannel.cjs.map +1 -0
  25. package/dist/cjs/polyfill/RTCDtlsTransport.cjs +52 -0
  26. package/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +1 -0
  27. package/dist/cjs/polyfill/RTCError.cjs +76 -0
  28. package/dist/cjs/polyfill/RTCError.cjs.map +1 -0
  29. package/dist/cjs/polyfill/RTCIceCandidate.cjs +129 -0
  30. package/dist/cjs/polyfill/RTCIceCandidate.cjs.map +1 -0
  31. package/dist/cjs/polyfill/RTCIceTransport.cjs +84 -0
  32. package/dist/cjs/polyfill/RTCIceTransport.cjs.map +1 -0
  33. package/dist/cjs/polyfill/RTCPeerConnection.cjs +417 -0
  34. package/dist/cjs/polyfill/RTCPeerConnection.cjs.map +1 -0
  35. package/dist/cjs/polyfill/RTCSctpTransport.cjs +61 -0
  36. package/dist/cjs/polyfill/RTCSctpTransport.cjs.map +1 -0
  37. package/dist/cjs/polyfill/RTCSessionDescription.cjs +37 -0
  38. package/dist/cjs/polyfill/RTCSessionDescription.cjs.map +1 -0
  39. package/dist/cjs/polyfill/index.cjs +42 -0
  40. package/dist/cjs/polyfill/index.cjs.map +1 -0
  41. package/dist/esm/index.mjs +8 -0
  42. package/dist/esm/index.mjs.map +1 -0
  43. package/dist/esm/lib/datachannel-stream.mjs +78 -0
  44. package/dist/esm/lib/datachannel-stream.mjs.map +1 -0
  45. package/dist/esm/lib/index.mjs +44 -0
  46. package/dist/esm/lib/index.mjs.map +1 -0
  47. package/dist/esm/lib/node-datachannel.mjs +18 -0
  48. package/dist/esm/lib/node-datachannel.mjs.map +1 -0
  49. package/dist/esm/lib/websocket-server.mjs +42 -0
  50. package/dist/esm/lib/websocket-server.mjs.map +1 -0
  51. package/dist/esm/lib/websocket.mjs +6 -0
  52. package/dist/esm/lib/websocket.mjs.map +1 -0
  53. package/dist/esm/polyfill/Events.mjs +34 -0
  54. package/dist/esm/polyfill/Events.mjs.map +1 -0
  55. package/dist/esm/polyfill/Exception.mjs +28 -0
  56. package/dist/esm/polyfill/Exception.mjs.map +1 -0
  57. package/dist/esm/polyfill/RTCCertificate.mjs +27 -0
  58. package/dist/esm/polyfill/RTCCertificate.mjs.map +1 -0
  59. package/dist/esm/polyfill/RTCDataChannel.mjs +175 -0
  60. package/dist/esm/polyfill/RTCDataChannel.mjs.map +1 -0
  61. package/dist/esm/polyfill/RTCDtlsTransport.mjs +48 -0
  62. package/dist/esm/polyfill/RTCDtlsTransport.mjs.map +1 -0
  63. package/dist/esm/polyfill/RTCError.mjs +72 -0
  64. package/dist/esm/polyfill/RTCError.mjs.map +1 -0
  65. package/dist/esm/polyfill/RTCIceCandidate.mjs +125 -0
  66. package/dist/esm/polyfill/RTCIceCandidate.mjs.map +1 -0
  67. package/dist/esm/polyfill/RTCIceTransport.mjs +80 -0
  68. package/dist/esm/polyfill/RTCIceTransport.mjs.map +1 -0
  69. package/dist/esm/polyfill/RTCPeerConnection.mjs +413 -0
  70. package/dist/esm/polyfill/RTCPeerConnection.mjs.map +1 -0
  71. package/dist/esm/polyfill/RTCSctpTransport.mjs +57 -0
  72. package/dist/esm/polyfill/RTCSctpTransport.mjs.map +1 -0
  73. package/dist/esm/polyfill/RTCSessionDescription.mjs +33 -0
  74. package/dist/esm/polyfill/RTCSessionDescription.mjs.map +1 -0
  75. package/dist/esm/polyfill/index.mjs +27 -0
  76. package/dist/esm/polyfill/index.mjs.map +1 -0
  77. package/dist/types/lib/datachannel-stream.d.ts +24 -0
  78. package/dist/types/lib/index.d.ts +164 -0
  79. package/dist/types/lib/types.d.ts +106 -0
  80. package/dist/types/lib/websocket-server.d.ts +13 -0
  81. package/dist/types/lib/websocket.d.ts +25 -0
  82. package/dist/types/polyfill/Events.d.ts +15 -0
  83. package/dist/types/polyfill/RTCCertificate.d.ts +8 -0
  84. package/dist/types/polyfill/RTCDataChannel.d.ts +29 -0
  85. package/dist/types/polyfill/RTCDtlsTransport.d.ts +17 -0
  86. package/dist/types/polyfill/RTCError.d.ts +16 -0
  87. package/dist/types/polyfill/RTCIceCandidate.d.ts +21 -0
  88. package/dist/types/polyfill/RTCIceTransport.d.ts +24 -0
  89. package/dist/types/polyfill/RTCPeerConnection.d.ts +56 -0
  90. package/dist/types/polyfill/RTCSctpTransport.d.ts +17 -0
  91. package/dist/types/polyfill/RTCSessionDescription.d.ts +9 -0
  92. package/{polyfill → dist/types/polyfill}/index.d.ts +3 -14
  93. package/jest.config.ts +14 -0
  94. package/package.json +47 -43
  95. package/rollup.config.mjs +63 -0
  96. package/src/index.ts +10 -0
  97. package/{lib/datachannel-stream.js → src/lib/datachannel-stream.ts} +16 -11
  98. package/src/lib/index.ts +180 -0
  99. package/src/lib/node-datachannel.ts +13 -0
  100. package/src/lib/types.ts +126 -0
  101. package/{lib/websocket-server.js → src/lib/websocket-server.ts} +10 -8
  102. package/src/lib/websocket.ts +26 -0
  103. package/src/polyfill/Events.ts +33 -0
  104. package/src/polyfill/Exception.ts +37 -0
  105. package/src/polyfill/RTCCertificate.ts +17 -0
  106. package/{polyfill/RTCDataChannel.js → src/polyfill/RTCDataChannel.ts} +43 -40
  107. package/src/polyfill/RTCDtlsTransport.ts +47 -0
  108. package/src/polyfill/RTCError.ts +71 -0
  109. package/{polyfill/RTCIceCandidate.js → src/polyfill/RTCIceCandidate.ts} +35 -35
  110. package/{polyfill/RTCIceTransport.js → src/polyfill/RTCIceTransport.ts} +22 -20
  111. package/{polyfill/RTCPeerConnection.js → src/polyfill/RTCPeerConnection.ts} +128 -114
  112. package/{polyfill/RTCSctpTransport.js → src/polyfill/RTCSctpTransport.ts} +16 -14
  113. package/{polyfill/RTCSessionDescription.js → src/polyfill/RTCSessionDescription.ts} +7 -12
  114. package/{polyfill/index.js → src/polyfill/index.ts} +10 -10
  115. package/tsconfig.json +20 -13
  116. package/.eslintrc.cjs +0 -8
  117. package/.github/FUNDING.yml +0 -2
  118. package/.github/workflows/build-linux.yml +0 -109
  119. package/.github/workflows/build-mac-m1.yml +0 -38
  120. package/.github/workflows/build-mac-x64.yml +0 -40
  121. package/.github/workflows/build-win.yml +0 -74
  122. package/.github/workflows/lint.yml +0 -20
  123. package/.github/workflows/npm-publish-manual.yml +0 -23
  124. package/.prettierrc.cjs +0 -8
  125. package/build-containers/Dockerfile.alpine +0 -6
  126. package/build-containers/Dockerfile.debian +0 -7
  127. package/cmake/toolchain/ci.cmake +0 -23
  128. package/examples/client-server/README.md +0 -22
  129. package/examples/client-server/client-benchmark.js +0 -230
  130. package/examples/client-server/client-periodic.js +0 -189
  131. package/examples/client-server/client.js +0 -111
  132. package/examples/client-server/package-lock.json +0 -289
  133. package/examples/client-server/package.json +0 -16
  134. package/examples/client-server/signaling-server.js +0 -39
  135. package/examples/electron-demo/README.md +0 -58
  136. package/examples/electron-demo/forge.config.js +0 -49
  137. package/examples/electron-demo/package-lock.json +0 -15877
  138. package/examples/electron-demo/package.json +0 -44
  139. package/examples/electron-demo/src/index.css +0 -7
  140. package/examples/electron-demo/src/index.html +0 -29
  141. package/examples/electron-demo/src/main.js +0 -53
  142. package/examples/electron-demo/src/node-datachannel.js +0 -123
  143. package/examples/electron-demo/src/preload.js +0 -28
  144. package/examples/electron-demo/src/renderer.js +0 -58
  145. package/examples/electron-demo/webpack.main.config.js +0 -21
  146. package/examples/electron-demo/webpack.renderer.config.js +0 -13
  147. package/examples/electron-demo/webpack.rules.js +0 -35
  148. package/examples/media/README.md +0 -34
  149. package/examples/media/main.html +0 -45
  150. package/examples/media/media.js +0 -54
  151. package/examples/simple-peer-usage/main.js +0 -28
  152. package/examples/simple-peer-usage/package-lock.json +0 -317
  153. package/examples/simple-peer-usage/package.json +0 -16
  154. package/examples/websocket/websocket-client.js +0 -20
  155. package/examples/websocket/websocket-server.js +0 -22
  156. package/jest.config.cjs +0 -7
  157. package/lib/index.cjs +0 -194
  158. package/lib/index.d.cts +0 -300
  159. package/lib/index.d.ts +0 -300
  160. package/lib/index.js +0 -58
  161. package/lib/node-datachannel.js +0 -7
  162. package/polyfill/Events.d.ts +0 -9
  163. package/polyfill/Events.js +0 -29
  164. package/polyfill/Exception.js +0 -23
  165. package/polyfill/RTCCertificate.d.ts +0 -7
  166. package/polyfill/RTCCertificate.js +0 -17
  167. package/polyfill/RTCDataChannel.d.ts +0 -35
  168. package/polyfill/RTCDtlsTransport.d.ts +0 -10
  169. package/polyfill/RTCDtlsTransport.js +0 -47
  170. package/polyfill/RTCError.d.ts +0 -11
  171. package/polyfill/RTCError.js +0 -65
  172. package/polyfill/RTCIceCandidate.d.ts +0 -20
  173. package/polyfill/RTCIceTransport.d.ts +0 -18
  174. package/polyfill/RTCPeerConnection.d.ts +0 -62
  175. package/polyfill/RTCSctpTransport.d.ts +0 -10
  176. package/polyfill/RTCSessionDescription.d.ts +0 -8
  177. package/polyfill/index.cjs +0 -1333
  178. package/polyfill/index.d.cts +0 -37
  179. package/test/connectivity.js +0 -86
  180. package/test/jest-tests/basic.test.js +0 -37
  181. package/test/jest-tests/multiple-run.test.js +0 -73
  182. package/test/jest-tests/p2p.test.js +0 -99
  183. package/test/jest-tests/polyfill.test.js +0 -10
  184. package/test/jest-tests/streams.test.js +0 -48
  185. package/test/jest-tests/websocket.test.js +0 -69
  186. package/test/polyfill-connectivity.js +0 -89
  187. package/test/websockets.js +0 -50
  188. package/test/wpt-tests/README.md +0 -46
  189. package/test/wpt-tests/chrome-failed-tests.js +0 -42
  190. package/test/wpt-tests/index.js +0 -96
  191. package/test/wpt-tests/last-test-results.md +0 -301
  192. package/test/wpt-tests/package-lock.json +0 -1712
  193. package/test/wpt-tests/package.json +0 -19
  194. package/test/wpt-tests/wpt-test-list.js +0 -139
  195. package/test/wpt-tests/wpt.js +0 -131
  196. /package/src/{data-channel-wrapper.cpp → cpp/data-channel-wrapper.cpp} +0 -0
  197. /package/src/{data-channel-wrapper.h → cpp/data-channel-wrapper.h} +0 -0
  198. /package/src/{main.cpp → cpp/main.cpp} +0 -0
  199. /package/src/{media-audio-wrapper.cpp → cpp/media-audio-wrapper.cpp} +0 -0
  200. /package/src/{media-audio-wrapper.h → cpp/media-audio-wrapper.h} +0 -0
  201. /package/src/{media-direction.cpp → cpp/media-direction.cpp} +0 -0
  202. /package/src/{media-direction.h → cpp/media-direction.h} +0 -0
  203. /package/src/{media-rtcpreceivingsession-wrapper.cpp → cpp/media-rtcpreceivingsession-wrapper.cpp} +0 -0
  204. /package/src/{media-rtcpreceivingsession-wrapper.h → cpp/media-rtcpreceivingsession-wrapper.h} +0 -0
  205. /package/src/{media-track-wrapper.cpp → cpp/media-track-wrapper.cpp} +0 -0
  206. /package/src/{media-track-wrapper.h → cpp/media-track-wrapper.h} +0 -0
  207. /package/src/{media-video-wrapper.cpp → cpp/media-video-wrapper.cpp} +0 -0
  208. /package/src/{media-video-wrapper.h → cpp/media-video-wrapper.h} +0 -0
  209. /package/src/{peer-connection-wrapper.cpp → cpp/peer-connection-wrapper.cpp} +0 -0
  210. /package/src/{peer-connection-wrapper.h → cpp/peer-connection-wrapper.h} +0 -0
  211. /package/src/{rtc-wrapper.cpp → cpp/rtc-wrapper.cpp} +0 -0
  212. /package/src/{rtc-wrapper.h → cpp/rtc-wrapper.h} +0 -0
  213. /package/src/{thread-safe-callback.cpp → cpp/thread-safe-callback.cpp} +0 -0
  214. /package/src/{thread-safe-callback.h → cpp/thread-safe-callback.h} +0 -0
  215. /package/src/{web-socket-server-wrapper.cpp → cpp/web-socket-server-wrapper.cpp} +0 -0
  216. /package/src/{web-socket-server-wrapper.h → cpp/web-socket-server-wrapper.h} +0 -0
  217. /package/src/{web-socket-wrapper.cpp → cpp/web-socket-wrapper.cpp} +0 -0
  218. /package/src/{web-socket-wrapper.h → cpp/web-socket-wrapper.h} +0 -0
  219. /package/{polyfill → src/polyfill}/README.md +0 -0
@@ -1,37 +0,0 @@
1
- import RTCCertificate from './RTCCertificate.js';
2
- import RTCDataChannel from './RTCDataChannel.js';
3
- import RTCDtlsTransport from './RTCDtlsTransport.js';
4
- import RTCIceCandidate from './RTCIceCandidate.js';
5
- import RTCIceTransport from './RTCIceTransport.js';
6
- import RTCPeerConnection from './RTCPeerConnection.js';
7
- import RTCSctpTransport from './RTCSctpTransport.js';
8
- import RTCSessionDescription from './RTCSessionDescription.js';
9
- import { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events.js';
10
-
11
- export {
12
- RTCCertificate,
13
- RTCDataChannel,
14
- RTCDtlsTransport,
15
- RTCIceCandidate,
16
- RTCIceTransport,
17
- RTCPeerConnection,
18
- RTCSctpTransport,
19
- RTCSessionDescription,
20
- RTCDataChannelEvent,
21
- RTCPeerConnectionIceEvent,
22
- };
23
-
24
- declare const _default: {
25
- RTCCertificate: typeof RTCCertificate;
26
- RTCDataChannel: typeof RTCDataChannel;
27
- RTCDtlsTransport: typeof RTCDtlsTransport;
28
- RTCIceCandidate: typeof RTCIceCandidate;
29
- RTCIceTransport: typeof RTCIceTransport;
30
- RTCPeerConnection: typeof RTCPeerConnection;
31
- RTCSctpTransport: typeof RTCSctpTransport;
32
- RTCSessionDescription: typeof RTCSessionDescription;
33
- RTCDataChannelEvent: typeof RTCDataChannelEvent;
34
- RTCPeerConnectionIceEvent: typeof RTCPeerConnectionIceEvent;
35
- };
36
-
37
- export default _default;
@@ -1,86 +0,0 @@
1
- import nodeDataChannel from '../lib/index.js';
2
-
3
- nodeDataChannel.initLogger('Debug');
4
-
5
- let dc1 = null;
6
- let dc2 = null;
7
-
8
- // "iceServers" option is an array of stun/turn server urls
9
- // Examples;
10
- // STUN Server Example : stun:stun.l.google.com:19302
11
- // TURN Server Example : turn:USERNAME:PASSWORD@TURN_IP_OR_ADDRESS:PORT
12
- // TURN Server Example (TCP) : turn:USERNAME:PASSWORD@TURN_IP_OR_ADDRESS:PORT?transport=tcp
13
- // TURN Server Example (TLS) : turns:USERNAME:PASSWORD@TURN_IP_OR_ADDRESS:PORT
14
- let peer1 = new nodeDataChannel.PeerConnection('Peer1', { iceServers: ['stun:stun.l.google.com:19302'] });
15
-
16
- // Set Callbacks
17
- peer1.onStateChange((state) => {
18
- console.log('Peer1 State:', state);
19
- });
20
- peer1.onIceStateChange((state) => {
21
- console.log('Peer1 IceState:', state);
22
- });
23
- peer1.onGatheringStateChange((state) => {
24
- console.log('Peer1 GatheringState:', state);
25
- });
26
- peer1.onLocalDescription((sdp, type) => {
27
- console.log('Peer1 SDP:', sdp, ' Type:', type);
28
- peer2.setRemoteDescription(sdp, type);
29
- });
30
- peer1.onLocalCandidate((candidate, mid) => {
31
- console.log('Peer1 Candidate:', candidate);
32
- peer2.addRemoteCandidate(candidate, mid);
33
- });
34
-
35
- let peer2 = new nodeDataChannel.PeerConnection('Peer2', { iceServers: ['stun:stun.l.google.com:19302'] });
36
-
37
- // Set Callbacks
38
- peer2.onStateChange((state) => {
39
- console.log('Peer2 State:', state);
40
- });
41
- peer2.onIceStateChange((state) => {
42
- console.log('Peer2 IceState:', state);
43
- });
44
- peer2.onGatheringStateChange((state) => {
45
- console.log('Peer2 GatheringState:', state);
46
- });
47
- peer2.onLocalDescription((sdp, type) => {
48
- console.log('Peer2 SDP:', sdp, ' Type:', type);
49
- peer1.setRemoteDescription(sdp, type);
50
- });
51
- peer2.onLocalCandidate((candidate, mid) => {
52
- console.log('Peer2 Candidate:', candidate);
53
- peer1.addRemoteCandidate(candidate, mid);
54
- });
55
- peer2.onDataChannel((dc) => {
56
- console.log('Peer2 Got DataChannel: ', dc.getLabel());
57
- dc2 = dc;
58
- dc2.onMessage((msg) => {
59
- console.log('Peer2 Received Msg:', msg);
60
- });
61
- dc2.sendMessage('Hello From Peer2');
62
- dc2.onClosed(() => {
63
- console.log('dc2 closed');
64
- });
65
- });
66
-
67
- // Create DataChannel
68
- dc1 = peer1.createDataChannel('test');
69
- dc1.onOpen(() => {
70
- dc1.sendMessage('Hello from Peer1');
71
- // Binary message: Use sendMessageBinary(Buffer)
72
- });
73
- dc1.onMessage((msg) => {
74
- console.log('Peer1 Received Msg:', msg);
75
- });
76
- dc1.onClosed(() => {
77
- console.log('dc1 closed');
78
- });
79
-
80
- setTimeout(() => {
81
- if (dc1) dc1.close();
82
- if (dc2) dc2.close();
83
- peer1.close();
84
- peer2.close();
85
- nodeDataChannel.cleanup();
86
- }, 5 * 1000);
@@ -1,37 +0,0 @@
1
- import * as nodeDataChannel from '../../lib';
2
-
3
- describe('Module Definition', () => {
4
- test('Module Defined', () => {
5
- expect(nodeDataChannel).toBeDefined();
6
- expect(nodeDataChannel.initLogger).toBeDefined();
7
- expect(nodeDataChannel.PeerConnection).toBeDefined();
8
- expect(typeof nodeDataChannel.PeerConnection).toBe('function');
9
- expect(nodeDataChannel.DataChannel).toBeDefined();
10
- expect(typeof nodeDataChannel.DataChannel).toBe('function');
11
- });
12
- });
13
-
14
- describe('PeerConnection Classes', () => {
15
- test('Create PeerConnection', () => {
16
- let peer = new nodeDataChannel.PeerConnection('Peer', { iceServers: ['stun:stun.l.google.com:19302'] });
17
- expect(peer).toBeDefined();
18
- expect(peer.onStateChange).toBeDefined();
19
- expect(peer.createDataChannel).toBeDefined();
20
-
21
- peer.close();
22
- });
23
-
24
- test('Create Data Channel', () => {
25
- let peer = new nodeDataChannel.PeerConnection('Peer', { iceServers: ['stun:stun.l.google.com:19302'] });
26
- let dc = peer.createDataChannel('test', { protocol: 'test-protocol' });
27
- expect(dc).toBeDefined();
28
- expect(dc.getId()).toBeDefined();
29
- expect(dc.getProtocol()).toBe('test-protocol');
30
- expect(dc.getLabel()).toBe('test');
31
- expect(dc.onOpen).toBeDefined();
32
- expect(dc.onMessage).toBeDefined();
33
-
34
- dc.close();
35
- peer.close();
36
- });
37
- });
@@ -1,73 +0,0 @@
1
- import { jest } from '@jest/globals';
2
- import * as nodeDataChannel from '../../lib';
3
-
4
- describe('P2P', () => {
5
- // Default is 5000 ms but we need more
6
- jest.setTimeout(12000);
7
-
8
- test.each(Array(100).fill(0))('P2P Test-%p', (i) => {
9
- return new Promise((done) => {
10
- let peer1 = new nodeDataChannel.PeerConnection('Peer1', { iceServers: ['stun:stun.l.google.com:19302'] });
11
- let peer2 = new nodeDataChannel.PeerConnection('Peer2', { iceServers: ['stun:stun.l.google.com:19302'] });
12
- let dc1 = null;
13
- let dc2 = null;
14
-
15
- // Mocks
16
- const p1DCMessageMock = jest.fn();
17
- const p2DCMessageMock = jest.fn();
18
-
19
- // Set Callbacks
20
- peer1.onStateChange(() => {
21
- /** */
22
- });
23
- peer1.onGatheringStateChange(() => {
24
- /** */
25
- });
26
- peer1.onLocalDescription((sdp, type) => {
27
- peer2.setRemoteDescription(sdp, type);
28
- });
29
- peer1.onLocalCandidate((candidate, mid) => {
30
- peer2.addRemoteCandidate(candidate, mid);
31
- });
32
-
33
- // Set Callbacks
34
- peer2.onStateChange(() => {
35
- /** */
36
- });
37
- peer2.onGatheringStateChange(() => {
38
- /** */
39
- });
40
- peer2.onLocalDescription((sdp, type) => {
41
- peer1.setRemoteDescription(sdp, type);
42
- });
43
- peer2.onLocalCandidate((candidate, mid) => {
44
- peer1.addRemoteCandidate(candidate, mid);
45
- });
46
- peer2.onDataChannel((dc) => {
47
- dc2 = dc;
48
- dc2.onMessage((msg) => {
49
- p2DCMessageMock(msg);
50
- dc2.sendMessage('Hello From Peer2');
51
- });
52
- });
53
-
54
- dc1 = peer1.createDataChannel('test-p2p');
55
- dc1.onOpen(() => {
56
- dc1.sendMessage('Hello From Peer1');
57
- });
58
- dc1.onMessage((msg) => {
59
- p1DCMessageMock(msg);
60
- peer1.close();
61
- peer2.close();
62
-
63
- // DataChannel
64
- expect(p1DCMessageMock.mock.calls.length).toBe(1);
65
- expect(p1DCMessageMock.mock.calls[0][0]).toEqual('Hello From Peer2');
66
- expect(p2DCMessageMock.mock.calls.length).toBe(1);
67
- expect(p2DCMessageMock.mock.calls[0][0]).toEqual('Hello From Peer1');
68
-
69
- done();
70
- });
71
- });
72
- });
73
- });
@@ -1,99 +0,0 @@
1
- import { jest } from '@jest/globals';
2
- import * as nodeDataChannel from '../../lib';
3
-
4
- describe('P2P', () => {
5
- // Default is 5000 ms but we need more
6
- jest.setTimeout(30000);
7
-
8
- test('P2P Test', () => {
9
- return new Promise((done) => {
10
- let peer1 = new nodeDataChannel.PeerConnection('Peer1', { iceServers: ['stun:stun.l.google.com:19302'] });
11
- let peer2 = new nodeDataChannel.PeerConnection('Peer2', { iceServers: ['stun:stun.l.google.com:19302'] });
12
- let dc1 = null;
13
- let dc2 = null;
14
-
15
- // Mocks
16
- const p1StateMock = jest.fn();
17
- const p1GatheringStateMock = jest.fn();
18
- const p2StateMock = jest.fn();
19
- const p2GatheringStateMock = jest.fn();
20
- const p1SDPMock = jest.fn();
21
- const p1CandidateMock = jest.fn();
22
- const p2SDPMock = jest.fn();
23
- const p2CandidateMock = jest.fn();
24
-
25
- const p1DCMock = jest.fn();
26
- const p1DCMessageMock = jest.fn();
27
- const p2DCMock = jest.fn();
28
- const p2DCMessageMock = jest.fn();
29
-
30
- // Set Callbacks
31
- peer1.onStateChange(p1StateMock);
32
- peer1.onGatheringStateChange(p1GatheringStateMock);
33
- peer1.onLocalDescription((sdp, type) => {
34
- p1SDPMock();
35
- peer2.setRemoteDescription(sdp, type);
36
- });
37
- peer1.onLocalCandidate((candidate, mid) => {
38
- p1CandidateMock();
39
- peer2.addRemoteCandidate(candidate, mid);
40
- });
41
-
42
- // Set Callbacks
43
- peer2.onStateChange(p2StateMock);
44
- peer2.onGatheringStateChange(p2GatheringStateMock);
45
- peer2.onLocalDescription((sdp, type) => {
46
- p2SDPMock();
47
- peer1.setRemoteDescription(sdp, type);
48
- });
49
- peer2.onLocalCandidate((candidate, mid) => {
50
- p2CandidateMock();
51
- peer1.addRemoteCandidate(candidate, mid);
52
- });
53
- peer2.onDataChannel((dc) => {
54
- p2DCMock();
55
- dc2 = dc;
56
- dc2.onMessage((msg) => {
57
- p2DCMessageMock(msg);
58
- dc2.sendMessage('Hello From Peer2');
59
- });
60
- });
61
-
62
- dc1 = peer1.createDataChannel('test-p2p');
63
- dc1.onOpen(() => {
64
- p1DCMock();
65
- dc1.sendMessage('Hello From Peer1');
66
- });
67
- dc1.onMessage((msg) => {
68
- p1DCMessageMock(msg);
69
- peer1.close();
70
- peer2.close();
71
-
72
- // State Callbacks
73
- expect(p1StateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
74
- expect(p1GatheringStateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
75
- expect(p2StateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
76
- expect(p2GatheringStateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
77
-
78
- // SDP
79
- expect(p1SDPMock.mock.calls.length).toBe(1);
80
- expect(p2SDPMock.mock.calls.length).toBe(1);
81
-
82
- // Candidates
83
- expect(p1CandidateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
84
- expect(p2CandidateMock.mock.calls.length).toBeGreaterThanOrEqual(1);
85
-
86
- // DataChannel
87
- expect(p1DCMock.mock.calls.length).toBe(1);
88
- expect(p1DCMessageMock.mock.calls.length).toBe(1);
89
- expect(p1DCMessageMock.mock.calls[0][0]).toEqual('Hello From Peer2');
90
- expect(p2DCMock.mock.calls.length).toBe(1);
91
-
92
- expect(p2DCMessageMock.mock.calls.length).toBe(1);
93
- expect(p2DCMessageMock.mock.calls[0][0]).toEqual('Hello From Peer1');
94
-
95
- done();
96
- });
97
- });
98
- });
99
- });
@@ -1,10 +0,0 @@
1
- import { expect } from '@jest/globals';
2
- import polyfill from '../../polyfill/index.js';
3
-
4
- describe('polyfill', () => {
5
- test('generateCertificate should throw', () => {
6
- expect(async () => {
7
- await polyfill.RTCPeerConnection.generateCertificate({});
8
- }).rejects.toEqual(new DOMException('Not implemented'));
9
- });
10
- });
@@ -1,48 +0,0 @@
1
- import * as nodeDataChannel from '../../lib';
2
-
3
- function waitForGathering(peer) {
4
- return new Promise((resolve) => {
5
- peer.onGatheringStateChange((state) => {
6
- if (state === 'complete') resolve();
7
- });
8
- // Handle race conditions where gathering has already completed
9
- if (peer.gatheringState() === 'complete') resolve();
10
-
11
- resolve();
12
- });
13
- }
14
-
15
- describe('DataChannel streams', () => {
16
- test('can build an echo pipeline', async () => {
17
- let clientPeer = new nodeDataChannel.PeerConnection('Client', { iceServers: [] });
18
- let echoPeer = new nodeDataChannel.PeerConnection('Client', { iceServers: [] });
19
-
20
- const echoStream = new nodeDataChannel.DataChannelStream(echoPeer.createDataChannel('echo-channel'));
21
- echoStream.pipe(echoStream); // Echo all received data back to the client
22
-
23
- await waitForGathering(echoPeer);
24
-
25
- const { sdp: echoDescSdp, type: echoDescType } = echoPeer.localDescription();
26
- clientPeer.setRemoteDescription(echoDescSdp, echoDescType);
27
- await waitForGathering(clientPeer);
28
-
29
- const { sdp: clientDescSdp, type: clientDescType } = clientPeer.localDescription();
30
- echoPeer.setRemoteDescription(clientDescSdp, clientDescType);
31
-
32
- const clientChannel = await new Promise((resolve) => clientPeer.onDataChannel(resolve));
33
-
34
- const clientResponsePromise = new Promise((resolve) => clientChannel.onMessage(resolve));
35
- clientChannel.sendMessage('test message');
36
-
37
- expect(await clientResponsePromise).toBe('test message');
38
-
39
- clientChannel.close();
40
- clientPeer.close();
41
- echoPeer.close();
42
- });
43
- });
44
-
45
- afterAll(() => {
46
- // Properly cleanup so Jest does not complain about asynchronous operations that weren't stopped.
47
- nodeDataChannel.cleanup();
48
- });
@@ -1,69 +0,0 @@
1
- import { jest } from '@jest/globals';
2
- import * as nodeDataChannel from '../../lib';
3
-
4
- describe('Websocket', () => {
5
- const webSocketServer = new nodeDataChannel.WebSocketServer({ bindAddress: '127.0.0.1', port: 1987 });
6
- const clientSocket = new nodeDataChannel.WebSocket();
7
-
8
- // Mocks
9
- const clientOnOpenMock = jest.fn();
10
- const clientOnMessageMock = jest.fn();
11
- const clientOnCLosedMock = jest.fn();
12
-
13
- const webServerOnClientMock = jest.fn();
14
- const webServerOnOpenMock = jest.fn();
15
- const webServerOnMessageMock = jest.fn();
16
- const webServerOnClosedMock = jest.fn();
17
-
18
- webSocketServer.onClient((serverSocket) => {
19
- webServerOnClientMock();
20
-
21
- serverSocket.onOpen(() => {
22
- webServerOnOpenMock();
23
- });
24
-
25
- serverSocket.onMessage((message) => {
26
- webServerOnMessageMock(message);
27
- serverSocket.sendMessage('reply to ' + message);
28
- serverSocket.close();
29
- });
30
-
31
- serverSocket.onClosed(() => {
32
- webServerOnClosedMock();
33
- serverSocket.close();
34
- });
35
- });
36
-
37
- test('can create a websocket client and connect to a server', (done) => {
38
- clientSocket.open('ws://127.0.0.1:1987');
39
- clientSocket.onOpen(() => {
40
- clientOnOpenMock();
41
- clientSocket.sendMessage('Hello');
42
- });
43
-
44
- clientSocket.onMessage((message) => {
45
- clientOnMessageMock(message);
46
- });
47
-
48
- clientSocket.onClosed(() => {
49
- clientOnCLosedMock();
50
- });
51
-
52
- setTimeout(() => {
53
- expect(clientOnMessageMock.mock.calls[0][0]).toEqual('reply to Hello');
54
- expect(clientOnOpenMock.mock.calls.length).toBe(1);
55
- expect(clientOnMessageMock.mock.calls.length).toBe(1);
56
- expect(clientOnCLosedMock.mock.calls.length).toBe(1);
57
-
58
- expect(webServerOnMessageMock.mock.calls[0][0]).toEqual('Hello');
59
- expect(webServerOnOpenMock.mock.calls.length).toBe(1);
60
- expect(webServerOnMessageMock.mock.calls.length).toBe(1);
61
- expect(webServerOnClosedMock.mock.calls.length).toBe(1);
62
-
63
- clientSocket.close();
64
- webSocketServer.stop();
65
-
66
- done();
67
- }, 3000);
68
- });
69
- });
@@ -1,89 +0,0 @@
1
- import polyfill from '../polyfill/index.js';
2
- import nodeDataChannel from '../lib/index.js';
3
-
4
- nodeDataChannel.initLogger('Info');
5
-
6
- let dc1 = null;
7
- let dc2 = null;
8
-
9
- let peer1 = new polyfill.RTCPeerConnection({
10
- peerIdentity: 'peer1',
11
- iceServers: [{ urls: ['stun:stun.l.google.com:19302'] }],
12
- });
13
-
14
- // Set Callbacks
15
- peer1.onconnectionstatechange = () => {
16
- console.log('Peer1 State:', peer1.connectionState);
17
- };
18
- peer1.oniceconnectionstatechange = () => {
19
- console.log('Peer1 IceState:', peer1.iceConnectionState);
20
- };
21
- peer1.onicegatheringstatechange = () => {
22
- console.log('Peer1 GatheringState:', peer1.iceGatheringState);
23
- };
24
- peer1.onicecandidate = (e) => {
25
- console.log('Peer1 Candidate:', e.candidate.candidate);
26
- peer2.addIceCandidate(e.candidate);
27
- };
28
-
29
- let peer2 = new polyfill.RTCPeerConnection({
30
- peerIdentity: 'peer2',
31
- iceServers: [{ urls: ['stun:stun.l.google.com:19302'] }],
32
- });
33
-
34
- // Set Callbacks
35
- peer2.onconnectionstatechange = () => {
36
- console.log('Peer2 State:', peer2.connectionState);
37
- };
38
- peer2.oniceconnectionstatechange = () => {
39
- console.log('Peer2 IceState:', peer2.iceConnectionState);
40
- };
41
- peer2.onicegatheringstatechange = () => {
42
- console.log('Peer2 GatheringState:', peer2.iceGatheringState);
43
- };
44
- peer2.onicecandidate = (e) => {
45
- console.log('Peer2 Candidate:', e.candidate.candidate);
46
- peer1.addIceCandidate(e.candidate);
47
- };
48
- peer2.ondatachannel = (dce) => {
49
- console.log('Peer2 Got DataChannel: ', dce.channel.label);
50
- dc2 = dce.channel;
51
- dc2.onmessage = (msg) => {
52
- console.log('Peer2 Received Msg:', msg.data.toString());
53
- };
54
- dc2.send('Hello From Peer2');
55
- dc2.onclose = () => {
56
- console.log('dc2 closed');
57
- };
58
- };
59
-
60
- dc1 = peer1.createDataChannel('test');
61
- dc1.onopen = () => {
62
- dc1.send('Hello from Peer1');
63
- };
64
- dc1.onmessage = (msg) => {
65
- console.log('Peer1 Received Msg:', msg.data.toString());
66
- };
67
- dc1.onclose = () => {
68
- console.log('dc1 closed');
69
- };
70
-
71
- peer1
72
- .createOffer({})
73
- .then((desc) => {
74
- // console.log(122222, desc);
75
- peer2.setRemoteDescription(desc);
76
- })
77
- .catch((err) => console.error(err));
78
-
79
- peer2
80
- .createAnswer({})
81
- .then((answerDesc) => {
82
- peer1.setRemoteDescription(answerDesc);
83
- })
84
- .catch((err) => console.error("Couldn't create answer", err));
85
-
86
- setTimeout(() => {
87
- peer1.close();
88
- peer2.close();
89
- }, 5 * 1000);
@@ -1,50 +0,0 @@
1
- import nodeDataChannel from '../lib/index.js';
2
-
3
- nodeDataChannel.initLogger('Debug');
4
- nodeDataChannel.preload();
5
-
6
- const webSocketServer = new nodeDataChannel.WebSocketServer({ bindAddress: '127.0.0.1', port: 1987 });
7
-
8
- webSocketServer.onClient((serverSocket) => {
9
- console.log(
10
- 'webSocketServer.onClient() remoteAddress: ' + serverSocket.remoteAddress() + ', path: ' + serverSocket.path(),
11
- );
12
-
13
- serverSocket.onOpen(() => {
14
- console.log('serverSocket.onOpen()');
15
- });
16
-
17
- serverSocket.onMessage((message) => {
18
- console.log('serverSocket.onMessage():', message);
19
- serverSocket.sendMessage('reply to ' + message);
20
- });
21
-
22
- serverSocket.onClosed(() => {
23
- console.log('serverSocket.onClosed()');
24
- serverSocket.close();
25
- });
26
- });
27
-
28
- const clientSocket = new nodeDataChannel.WebSocket();
29
-
30
- clientSocket.onOpen(() => {
31
- console.log('clientSocket.onOpen()');
32
- clientSocket.sendMessage('Hello');
33
- });
34
-
35
- clientSocket.onMessage((message) => {
36
- console.log('clientSocket.onMessage():', message);
37
- clientSocket.forceClose();
38
- webSocketServer.stop();
39
- });
40
-
41
- clientSocket.onClosed(() => {
42
- console.log('clientSocket.onClosed()');
43
- clientSocket.close();
44
- });
45
-
46
- clientSocket.open('ws://127.0.0.1:1987');
47
-
48
- setTimeout(() => {
49
- nodeDataChannel.cleanup();
50
- }, 1000);
@@ -1,46 +0,0 @@
1
- # Setup (First time usage)
2
-
3
- > cd test/wpt-tests
4
-
5
- > npm i
6
-
7
- > git submodule update --init --recursive --depth 1
8
-
9
- > cd wpt
10
-
11
- > ./wpt make-hosts-file | sudo tee -a /etc/hosts
12
-
13
- After your hosts file is configured, the servers will be locally accessible at:
14
-
15
- http://web-platform.test:8000/
16
-
17
- https://web-platform.test:8443/ \*
18
-
19
- To use the web-based runner point your browser to:
20
-
21
- http://web-platform.test:8000/tools/runner/index.html
22
-
23
- https://web-platform.test:8443/tools/runner/index.html \*
24
-
25
- # Running Tests
26
-
27
- > npm run test
28
-
29
- OR
30
-
31
- > npm run:wpt (Let this run)
32
-
33
- > npm run:test (In an other console)
34
-
35
- The files that tested are listed in `wpt-test-list.js`. The commented lines need still to be one-by-one tested and uncommented.
36
-
37
- Contributions are welcome!
38
-
39
- # Run a test for Chrome
40
-
41
- ./wpt run chrome /webrtc/RTCPeerConnection-addIceCandidate.html
42
-
43
- # Latest Test Results
44
-
45
- Please check [last-test-results.md](./last-test-results.md) page
46
-