node-datachannel 0.27.0 → 0.28.0

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 (96) hide show
  1. package/.eslintrc.json +25 -25
  2. package/.prettierignore +4 -0
  3. package/.prettierrc +1 -0
  4. package/API.md +4 -4
  5. package/BULDING.md +11 -2
  6. package/CMakeLists.txt +9 -4
  7. package/README.md +22 -18
  8. package/dist/cjs/index.cjs.map +1 -1
  9. package/dist/cjs/lib/datachannel-stream.cjs +13 -13
  10. package/dist/cjs/lib/datachannel-stream.cjs.map +1 -1
  11. package/dist/cjs/lib/index.cjs.map +1 -1
  12. package/dist/cjs/lib/websocket-server.cjs.map +1 -1
  13. package/dist/cjs/lib/websocket.cjs.map +1 -1
  14. package/dist/cjs/polyfill/Events.cjs +52 -3
  15. package/dist/cjs/polyfill/Events.cjs.map +1 -1
  16. package/dist/cjs/polyfill/Exception.cjs.map +1 -1
  17. package/dist/cjs/polyfill/RTCCertificate.cjs +5 -2
  18. package/dist/cjs/polyfill/RTCCertificate.cjs.map +1 -1
  19. package/dist/cjs/polyfill/RTCDataChannel.cjs +27 -19
  20. package/dist/cjs/polyfill/RTCDataChannel.cjs.map +1 -1
  21. package/dist/cjs/polyfill/RTCDtlsTransport.cjs +6 -5
  22. package/dist/cjs/polyfill/RTCDtlsTransport.cjs.map +1 -1
  23. package/dist/cjs/polyfill/RTCError.cjs +9 -2
  24. package/dist/cjs/polyfill/RTCError.cjs.map +1 -1
  25. package/dist/cjs/polyfill/RTCIceCandidate.cjs +13 -8
  26. package/dist/cjs/polyfill/RTCIceCandidate.cjs.map +1 -1
  27. package/dist/cjs/polyfill/RTCIceTransport.cjs +26 -16
  28. package/dist/cjs/polyfill/RTCIceTransport.cjs.map +1 -1
  29. package/dist/cjs/polyfill/RTCPeerConnection.cjs +80 -70
  30. package/dist/cjs/polyfill/RTCPeerConnection.cjs.map +1 -1
  31. package/dist/cjs/polyfill/RTCSctpTransport.cjs +9 -11
  32. package/dist/cjs/polyfill/RTCSctpTransport.cjs.map +1 -1
  33. package/dist/cjs/polyfill/RTCSessionDescription.cjs +10 -2
  34. package/dist/cjs/polyfill/RTCSessionDescription.cjs.map +1 -1
  35. package/dist/cjs/polyfill/index.cjs.map +1 -1
  36. package/dist/esm/index.mjs.map +1 -1
  37. package/dist/esm/lib/datachannel-stream.mjs.map +1 -1
  38. package/dist/esm/lib/index.mjs.map +1 -1
  39. package/dist/esm/lib/websocket-server.mjs.map +1 -1
  40. package/dist/esm/lib/websocket.mjs.map +1 -1
  41. package/dist/esm/polyfill/Events.mjs +52 -4
  42. package/dist/esm/polyfill/Events.mjs.map +1 -1
  43. package/dist/esm/polyfill/Exception.mjs.map +1 -1
  44. package/dist/esm/polyfill/RTCCertificate.mjs +5 -2
  45. package/dist/esm/polyfill/RTCCertificate.mjs.map +1 -1
  46. package/dist/esm/polyfill/RTCDataChannel.mjs +27 -19
  47. package/dist/esm/polyfill/RTCDataChannel.mjs.map +1 -1
  48. package/dist/esm/polyfill/RTCDtlsTransport.mjs +6 -5
  49. package/dist/esm/polyfill/RTCDtlsTransport.mjs.map +1 -1
  50. package/dist/esm/polyfill/RTCError.mjs +9 -2
  51. package/dist/esm/polyfill/RTCError.mjs.map +1 -1
  52. package/dist/esm/polyfill/RTCIceCandidate.mjs +13 -8
  53. package/dist/esm/polyfill/RTCIceCandidate.mjs.map +1 -1
  54. package/dist/esm/polyfill/RTCIceTransport.mjs +26 -17
  55. package/dist/esm/polyfill/RTCIceTransport.mjs.map +1 -1
  56. package/dist/esm/polyfill/RTCPeerConnection.mjs +80 -70
  57. package/dist/esm/polyfill/RTCPeerConnection.mjs.map +1 -1
  58. package/dist/esm/polyfill/RTCSctpTransport.mjs +9 -11
  59. package/dist/esm/polyfill/RTCSctpTransport.mjs.map +1 -1
  60. package/dist/esm/polyfill/RTCSessionDescription.mjs +10 -2
  61. package/dist/esm/polyfill/RTCSessionDescription.mjs.map +1 -1
  62. package/dist/esm/polyfill/index.mjs.map +1 -1
  63. package/dist/types/lib/types.d.ts +6 -6
  64. package/dist/types/polyfill/Events.d.ts +4 -1
  65. package/dist/types/polyfill/RTCCertificate.d.ts +1 -0
  66. package/dist/types/polyfill/RTCDataChannel.d.ts +6 -6
  67. package/dist/types/polyfill/RTCDtlsTransport.d.ts +5 -4
  68. package/dist/types/polyfill/RTCError.d.ts +1 -0
  69. package/dist/types/polyfill/RTCIceCandidate.d.ts +1 -1
  70. package/dist/types/polyfill/RTCIceTransport.d.ts +17 -8
  71. package/dist/types/polyfill/RTCPeerConnection.d.ts +22 -11
  72. package/dist/types/polyfill/RTCSctpTransport.d.ts +4 -3
  73. package/dist/types/polyfill/RTCSessionDescription.d.ts +1 -0
  74. package/jest.config.ts +8 -8
  75. package/package.json +4 -2
  76. package/rollup.config.mjs +1 -1
  77. package/src/cpp/data-channel-wrapper.cpp +11 -0
  78. package/src/index.ts +0 -1
  79. package/src/lib/datachannel-stream.ts +83 -84
  80. package/src/lib/index.ts +163 -140
  81. package/src/lib/types.ts +97 -72
  82. package/src/lib/websocket-server.ts +25 -25
  83. package/src/lib/websocket.ts +19 -19
  84. package/src/polyfill/Events.ts +67 -17
  85. package/src/polyfill/Exception.ts +24 -24
  86. package/src/polyfill/README.md +8 -8
  87. package/src/polyfill/RTCCertificate.ts +16 -12
  88. package/src/polyfill/RTCDataChannel.ts +198 -192
  89. package/src/polyfill/RTCDtlsTransport.ts +39 -39
  90. package/src/polyfill/RTCError.ts +63 -56
  91. package/src/polyfill/RTCIceCandidate.ts +120 -116
  92. package/src/polyfill/RTCIceTransport.ts +72 -64
  93. package/src/polyfill/RTCPeerConnection.ts +436 -420
  94. package/src/polyfill/RTCSctpTransport.ts +44 -47
  95. package/src/polyfill/RTCSessionDescription.ts +26 -17
  96. package/src/polyfill/index.ts +22 -22
@@ -10,31 +10,30 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
10
10
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
11
11
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
12
12
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
13
- var _pc, _extraFunctions, _transport;
13
+ var _pc, _transport;
14
14
  class RTCSctpTransport extends EventTarget {
15
15
  constructor(initial) {
16
16
  super();
17
17
  __privateAdd(this, _pc, null);
18
- __privateAdd(this, _extraFunctions, null);
19
18
  __privateAdd(this, _transport, null);
20
19
  __publicField(this, "onstatechange", null);
21
20
  __privateSet(this, _pc, initial.pc);
22
- __privateSet(this, _extraFunctions, initial.extraFunctions);
23
- __privateSet(this, _transport, new RTCDtlsTransport({ pc: initial.pc, extraFunctions: initial.extraFunctions }));
21
+ __privateSet(this, _transport, new RTCDtlsTransport({
22
+ pc: initial.pc
23
+ }));
24
24
  __privateGet(this, _pc).addEventListener("connectionstatechange", () => {
25
- this.dispatchEvent(new Event("statechange"));
26
- });
27
- this.addEventListener("statechange", (e) => {
28
- if (this.onstatechange) this.onstatechange(e);
25
+ const e = new Event("statechange");
26
+ this.dispatchEvent(e);
27
+ this.onstatechange?.(e);
29
28
  });
30
29
  }
31
30
  get maxChannels() {
32
31
  if (this.state !== "connected") return null;
33
- return __privateGet(this, _pc) ? __privateGet(this, _extraFunctions).maxDataChannelId() : 0;
32
+ return __privateGet(this, _pc).ext_maxDataChannelId;
34
33
  }
35
34
  get maxMessageSize() {
36
35
  if (this.state !== "connected") return null;
37
- return __privateGet(this, _pc) ? __privateGet(this, _extraFunctions).maxMessageSize() : 0;
36
+ return __privateGet(this, _pc)?.ext_maxMessageSize ?? 65536;
38
37
  }
39
38
  get state() {
40
39
  let state = __privateGet(this, _pc).connectionState;
@@ -50,7 +49,6 @@ class RTCSctpTransport extends EventTarget {
50
49
  }
51
50
  }
52
51
  _pc = new WeakMap();
53
- _extraFunctions = new WeakMap();
54
52
  _transport = new WeakMap();
55
53
 
56
54
  export { RTCSctpTransport as default };
@@ -1 +1 @@
1
- {"version":3,"file":"RTCSctpTransport.mjs","sources":["../../../src/polyfill/RTCSctpTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCDtlsTransport from './RTCDtlsTransport';\n\nexport default class RTCSctpTransport extends EventTarget implements globalThis.RTCSctpTransport {\n #pc: globalThis.RTCPeerConnection = null;\n #extraFunctions = null;\n #transport: globalThis.RTCDtlsTransport = null;\n\n onstatechange: ((this: globalThis.RTCSctpTransport, ev: Event) => any) | null = null;\n\n constructor(initial: { pc: globalThis.RTCPeerConnection, extraFunctions }) {\n super();\n this.#pc = initial.pc;\n this.#extraFunctions = initial.extraFunctions;\n\n this.#transport = new RTCDtlsTransport({ pc: initial.pc, extraFunctions: initial.extraFunctions });\n\n // forward peerConnection events\n this.#pc.addEventListener('connectionstatechange', () => {\n this.dispatchEvent(new Event('statechange'));\n });\n\n // forward events to properties\n this.addEventListener('statechange', (e) => {\n if (this.onstatechange) this.onstatechange(e);\n });\n }\n\n get maxChannels(): number | null {\n if (this.state !== 'connected') return null;\n return this.#pc ? this.#extraFunctions.maxDataChannelId() : 0;\n }\n\n get maxMessageSize(): number {\n if (this.state !== 'connected') return null;\n return this.#pc ? this.#extraFunctions.maxMessageSize() : 0;\n }\n\n get state(): globalThis.RTCSctpTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCSctpTransport states connecting, connected, closed\n let state = this.#pc.connectionState;\n if (state === 'new' || state === 'connecting') {\n state = 'connecting';\n } else if (state === 'disconnected' || state === 'failed' || state === 'closed') {\n state = 'closed';\n }\n return state;\n }\n\n get transport(): globalThis.RTCDtlsTransport {\n return this.#transport;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,eAAA,EAAA,UAAA,CAAA;AAGA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAO7F,YAAY,OAA+D,EAAA;AACvE,IAAM,KAAA,EAAA,CAAA;AAPV,IAAoC,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACpC,IAAkB,YAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAClB,IAA0C,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,IAAA,CAAA,CAAA;AAE1C,IAAgF,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAI5E,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,OAAQ,CAAA,EAAA,CAAA,CAAA;AACnB,IAAA,YAAA,CAAA,IAAA,EAAK,iBAAkB,OAAQ,CAAA,cAAA,CAAA,CAAA;AAE/B,IAAK,YAAA,CAAA,IAAA,EAAA,UAAA,EAAa,IAAI,gBAAA,CAAiB,EAAE,EAAA,EAAI,QAAQ,EAAI,EAAA,cAAA,EAAgB,OAAQ,CAAA,cAAA,EAAgB,CAAA,CAAA,CAAA;AAGjG,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACrD,MAAA,IAAA,CAAK,aAAc,CAAA,IAAI,KAAM,CAAA,aAAa,CAAC,CAAA,CAAA;AAAA,KAC9C,CAAA,CAAA;AAGD,IAAK,IAAA,CAAA,gBAAA,CAAiB,aAAe,EAAA,CAAC,CAAM,KAAA;AACxC,MAAA,IAAI,IAAK,CAAA,aAAA,EAAoB,IAAA,CAAA,aAAA,CAAc,CAAC,CAAA,CAAA;AAAA,KAC/C,CAAA,CAAA;AAAA,GACL;AAAA,EAEA,IAAI,WAA6B,GAAA;AAC7B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,GAAA,CAAA,GAAM,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,kBAAqB,GAAA,CAAA,CAAA;AAAA,GAChE;AAAA,EAEA,IAAI,cAAyB,GAAA;AACzB,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,GAAA,CAAA,GAAM,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA,CAAgB,gBAAmB,GAAA,CAAA,CAAA;AAAA,GAC9D;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG1C,IAAI,IAAA,KAAA,GAAQ,mBAAK,GAAI,CAAA,CAAA,eAAA,CAAA;AACrB,IAAI,IAAA,KAAA,KAAU,KAAS,IAAA,KAAA,KAAU,YAAc,EAAA;AAC3C,MAAQ,KAAA,GAAA,YAAA,CAAA;AAAA,eACD,KAAU,KAAA,cAAA,IAAkB,KAAU,KAAA,QAAA,IAAY,UAAU,QAAU,EAAA;AAC7E,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACZ;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAAA,EAEA,IAAI,SAAyC,GAAA;AACzC,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAAA,GAChB;AACJ,CAAA;AAjDI,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,eAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
1
+ {"version":3,"file":"RTCSctpTransport.mjs","sources":["../../../src/polyfill/RTCSctpTransport.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport RTCDtlsTransport from './RTCDtlsTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\n\nexport default class RTCSctpTransport extends EventTarget implements globalThis.RTCSctpTransport {\n #pc: RTCPeerConnection = null;\n #transport: globalThis.RTCDtlsTransport = null;\n\n onstatechange: globalThis.RTCSctpTransport['onstatechange'] = null;\n\n constructor(initial: { pc: RTCPeerConnection }) {\n super();\n this.#pc = initial.pc;\n\n this.#transport = new RTCDtlsTransport({\n pc: initial.pc\n });\n\n this.#pc.addEventListener('connectionstatechange', () => {\n const e = new Event('statechange');\n this.dispatchEvent(e);\n this.onstatechange?.(e);\n });\n }\n\n get maxChannels(): number | null {\n if (this.state !== 'connected') return null;\n return this.#pc.ext_maxDataChannelId;\n }\n\n get maxMessageSize(): number {\n if (this.state !== 'connected') return null;\n return this.#pc?.ext_maxMessageSize ?? 65536;;\n }\n\n get state(): globalThis.RTCSctpTransportState {\n // reduce state from new, connecting, connected, disconnected, failed, closed, unknown\n // to RTCSctpTransport states connecting, connected, closed\n let state = this.#pc.connectionState;\n if (state === 'new' || state === 'connecting') {\n state = 'connecting';\n } else if (state === 'disconnected' || state === 'failed' || state === 'closed') {\n state = 'closed';\n }\n return state;\n }\n\n get transport(): globalThis.RTCDtlsTransport {\n return this.#transport;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAAA,IAAA,GAAA,EAAA,UAAA,CAAA;AAIA,MAAqB,yBAAyB,WAAmD,CAAA;AAAA,EAM/F,YAAY,OAAoC,EAAA;AAC9C,IAAM,KAAA,EAAA,CAAA;AANR,IAAyB,YAAA,CAAA,IAAA,EAAA,GAAA,EAAA,IAAA,CAAA,CAAA;AACzB,IAA0C,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,IAAA,CAAA,CAAA;AAE1C,IAA8D,aAAA,CAAA,IAAA,EAAA,eAAA,EAAA,IAAA,CAAA,CAAA;AAI5D,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,OAAQ,CAAA,EAAA,CAAA,CAAA;AAEnB,IAAK,YAAA,CAAA,IAAA,EAAA,UAAA,EAAa,IAAI,gBAAiB,CAAA;AAAA,MACrC,IAAI,OAAQ,CAAA,EAAA;AAAA,KACb,CAAA,CAAA,CAAA;AAED,IAAK,YAAA,CAAA,IAAA,EAAA,GAAA,CAAA,CAAI,gBAAiB,CAAA,uBAAA,EAAyB,MAAM;AACvD,MAAM,MAAA,CAAA,GAAI,IAAI,KAAA,CAAM,aAAa,CAAA,CAAA;AACjC,MAAA,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA;AACpB,MAAA,IAAA,CAAK,gBAAgB,CAAC,CAAA,CAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,IAAI,WAA6B,GAAA;AAC/B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAA,OAAO,mBAAK,GAAI,CAAA,CAAA,oBAAA,CAAA;AAAA,GAClB;AAAA,EAEA,IAAI,cAAyB,GAAA;AAC3B,IAAI,IAAA,IAAA,CAAK,KAAU,KAAA,WAAA,EAAoB,OAAA,IAAA,CAAA;AACvC,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,MAAK,kBAAsB,IAAA,KAAA,CAAA;AAAM,GAC/C;AAAA,EAEA,IAAI,KAA0C,GAAA;AAG5C,IAAI,IAAA,KAAA,GAAQ,mBAAK,GAAI,CAAA,CAAA,eAAA,CAAA;AACrB,IAAI,IAAA,KAAA,KAAU,KAAS,IAAA,KAAA,KAAU,YAAc,EAAA;AAC7C,MAAQ,KAAA,GAAA,YAAA,CAAA;AAAA,eACC,KAAU,KAAA,cAAA,IAAkB,KAAU,KAAA,QAAA,IAAY,UAAU,QAAU,EAAA;AAC/E,MAAQ,KAAA,GAAA,QAAA,CAAA;AAAA,KACV;AACA,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AAAA,EAEA,IAAI,SAAyC,GAAA;AAC3C,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAA;AAAA,GACd;AACF,CAAA;AA7CE,GAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -10,12 +10,20 @@ class RTCSessionDescription {
10
10
  constructor(init) {
11
11
  __privateAdd(this, _type);
12
12
  __privateAdd(this, _sdp);
13
- __privateSet(this, _type, init ? init.type : null);
14
- __privateSet(this, _sdp, init ? init.sdp : null);
13
+ __privateSet(this, _type, init?.type);
14
+ __privateSet(this, _sdp, init?.sdp ?? "");
15
15
  }
16
16
  get type() {
17
17
  return __privateGet(this, _type);
18
18
  }
19
+ set type(type) {
20
+ if (type !== "offer" && type !== "answer" && type !== "pranswer" && type !== "rollback") {
21
+ throw new TypeError(
22
+ `Failed to set the 'type' property on 'RTCSessionDescription': The provided value '${type}' is not a valid enum value of type RTCSdpType.`
23
+ );
24
+ }
25
+ __privateSet(this, _type, type);
26
+ }
19
27
  get sdp() {
20
28
  return __privateGet(this, _sdp);
21
29
  }
@@ -1 +1 @@
1
- {"version":3,"file":"RTCSessionDescription.mjs","sources":["../../../src/polyfill/RTCSessionDescription.ts"],"sourcesContent":["// https://developer.mozilla.org/docs/Web/API/RTCSessionDescription\n//\n// Example usage\n// const init = {\n// type: 'offer',\n// sdp: 'v=0\\r\\no=- 1234567890 1234567890 IN IP4 192.168.1.1\\r\\ns=-\\r\\nt=0 0\\r\\na=ice-ufrag:abcd\\r\\na=ice-pwd:efgh\\r\\n'\n// };\n\nexport default class RTCSessionDescription implements globalThis.RTCSessionDescriptionInit {\n #type: globalThis.RTCSdpType;\n #sdp: string;\n\n constructor(init: globalThis.RTCSessionDescriptionInit) {\n this.#type = init ? init.type : null;\n this.#sdp = init ? init.sdp : null;\n }\n\n get type(): globalThis.RTCSdpType {\n return this.#type;\n }\n\n get sdp(): string {\n return this.#sdp;\n }\n\n toJSON(): globalThis.RTCSessionDescriptionInit {\n return {\n sdp: this.#sdp,\n type: this.#type,\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;AAAA,IAAA,KAAA,EAAA,IAAA,CAAA;AAQA,MAAqB,qBAAsE,CAAA;AAAA,EAIvF,YAAY,IAA4C,EAAA;AAHxD,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AAGI,IAAK,YAAA,CAAA,IAAA,EAAA,KAAA,EAAQ,IAAO,GAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA,CAAA;AAChC,IAAK,YAAA,CAAA,IAAA,EAAA,IAAA,EAAO,IAAO,GAAA,IAAA,CAAK,GAAM,GAAA,IAAA,CAAA,CAAA;AAAA,GAClC;AAAA,EAEA,IAAI,IAA8B,GAAA;AAC9B,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,GAAc,GAAA;AACd,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AAAA,GAChB;AAAA,EAEA,MAA+C,GAAA;AAC3C,IAAO,OAAA;AAAA,MACH,KAAK,YAAK,CAAA,IAAA,EAAA,IAAA,CAAA;AAAA,MACV,MAAM,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,KACf,CAAA;AAAA,GACJ;AACJ,CAAA;AAtBI,KAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,IAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
1
+ {"version":3,"file":"RTCSessionDescription.mjs","sources":["../../../src/polyfill/RTCSessionDescription.ts"],"sourcesContent":["// https://developer.mozilla.org/docs/Web/API/RTCSessionDescription\n//\n// Example usage\n// const init = {\n// type: 'offer',\n// sdp: 'v=0\\r\\no=- 1234567890 1234567890 IN IP4 192.168.1.1\\r\\ns=-\\r\\nt=0 0\\r\\na=ice-ufrag:abcd\\r\\na=ice-pwd:efgh\\r\\n'\n// };\n\nexport default class RTCSessionDescription implements globalThis.RTCSessionDescriptionInit {\n #type: globalThis.RTCSdpType;\n #sdp: string;\n\n constructor(init: globalThis.RTCSessionDescriptionInit) {\n this.#type = init?.type;\n this.#sdp = init?.sdp ?? '';\n }\n\n get type(): globalThis.RTCSdpType {\n return this.#type;\n }\n\n set type(type) {\n if (type !== 'offer' && type !== 'answer' && type !== 'pranswer' && type !== 'rollback') {\n throw new TypeError(\n `Failed to set the 'type' property on 'RTCSessionDescription': The provided value '${type}' is not a valid enum value of type RTCSdpType.`,\n );\n }\n this.#type = type;\n }\n\n get sdp(): string {\n return this.#sdp;\n }\n\n toJSON(): globalThis.RTCSessionDescriptionInit {\n return {\n sdp: this.#sdp,\n type: this.#type,\n };\n }\n}\n"],"names":[],"mappings":";;;;;;;AAAA,IAAA,KAAA,EAAA,IAAA,CAAA;AAQA,MAAqB,qBAAsE,CAAA;AAAA,EAIzF,YAAY,IAA4C,EAAA;AAHxD,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AAGE,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,IAAM,EAAA,IAAA,CAAA,CAAA;AACnB,IAAK,YAAA,CAAA,IAAA,EAAA,IAAA,EAAO,MAAM,GAAO,IAAA,EAAA,CAAA,CAAA;AAAA,GAC3B;AAAA,EAEA,IAAI,IAA8B,GAAA;AAChC,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,KAAK,IAAM,EAAA;AACb,IAAA,IAAI,SAAS,OAAW,IAAA,IAAA,KAAS,YAAY,IAAS,KAAA,UAAA,IAAc,SAAS,UAAY,EAAA;AACvF,MAAA,MAAM,IAAI,SAAA;AAAA,QACR,qFAAqF,IAAI,CAAA,+CAAA,CAAA;AAAA,OAC3F,CAAA;AAAA,KACF;AACA,IAAA,YAAA,CAAA,IAAA,EAAK,KAAQ,EAAA,IAAA,CAAA,CAAA;AAAA,GACf;AAAA,EAEA,IAAI,GAAc,GAAA;AAChB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,IAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,MAA+C,GAAA;AAC7C,IAAO,OAAA;AAAA,MACL,KAAK,YAAK,CAAA,IAAA,EAAA,IAAA,CAAA;AAAA,MACV,MAAM,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,KACb,CAAA;AAAA,GACF;AACF,CAAA;AA/BE,KAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,IAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../src/polyfill/index.ts"],"sourcesContent":["import RTCCertificate from './RTCCertificate';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCDtlsTransport from './RTCDtlsTransport';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport RTCIceTransport from './RTCIceTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\nimport RTCSctpTransport from './RTCSctpTransport';\nimport RTCSessionDescription from './RTCSessionDescription';\nimport { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events';\nimport RTCError from './RTCError';\n\nexport {\n RTCCertificate,\n RTCDataChannel,\n RTCDtlsTransport,\n RTCIceCandidate,\n RTCIceTransport,\n RTCPeerConnection,\n RTCSctpTransport,\n RTCSessionDescription,\n RTCDataChannelEvent,\n RTCPeerConnectionIceEvent,\n RTCError,\n};\n\nexport default {\n RTCCertificate,\n RTCDataChannel,\n RTCDtlsTransport,\n RTCIceCandidate,\n RTCIceTransport,\n RTCPeerConnection,\n RTCSctpTransport,\n RTCSessionDescription,\n RTCDataChannelEvent,\n RTCPeerConnectionIceEvent,\n RTCError,\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAyBA,QAAe;AAAA,EACX,cAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,mBAAA;AAAA,EACA,yBAAA;AAAA,EACA,QAAA;AACJ,CAAA;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../src/polyfill/index.ts"],"sourcesContent":["import RTCCertificate from './RTCCertificate';\nimport RTCDataChannel from './RTCDataChannel';\nimport RTCDtlsTransport from './RTCDtlsTransport';\nimport RTCIceCandidate from './RTCIceCandidate';\nimport RTCIceTransport from './RTCIceTransport';\nimport RTCPeerConnection from './RTCPeerConnection';\nimport RTCSctpTransport from './RTCSctpTransport';\nimport RTCSessionDescription from './RTCSessionDescription';\nimport { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events';\nimport RTCError from './RTCError';\n\nexport {\n RTCCertificate,\n RTCDataChannel,\n RTCDtlsTransport,\n RTCIceCandidate,\n RTCIceTransport,\n RTCPeerConnection,\n RTCSctpTransport,\n RTCSessionDescription,\n RTCDataChannelEvent,\n RTCPeerConnectionIceEvent,\n RTCError,\n};\n\nexport default {\n RTCCertificate,\n RTCDataChannel,\n RTCDtlsTransport,\n RTCIceCandidate,\n RTCIceTransport,\n RTCPeerConnection,\n RTCSctpTransport,\n RTCSessionDescription,\n RTCDataChannelEvent,\n RTCPeerConnectionIceEvent,\n RTCError,\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAyBA,QAAe;AAAA,EACb,cAAA;AAAA,EACA,cAAA;AAAA,EACA,gBAAA;AAAA,EACA,eAAA;AAAA,EACA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,gBAAA;AAAA,EACA,qBAAA;AAAA,EACA,mBAAA;AAAA,EACA,yBAAA;AAAA,EACA,QAAA;AACF,CAAA;;;;"}
@@ -65,12 +65,12 @@ interface RtcConfig {
65
65
  }
66
66
  type DescriptionType = 'unspec' | 'offer' | 'answer' | 'pranswer' | 'rollback';
67
67
  type RTCSdpType = 'answer' | 'offer' | 'pranswer' | 'rollback';
68
- type RTCIceTransportState = "checking" | "closed" | "completed" | "connected" | "disconnected" | "failed" | "new";
69
- type RTCPeerConnectionState = "closed" | "connected" | "connecting" | "disconnected" | "failed" | "new";
70
- type RTCIceConnectionState = "checking" | "closed" | "completed" | "connected" | "disconnected" | "failed" | "new";
71
- type RTCIceGathererState = "complete" | "gathering" | "new";
72
- type RTCIceGatheringState = "complete" | "gathering" | "new";
73
- type RTCSignalingState = "closed" | "have-local-offer" | "have-local-pranswer" | "have-remote-offer" | "have-remote-pranswer" | "stable";
68
+ type RTCIceTransportState = 'checking' | 'closed' | 'completed' | 'connected' | 'disconnected' | 'failed' | 'new';
69
+ type RTCPeerConnectionState = 'closed' | 'connected' | 'connecting' | 'disconnected' | 'failed' | 'new';
70
+ type RTCIceConnectionState = 'checking' | 'closed' | 'completed' | 'connected' | 'disconnected' | 'failed' | 'new';
71
+ type RTCIceGathererState = 'complete' | 'gathering' | 'new';
72
+ type RTCIceGatheringState = 'complete' | 'gathering' | 'new';
73
+ type RTCSignalingState = 'closed' | 'have-local-offer' | 'have-local-pranswer' | 'have-remote-offer' | 'have-remote-pranswer' | 'stable';
74
74
  interface DataChannelInitConfig {
75
75
  protocol?: string;
76
76
  negotiated?: boolean;
@@ -1,12 +1,15 @@
1
+ import RTCDataChannel from './RTCDataChannel.js';
2
+
1
3
  declare class RTCPeerConnectionIceEvent extends Event implements globalThis.RTCPeerConnectionIceEvent {
2
4
  #private;
3
5
  constructor(candidate: globalThis.RTCIceCandidate);
4
6
  get candidate(): globalThis.RTCIceCandidate;
7
+ get url(): string;
5
8
  }
6
9
  declare class RTCDataChannelEvent extends Event implements globalThis.RTCDataChannelEvent {
7
10
  #private;
8
11
  constructor(type: string, eventInitDict: globalThis.RTCDataChannelEventInit);
9
- get channel(): globalThis.RTCDataChannel;
12
+ get channel(): RTCDataChannel;
10
13
  }
11
14
 
12
15
  export { RTCDataChannelEvent, RTCPeerConnectionIceEvent };
@@ -3,6 +3,7 @@ declare class RTCCertificate implements globalThis.RTCCertificate {
3
3
  constructor();
4
4
  get expires(): number;
5
5
  getFingerprints(): globalThis.RTCDtlsFingerprint[];
6
+ getAlgorithm(): string;
6
7
  }
7
8
 
8
9
  export { RTCCertificate as default };
@@ -2,12 +2,12 @@ import { DataChannel } from '../lib/index';
2
2
 
3
3
  declare class RTCDataChannel extends EventTarget implements globalThis.RTCDataChannel {
4
4
  #private;
5
- onbufferedamountlow: ((this: globalThis.RTCDataChannel, ev: Event) => any) | null;
6
- onclose: ((this: globalThis.RTCDataChannel, ev: Event) => any) | null;
7
- onclosing: ((this: globalThis.RTCDataChannel, ev: Event) => any) | null;
8
- onerror: ((this: globalThis.RTCDataChannel, ev: Event) => any) | null;
9
- onmessage: ((this: globalThis.RTCDataChannel, ev: MessageEvent) => any) | null;
10
- onopen: ((this: globalThis.RTCDataChannel, ev: Event) => any) | null;
5
+ onbufferedamountlow: globalThis.RTCDataChannel['onbufferedamountlow'];
6
+ onclose: globalThis.RTCDataChannel['onclose'];
7
+ onclosing: globalThis.RTCDataChannel['onclosing'];
8
+ onerror: globalThis.RTCDataChannel['onerror'];
9
+ onmessage: globalThis.RTCDataChannel['onmessage'];
10
+ onopen: globalThis.RTCDataChannel['onopen'];
11
11
  constructor(dataChannel: DataChannel, opts?: globalThis.RTCDataChannelInit);
12
12
  set binaryType(type: BinaryType);
13
13
  get binaryType(): BinaryType;
@@ -1,10 +1,11 @@
1
+ import RTCPeerConnection from './RTCPeerConnection.js';
2
+
1
3
  declare class RTCDtlsTransport extends EventTarget implements globalThis.RTCDtlsTransport {
2
4
  #private;
3
- onstatechange: ((this: globalThis.RTCDtlsTransport, ev: Event) => any) | null;
4
- onerror: ((this: globalThis.RTCDtlsTransport, ev: Event) => any) | null;
5
+ onstatechange: globalThis.RTCDtlsTransport['onstatechange'];
6
+ onerror: globalThis.RTCDtlsTransport['onstatechange'];
5
7
  constructor(init: {
6
- pc: globalThis.RTCPeerConnection;
7
- extraFunctions: any;
8
+ pc: RTCPeerConnection;
8
9
  });
9
10
  get iceTransport(): globalThis.RTCIceTransport;
10
11
  get state(): globalThis.RTCDtlsTransportState;
@@ -7,6 +7,7 @@ declare class RTCError extends DOMException implements globalThis.RTCError {
7
7
  set receivedAlert(_value: number | null);
8
8
  get sctpCauseCode(): number | null;
9
9
  set sctpCauseCode(_value: number | null);
10
+ get httpRequestStatusCode(): number | null;
10
11
  get sdpLineNumber(): number | null;
11
12
  set sdpLineNumber(_value: number | null);
12
13
  get sentAlert(): number | null;
@@ -1,6 +1,6 @@
1
1
  declare class RTCIceCandidate implements globalThis.RTCIceCandidate {
2
2
  #private;
3
- constructor({ candidate, sdpMLineIndex, sdpMid, usernameFragment }: globalThis.RTCIceCandidateInit);
3
+ constructor({ candidate, sdpMLineIndex, sdpMid, usernameFragment, }: globalThis.RTCIceCandidateInit);
4
4
  get address(): string | null;
5
5
  get candidate(): string;
6
6
  get component(): globalThis.RTCIceComponent | null;
@@ -1,21 +1,30 @@
1
+ import RTCPeerConnection from './RTCPeerConnection.js';
2
+
1
3
  declare class RTCIceTransport extends EventTarget implements globalThis.RTCIceTransport {
2
4
  #private;
3
- ongatheringstatechange: ((this: globalThis.RTCIceTransport, ev: Event) => any) | null;
4
- onselectedcandidatepairchange: ((this: globalThis.RTCIceTransport, ev: Event) => any) | null;
5
- onstatechange: ((this: globalThis.RTCIceTransport, ev: Event) => any) | null;
5
+ ongatheringstatechange: globalThis.RTCIceTransport['ongatheringstatechange'];
6
+ onselectedcandidatepairchange: globalThis.RTCIceTransport['onselectedcandidatepairchange'];
7
+ onstatechange: globalThis.RTCIceTransport['onstatechange'];
6
8
  constructor(init: {
7
- pc: globalThis.RTCPeerConnection;
8
- extraFunctions: any;
9
+ pc: RTCPeerConnection;
9
10
  });
10
11
  get component(): globalThis.RTCIceComponent;
11
12
  get gatheringState(): globalThis.RTCIceGatheringState;
12
- get role(): string;
13
+ get role(): globalThis.RTCIceRole;
13
14
  get state(): globalThis.RTCIceTransportState;
14
15
  getLocalCandidates(): globalThis.RTCIceCandidate[];
15
- getLocalParameters(): any;
16
+ getLocalParameters(): RTCIceParameters | null;
16
17
  getRemoteCandidates(): globalThis.RTCIceCandidate[];
17
18
  getRemoteParameters(): any;
18
19
  getSelectedCandidatePair(): globalThis.RTCIceCandidatePair | null;
19
20
  }
21
+ declare class RTCIceParameters implements globalThis.RTCIceParameters {
22
+ usernameFragment: string;
23
+ password: string;
24
+ constructor({ usernameFragment, password }: {
25
+ usernameFragment: any;
26
+ password?: string;
27
+ });
28
+ }
20
29
 
21
- export { RTCIceTransport as default };
30
+ export { RTCIceParameters, RTCIceTransport as default };
@@ -1,4 +1,7 @@
1
+ import { SelectedCandidateInfo } from '../lib/types';
1
2
  import { PeerConnection } from '../lib/index';
3
+ import RTCDataChannel from './RTCDataChannel.js';
4
+ import { RTCDataChannelEvent } from './Events.js';
2
5
  import RTCCertificate from './RTCCertificate.js';
3
6
 
4
7
  interface RTCConfiguration extends globalThis.RTCConfiguration {
@@ -8,18 +11,26 @@ interface RTCConfiguration extends globalThis.RTCConfiguration {
8
11
  declare class RTCPeerConnection extends EventTarget implements globalThis.RTCPeerConnection {
9
12
  #private;
10
13
  static generateCertificate(): Promise<RTCCertificate>;
11
- onconnectionstatechange: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;
12
- ondatachannel: ((this: globalThis.RTCPeerConnection, ev: globalThis.RTCDataChannelEvent) => any) | null;
13
- onicecandidate: ((this: globalThis.RTCPeerConnection, ev: globalThis.RTCPeerConnectionIceEvent) => any) | null;
14
- onicecandidateerror: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;
15
- oniceconnectionstatechange: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;
16
- onicegatheringstatechange: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;
17
- onnegotiationneeded: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;
18
- onsignalingstatechange: ((this: globalThis.RTCPeerConnection, ev: Event) => any) | null;
19
- ontrack: ((this: globalThis.RTCPeerConnection, ev: globalThis.RTCTrackEvent) => any) | null;
14
+ onconnectionstatechange: globalThis.RTCPeerConnection['onconnectionstatechange'];
15
+ ondatachannel: ((this: globalThis.RTCPeerConnection, ev: RTCDataChannelEvent) => any) | null;
16
+ onicecandidate: globalThis.RTCPeerConnection['onicecandidate'];
17
+ onicecandidateerror: globalThis.RTCPeerConnection['onicecandidateerror'];
18
+ oniceconnectionstatechange: globalThis.RTCPeerConnection['oniceconnectionstatechange'];
19
+ onicegatheringstatechange: globalThis.RTCPeerConnection['onicegatheringstatechange'];
20
+ onnegotiationneeded: globalThis.RTCPeerConnection['onnegotiationneeded'];
21
+ onsignalingstatechange: globalThis.RTCPeerConnection['onsignalingstatechange'];
22
+ ontrack: globalThis.RTCPeerConnection['ontrack'];
20
23
  private _checkConfiguration;
21
24
  setConfiguration(config: globalThis.RTCConfiguration): void;
22
25
  constructor(config?: RTCConfiguration);
26
+ get ext_maxDataChannelId(): number;
27
+ get ext_maxMessageSize(): number;
28
+ get ext_localCandidates(): globalThis.RTCIceCandidate[];
29
+ get ext_remoteCandidates(): globalThis.RTCIceCandidate[];
30
+ selectedCandidatePair(): {
31
+ local: SelectedCandidateInfo;
32
+ remote: SelectedCandidateInfo;
33
+ } | null;
23
34
  get canTrickleIceCandidates(): boolean | null;
24
35
  get connectionState(): globalThis.RTCPeerConnectionState;
25
36
  get iceConnectionState(): globalThis.RTCIceConnectionState;
@@ -37,12 +48,12 @@ declare class RTCPeerConnection extends EventTarget implements globalThis.RTCPee
37
48
  addTransceiver(_trackOrKind: any, _init: any): globalThis.RTCRtpTransceiver;
38
49
  close(): void;
39
50
  createAnswer(): Promise<globalThis.RTCSessionDescriptionInit | any>;
40
- createDataChannel(label: any, opts?: {}): globalThis.RTCDataChannel;
51
+ createDataChannel(label: string, opts?: globalThis.RTCDataChannelInit): RTCDataChannel;
41
52
  createOffer(): Promise<globalThis.RTCSessionDescriptionInit | any>;
42
53
  getConfiguration(): globalThis.RTCConfiguration;
43
54
  getReceivers(): globalThis.RTCRtpReceiver[];
44
55
  getSenders(): globalThis.RTCRtpSender[];
45
- getStats(): Promise<globalThis.RTCStatsReport>;
56
+ getStats(): Promise<globalThis.RTCStatsReport> | any;
46
57
  getTransceivers(): globalThis.RTCRtpTransceiver[];
47
58
  removeTrack(): void;
48
59
  restartIce(): Promise<void>;
@@ -1,9 +1,10 @@
1
+ import RTCPeerConnection from './RTCPeerConnection.js';
2
+
1
3
  declare class RTCSctpTransport extends EventTarget implements globalThis.RTCSctpTransport {
2
4
  #private;
3
- onstatechange: ((this: globalThis.RTCSctpTransport, ev: Event) => any) | null;
5
+ onstatechange: globalThis.RTCSctpTransport['onstatechange'];
4
6
  constructor(initial: {
5
- pc: globalThis.RTCPeerConnection;
6
- extraFunctions: any;
7
+ pc: RTCPeerConnection;
7
8
  });
8
9
  get maxChannels(): number | null;
9
10
  get maxMessageSize(): number;
@@ -2,6 +2,7 @@ declare class RTCSessionDescription implements globalThis.RTCSessionDescriptionI
2
2
  #private;
3
3
  constructor(init: globalThis.RTCSessionDescriptionInit);
4
4
  get type(): globalThis.RTCSdpType;
5
+ set type(type: globalThis.RTCSdpType);
5
6
  get sdp(): string;
6
7
  toJSON(): globalThis.RTCSessionDescriptionInit;
7
8
  }
package/jest.config.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import type { Config } from 'jest';
2
2
 
3
3
  const config: Config = {
4
- clearMocks: true,
5
- collectCoverage: false,
6
- coverageDirectory: "coverage",
7
- coverageProvider: "v8",
8
- preset: 'ts-jest',
9
- testEnvironment: "jest-environment-node",
10
- testRegex: '(/test/jest-tests/.*|(\\.|/)(test|spec))\\.(m)?ts$',
11
- testPathIgnorePatterns: ['node_modules', 'multiple-run.test'],
4
+ clearMocks: true,
5
+ collectCoverage: false,
6
+ coverageDirectory: 'coverage',
7
+ coverageProvider: 'v8',
8
+ preset: 'ts-jest',
9
+ testEnvironment: 'jest-environment-node',
10
+ testRegex: '(/test/jest-tests/.*|(\\.|/)(test|spec))\\.(m)?ts$',
11
+ testPathIgnorePatterns: ['node_modules', 'multiple-run.test'],
12
12
  };
13
13
 
14
14
  export default config;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-datachannel",
3
- "version": "0.27.0",
3
+ "version": "0.28.0",
4
4
  "description": "WebRTC For Node.js and Electron. libdatachannel node bindings.",
5
5
  "main": "./dist/cjs/lib/index.cjs",
6
6
  "module": "./dist/esm/lib/index.mjs",
@@ -38,7 +38,8 @@
38
38
  "install:gnu": "npm run clean && npm install --ignore-scripts --production=false && cmake-js configure --CDUSE_GNUTLS=1 && cmake-js build",
39
39
  "build": "npm run compile && npm run build:tsc",
40
40
  "compile": "cmake-js build",
41
- "compile:debug": "cmake-js build -D",
41
+ "build:debug": "npm run compile:debug && npm run build:tsc",
42
+ "compile:debug": "cmake-js configure -D && cmake-js build -D",
42
43
  "build:tsc": "rimraf dist && rollup -c",
43
44
  "build:tsc:watch": "rollup -c -w",
44
45
  "clean": "rimraf dist build",
@@ -89,6 +90,7 @@
89
90
  "@rollup/plugin-replace": "^6.0.1",
90
91
  "@types/jest": "^29.5.12",
91
92
  "@types/node": "^20.6.1",
93
+ "@types/webrtc": "^0.0.46",
92
94
  "@typescript-eslint/eslint-plugin": "^7.17.0",
93
95
  "@typescript-eslint/parser": "^7.17.0",
94
96
  "cmake-js": "^7.3.0",
package/rollup.config.mjs CHANGED
@@ -17,7 +17,7 @@ export default [
17
17
  bundle({
18
18
  plugins: [
19
19
  replace({
20
- include: "src/lib/node-datachannel.ts",
20
+ include: 'src/lib/node-datachannel.ts',
21
21
  preventAssignment: true,
22
22
  "require('../../build": "require('../../../build",
23
23
  }),
@@ -103,6 +103,17 @@ void DataChannelWrapper::doCleanup()
103
103
  {
104
104
  PLOG_DEBUG << "doCleanup() called";
105
105
  mOnClosedCallback.reset();
106
+
107
+ // For close there are 3 cases:
108
+ // 1. Close was called from JS
109
+ // 2. Close was called from RTC
110
+ // 3. Close was not called from JS or RTC (we are destroying the object)
111
+ // This could be coming from rtc (case 2)
112
+ mDataChannelPtr.reset();
113
+ mOnOpenCallback.reset();
114
+ mOnErrorCallback.reset();
115
+ mOnBufferedAmountLowCallback.reset();
116
+ mOnMessageCallback.reset();
106
117
  instances.erase(this);
107
118
  }
108
119
 
package/src/index.ts CHANGED
@@ -5,6 +5,5 @@
5
5
  import n from './lib/index';
6
6
  import p from './polyfill/index';
7
7
 
8
-
9
8
  export const nodeDataChannel = n;
10
9
  export const polyfill = p;
@@ -10,92 +10,91 @@ import * as stream from 'stream';
10
10
  * the protocol level, and is preserved here throughout.
11
11
  */
12
12
  export default class DataChannelStream extends stream.Duplex {
13
- private _rawChannel: any;
14
- private _readActive: boolean;
15
-
16
-
17
- constructor(rawChannel: any, streamOptions?: Omit<stream.DuplexOptions, 'objectMode'>) {
18
- super({
19
- allowHalfOpen: false, // Default to autoclose on end().
20
- ...streamOptions,
21
- objectMode: true, // Preserve the string/buffer distinction (WebRTC treats them differently)
22
- });
23
-
24
- this._rawChannel = rawChannel;
25
- this._readActive = true;
26
-
27
- rawChannel.onMessage((msg: any) => {
28
- if (!this._readActive) return; // If the buffer is full, drop messages.
29
-
30
- // If the push is rejected, we pause reading until the next call to _read().
31
- this._readActive = this.push(msg);
32
- });
33
-
34
- // When the DataChannel closes, the readable & writable ends close
35
- rawChannel.onClosed(() => {
36
- this.push(null);
37
- this.destroy();
38
- });
39
-
40
- rawChannel.onError((errMsg: string) => {
41
- this.destroy(new Error(`DataChannel error: ${errMsg}`));
42
- });
43
-
44
- // Buffer all writes until the DataChannel opens
45
- if (!rawChannel.isOpen()) {
46
- this.cork();
47
- rawChannel.onOpen(() => this.uncork());
48
- }
13
+ private _rawChannel: any;
14
+ private _readActive: boolean;
15
+
16
+ constructor(rawChannel: any, streamOptions?: Omit<stream.DuplexOptions, 'objectMode'>) {
17
+ super({
18
+ allowHalfOpen: false, // Default to autoclose on end().
19
+ ...streamOptions,
20
+ objectMode: true, // Preserve the string/buffer distinction (WebRTC treats them differently)
21
+ });
22
+
23
+ this._rawChannel = rawChannel;
24
+ this._readActive = true;
25
+
26
+ rawChannel.onMessage((msg: any) => {
27
+ if (!this._readActive) return; // If the buffer is full, drop messages.
28
+
29
+ // If the push is rejected, we pause reading until the next call to _read().
30
+ this._readActive = this.push(msg);
31
+ });
32
+
33
+ // When the DataChannel closes, the readable & writable ends close
34
+ rawChannel.onClosed(() => {
35
+ this.push(null);
36
+ this.destroy();
37
+ });
38
+
39
+ rawChannel.onError((errMsg: string) => {
40
+ this.destroy(new Error(`DataChannel error: ${errMsg}`));
41
+ });
42
+
43
+ // Buffer all writes until the DataChannel opens
44
+ if (!rawChannel.isOpen()) {
45
+ this.cork();
46
+ rawChannel.onOpen(() => this.uncork());
49
47
  }
50
-
51
- _read(): void {
52
- // Stop dropping messages, if the buffer filling up meant we were doing so before.
53
- this._readActive = true;
54
- }
55
-
56
- _write(chunk, _encoding, callback): void {
57
- let sentOk;
58
-
59
- try {
60
- if (Buffer.isBuffer(chunk)) {
61
- sentOk = this._rawChannel.sendMessageBinary(chunk);
62
- } else if (typeof chunk === 'string') {
63
- sentOk = this._rawChannel.sendMessage(chunk);
64
- } else {
65
- const typeName = chunk.constructor.name || typeof chunk;
66
- throw new Error(`Cannot write ${typeName} to DataChannel stream`);
67
- }
68
- } catch (err) {
69
- return callback(err);
70
- }
71
-
72
- if (sentOk) {
73
- callback(null);
74
- } else {
75
- callback(new Error('Failed to write to DataChannel'));
76
- }
77
- }
78
-
79
- _final(callback): void {
80
- if (!this.allowHalfOpen) this.destroy();
81
- callback(null);
82
- }
83
-
84
- _destroy(maybeErr, callback): void {
85
- // When the stream is destroyed, we close the DataChannel.
86
- this._rawChannel.close();
87
- callback(maybeErr);
88
- }
89
-
90
- get label(): string {
91
- return this._rawChannel.getLabel();
92
- }
93
-
94
- get id(): number {
95
- return this._rawChannel.getId();
48
+ }
49
+
50
+ _read(): void {
51
+ // Stop dropping messages, if the buffer filling up meant we were doing so before.
52
+ this._readActive = true;
53
+ }
54
+
55
+ _write(chunk, _encoding, callback): void {
56
+ let sentOk;
57
+
58
+ try {
59
+ if (Buffer.isBuffer(chunk)) {
60
+ sentOk = this._rawChannel.sendMessageBinary(chunk);
61
+ } else if (typeof chunk === 'string') {
62
+ sentOk = this._rawChannel.sendMessage(chunk);
63
+ } else {
64
+ const typeName = chunk.constructor.name || typeof chunk;
65
+ throw new Error(`Cannot write ${typeName} to DataChannel stream`);
66
+ }
67
+ } catch (err) {
68
+ return callback(err);
96
69
  }
97
70
 
98
- get protocol(): string {
99
- return this._rawChannel.getProtocol();
71
+ if (sentOk) {
72
+ callback(null);
73
+ } else {
74
+ callback(new Error('Failed to write to DataChannel'));
100
75
  }
76
+ }
77
+
78
+ _final(callback): void {
79
+ if (!this.allowHalfOpen) this.destroy();
80
+ callback(null);
81
+ }
82
+
83
+ _destroy(maybeErr, callback): void {
84
+ // When the stream is destroyed, we close the DataChannel.
85
+ this._rawChannel.close();
86
+ callback(maybeErr);
87
+ }
88
+
89
+ get label(): string {
90
+ return this._rawChannel.getLabel();
91
+ }
92
+
93
+ get id(): number {
94
+ return this._rawChannel.getId();
95
+ }
96
+
97
+ get protocol(): string {
98
+ return this._rawChannel.getProtocol();
99
+ }
101
100
  }