node-datachannel 0.5.0-dev → 0.5.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 (332) hide show
  1. package/CMakeLists.txt +2 -2
  2. package/examples/electron-demo/package-lock.json +164 -419
  3. package/examples/electron-demo/package.json +2 -2
  4. package/lib/index.d.ts +5 -0
  5. package/lib/index.js +33 -2
  6. package/package.json +3 -11
  7. package/polyfill/RTCDtlsTransport.js +30 -12
  8. package/polyfill/RTCIceCandidate.js +1 -1
  9. package/polyfill/RTCIceTransport.js +47 -21
  10. package/polyfill/RTCPeerConnection.js +46 -23
  11. package/polyfill/RTCSctpTransport.js +33 -14
  12. package/src/peer-connection-wrapper.cpp +50 -0
  13. package/src/peer-connection-wrapper.h +2 -0
  14. package/test/polyfill-connectivity.js +1 -0
  15. package/test/test.js +2 -2
  16. package/examples/build/Dockerfile +0 -30
  17. package/examples/build/README.md +0 -24
  18. package/node_modules/base64-js/LICENSE +0 -21
  19. package/node_modules/base64-js/README.md +0 -34
  20. package/node_modules/base64-js/base64js.min.js +0 -1
  21. package/node_modules/base64-js/index.d.ts +0 -3
  22. package/node_modules/base64-js/index.js +0 -150
  23. package/node_modules/base64-js/package.json +0 -47
  24. package/node_modules/buffer/AUTHORS.md +0 -70
  25. package/node_modules/buffer/LICENSE +0 -21
  26. package/node_modules/buffer/README.md +0 -410
  27. package/node_modules/buffer/index.d.ts +0 -186
  28. package/node_modules/buffer/index.js +0 -1817
  29. package/node_modules/buffer/package.json +0 -96
  30. package/node_modules/chownr/LICENSE +0 -15
  31. package/node_modules/chownr/README.md +0 -3
  32. package/node_modules/chownr/chownr.js +0 -167
  33. package/node_modules/chownr/package.json +0 -29
  34. package/node_modules/decompress-response/index.d.ts +0 -22
  35. package/node_modules/decompress-response/index.js +0 -58
  36. package/node_modules/decompress-response/license +0 -9
  37. package/node_modules/decompress-response/package.json +0 -56
  38. package/node_modules/decompress-response/readme.md +0 -48
  39. package/node_modules/deep-extend/CHANGELOG.md +0 -46
  40. package/node_modules/deep-extend/LICENSE +0 -20
  41. package/node_modules/deep-extend/README.md +0 -91
  42. package/node_modules/deep-extend/index.js +0 -1
  43. package/node_modules/deep-extend/lib/deep-extend.js +0 -150
  44. package/node_modules/deep-extend/package.json +0 -62
  45. package/node_modules/detect-libc/LICENSE +0 -201
  46. package/node_modules/detect-libc/README.md +0 -163
  47. package/node_modules/detect-libc/index.d.ts +0 -14
  48. package/node_modules/detect-libc/lib/detect-libc.js +0 -279
  49. package/node_modules/detect-libc/lib/filesystem.js +0 -41
  50. package/node_modules/detect-libc/lib/process.js +0 -19
  51. package/node_modules/detect-libc/package.json +0 -40
  52. package/node_modules/end-of-stream/LICENSE +0 -21
  53. package/node_modules/end-of-stream/README.md +0 -54
  54. package/node_modules/end-of-stream/index.js +0 -94
  55. package/node_modules/end-of-stream/package.json +0 -37
  56. package/node_modules/expand-template/.travis.yml +0 -6
  57. package/node_modules/expand-template/LICENSE +0 -21
  58. package/node_modules/expand-template/README.md +0 -43
  59. package/node_modules/expand-template/index.js +0 -26
  60. package/node_modules/expand-template/package.json +0 -29
  61. package/node_modules/expand-template/test.js +0 -67
  62. package/node_modules/fs-constants/LICENSE +0 -21
  63. package/node_modules/fs-constants/README.md +0 -26
  64. package/node_modules/fs-constants/browser.js +0 -1
  65. package/node_modules/fs-constants/index.js +0 -1
  66. package/node_modules/fs-constants/package.json +0 -19
  67. package/node_modules/github-from-package/.travis.yml +0 -4
  68. package/node_modules/github-from-package/LICENSE +0 -18
  69. package/node_modules/github-from-package/example/package.json +0 -8
  70. package/node_modules/github-from-package/example/url.js +0 -3
  71. package/node_modules/github-from-package/index.js +0 -17
  72. package/node_modules/github-from-package/package.json +0 -30
  73. package/node_modules/github-from-package/readme.markdown +0 -53
  74. package/node_modules/github-from-package/test/a.json +0 -8
  75. package/node_modules/github-from-package/test/b.json +0 -5
  76. package/node_modules/github-from-package/test/c.json +0 -5
  77. package/node_modules/github-from-package/test/d.json +0 -7
  78. package/node_modules/github-from-package/test/e.json +0 -5
  79. package/node_modules/github-from-package/test/url.js +0 -19
  80. package/node_modules/ieee754/LICENSE +0 -11
  81. package/node_modules/ieee754/README.md +0 -51
  82. package/node_modules/ieee754/index.d.ts +0 -10
  83. package/node_modules/ieee754/index.js +0 -85
  84. package/node_modules/ieee754/package.json +0 -52
  85. package/node_modules/inherits/LICENSE +0 -16
  86. package/node_modules/inherits/README.md +0 -42
  87. package/node_modules/inherits/inherits.js +0 -9
  88. package/node_modules/inherits/inherits_browser.js +0 -27
  89. package/node_modules/inherits/package.json +0 -29
  90. package/node_modules/ini/LICENSE +0 -15
  91. package/node_modules/ini/README.md +0 -102
  92. package/node_modules/ini/ini.js +0 -206
  93. package/node_modules/ini/package.json +0 -33
  94. package/node_modules/mimic-response/index.d.ts +0 -17
  95. package/node_modules/mimic-response/index.js +0 -77
  96. package/node_modules/mimic-response/license +0 -9
  97. package/node_modules/mimic-response/package.json +0 -42
  98. package/node_modules/mimic-response/readme.md +0 -78
  99. package/node_modules/minimist/.eslintrc +0 -29
  100. package/node_modules/minimist/.github/FUNDING.yml +0 -12
  101. package/node_modules/minimist/.nycrc +0 -14
  102. package/node_modules/minimist/CHANGELOG.md +0 -298
  103. package/node_modules/minimist/LICENSE +0 -18
  104. package/node_modules/minimist/README.md +0 -121
  105. package/node_modules/minimist/example/parse.js +0 -4
  106. package/node_modules/minimist/index.js +0 -263
  107. package/node_modules/minimist/package.json +0 -75
  108. package/node_modules/minimist/test/all_bool.js +0 -34
  109. package/node_modules/minimist/test/bool.js +0 -177
  110. package/node_modules/minimist/test/dash.js +0 -43
  111. package/node_modules/minimist/test/default_bool.js +0 -37
  112. package/node_modules/minimist/test/dotted.js +0 -24
  113. package/node_modules/minimist/test/kv_short.js +0 -32
  114. package/node_modules/minimist/test/long.js +0 -33
  115. package/node_modules/minimist/test/num.js +0 -38
  116. package/node_modules/minimist/test/parse.js +0 -209
  117. package/node_modules/minimist/test/parse_modified.js +0 -11
  118. package/node_modules/minimist/test/proto.js +0 -64
  119. package/node_modules/minimist/test/short.js +0 -69
  120. package/node_modules/minimist/test/stop_early.js +0 -17
  121. package/node_modules/minimist/test/unknown.js +0 -104
  122. package/node_modules/minimist/test/whitespace.js +0 -10
  123. package/node_modules/mkdirp-classic/LICENSE +0 -21
  124. package/node_modules/mkdirp-classic/README.md +0 -18
  125. package/node_modules/mkdirp-classic/index.js +0 -98
  126. package/node_modules/mkdirp-classic/package.json +0 -18
  127. package/node_modules/napi-build-utils/LICENSE +0 -21
  128. package/node_modules/napi-build-utils/README.md +0 -48
  129. package/node_modules/napi-build-utils/index.js +0 -213
  130. package/node_modules/napi-build-utils/index.md +0 -81
  131. package/node_modules/napi-build-utils/package.json +0 -41
  132. package/node_modules/node-abi/LICENSE +0 -21
  133. package/node_modules/node-abi/README.md +0 -52
  134. package/node_modules/node-abi/abi_registry.json +0 -276
  135. package/node_modules/node-abi/index.js +0 -179
  136. package/node_modules/node-abi/package.json +0 -41
  137. package/node_modules/once/LICENSE +0 -15
  138. package/node_modules/once/README.md +0 -79
  139. package/node_modules/once/once.js +0 -42
  140. package/node_modules/once/package.json +0 -33
  141. package/node_modules/prebuild-install/CHANGELOG.md +0 -116
  142. package/node_modules/prebuild-install/CONTRIBUTING.md +0 -6
  143. package/node_modules/prebuild-install/LICENSE +0 -21
  144. package/node_modules/prebuild-install/README.md +0 -163
  145. package/node_modules/prebuild-install/asset.js +0 -44
  146. package/node_modules/prebuild-install/bin.js +0 -78
  147. package/node_modules/prebuild-install/download.js +0 -142
  148. package/node_modules/prebuild-install/error.js +0 -14
  149. package/node_modules/prebuild-install/help.txt +0 -16
  150. package/node_modules/prebuild-install/index.js +0 -1
  151. package/node_modules/prebuild-install/log.js +0 -33
  152. package/node_modules/prebuild-install/package.json +0 -67
  153. package/node_modules/prebuild-install/proxy.js +0 -35
  154. package/node_modules/prebuild-install/rc.js +0 -64
  155. package/node_modules/prebuild-install/util.js +0 -143
  156. package/node_modules/pump/.travis.yml +0 -5
  157. package/node_modules/pump/LICENSE +0 -21
  158. package/node_modules/pump/README.md +0 -65
  159. package/node_modules/pump/index.js +0 -82
  160. package/node_modules/pump/package.json +0 -24
  161. package/node_modules/pump/test-browser.js +0 -66
  162. package/node_modules/pump/test-node.js +0 -53
  163. package/node_modules/rc/LICENSE.APACHE2 +0 -15
  164. package/node_modules/rc/LICENSE.BSD +0 -26
  165. package/node_modules/rc/LICENSE.MIT +0 -24
  166. package/node_modules/rc/README.md +0 -227
  167. package/node_modules/rc/browser.js +0 -7
  168. package/node_modules/rc/cli.js +0 -4
  169. package/node_modules/rc/index.js +0 -53
  170. package/node_modules/rc/lib/utils.js +0 -104
  171. package/node_modules/rc/node_modules/strip-json-comments/index.js +0 -70
  172. package/node_modules/rc/node_modules/strip-json-comments/license +0 -21
  173. package/node_modules/rc/node_modules/strip-json-comments/package.json +0 -42
  174. package/node_modules/rc/node_modules/strip-json-comments/readme.md +0 -64
  175. package/node_modules/rc/package.json +0 -29
  176. package/node_modules/rc/test/ini.js +0 -16
  177. package/node_modules/rc/test/nested-env-vars.js +0 -50
  178. package/node_modules/rc/test/test.js +0 -59
  179. package/node_modules/safe-buffer/LICENSE +0 -21
  180. package/node_modules/safe-buffer/README.md +0 -584
  181. package/node_modules/safe-buffer/index.d.ts +0 -187
  182. package/node_modules/safe-buffer/index.js +0 -65
  183. package/node_modules/safe-buffer/package.json +0 -51
  184. package/node_modules/semver/LICENSE +0 -15
  185. package/node_modules/semver/README.md +0 -637
  186. package/node_modules/semver/bin/semver.js +0 -197
  187. package/node_modules/semver/classes/comparator.js +0 -141
  188. package/node_modules/semver/classes/index.js +0 -5
  189. package/node_modules/semver/classes/range.js +0 -539
  190. package/node_modules/semver/classes/semver.js +0 -302
  191. package/node_modules/semver/functions/clean.js +0 -6
  192. package/node_modules/semver/functions/cmp.js +0 -52
  193. package/node_modules/semver/functions/coerce.js +0 -52
  194. package/node_modules/semver/functions/compare-build.js +0 -7
  195. package/node_modules/semver/functions/compare-loose.js +0 -3
  196. package/node_modules/semver/functions/compare.js +0 -5
  197. package/node_modules/semver/functions/diff.js +0 -65
  198. package/node_modules/semver/functions/eq.js +0 -3
  199. package/node_modules/semver/functions/gt.js +0 -3
  200. package/node_modules/semver/functions/gte.js +0 -3
  201. package/node_modules/semver/functions/inc.js +0 -19
  202. package/node_modules/semver/functions/lt.js +0 -3
  203. package/node_modules/semver/functions/lte.js +0 -3
  204. package/node_modules/semver/functions/major.js +0 -3
  205. package/node_modules/semver/functions/minor.js +0 -3
  206. package/node_modules/semver/functions/neq.js +0 -3
  207. package/node_modules/semver/functions/parse.js +0 -16
  208. package/node_modules/semver/functions/patch.js +0 -3
  209. package/node_modules/semver/functions/prerelease.js +0 -6
  210. package/node_modules/semver/functions/rcompare.js +0 -3
  211. package/node_modules/semver/functions/rsort.js +0 -3
  212. package/node_modules/semver/functions/satisfies.js +0 -10
  213. package/node_modules/semver/functions/sort.js +0 -3
  214. package/node_modules/semver/functions/valid.js +0 -6
  215. package/node_modules/semver/index.js +0 -89
  216. package/node_modules/semver/internal/constants.js +0 -35
  217. package/node_modules/semver/internal/debug.js +0 -9
  218. package/node_modules/semver/internal/identifiers.js +0 -23
  219. package/node_modules/semver/internal/parse-options.js +0 -15
  220. package/node_modules/semver/internal/re.js +0 -212
  221. package/node_modules/semver/node_modules/lru-cache/LICENSE +0 -15
  222. package/node_modules/semver/node_modules/lru-cache/README.md +0 -166
  223. package/node_modules/semver/node_modules/lru-cache/index.js +0 -334
  224. package/node_modules/semver/node_modules/lru-cache/package.json +0 -34
  225. package/node_modules/semver/node_modules/yallist/LICENSE +0 -15
  226. package/node_modules/semver/node_modules/yallist/README.md +0 -204
  227. package/node_modules/semver/node_modules/yallist/iterator.js +0 -8
  228. package/node_modules/semver/node_modules/yallist/package.json +0 -29
  229. package/node_modules/semver/node_modules/yallist/yallist.js +0 -426
  230. package/node_modules/semver/package.json +0 -87
  231. package/node_modules/semver/preload.js +0 -2
  232. package/node_modules/semver/range.bnf +0 -16
  233. package/node_modules/semver/ranges/gtr.js +0 -4
  234. package/node_modules/semver/ranges/intersects.js +0 -7
  235. package/node_modules/semver/ranges/ltr.js +0 -4
  236. package/node_modules/semver/ranges/max-satisfying.js +0 -25
  237. package/node_modules/semver/ranges/min-satisfying.js +0 -24
  238. package/node_modules/semver/ranges/min-version.js +0 -61
  239. package/node_modules/semver/ranges/outside.js +0 -80
  240. package/node_modules/semver/ranges/simplify.js +0 -47
  241. package/node_modules/semver/ranges/subset.js +0 -247
  242. package/node_modules/semver/ranges/to-comparators.js +0 -8
  243. package/node_modules/semver/ranges/valid.js +0 -11
  244. package/node_modules/simple-concat/.travis.yml +0 -3
  245. package/node_modules/simple-concat/LICENSE +0 -20
  246. package/node_modules/simple-concat/README.md +0 -44
  247. package/node_modules/simple-concat/index.js +0 -15
  248. package/node_modules/simple-concat/package.json +0 -47
  249. package/node_modules/simple-concat/test/basic.js +0 -41
  250. package/node_modules/simple-get/.github/dependabot.yml +0 -15
  251. package/node_modules/simple-get/.github/workflows/ci.yml +0 -23
  252. package/node_modules/simple-get/LICENSE +0 -20
  253. package/node_modules/simple-get/README.md +0 -333
  254. package/node_modules/simple-get/index.js +0 -108
  255. package/node_modules/simple-get/package.json +0 -67
  256. package/node_modules/tar-fs/.travis.yml +0 -6
  257. package/node_modules/tar-fs/LICENSE +0 -21
  258. package/node_modules/tar-fs/README.md +0 -165
  259. package/node_modules/tar-fs/index.js +0 -351
  260. package/node_modules/tar-fs/node_modules/bl/.travis.yml +0 -17
  261. package/node_modules/tar-fs/node_modules/bl/BufferList.js +0 -396
  262. package/node_modules/tar-fs/node_modules/bl/LICENSE.md +0 -13
  263. package/node_modules/tar-fs/node_modules/bl/README.md +0 -247
  264. package/node_modules/tar-fs/node_modules/bl/bl.js +0 -84
  265. package/node_modules/tar-fs/node_modules/bl/package.json +0 -37
  266. package/node_modules/tar-fs/node_modules/bl/test/convert.js +0 -21
  267. package/node_modules/tar-fs/node_modules/bl/test/indexOf.js +0 -492
  268. package/node_modules/tar-fs/node_modules/bl/test/isBufferList.js +0 -32
  269. package/node_modules/tar-fs/node_modules/bl/test/test.js +0 -869
  270. package/node_modules/tar-fs/node_modules/readable-stream/CONTRIBUTING.md +0 -38
  271. package/node_modules/tar-fs/node_modules/readable-stream/GOVERNANCE.md +0 -136
  272. package/node_modules/tar-fs/node_modules/readable-stream/LICENSE +0 -47
  273. package/node_modules/tar-fs/node_modules/readable-stream/README.md +0 -106
  274. package/node_modules/tar-fs/node_modules/readable-stream/errors-browser.js +0 -127
  275. package/node_modules/tar-fs/node_modules/readable-stream/errors.js +0 -116
  276. package/node_modules/tar-fs/node_modules/readable-stream/experimentalWarning.js +0 -17
  277. package/node_modules/tar-fs/node_modules/readable-stream/lib/_stream_duplex.js +0 -126
  278. package/node_modules/tar-fs/node_modules/readable-stream/lib/_stream_passthrough.js +0 -37
  279. package/node_modules/tar-fs/node_modules/readable-stream/lib/_stream_readable.js +0 -1027
  280. package/node_modules/tar-fs/node_modules/readable-stream/lib/_stream_transform.js +0 -190
  281. package/node_modules/tar-fs/node_modules/readable-stream/lib/_stream_writable.js +0 -641
  282. package/node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/async_iterator.js +0 -180
  283. package/node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/buffer_list.js +0 -183
  284. package/node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/destroy.js +0 -96
  285. package/node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/end-of-stream.js +0 -86
  286. package/node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/from-browser.js +0 -3
  287. package/node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/from.js +0 -52
  288. package/node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/pipeline.js +0 -86
  289. package/node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/state.js +0 -22
  290. package/node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/stream-browser.js +0 -1
  291. package/node_modules/tar-fs/node_modules/readable-stream/lib/internal/streams/stream.js +0 -1
  292. package/node_modules/tar-fs/node_modules/readable-stream/package.json +0 -68
  293. package/node_modules/tar-fs/node_modules/readable-stream/readable-browser.js +0 -9
  294. package/node_modules/tar-fs/node_modules/readable-stream/readable.js +0 -16
  295. package/node_modules/tar-fs/node_modules/string_decoder/LICENSE +0 -48
  296. package/node_modules/tar-fs/node_modules/string_decoder/README.md +0 -47
  297. package/node_modules/tar-fs/node_modules/string_decoder/lib/string_decoder.js +0 -296
  298. package/node_modules/tar-fs/node_modules/string_decoder/package.json +0 -34
  299. package/node_modules/tar-fs/node_modules/tar-stream/LICENSE +0 -21
  300. package/node_modules/tar-fs/node_modules/tar-stream/README.md +0 -168
  301. package/node_modules/tar-fs/node_modules/tar-stream/extract.js +0 -257
  302. package/node_modules/tar-fs/node_modules/tar-stream/headers.js +0 -295
  303. package/node_modules/tar-fs/node_modules/tar-stream/index.js +0 -2
  304. package/node_modules/tar-fs/node_modules/tar-stream/pack.js +0 -255
  305. package/node_modules/tar-fs/node_modules/tar-stream/package.json +0 -58
  306. package/node_modules/tar-fs/node_modules/tar-stream/sandbox.js +0 -11
  307. package/node_modules/tar-fs/package.json +0 -41
  308. package/node_modules/tar-fs/test/fixtures/a/hello.txt +0 -1
  309. package/node_modules/tar-fs/test/fixtures/b/a/test.txt +0 -1
  310. package/node_modules/tar-fs/test/fixtures/d/file1 +0 -0
  311. package/node_modules/tar-fs/test/fixtures/d/file2 +0 -0
  312. package/node_modules/tar-fs/test/fixtures/d/sub-dir/file5 +0 -0
  313. package/node_modules/tar-fs/test/fixtures/d/sub-files/file3 +0 -0
  314. package/node_modules/tar-fs/test/fixtures/d/sub-files/file4 +0 -0
  315. package/node_modules/tar-fs/test/fixtures/e/directory/.ignore +0 -0
  316. package/node_modules/tar-fs/test/fixtures/e/file +0 -0
  317. package/node_modules/tar-fs/test/fixtures/invalid.tar +0 -0
  318. package/node_modules/tar-fs/test/index.js +0 -346
  319. package/node_modules/tunnel-agent/LICENSE +0 -55
  320. package/node_modules/tunnel-agent/README.md +0 -4
  321. package/node_modules/tunnel-agent/index.js +0 -244
  322. package/node_modules/tunnel-agent/package.json +0 -22
  323. package/node_modules/util-deprecate/History.md +0 -16
  324. package/node_modules/util-deprecate/LICENSE +0 -24
  325. package/node_modules/util-deprecate/README.md +0 -53
  326. package/node_modules/util-deprecate/browser.js +0 -67
  327. package/node_modules/util-deprecate/node.js +0 -6
  328. package/node_modules/util-deprecate/package.json +0 -27
  329. package/node_modules/wrappy/LICENSE +0 -15
  330. package/node_modules/wrappy/README.md +0 -36
  331. package/node_modules/wrappy/package.json +0 -29
  332. package/node_modules/wrappy/wrappy.js +0 -33
@@ -28,13 +28,13 @@
28
28
  "@electron/rebuild": "^3.3.0",
29
29
  "@vercel/webpack-asset-relocator-loader": "^1.7.3",
30
30
  "css-loader": "^6.8.1",
31
- "electron": "26.2.0",
31
+ "electron": "26.2.4",
32
32
  "node-loader": "^2.0.0",
33
33
  "style-loader": "^3.3.3"
34
34
  },
35
35
  "dependencies": {
36
36
  "electron-squirrel-startup": "^1.0.0",
37
- "node-datachannel": "0.5.0"
37
+ "node-datachannel": "0.5.0-dev"
38
38
  },
39
39
  "cmake-js": {
40
40
  "runtime": "electron",
package/lib/index.d.ts CHANGED
@@ -98,6 +98,9 @@ export interface SelectedCandidateInfo {
98
98
  port: number;
99
99
  type: string;
100
100
  transportType: string;
101
+ candidate: string;
102
+ mid: string;
103
+ priority: number;
101
104
  }
102
105
 
103
106
  // Must be same as rtc enum class Direction
@@ -232,6 +235,8 @@ export class PeerConnection {
232
235
  bytesReceived(): number;
233
236
  rtt(): number;
234
237
  getSelectedCandidatePair(): { local: SelectedCandidateInfo; remote: SelectedCandidateInfo } | null;
238
+ maxDataChannelId(): number;
239
+ maxMessageSize(): number;
235
240
  }
236
241
 
237
242
  export class DataChannelStream extends stream.Duplex {
package/lib/index.js CHANGED
@@ -3,6 +3,37 @@ import { createRequire } from 'module';
3
3
  const require = createRequire(import.meta.url);
4
4
 
5
5
  const nodeDataChannel = require('../build/Release/node_datachannel.node');
6
+ import DataChannelStream from './datachannel-stream.js';
6
7
 
7
- export default nodeDataChannel;
8
- export { default as DataChannelStream } from './datachannel-stream.js';
8
+ const {
9
+ initLogger,
10
+ cleanup,
11
+ preload,
12
+ setSctpSettings,
13
+ RtcpReceivingSession,
14
+ Track,
15
+ Video,
16
+ Audio,
17
+ DataChannel,
18
+ PeerConnection,
19
+ } = nodeDataChannel;
20
+
21
+ export {
22
+ initLogger,
23
+ cleanup,
24
+ preload,
25
+ setSctpSettings,
26
+ RtcpReceivingSession,
27
+ Track,
28
+ Video,
29
+ Audio,
30
+ DataChannel,
31
+ PeerConnection,
32
+ // Extra exports
33
+ DataChannelStream,
34
+ };
35
+
36
+ export default {
37
+ ...nodeDataChannel,
38
+ DataChannelStream,
39
+ };
package/package.json CHANGED
@@ -1,15 +1,11 @@
1
1
  {
2
2
  "name": "node-datachannel",
3
- "version": "0.5.0-dev",
3
+ "version": "0.5.1",
4
4
  "description": "libdatachannel node bindings",
5
5
  "type": "module",
6
6
  "exports": {
7
- ".": {
8
- "import": "./lib/index.js"
9
- },
10
- "./polyfill": {
11
- "import": "./polyfill/index.js"
12
- }
7
+ ".": "./lib/index.js",
8
+ "./polyfill": "./polyfill/index.js"
13
9
  },
14
10
  "typings": "lib/index.d.ts",
15
11
  "engines": {
@@ -60,7 +56,6 @@
60
56
  }
61
57
  ],
62
58
  "license": "MPL 2.0",
63
- "gypfile": true,
64
59
  "bugs": {
65
60
  "url": "https://github.com/murat-dogan/node-datachannel/issues"
66
61
  },
@@ -79,9 +74,6 @@
79
74
  "prettier": "^2.8.8",
80
75
  "typescript": "^4.6.3"
81
76
  },
82
- "bundledDependencies": [
83
- "prebuild-install"
84
- ],
85
77
  "dependencies": {
86
78
  "node-domexception": "^2.0.1",
87
79
  "prebuild-install": "^7.0.1"
@@ -1,12 +1,29 @@
1
+ import RTCIceTransport from './RTCIceTransport.js';
2
+
1
3
  export default class _RTCDtlsTransport extends EventTarget {
4
+ #pc = null;
5
+ #extraFunctions = null;
2
6
  #iceTransport = null;
3
- #state = null;
4
7
 
5
- onerror = createEmptyFunction();
6
- onstatechange = createEmptyFunction();
8
+ onerror = null;
9
+ onstatechange = null;
7
10
 
8
- constructor() {
11
+ constructor({ pc, extraFunctions }) {
9
12
  super();
13
+ this.#pc = pc;
14
+ this.#extraFunctions = extraFunctions;
15
+
16
+ this.#iceTransport = new RTCIceTransport({ pc, extraFunctions });
17
+
18
+ // forward peerConnection events
19
+ this.#pc.addEventListener('connectionstatechange', () => {
20
+ this.dispatchEvent(new Event('statechange'));
21
+ });
22
+
23
+ // forward events to properties
24
+ this.addEventListener('statechange', (e) => {
25
+ if (this.onstatechange) this.onstatechange(e);
26
+ });
10
27
  }
11
28
 
12
29
  get iceTransport() {
@@ -14,16 +31,17 @@ export default class _RTCDtlsTransport extends EventTarget {
14
31
  }
15
32
 
16
33
  get state() {
17
- return this.#state;
34
+ // reduce state from new, connecting, connected, disconnected, failed, closed, unknown
35
+ // to RTCDtlsTRansport states new, connecting, connected, closed, failed
36
+ let state = this.#pc ? this.#pc.connectionState : 'new';
37
+ if (state === 'disconnected' || state === 'unknown') {
38
+ state = 'closed';
39
+ }
40
+ return state;
18
41
  }
19
42
 
20
43
  getRemoteCertificates() {
21
- /** */
44
+ // TODO: implement
45
+ return new ArrayBuffer(0);
22
46
  }
23
47
  }
24
-
25
- function createEmptyFunction() {
26
- return () => {
27
- /** */
28
- };
29
- }
@@ -34,7 +34,7 @@ export default class _RTCIceCandidate {
34
34
  if (candidate) {
35
35
  const fields = candidate.split(' ');
36
36
  this.#foundation = fields[0];
37
- this.#component = fields[1];
37
+ this.#component = fields[1] == '1' ? 'rtp' : 'rtcp';
38
38
  this.#protocol = fields[2];
39
39
  this.#priority = parseInt(fields[3], 10);
40
40
  this.#ip = fields[4];
@@ -1,34 +1,55 @@
1
+ import RTCIceCandidate from './RTCIceCandidate.js';
2
+
1
3
  export default class _RTCIceTransport extends EventTarget {
2
- #component = null;
3
- #gatheringState = null;
4
- #role = null;
5
- #state = null;
4
+ #pc = null;
5
+ #extraFunctions = null;
6
6
 
7
- ongatheringstatechange = createEmptyFunction();
8
- onselectedcandidatepairchange = createEmptyFunction();
9
- onstatechange = createEmptyFunction();
7
+ ongatheringstatechange = null;
8
+ onselectedcandidatepairchange = null;
9
+ onstatechange = null;
10
10
 
11
- constructor() {
11
+ constructor({ pc, extraFunctions }) {
12
12
  super();
13
+ this.#pc = pc;
14
+ this.#extraFunctions = extraFunctions;
15
+
16
+ // forward peerConnection events
17
+ this.#pc.addEventListener('icegatheringstatechange', () => {
18
+ this.dispatchEvent(new Event('gatheringstatechange'));
19
+ });
20
+ this.#pc.addEventListener('iceconnectionstatechange', () => {
21
+ this.dispatchEvent(new Event('statechange'));
22
+ });
23
+
24
+ // forward events to properties
25
+ this.addEventListener('gatheringstatechange', (e) => {
26
+ if (this.ongatheringstatechange) this.ongatheringstatechange(e);
27
+ });
28
+ this.addEventListener('statechange', (e) => {
29
+ if (this.onstatechange) this.onstatechange(e);
30
+ });
13
31
  }
14
32
 
15
33
  get component() {
16
- return this.#component;
34
+ let cp = this.getSelectedCandidatePair();
35
+ if (!cp) return null;
36
+ return cp.local.component;
17
37
  }
18
38
 
19
39
  get gatheringState() {
20
- return this.#gatheringState;
40
+ return this.#pc ? this.#pc.iceGatheringState : 'new';
21
41
  }
22
42
 
23
43
  get role() {
24
- return this.#role;
44
+ return this.#pc.localDescription.type == 'offer' ? 'controlling' : 'controlled';
25
45
  }
26
46
 
27
47
  get state() {
28
- return this.#state;
48
+ return this.#pc ? this.#pc.iceConnectionState : 'new';
29
49
  }
50
+
30
51
  getLocalCandidates() {
31
- /** */
52
+ return this.#pc ? this.#extraFunctions.localCandidates() : [];
32
53
  }
33
54
 
34
55
  getLocalParameters() {
@@ -36,7 +57,7 @@ export default class _RTCIceTransport extends EventTarget {
36
57
  }
37
58
 
38
59
  getRemoteCandidates() {
39
- /** */
60
+ return this.#pc ? this.#extraFunctions.remoteCandidates() : [];
40
61
  }
41
62
 
42
63
  getRemoteParameters() {
@@ -44,12 +65,17 @@ export default class _RTCIceTransport extends EventTarget {
44
65
  }
45
66
 
46
67
  getSelectedCandidatePair() {
47
- /** */
68
+ let cp = this.#extraFunctions.selectedCandidatePair();
69
+ if (!cp) return null;
70
+ return {
71
+ local: new RTCIceCandidate({
72
+ candidate: cp.local.candidate,
73
+ sdpMid: cp.local.mid,
74
+ }),
75
+ remote: new RTCIceCandidate({
76
+ candidate: cp.remote.candidate,
77
+ sdpMid: cp.remote.mid,
78
+ }),
79
+ };
48
80
  }
49
81
  }
50
-
51
- function createEmptyFunction() {
52
- return () => {
53
- /** */
54
- };
55
- }
@@ -3,6 +3,7 @@ import RTCSessionDescription from './RTCSessionDescription.js';
3
3
  import RTCDataChannel from './RTCDataChannel.js';
4
4
  import RTCIceCandidate from './RTCIceCandidate.js';
5
5
  import { RTCDataChannelEvent, RTCPeerConnectionIceEvent } from './Events.js';
6
+ import RTCSctpTransport from './RTCSctpTransport.js';
6
7
  import DOMException from 'node-domexception';
7
8
 
8
9
  export default class _RTCPeerConnection extends EventTarget {
@@ -14,6 +15,9 @@ export default class _RTCPeerConnection extends EventTarget {
14
15
  #canTrickleIceCandidates;
15
16
  #sctp;
16
17
 
18
+ #localCandidates = [];
19
+ #remoteCandidates = [];
20
+
17
21
  onconnectionstatechange;
18
22
  ondatachannel;
19
23
  onicecandidate;
@@ -32,29 +36,23 @@ export default class _RTCPeerConnection extends EventTarget {
32
36
  this.#localAnswer = createDeferredPromise();
33
37
  this.#dataChannels = new Set();
34
38
  this.#canTrickleIceCandidates = null;
35
- this.#sctp = null;
36
-
37
- const iceServers = init ? init.iceServers : [];
38
-
39
- this.#peerConnection = new NodeDataChannel.PeerConnection(
40
- init && init.peerIdentity ? init.peerIdentity : `peer-${getRandomString(7)}`,
41
- {
42
- iceServers: iceServers
43
- .map((server) => {
44
- const urls = Array.isArray(server.urls) ? server.urls : [server.urls];
45
-
46
- return urls.map((url) => {
47
- if (server.username && server.credential) {
48
- const [protocol, rest] = url.split(/:(.*)/);
49
- return `${protocol}:${server.username}:${server.credential}@${rest}`;
50
- }
51
- return url;
52
- });
53
- })
54
- .flat(),
55
- iceTransportPolicy: init ? init.iceTransportPolicy : undefined,
56
- },
57
- );
39
+
40
+ this.#peerConnection = new NodeDataChannel.PeerConnection(init?.peerIdentity ?? `peer-${getRandomString(7)}`, {
41
+ ...init,
42
+ iceServers: init?.iceServers
43
+ ?.map((server) => {
44
+ const urls = Array.isArray(server.urls) ? server.urls : [server.urls];
45
+
46
+ return urls.map((url) => {
47
+ if (server.username && server.credential) {
48
+ const [protocol, rest] = url.split(/:(.*)/);
49
+ return `${protocol}:${server.username}:${server.credential}@${rest}`;
50
+ }
51
+ return url;
52
+ });
53
+ })
54
+ .flat(),
55
+ });
58
56
 
59
57
  // forward peerConnection events
60
58
  this.#peerConnection.onStateChange(() => {
@@ -95,6 +93,7 @@ export default class _RTCPeerConnection extends EventTarget {
95
93
  return;
96
94
  }
97
95
 
96
+ this.#localCandidates.push(new RTCIceCandidate({ candidate, sdpMid }));
98
97
  this.dispatchEvent(new RTCPeerConnectionIceEvent(new RTCIceCandidate({ candidate, sdpMid })));
99
98
  });
100
99
 
@@ -117,6 +116,27 @@ export default class _RTCPeerConnection extends EventTarget {
117
116
  this.addEventListener('icecandidate', (e) => {
118
117
  if (this.onicecandidate) this.onicecandidate(e);
119
118
  });
119
+
120
+ this.#sctp = new RTCSctpTransport({
121
+ pc: this,
122
+ extraFunctions: {
123
+ maxDataChannelId: () => {
124
+ return this.#peerConnection.maxDataChannelId();
125
+ },
126
+ maxMessageSize: () => {
127
+ return this.#peerConnection.maxMessageSize();
128
+ },
129
+ localCandidates: () => {
130
+ return this.#localCandidates;
131
+ },
132
+ remoteCandidates: () => {
133
+ return this.#remoteCandidates;
134
+ },
135
+ selectedCandidatePair: () => {
136
+ return this.#peerConnection.getSelectedCandidatePair();
137
+ },
138
+ },
139
+ });
120
140
  }
121
141
 
122
142
  get canTrickleIceCandidates() {
@@ -176,6 +196,9 @@ export default class _RTCPeerConnection extends EventTarget {
176
196
  throw new DOMException('Candidate invalid');
177
197
  }
178
198
 
199
+ this.#remoteCandidates.push(
200
+ new RTCIceCandidate({ candidate: candidate.candidate, sdpMid: candidate.sdpMid || '0' }),
201
+ );
179
202
  this.#peerConnection.addRemoteCandidate(candidate.candidate, candidate.sdpMid || '0');
180
203
  }
181
204
 
@@ -1,34 +1,53 @@
1
+ import RTCDtlsTransport from './RTCDtlsTransport.js';
2
+
1
3
  export default class _RTCSctpTransport extends EventTarget {
2
- #maxChannels = null;
3
- #maxMessageSize = null;
4
- #state = null;
4
+ #pc = null;
5
+ #extraFunctions = null;
5
6
  #transport = null;
6
7
 
7
- onstatechange = createEmptyFunction();
8
+ onstatechange = null;
8
9
 
9
- constructor(init = {}) {
10
+ constructor({ pc, extraFunctions }) {
10
11
  super();
12
+ this.#pc = pc;
13
+ this.#extraFunctions = extraFunctions;
14
+
15
+ this.#transport = new RTCDtlsTransport({ pc, extraFunctions });
16
+
17
+ // forward peerConnection events
18
+ this.#pc.addEventListener('connectionstatechange', () => {
19
+ this.dispatchEvent(new Event('statechange'));
20
+ });
21
+
22
+ // forward events to properties
23
+ this.addEventListener('statechange', (e) => {
24
+ if (this.onstatechange) this.onstatechange(e);
25
+ });
11
26
  }
12
27
 
13
28
  get maxChannels() {
14
- return this.#maxChannels;
29
+ if (this.state !== 'connected') return null;
30
+ return this.#pc ? this.#extraFunctions.maxDataChannelId() : 0;
15
31
  }
16
32
 
17
33
  get maxMessageSize() {
18
- return this.#maxMessageSize;
34
+ if (this.state !== 'connected') return null;
35
+ return this.#pc ? this.#extraFunctions.maxMessageSize() : 0;
19
36
  }
20
37
 
21
38
  get state() {
22
- return this.#state;
39
+ // reduce state from new, connecting, connected, disconnected, failed, closed, unknown
40
+ // to RTCSctpTransport states connecting, connected, closed
41
+ let state = this.#pc.connectionState;
42
+ if (state === 'new' || state === 'connecting') {
43
+ state = 'connecting';
44
+ } else if (state === 'disconnected' || state === 'failed' || state === 'closed' || state === 'unknown') {
45
+ state = 'closed';
46
+ }
47
+ return state;
23
48
  }
24
49
 
25
50
  get transport() {
26
51
  return this.#transport;
27
52
  }
28
53
  }
29
-
30
- function createEmptyFunction() {
31
- return () => {
32
- /** */
33
- };
34
- }
@@ -62,6 +62,8 @@ Napi::Object PeerConnectionWrapper::Init(Napi::Env env, Napi::Object exports)
62
62
  InstanceMethod("bytesReceived", &PeerConnectionWrapper::bytesReceived),
63
63
  InstanceMethod("rtt", &PeerConnectionWrapper::rtt),
64
64
  InstanceMethod("getSelectedCandidatePair", &PeerConnectionWrapper::getSelectedCandidatePair),
65
+ InstanceMethod("maxDataChannelId", &PeerConnectionWrapper::maxDataChannelId),
66
+ InstanceMethod("maxMessageSize", &PeerConnectionWrapper::maxMessageSize),
65
67
  });
66
68
 
67
69
  constructor = Napi::Persistent(func);
@@ -984,11 +986,17 @@ Napi::Value PeerConnectionWrapper::getSelectedCandidatePair(const Napi::Callback
984
986
  localObj.Set("port", local.port().value_or(0));
985
987
  localObj.Set("type", candidateTypeToString(local.type()));
986
988
  localObj.Set("transportType", candidateTransportTypeToString(local.transportType()));
989
+ localObj.Set("candidate", local.candidate());
990
+ localObj.Set("mid", local.mid());
991
+ localObj.Set("priority", local.priority());
987
992
 
988
993
  remoteObj.Set("address", remote.address().value_or("?"));
989
994
  remoteObj.Set("port", remote.port().value_or(0));
990
995
  remoteObj.Set("type", candidateTypeToString(remote.type()));
991
996
  remoteObj.Set("transportType", candidateTransportTypeToString(remote.transportType()));
997
+ remoteObj.Set("candidate", remote.candidate());
998
+ remoteObj.Set("mid", remote.mid());
999
+ remoteObj.Set("priority", remote.priority());
992
1000
 
993
1001
  retvalue.Set("local", localObj);
994
1002
  retvalue.Set("remote", remoteObj);
@@ -1002,6 +1010,48 @@ Napi::Value PeerConnectionWrapper::getSelectedCandidatePair(const Napi::Callback
1002
1010
  }
1003
1011
  }
1004
1012
 
1013
+ Napi::Value PeerConnectionWrapper::maxDataChannelId(const Napi::CallbackInfo &info)
1014
+ {
1015
+ PLOG_DEBUG << "maxDataChannelId() called";
1016
+ Napi::Env env = info.Env();
1017
+
1018
+ if (!mRtcPeerConnPtr)
1019
+ {
1020
+ return Napi::Number::New(info.Env(), 0);
1021
+ }
1022
+
1023
+ try
1024
+ {
1025
+ return Napi::Number::New(env, mRtcPeerConnPtr->maxDataChannelId());
1026
+ }
1027
+ catch (std::exception &ex)
1028
+ {
1029
+ Napi::Error::New(env, std::string("libdatachannel error: ") + ex.what()).ThrowAsJavaScriptException();
1030
+ return Napi::Number::New(info.Env(), 0);
1031
+ }
1032
+ }
1033
+
1034
+ Napi::Value PeerConnectionWrapper::maxMessageSize(const Napi::CallbackInfo &info)
1035
+ {
1036
+ PLOG_DEBUG << "maxMessageSize() called";
1037
+ Napi::Env env = info.Env();
1038
+
1039
+ if (!mRtcPeerConnPtr)
1040
+ {
1041
+ return Napi::Number::New(info.Env(), 0);
1042
+ }
1043
+
1044
+ try
1045
+ {
1046
+ return Napi::Number::New(env, mRtcPeerConnPtr->remoteMaxMessageSize());
1047
+ }
1048
+ catch (std::exception &ex)
1049
+ {
1050
+ Napi::Error::New(env, std::string("libdatachannel error: ") + ex.what()).ThrowAsJavaScriptException();
1051
+ return Napi::Number::New(info.Env(), 0);
1052
+ }
1053
+ }
1054
+
1005
1055
  std::string PeerConnectionWrapper::candidateTypeToString(const rtc::Candidate::Type &type)
1006
1056
  {
1007
1057
  PLOG_DEBUG << "candidateTypeToString() called";
@@ -51,6 +51,8 @@ public:
51
51
  Napi::Value bytesReceived(const Napi::CallbackInfo &info);
52
52
  Napi::Value rtt(const Napi::CallbackInfo &info);
53
53
  Napi::Value getSelectedCandidatePair(const Napi::CallbackInfo &info);
54
+ Napi::Value maxDataChannelId(const Napi::CallbackInfo &info);
55
+ Napi::Value maxMessageSize(const Napi::CallbackInfo &info);
54
56
 
55
57
  // Close all existing Peer Connections
56
58
  static void CloseAll();
@@ -71,6 +71,7 @@ dc1.onclose = () => {
71
71
  peer1
72
72
  .createOffer({})
73
73
  .then((desc) => {
74
+ // console.log(122222, desc);
74
75
  peer2.setRemoteDescription(desc);
75
76
  })
76
77
  .catch((err) => console.error(err));
package/test/test.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { jest } from '@jest/globals';
2
- import nodeDataChannel, { DataChannelStream } from '../lib/index.js';
2
+ import * as nodeDataChannel from '../lib';
3
3
 
4
4
  describe('Module Definition', () => {
5
5
  test('Module Defined', () => {
@@ -154,7 +154,7 @@ describe('DataChannel streams', () => {
154
154
  let clientPeer = new nodeDataChannel.PeerConnection('Client', { iceServers: [] });
155
155
  let echoPeer = new nodeDataChannel.PeerConnection('Client', { iceServers: [] });
156
156
 
157
- const echoStream = new DataChannelStream(echoPeer.createDataChannel('echo-channel'));
157
+ const echoStream = new nodeDataChannel.DataChannelStream(echoPeer.createDataChannel('echo-channel'));
158
158
  echoStream.pipe(echoStream); // Echo all received data back to the client
159
159
 
160
160
  await waitForGathering(echoPeer);
@@ -1,30 +0,0 @@
1
- ARG UBUNTU_VERSION=20.04
2
-
3
- FROM ubuntu:${UBUNTU_VERSION}
4
-
5
- RUN apt-get update -y && apt-get upgrade -y
6
-
7
- # Node
8
- # https://github.com/nodesource/distributions#nodejs
9
- ARG NODE_MAJOR=18
10
- RUN apt-get install -y ca-certificates curl gnupg
11
- RUN mkdir -p /etc/apt/keyrings
12
- RUN curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
13
- RUN echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list
14
- RUN apt-get update -y
15
- RUN apt-get install -y nodejs
16
-
17
- # C++
18
- RUN apt-get install -y cmake g++
19
-
20
- # libnice library as an alternative to default one
21
- # RUN apt-get install -y libnice-dev
22
-
23
- # libssl-dev
24
- # https://www.claudiokuenzler.com/blog/1216/could-not-find-openssl-error-compiling-cmake-source
25
- RUN apt-get install -y libssl-dev
26
-
27
- # Git
28
- RUN apt-get install -y git
29
-
30
- WORKDIR /home/node-datachannel
@@ -1,24 +0,0 @@
1
- # Examples
2
-
3
- ## Building with Docker
4
-
5
- `cd` into `node-datachannel` root directory
6
-
7
- ```sh
8
- # Build Docker image from Dockerfile
9
- # You can choose Ubuntu and Node major versions by changing UBUNTU_VERSION and NODE_MAJOR
10
- > docker build \
11
- -f ./examples/build/Dockerfile \
12
- -t node-datachannel-dev \
13
- --build-arg UBUNTU_VERSION=20.04 \
14
- --build-arg NODE_MAJOR=18 \
15
- .
16
-
17
- # Run Docker container and mount node-datachannel root directory as a volume to the container
18
- > docker run -it --rm --name node-datachannel-dev-container -v ${PWD}:/home/node-datachannel node-datachannel-dev /bin/bash
19
-
20
- # Run inside Docker container:
21
- > npm install --build-from-source
22
- ```
23
-
24
- The build will be written to `prebuilds/`
@@ -1,21 +0,0 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2014 Jameson Little
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in
13
- all copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
- THE SOFTWARE.