@wazo/sdk 0.38.22 → 0.39.0-beta.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 (884) hide show
  1. package/README.md +0 -293
  2. package/dist/wazo-sdk.js +9 -25
  3. package/esm/__tests__/api-client.test.js +183 -5059
  4. package/esm/__tests__/web-rtc-client.test.js +177 -7930
  5. package/esm/api/agentd.js +23 -832
  6. package/esm/api/amid.js +9 -411
  7. package/esm/api/application.js +60 -829
  8. package/esm/api/auth.js +164 -1213
  9. package/esm/api/call-logd.js +24 -733
  10. package/esm/api/calld.js +114 -1469
  11. package/esm/api/chatd.js +35 -1312
  12. package/esm/api/confd.js +67 -1580
  13. package/esm/api/ctid-ng.js +92 -1343
  14. package/esm/api/dird.js +100 -1590
  15. package/esm/api/webhookd.js +7 -513
  16. package/esm/api-client.js +143 -4881
  17. package/esm/checker/Checker.js +45 -8727
  18. package/esm/checker/checks/aor.js +24 -4924
  19. package/esm/checker/checks/api.js +70 -4968
  20. package/esm/checker/checks/ice-ipv4.js +63 -117
  21. package/esm/checker/checks/index.js +8 -8677
  22. package/esm/checker/checks/symmetric-nat.js +54 -102
  23. package/esm/checker/checks/wazo-websocket.js +34 -999
  24. package/esm/checker/checks/webrtc-transport.js +28 -7845
  25. package/esm/checker/checks/webrtc.js +31 -7852
  26. package/esm/domain/AdHocAPIConference.js +86 -5115
  27. package/esm/domain/Agent.js +27 -61
  28. package/esm/domain/BadResponse.js +20 -43
  29. package/esm/domain/Call.js +120 -210
  30. package/esm/domain/CallLog.js +123 -305
  31. package/esm/domain/CallSession.js +251 -423
  32. package/esm/domain/ChatMessage.js +52 -105
  33. package/esm/domain/ChatRoom.js +28 -60
  34. package/esm/domain/Contact.js +430 -741
  35. package/esm/domain/Country.js +17 -19
  36. package/esm/domain/Device/DebugDevice.js +31 -47
  37. package/esm/domain/Device/Device.js +1 -1
  38. package/esm/domain/DirectorySource.js +1 -1
  39. package/esm/domain/ExternalApp.js +23 -56
  40. package/esm/domain/Features.js +57 -5009
  41. package/esm/domain/ForwardOption.js +35 -70
  42. package/esm/domain/IndirectTransfer.js +38 -97
  43. package/esm/domain/Line.js +37 -88
  44. package/esm/domain/Meeting.js +58 -113
  45. package/esm/domain/MeetingAuthorization.js +38 -68
  46. package/esm/domain/MeetingStatus.js +13 -28
  47. package/esm/domain/NotificationOptions.js +43 -77
  48. package/esm/domain/Phone/CTIPhone.js +245 -5743
  49. package/esm/domain/Phone/Phone.js +1 -2
  50. package/esm/domain/Phone/WebRTCPhone.js +1446 -2670
  51. package/esm/domain/Profile.js +120 -405
  52. package/esm/domain/Recording.js +27 -51
  53. package/esm/domain/Relocation.js +16 -40
  54. package/esm/domain/Room.js +90 -133
  55. package/esm/domain/SFUNotAvailableError.js +5 -8
  56. package/esm/domain/ServerError.js +8 -61
  57. package/esm/domain/Session.js +125 -251
  58. package/esm/domain/SipLine.js +78 -155
  59. package/esm/domain/Subscription.js +39 -83
  60. package/esm/domain/SwitchboardCall.js +51 -143
  61. package/esm/domain/Voicemail.js +57 -122
  62. package/esm/domain/__tests__/Agent.test.js +31 -101
  63. package/esm/domain/__tests__/Call.test.js +24 -232
  64. package/esm/domain/__tests__/CallLog.test.js +60 -386
  65. package/esm/domain/__tests__/CallSession.test.js +74 -502
  66. package/esm/domain/__tests__/Contact.test.js +220 -902
  67. package/esm/domain/__tests__/IndirectTransfer.test.js +63 -546
  68. package/esm/domain/__tests__/Line.test.js +48 -156
  69. package/esm/domain/__tests__/Meeting.test.js +73 -226
  70. package/esm/domain/__tests__/MeetingAuthorization.test.js +45 -105
  71. package/esm/domain/__tests__/Profile.test.js +135 -496
  72. package/esm/domain/__tests__/Room.test.js +227 -719
  73. package/esm/domain/__tests__/Session.test.js +357 -1025
  74. package/esm/domain/__tests__/SipLine.test.js +24 -179
  75. package/esm/domain/__tests__/Voicemail.test.js +82 -200
  76. package/esm/domain/types.js +1 -1
  77. package/esm/index.js +63 -14985
  78. package/esm/lib/WazoSessionDescriptionHandler.js +406 -890
  79. package/esm/pubkey.js +10 -0
  80. package/esm/service/CallApi.js +42 -5014
  81. package/esm/service/IssueReporter.js +278 -360
  82. package/esm/service/__tests__/IssueReporter.test.js +92 -494
  83. package/esm/service/getApiClient.js +53 -4972
  84. package/esm/simple/Auth.js +211 -14747
  85. package/esm/simple/Configuration.js +8 -14796
  86. package/esm/simple/Directory.js +6 -4964
  87. package/esm/simple/Phone.js +309 -14727
  88. package/esm/simple/Websocket.js +68 -1112
  89. package/esm/simple/index.js +125 -14792
  90. package/esm/simple/room/LocalParticipant.js +1 -14797
  91. package/esm/simple/room/Participant.js +274 -14760
  92. package/esm/simple/room/RemoteParticipant.js +6 -14796
  93. package/esm/simple/room/Room.js +648 -14736
  94. package/esm/simple/room/SipRoom.js +111 -14790
  95. package/esm/simple/room/Stream.js +40 -14792
  96. package/esm/simple/room/__tests__/Participant.test.js +68 -14872
  97. package/esm/simple/room/__tests__/RemoteParticipant.test.js +10 -14805
  98. package/esm/simple/utils.js +9 -14799
  99. package/esm/types/WebSocketMessage.js +1 -1
  100. package/esm/types/__tests__/api-client.test.d.ts +2 -0
  101. package/esm/types/__tests__/api-client.test.d.ts.map +1 -0
  102. package/esm/types/__tests__/web-rtc-client.test.d.ts +2 -0
  103. package/esm/types/__tests__/web-rtc-client.test.d.ts.map +1 -0
  104. package/esm/types/api/agentd.d.ts +17 -0
  105. package/esm/types/api/agentd.d.ts.map +1 -0
  106. package/esm/types/api/amid.d.ts +8 -0
  107. package/esm/types/api/amid.d.ts.map +1 -0
  108. package/esm/types/api/application.d.ts +34 -0
  109. package/esm/types/api/application.d.ts.map +1 -0
  110. package/esm/types/api/auth.d.ts +64 -0
  111. package/esm/types/api/auth.d.ts.map +1 -0
  112. package/esm/types/api/call-logd.d.ts +12 -0
  113. package/esm/types/api/call-logd.d.ts.map +1 -0
  114. package/esm/types/api/calld.d.ts +51 -0
  115. package/esm/types/api/calld.d.ts.map +1 -0
  116. package/esm/types/api/chatd.d.ts +42 -0
  117. package/esm/types/api/chatd.d.ts.map +1 -0
  118. package/esm/types/api/confd.d.ts +39 -0
  119. package/esm/types/api/confd.d.ts.map +1 -0
  120. package/esm/types/api/ctid-ng.d.ts +36 -0
  121. package/esm/types/api/ctid-ng.d.ts.map +1 -0
  122. package/esm/types/api/dird.d.ts +38 -0
  123. package/esm/types/api/dird.d.ts.map +1 -0
  124. package/esm/types/api/webhookd.d.ts +24 -0
  125. package/esm/types/api/webhookd.d.ts.map +1 -0
  126. package/esm/types/api-client.d.ts +63 -0
  127. package/esm/types/api-client.d.ts.map +1 -0
  128. package/esm/types/checker/Checker.d.ts +13 -0
  129. package/esm/types/checker/Checker.d.ts.map +1 -0
  130. package/esm/types/checker/checks/aor.d.ts +6 -0
  131. package/esm/types/checker/checks/aor.d.ts.map +1 -0
  132. package/esm/types/checker/checks/api.d.ts +6 -0
  133. package/esm/types/checker/checks/api.d.ts.map +1 -0
  134. package/esm/types/checker/checks/ice-ipv4.d.ts +6 -0
  135. package/esm/types/checker/checks/ice-ipv4.d.ts.map +1 -0
  136. package/esm/types/checker/checks/index.d.ts +9 -0
  137. package/esm/types/checker/checks/index.d.ts.map +1 -0
  138. package/esm/types/checker/checks/symmetric-nat.d.ts +6 -0
  139. package/esm/types/checker/checks/symmetric-nat.d.ts.map +1 -0
  140. package/esm/types/checker/checks/wazo-websocket.d.ts +6 -0
  141. package/esm/types/checker/checks/wazo-websocket.d.ts.map +1 -0
  142. package/esm/types/checker/checks/webrtc-transport.d.ts +7 -0
  143. package/esm/types/checker/checks/webrtc-transport.d.ts.map +1 -0
  144. package/esm/types/checker/checks/webrtc.d.ts +6 -0
  145. package/esm/types/checker/checks/webrtc.d.ts.map +1 -0
  146. package/esm/types/domain/AdHocAPIConference.d.ts +54 -0
  147. package/esm/types/domain/AdHocAPIConference.d.ts.map +1 -0
  148. package/esm/types/domain/Agent.d.ts +31 -0
  149. package/esm/types/domain/Agent.d.ts.map +1 -0
  150. package/esm/types/domain/BadResponse.d.ts +11 -0
  151. package/esm/types/domain/BadResponse.d.ts.map +1 -0
  152. package/esm/types/domain/Call.d.ts +79 -0
  153. package/esm/types/domain/Call.d.ts.map +1 -0
  154. package/esm/types/domain/CallLog.d.ts +91 -0
  155. package/esm/types/domain/CallLog.d.ts.map +1 -0
  156. package/esm/types/domain/CallSession.d.ts +120 -0
  157. package/esm/types/domain/CallSession.d.ts.map +1 -0
  158. package/esm/types/domain/ChatMessage.d.ts +41 -0
  159. package/esm/types/domain/ChatMessage.d.ts.map +1 -0
  160. package/esm/types/domain/ChatRoom.d.ts +22 -0
  161. package/esm/types/domain/ChatRoom.d.ts.map +1 -0
  162. package/esm/types/domain/Contact.d.ts +316 -0
  163. package/esm/types/domain/Contact.d.ts.map +1 -0
  164. package/esm/types/domain/Country.d.ts +20 -0
  165. package/esm/types/domain/Country.d.ts.map +1 -0
  166. package/esm/types/domain/Device/DebugDevice.d.ts +14 -0
  167. package/esm/types/domain/Device/DebugDevice.d.ts.map +1 -0
  168. package/esm/types/domain/Device/Device.d.ts +13 -0
  169. package/esm/types/domain/Device/Device.d.ts.map +1 -0
  170. package/esm/types/domain/DirectorySource.d.ts +13 -0
  171. package/esm/types/domain/DirectorySource.d.ts.map +1 -0
  172. package/esm/types/domain/ExternalApp.d.ts +22 -0
  173. package/esm/types/domain/ExternalApp.d.ts.map +1 -0
  174. package/esm/types/domain/Features.d.ts +24 -0
  175. package/esm/types/domain/Features.d.ts.map +1 -0
  176. package/esm/types/domain/ForwardOption.d.ts +27 -0
  177. package/esm/types/domain/ForwardOption.d.ts.map +1 -0
  178. package/esm/types/domain/IndirectTransfer.d.ts +31 -0
  179. package/esm/types/domain/IndirectTransfer.d.ts.map +1 -0
  180. package/esm/types/domain/Line.d.ts +46 -0
  181. package/esm/types/domain/Line.d.ts.map +1 -0
  182. package/esm/types/domain/Meeting.d.ts +45 -0
  183. package/esm/types/domain/Meeting.d.ts.map +1 -0
  184. package/esm/types/domain/MeetingAuthorization.d.ts +26 -0
  185. package/esm/types/domain/MeetingAuthorization.d.ts.map +1 -0
  186. package/esm/types/domain/MeetingStatus.d.ts +10 -0
  187. package/esm/types/domain/MeetingStatus.d.ts.map +1 -0
  188. package/esm/types/domain/NotificationOptions.d.ts +22 -0
  189. package/esm/types/domain/NotificationOptions.d.ts.map +1 -0
  190. package/esm/types/domain/Phone/CTIPhone.d.ts +76 -0
  191. package/esm/types/domain/Phone/CTIPhone.d.ts.map +1 -0
  192. package/esm/types/domain/Phone/Phone.d.ts +71 -0
  193. package/esm/types/domain/Phone/Phone.d.ts.map +1 -0
  194. package/esm/types/domain/Phone/WebRTCPhone.d.ts +179 -0
  195. package/esm/types/domain/Phone/WebRTCPhone.d.ts.map +1 -0
  196. package/esm/types/domain/Profile.d.ts +151 -0
  197. package/esm/types/domain/Profile.d.ts.map +1 -0
  198. package/esm/types/domain/Recording.d.ts +26 -0
  199. package/esm/types/domain/Recording.d.ts.map +1 -0
  200. package/esm/types/domain/Relocation.d.ts +23 -0
  201. package/esm/types/domain/Relocation.d.ts.map +1 -0
  202. package/esm/types/domain/Room.d.ts +35 -0
  203. package/esm/types/domain/Room.d.ts.map +1 -0
  204. package/esm/types/domain/SFUNotAvailableError.d.ts +4 -0
  205. package/esm/types/domain/SFUNotAvailableError.d.ts.map +1 -0
  206. package/esm/types/domain/ServerError.d.ts +6 -0
  207. package/esm/types/domain/ServerError.d.ts.map +1 -0
  208. package/esm/types/domain/Session.d.ts +90 -0
  209. package/esm/types/domain/Session.d.ts.map +1 -0
  210. package/esm/types/domain/SipLine.d.ts +54 -0
  211. package/esm/types/domain/SipLine.d.ts.map +1 -0
  212. package/esm/types/domain/Subscription.d.ts +43 -0
  213. package/esm/types/domain/Subscription.d.ts.map +1 -0
  214. package/esm/types/domain/SwitchboardCall.d.ts +62 -0
  215. package/esm/types/domain/SwitchboardCall.d.ts.map +1 -0
  216. package/esm/types/domain/Voicemail.d.ts +50 -0
  217. package/esm/types/domain/Voicemail.d.ts.map +1 -0
  218. package/esm/types/domain/__tests__/Agent.test.d.ts +2 -0
  219. package/esm/types/domain/__tests__/Agent.test.d.ts.map +1 -0
  220. package/esm/types/domain/__tests__/Call.test.d.ts +2 -0
  221. package/esm/types/domain/__tests__/Call.test.d.ts.map +1 -0
  222. package/esm/types/domain/__tests__/CallLog.test.d.ts +2 -0
  223. package/esm/types/domain/__tests__/CallLog.test.d.ts.map +1 -0
  224. package/esm/types/domain/__tests__/CallSession.test.d.ts +2 -0
  225. package/esm/types/domain/__tests__/CallSession.test.d.ts.map +1 -0
  226. package/esm/types/domain/__tests__/Contact.test.d.ts +2 -0
  227. package/esm/types/domain/__tests__/Contact.test.d.ts.map +1 -0
  228. package/esm/types/domain/__tests__/IndirectTransfer.test.d.ts +2 -0
  229. package/esm/types/domain/__tests__/IndirectTransfer.test.d.ts.map +1 -0
  230. package/esm/types/domain/__tests__/Line.test.d.ts +2 -0
  231. package/esm/types/domain/__tests__/Line.test.d.ts.map +1 -0
  232. package/esm/types/domain/__tests__/Meeting.test.d.ts +2 -0
  233. package/esm/types/domain/__tests__/Meeting.test.d.ts.map +1 -0
  234. package/esm/types/domain/__tests__/MeetingAuthorization.test.d.ts +2 -0
  235. package/esm/types/domain/__tests__/MeetingAuthorization.test.d.ts.map +1 -0
  236. package/esm/types/domain/__tests__/Profile.test.d.ts +2 -0
  237. package/esm/types/domain/__tests__/Profile.test.d.ts.map +1 -0
  238. package/esm/types/domain/__tests__/Room.test.d.ts +2 -0
  239. package/esm/types/domain/__tests__/Room.test.d.ts.map +1 -0
  240. package/esm/types/domain/__tests__/Session.test.d.ts +2 -0
  241. package/esm/types/domain/__tests__/Session.test.d.ts.map +1 -0
  242. package/esm/types/domain/__tests__/SipLine.test.d.ts +2 -0
  243. package/esm/types/domain/__tests__/SipLine.test.d.ts.map +1 -0
  244. package/esm/types/domain/__tests__/Voicemail.test.d.ts +2 -0
  245. package/esm/types/domain/__tests__/Voicemail.test.d.ts.map +1 -0
  246. package/esm/types/domain/types.d.ts +217 -0
  247. package/esm/types/domain/types.d.ts.map +1 -0
  248. package/esm/types/index.d.ts +304 -0
  249. package/esm/types/index.d.ts.map +1 -0
  250. package/esm/types/lib/WazoSessionDescriptionHandler.d.ts +30 -0
  251. package/esm/types/lib/WazoSessionDescriptionHandler.d.ts.map +1 -0
  252. package/esm/types/pubkey.d.ts +3 -0
  253. package/esm/types/pubkey.d.ts.map +1 -0
  254. package/esm/types/service/CallApi.d.ts +28 -0
  255. package/esm/types/service/CallApi.d.ts.map +1 -0
  256. package/esm/types/service/IssueReporter.d.ts +40 -0
  257. package/esm/types/service/IssueReporter.d.ts.map +1 -0
  258. package/esm/types/service/__tests__/IssueReporter.test.d.ts +2 -0
  259. package/esm/types/service/__tests__/IssueReporter.test.d.ts.map +1 -0
  260. package/esm/types/service/getApiClient.d.ts +16 -0
  261. package/esm/types/service/getApiClient.d.ts.map +1 -0
  262. package/esm/types/simple/Auth.d.ts +51 -0
  263. package/esm/types/simple/Auth.d.ts.map +1 -0
  264. package/esm/types/simple/Configuration.d.ts +3 -0
  265. package/esm/types/simple/Configuration.d.ts.map +1 -0
  266. package/esm/types/simple/Directory.d.ts +3 -0
  267. package/esm/types/simple/Directory.d.ts.map +1 -0
  268. package/esm/types/simple/Phone.d.ts +115 -0
  269. package/esm/types/simple/Phone.d.ts.map +1 -0
  270. package/esm/types/simple/Websocket.d.ts +19 -0
  271. package/esm/types/simple/Websocket.d.ts.map +1 -0
  272. package/esm/types/simple/index.d.ts +147 -0
  273. package/esm/types/simple/index.d.ts.map +1 -0
  274. package/esm/types/simple/room/LocalParticipant.d.ts +5 -0
  275. package/esm/types/simple/room/LocalParticipant.d.ts.map +1 -0
  276. package/esm/types/simple/room/Participant.d.ts +76 -0
  277. package/esm/types/simple/room/Participant.d.ts.map +1 -0
  278. package/esm/types/simple/room/RemoteParticipant.d.ts +7 -0
  279. package/esm/types/simple/room/RemoteParticipant.d.ts.map +1 -0
  280. package/esm/types/simple/room/Room.d.ts +116 -0
  281. package/esm/types/simple/room/Room.d.ts.map +1 -0
  282. package/esm/types/simple/room/SipRoom.d.ts +14 -0
  283. package/esm/types/simple/room/SipRoom.d.ts.map +1 -0
  284. package/esm/types/simple/room/Stream.d.ts +13 -0
  285. package/esm/types/simple/room/Stream.d.ts.map +1 -0
  286. package/esm/types/simple/room/__tests__/Participant.test.d.ts +2 -0
  287. package/esm/types/simple/room/__tests__/Participant.test.d.ts.map +1 -0
  288. package/esm/types/simple/room/__tests__/RemoteParticipant.test.d.ts +2 -0
  289. package/esm/types/simple/room/__tests__/RemoteParticipant.test.d.ts.map +1 -0
  290. package/esm/types/simple/utils.d.ts +3 -0
  291. package/esm/types/simple/utils.d.ts.map +1 -0
  292. package/esm/types/types/WebSocketMessage.d.ts +285 -0
  293. package/esm/types/types/WebSocketMessage.d.ts.map +1 -0
  294. package/esm/types/utils/Emitter.d.ts +18 -0
  295. package/esm/types/utils/Emitter.d.ts.map +1 -0
  296. package/esm/types/utils/Heartbeat.d.ts +21 -0
  297. package/esm/types/utils/Heartbeat.d.ts.map +1 -0
  298. package/esm/types/utils/PhoneNumberUtil.d.ts +8 -0
  299. package/esm/types/utils/PhoneNumberUtil.d.ts.map +1 -0
  300. package/esm/types/utils/__tests__/Heartbeat.test.d.ts +2 -0
  301. package/esm/types/utils/__tests__/Heartbeat.test.d.ts.map +1 -0
  302. package/esm/types/utils/__tests__/PhoneNumberUtil.test.d.ts +2 -0
  303. package/esm/types/utils/__tests__/PhoneNumberUtil.test.d.ts.map +1 -0
  304. package/esm/types/utils/__tests__/api-requester.test.d.ts +2 -0
  305. package/esm/types/utils/__tests__/api-requester.test.d.ts.map +1 -0
  306. package/esm/types/utils/__tests__/array.test.d.ts +2 -0
  307. package/esm/types/utils/__tests__/array.test.d.ts.map +1 -0
  308. package/esm/types/utils/__tests__/compare-version.test.d.ts +2 -0
  309. package/esm/types/utils/__tests__/compare-version.test.d.ts.map +1 -0
  310. package/esm/types/utils/__tests__/object.test.d.ts +2 -0
  311. package/esm/types/utils/__tests__/object.test.d.ts.map +1 -0
  312. package/esm/types/utils/__tests__/sdp.test.d.ts +2 -0
  313. package/esm/types/utils/__tests__/sdp.test.d.ts.map +1 -0
  314. package/esm/types/utils/__tests__/string.test.d.ts +2 -0
  315. package/esm/types/utils/__tests__/string.test.d.ts.map +1 -0
  316. package/esm/types/utils/api-requester.d.ts +45 -0
  317. package/esm/types/utils/api-requester.d.ts.map +1 -0
  318. package/esm/types/utils/array.d.ts +2 -0
  319. package/esm/types/utils/array.d.ts.map +1 -0
  320. package/esm/types/utils/compare-version.d.ts +3 -0
  321. package/esm/types/utils/compare-version.d.ts.map +1 -0
  322. package/esm/types/utils/isMobile.d.ts +3 -0
  323. package/esm/types/utils/isMobile.d.ts.map +1 -0
  324. package/esm/types/utils/new-from.d.ts +3 -0
  325. package/esm/types/utils/new-from.d.ts.map +1 -0
  326. package/esm/types/utils/object.d.ts +2 -0
  327. package/esm/types/utils/object.d.ts.map +1 -0
  328. package/esm/types/utils/once.d.ts +2 -0
  329. package/esm/types/utils/once.d.ts.map +1 -0
  330. package/esm/types/utils/sdp.d.ts +13 -0
  331. package/esm/types/utils/sdp.d.ts.map +1 -0
  332. package/esm/types/utils/string.d.ts +2 -0
  333. package/esm/types/utils/string.d.ts.map +1 -0
  334. package/esm/types/utils/update-from.d.ts +3 -0
  335. package/esm/types/utils/update-from.d.ts.map +1 -0
  336. package/esm/types/utils/webrtc.d.ts +15 -0
  337. package/esm/types/utils/webrtc.d.ts.map +1 -0
  338. package/esm/types/web-rtc-client.d.ts +211 -0
  339. package/esm/types/web-rtc-client.d.ts.map +1 -0
  340. package/esm/types/websocket-client.d.ts +134 -0
  341. package/esm/types/websocket-client.d.ts.map +1 -0
  342. package/esm/utils/Emitter.js +17 -27
  343. package/esm/utils/Heartbeat.js +60 -83
  344. package/esm/utils/PhoneNumberUtil.js +48 -63
  345. package/esm/utils/__tests__/Heartbeat.test.js +59 -168
  346. package/esm/utils/__tests__/PhoneNumberUtil.test.js +55 -125
  347. package/esm/utils/__tests__/api-requester.test.js +127 -780
  348. package/esm/utils/__tests__/array.test.js +16 -19
  349. package/esm/utils/__tests__/compare-version.test.js +8 -26
  350. package/esm/utils/__tests__/object.test.js +73 -54
  351. package/esm/utils/__tests__/sdp.test.js +87 -216
  352. package/esm/utils/__tests__/string.test.js +21 -27
  353. package/esm/utils/api-requester.js +197 -675
  354. package/esm/utils/array.js +7 -11
  355. package/esm/utils/compare-version.js +12 -15
  356. package/esm/utils/isMobile.js +0 -2
  357. package/esm/utils/new-from.js +7 -12
  358. package/esm/utils/object.js +9 -23
  359. package/esm/utils/once.js +12 -13
  360. package/esm/utils/sdp.js +87 -131
  361. package/esm/utils/string.js +5 -9
  362. package/esm/utils/update-from.js +9 -16
  363. package/esm/utils/webrtc.js +35 -36
  364. package/esm/web-rtc-client.js +1973 -7676
  365. package/esm/websocket-client.js +352 -944
  366. package/lib/__tests__/api-client.test.js +199 -5067
  367. package/lib/__tests__/web-rtc-client.test.js +191 -7941
  368. package/lib/api/agentd.js +27 -837
  369. package/lib/api/amid.js +18 -415
  370. package/lib/api/application.js +64 -834
  371. package/lib/api/auth.js +166 -1222
  372. package/lib/api/call-logd.js +28 -738
  373. package/lib/api/calld.js +126 -1473
  374. package/lib/api/chatd.js +49 -1316
  375. package/lib/api/confd.js +79 -1584
  376. package/lib/api/ctid-ng.js +96 -1348
  377. package/lib/api/dird.js +105 -1596
  378. package/lib/api/webhookd.js +11 -518
  379. package/lib/api-client.js +138 -4884
  380. package/lib/checker/Checker.js +61 -8739
  381. package/lib/checker/checks/aor.js +37 -4929
  382. package/lib/checker/checks/api.js +81 -4971
  383. package/lib/checker/checks/ice-ipv4.js +66 -118
  384. package/lib/checker/checks/index.js +13 -8687
  385. package/lib/checker/checks/symmetric-nat.js +56 -104
  386. package/lib/checker/checks/wazo-websocket.js +58 -1006
  387. package/lib/checker/checks/webrtc-transport.js +41 -7853
  388. package/lib/checker/checks/webrtc.js +42 -7858
  389. package/lib/domain/AdHocAPIConference.js +80 -5116
  390. package/lib/domain/Agent.js +23 -64
  391. package/lib/domain/BadResponse.js +17 -44
  392. package/lib/domain/Call.js +108 -215
  393. package/lib/domain/CallLog.js +117 -311
  394. package/lib/domain/CallSession.js +221 -424
  395. package/lib/domain/ChatMessage.js +49 -110
  396. package/lib/domain/ChatRoom.js +28 -60
  397. package/lib/domain/Contact.js +404 -742
  398. package/lib/domain/Country.js +19 -21
  399. package/lib/domain/Device/DebugDevice.js +34 -49
  400. package/lib/domain/Device/Device.js +2 -2
  401. package/lib/domain/DirectorySource.js +2 -2
  402. package/lib/domain/ExternalApp.js +24 -56
  403. package/lib/domain/Features.js +68 -5018
  404. package/lib/domain/ForwardOption.js +36 -71
  405. package/lib/domain/IndirectTransfer.js +39 -98
  406. package/lib/domain/Line.js +35 -88
  407. package/lib/domain/Meeting.js +51 -118
  408. package/lib/domain/MeetingAuthorization.js +35 -75
  409. package/lib/domain/MeetingStatus.js +13 -29
  410. package/lib/domain/NotificationOptions.js +45 -77
  411. package/lib/domain/Phone/CTIPhone.js +283 -5755
  412. package/lib/domain/Phone/Phone.js +2 -5
  413. package/lib/domain/Phone/WebRTCPhone.js +1446 -2715
  414. package/lib/domain/Profile.js +127 -406
  415. package/lib/domain/Recording.js +28 -57
  416. package/lib/domain/Relocation.js +15 -43
  417. package/lib/domain/Room.js +73 -134
  418. package/lib/domain/SFUNotAvailableError.js +7 -9
  419. package/lib/domain/ServerError.js +14 -63
  420. package/lib/domain/Session.js +118 -251
  421. package/lib/domain/SipLine.js +70 -155
  422. package/lib/domain/Subscription.js +32 -86
  423. package/lib/domain/SwitchboardCall.js +45 -145
  424. package/lib/domain/Voicemail.js +56 -127
  425. package/lib/domain/__tests__/Agent.test.js +36 -103
  426. package/lib/domain/__tests__/Call.test.js +28 -237
  427. package/lib/domain/__tests__/CallLog.test.js +65 -392
  428. package/lib/domain/__tests__/CallSession.test.js +78 -503
  429. package/lib/domain/__tests__/Contact.test.js +224 -903
  430. package/lib/domain/__tests__/IndirectTransfer.test.js +75 -546
  431. package/lib/domain/__tests__/Line.test.js +52 -157
  432. package/lib/domain/__tests__/Meeting.test.js +78 -232
  433. package/lib/domain/__tests__/MeetingAuthorization.test.js +50 -107
  434. package/lib/domain/__tests__/Profile.test.js +161 -496
  435. package/lib/domain/__tests__/Room.test.js +239 -719
  436. package/lib/domain/__tests__/Session.test.js +350 -1024
  437. package/lib/domain/__tests__/SipLine.test.js +28 -180
  438. package/lib/domain/__tests__/Voicemail.test.js +86 -205
  439. package/lib/domain/types.js +2 -2
  440. package/lib/index.js +105 -15010
  441. package/lib/lib/WazoSessionDescriptionHandler.js +409 -898
  442. package/lib/pubkey.js +12 -0
  443. package/lib/service/CallApi.js +88 -5015
  444. package/lib/service/IssueReporter.js +264 -366
  445. package/lib/service/__tests__/IssueReporter.test.js +97 -500
  446. package/lib/service/getApiClient.js +70 -4990
  447. package/lib/simple/Auth.js +271 -14777
  448. package/lib/simple/Configuration.js +23 -14805
  449. package/lib/simple/Directory.js +18 -4966
  450. package/lib/simple/Phone.js +345 -14746
  451. package/lib/simple/Websocket.js +98 -1117
  452. package/lib/simple/index.js +151 -14800
  453. package/lib/simple/room/LocalParticipant.js +7 -14808
  454. package/lib/simple/room/Participant.js +269 -14778
  455. package/lib/simple/room/RemoteParticipant.js +11 -14806
  456. package/lib/simple/room/Room.js +655 -14761
  457. package/lib/simple/room/SipRoom.js +136 -14805
  458. package/lib/simple/room/Stream.js +43 -14802
  459. package/lib/simple/room/__tests__/Participant.test.js +79 -14879
  460. package/lib/simple/room/__tests__/RemoteParticipant.test.js +14 -14814
  461. package/lib/simple/utils.js +22 -14808
  462. package/lib/types/WebSocketMessage.js +2 -4
  463. package/lib/types/__tests__/api-client.test.d.ts +2 -0
  464. package/lib/types/__tests__/api-client.test.d.ts.map +1 -0
  465. package/lib/types/__tests__/web-rtc-client.test.d.ts +2 -0
  466. package/lib/types/__tests__/web-rtc-client.test.d.ts.map +1 -0
  467. package/lib/types/api/agentd.d.ts +17 -0
  468. package/lib/types/api/agentd.d.ts.map +1 -0
  469. package/lib/types/api/amid.d.ts +8 -0
  470. package/lib/types/api/amid.d.ts.map +1 -0
  471. package/lib/types/api/application.d.ts +34 -0
  472. package/lib/types/api/application.d.ts.map +1 -0
  473. package/lib/types/api/auth.d.ts +64 -0
  474. package/lib/types/api/auth.d.ts.map +1 -0
  475. package/lib/types/api/call-logd.d.ts +12 -0
  476. package/lib/types/api/call-logd.d.ts.map +1 -0
  477. package/lib/types/api/calld.d.ts +51 -0
  478. package/lib/types/api/calld.d.ts.map +1 -0
  479. package/lib/types/api/chatd.d.ts +42 -0
  480. package/lib/types/api/chatd.d.ts.map +1 -0
  481. package/lib/types/api/confd.d.ts +39 -0
  482. package/lib/types/api/confd.d.ts.map +1 -0
  483. package/lib/types/api/ctid-ng.d.ts +36 -0
  484. package/lib/types/api/ctid-ng.d.ts.map +1 -0
  485. package/lib/types/api/dird.d.ts +38 -0
  486. package/lib/types/api/dird.d.ts.map +1 -0
  487. package/lib/types/api/webhookd.d.ts +24 -0
  488. package/lib/types/api/webhookd.d.ts.map +1 -0
  489. package/lib/types/api-client.d.ts +63 -0
  490. package/lib/types/api-client.d.ts.map +1 -0
  491. package/lib/types/checker/Checker.d.ts +13 -0
  492. package/lib/types/checker/Checker.d.ts.map +1 -0
  493. package/lib/types/checker/checks/aor.d.ts +6 -0
  494. package/lib/types/checker/checks/aor.d.ts.map +1 -0
  495. package/lib/types/checker/checks/api.d.ts +6 -0
  496. package/lib/types/checker/checks/api.d.ts.map +1 -0
  497. package/lib/types/checker/checks/ice-ipv4.d.ts +6 -0
  498. package/lib/types/checker/checks/ice-ipv4.d.ts.map +1 -0
  499. package/lib/types/checker/checks/index.d.ts +9 -0
  500. package/lib/types/checker/checks/index.d.ts.map +1 -0
  501. package/lib/types/checker/checks/symmetric-nat.d.ts +6 -0
  502. package/lib/types/checker/checks/symmetric-nat.d.ts.map +1 -0
  503. package/lib/types/checker/checks/wazo-websocket.d.ts +6 -0
  504. package/lib/types/checker/checks/wazo-websocket.d.ts.map +1 -0
  505. package/lib/types/checker/checks/webrtc-transport.d.ts +7 -0
  506. package/lib/types/checker/checks/webrtc-transport.d.ts.map +1 -0
  507. package/lib/types/checker/checks/webrtc.d.ts +6 -0
  508. package/lib/types/checker/checks/webrtc.d.ts.map +1 -0
  509. package/lib/types/domain/AdHocAPIConference.d.ts +54 -0
  510. package/lib/types/domain/AdHocAPIConference.d.ts.map +1 -0
  511. package/lib/types/domain/Agent.d.ts +31 -0
  512. package/lib/types/domain/Agent.d.ts.map +1 -0
  513. package/lib/types/domain/BadResponse.d.ts +11 -0
  514. package/lib/types/domain/BadResponse.d.ts.map +1 -0
  515. package/lib/types/domain/Call.d.ts +79 -0
  516. package/lib/types/domain/Call.d.ts.map +1 -0
  517. package/lib/types/domain/CallLog.d.ts +91 -0
  518. package/lib/types/domain/CallLog.d.ts.map +1 -0
  519. package/lib/types/domain/CallSession.d.ts +120 -0
  520. package/lib/types/domain/CallSession.d.ts.map +1 -0
  521. package/lib/types/domain/ChatMessage.d.ts +41 -0
  522. package/lib/types/domain/ChatMessage.d.ts.map +1 -0
  523. package/lib/types/domain/ChatRoom.d.ts +22 -0
  524. package/lib/types/domain/ChatRoom.d.ts.map +1 -0
  525. package/lib/types/domain/Contact.d.ts +316 -0
  526. package/lib/types/domain/Contact.d.ts.map +1 -0
  527. package/lib/types/domain/Country.d.ts +20 -0
  528. package/lib/types/domain/Country.d.ts.map +1 -0
  529. package/lib/types/domain/Device/DebugDevice.d.ts +14 -0
  530. package/lib/types/domain/Device/DebugDevice.d.ts.map +1 -0
  531. package/lib/types/domain/Device/Device.d.ts +13 -0
  532. package/lib/types/domain/Device/Device.d.ts.map +1 -0
  533. package/lib/types/domain/DirectorySource.d.ts +13 -0
  534. package/lib/types/domain/DirectorySource.d.ts.map +1 -0
  535. package/lib/types/domain/ExternalApp.d.ts +22 -0
  536. package/lib/types/domain/ExternalApp.d.ts.map +1 -0
  537. package/lib/types/domain/Features.d.ts +24 -0
  538. package/lib/types/domain/Features.d.ts.map +1 -0
  539. package/lib/types/domain/ForwardOption.d.ts +27 -0
  540. package/lib/types/domain/ForwardOption.d.ts.map +1 -0
  541. package/lib/types/domain/IndirectTransfer.d.ts +31 -0
  542. package/lib/types/domain/IndirectTransfer.d.ts.map +1 -0
  543. package/lib/types/domain/Line.d.ts +46 -0
  544. package/lib/types/domain/Line.d.ts.map +1 -0
  545. package/lib/types/domain/Meeting.d.ts +45 -0
  546. package/lib/types/domain/Meeting.d.ts.map +1 -0
  547. package/lib/types/domain/MeetingAuthorization.d.ts +26 -0
  548. package/lib/types/domain/MeetingAuthorization.d.ts.map +1 -0
  549. package/lib/types/domain/MeetingStatus.d.ts +10 -0
  550. package/lib/types/domain/MeetingStatus.d.ts.map +1 -0
  551. package/lib/types/domain/NotificationOptions.d.ts +22 -0
  552. package/lib/types/domain/NotificationOptions.d.ts.map +1 -0
  553. package/lib/types/domain/Phone/CTIPhone.d.ts +76 -0
  554. package/lib/types/domain/Phone/CTIPhone.d.ts.map +1 -0
  555. package/lib/types/domain/Phone/Phone.d.ts +71 -0
  556. package/lib/types/domain/Phone/Phone.d.ts.map +1 -0
  557. package/lib/types/domain/Phone/WebRTCPhone.d.ts +179 -0
  558. package/lib/types/domain/Phone/WebRTCPhone.d.ts.map +1 -0
  559. package/lib/types/domain/Profile.d.ts +151 -0
  560. package/lib/types/domain/Profile.d.ts.map +1 -0
  561. package/lib/types/domain/Recording.d.ts +26 -0
  562. package/lib/types/domain/Recording.d.ts.map +1 -0
  563. package/lib/types/domain/Relocation.d.ts +23 -0
  564. package/lib/types/domain/Relocation.d.ts.map +1 -0
  565. package/lib/types/domain/Room.d.ts +35 -0
  566. package/lib/types/domain/Room.d.ts.map +1 -0
  567. package/lib/types/domain/SFUNotAvailableError.d.ts +4 -0
  568. package/lib/types/domain/SFUNotAvailableError.d.ts.map +1 -0
  569. package/lib/types/domain/ServerError.d.ts +6 -0
  570. package/lib/types/domain/ServerError.d.ts.map +1 -0
  571. package/lib/types/domain/Session.d.ts +90 -0
  572. package/lib/types/domain/Session.d.ts.map +1 -0
  573. package/lib/types/domain/SipLine.d.ts +54 -0
  574. package/lib/types/domain/SipLine.d.ts.map +1 -0
  575. package/lib/types/domain/Subscription.d.ts +43 -0
  576. package/lib/types/domain/Subscription.d.ts.map +1 -0
  577. package/lib/types/domain/SwitchboardCall.d.ts +62 -0
  578. package/lib/types/domain/SwitchboardCall.d.ts.map +1 -0
  579. package/lib/types/domain/Voicemail.d.ts +50 -0
  580. package/lib/types/domain/Voicemail.d.ts.map +1 -0
  581. package/lib/types/domain/__tests__/Agent.test.d.ts +2 -0
  582. package/lib/types/domain/__tests__/Agent.test.d.ts.map +1 -0
  583. package/lib/types/domain/__tests__/Call.test.d.ts +2 -0
  584. package/lib/types/domain/__tests__/Call.test.d.ts.map +1 -0
  585. package/lib/types/domain/__tests__/CallLog.test.d.ts +2 -0
  586. package/lib/types/domain/__tests__/CallLog.test.d.ts.map +1 -0
  587. package/lib/types/domain/__tests__/CallSession.test.d.ts +2 -0
  588. package/lib/types/domain/__tests__/CallSession.test.d.ts.map +1 -0
  589. package/lib/types/domain/__tests__/Contact.test.d.ts +2 -0
  590. package/lib/types/domain/__tests__/Contact.test.d.ts.map +1 -0
  591. package/lib/types/domain/__tests__/IndirectTransfer.test.d.ts +2 -0
  592. package/lib/types/domain/__tests__/IndirectTransfer.test.d.ts.map +1 -0
  593. package/lib/types/domain/__tests__/Line.test.d.ts +2 -0
  594. package/lib/types/domain/__tests__/Line.test.d.ts.map +1 -0
  595. package/lib/types/domain/__tests__/Meeting.test.d.ts +2 -0
  596. package/lib/types/domain/__tests__/Meeting.test.d.ts.map +1 -0
  597. package/lib/types/domain/__tests__/MeetingAuthorization.test.d.ts +2 -0
  598. package/lib/types/domain/__tests__/MeetingAuthorization.test.d.ts.map +1 -0
  599. package/lib/types/domain/__tests__/Profile.test.d.ts +2 -0
  600. package/lib/types/domain/__tests__/Profile.test.d.ts.map +1 -0
  601. package/lib/types/domain/__tests__/Room.test.d.ts +2 -0
  602. package/lib/types/domain/__tests__/Room.test.d.ts.map +1 -0
  603. package/lib/types/domain/__tests__/Session.test.d.ts +2 -0
  604. package/lib/types/domain/__tests__/Session.test.d.ts.map +1 -0
  605. package/lib/types/domain/__tests__/SipLine.test.d.ts +2 -0
  606. package/lib/types/domain/__tests__/SipLine.test.d.ts.map +1 -0
  607. package/lib/types/domain/__tests__/Voicemail.test.d.ts +2 -0
  608. package/lib/types/domain/__tests__/Voicemail.test.d.ts.map +1 -0
  609. package/lib/types/domain/types.d.ts +217 -0
  610. package/lib/types/domain/types.d.ts.map +1 -0
  611. package/lib/types/index.d.ts +304 -0
  612. package/lib/types/index.d.ts.map +1 -0
  613. package/lib/types/lib/WazoSessionDescriptionHandler.d.ts +30 -0
  614. package/lib/types/lib/WazoSessionDescriptionHandler.d.ts.map +1 -0
  615. package/lib/types/pubkey.d.ts +3 -0
  616. package/lib/types/pubkey.d.ts.map +1 -0
  617. package/lib/types/service/CallApi.d.ts +28 -0
  618. package/lib/types/service/CallApi.d.ts.map +1 -0
  619. package/lib/types/service/IssueReporter.d.ts +40 -0
  620. package/lib/types/service/IssueReporter.d.ts.map +1 -0
  621. package/lib/types/service/__tests__/IssueReporter.test.d.ts +2 -0
  622. package/lib/types/service/__tests__/IssueReporter.test.d.ts.map +1 -0
  623. package/lib/types/service/getApiClient.d.ts +16 -0
  624. package/lib/types/service/getApiClient.d.ts.map +1 -0
  625. package/lib/types/simple/Auth.d.ts +51 -0
  626. package/lib/types/simple/Auth.d.ts.map +1 -0
  627. package/lib/types/simple/Configuration.d.ts +3 -0
  628. package/lib/types/simple/Configuration.d.ts.map +1 -0
  629. package/lib/types/simple/Directory.d.ts +3 -0
  630. package/lib/types/simple/Directory.d.ts.map +1 -0
  631. package/lib/types/simple/Phone.d.ts +115 -0
  632. package/lib/types/simple/Phone.d.ts.map +1 -0
  633. package/lib/types/simple/Websocket.d.ts +19 -0
  634. package/lib/types/simple/Websocket.d.ts.map +1 -0
  635. package/lib/types/simple/index.d.ts +147 -0
  636. package/lib/types/simple/index.d.ts.map +1 -0
  637. package/lib/types/simple/room/LocalParticipant.d.ts +5 -0
  638. package/lib/types/simple/room/LocalParticipant.d.ts.map +1 -0
  639. package/lib/types/simple/room/Participant.d.ts +76 -0
  640. package/lib/types/simple/room/Participant.d.ts.map +1 -0
  641. package/lib/types/simple/room/RemoteParticipant.d.ts +7 -0
  642. package/lib/types/simple/room/RemoteParticipant.d.ts.map +1 -0
  643. package/lib/types/simple/room/Room.d.ts +116 -0
  644. package/lib/types/simple/room/Room.d.ts.map +1 -0
  645. package/lib/types/simple/room/SipRoom.d.ts +14 -0
  646. package/lib/types/simple/room/SipRoom.d.ts.map +1 -0
  647. package/lib/types/simple/room/Stream.d.ts +13 -0
  648. package/lib/types/simple/room/Stream.d.ts.map +1 -0
  649. package/lib/types/simple/room/__tests__/Participant.test.d.ts +2 -0
  650. package/lib/types/simple/room/__tests__/Participant.test.d.ts.map +1 -0
  651. package/lib/types/simple/room/__tests__/RemoteParticipant.test.d.ts +2 -0
  652. package/lib/types/simple/room/__tests__/RemoteParticipant.test.d.ts.map +1 -0
  653. package/lib/types/simple/utils.d.ts +3 -0
  654. package/lib/types/simple/utils.d.ts.map +1 -0
  655. package/lib/types/types/WebSocketMessage.d.ts +285 -0
  656. package/lib/types/types/WebSocketMessage.d.ts.map +1 -0
  657. package/lib/types/utils/Emitter.d.ts +18 -0
  658. package/lib/types/utils/Emitter.d.ts.map +1 -0
  659. package/lib/types/utils/Heartbeat.d.ts +21 -0
  660. package/lib/types/utils/Heartbeat.d.ts.map +1 -0
  661. package/lib/types/utils/PhoneNumberUtil.d.ts +8 -0
  662. package/lib/types/utils/PhoneNumberUtil.d.ts.map +1 -0
  663. package/lib/types/utils/__tests__/Heartbeat.test.d.ts +2 -0
  664. package/lib/types/utils/__tests__/Heartbeat.test.d.ts.map +1 -0
  665. package/lib/types/utils/__tests__/PhoneNumberUtil.test.d.ts +2 -0
  666. package/lib/types/utils/__tests__/PhoneNumberUtil.test.d.ts.map +1 -0
  667. package/lib/types/utils/__tests__/api-requester.test.d.ts +2 -0
  668. package/lib/types/utils/__tests__/api-requester.test.d.ts.map +1 -0
  669. package/lib/types/utils/__tests__/array.test.d.ts +2 -0
  670. package/lib/types/utils/__tests__/array.test.d.ts.map +1 -0
  671. package/lib/types/utils/__tests__/compare-version.test.d.ts +2 -0
  672. package/lib/types/utils/__tests__/compare-version.test.d.ts.map +1 -0
  673. package/lib/types/utils/__tests__/object.test.d.ts +2 -0
  674. package/lib/types/utils/__tests__/object.test.d.ts.map +1 -0
  675. package/lib/types/utils/__tests__/sdp.test.d.ts +2 -0
  676. package/lib/types/utils/__tests__/sdp.test.d.ts.map +1 -0
  677. package/lib/types/utils/__tests__/string.test.d.ts +2 -0
  678. package/lib/types/utils/__tests__/string.test.d.ts.map +1 -0
  679. package/lib/types/utils/api-requester.d.ts +45 -0
  680. package/lib/types/utils/api-requester.d.ts.map +1 -0
  681. package/lib/types/utils/array.d.ts +2 -0
  682. package/lib/types/utils/array.d.ts.map +1 -0
  683. package/lib/types/utils/compare-version.d.ts +3 -0
  684. package/lib/types/utils/compare-version.d.ts.map +1 -0
  685. package/lib/types/utils/isMobile.d.ts +3 -0
  686. package/lib/types/utils/isMobile.d.ts.map +1 -0
  687. package/lib/types/utils/new-from.d.ts +3 -0
  688. package/lib/types/utils/new-from.d.ts.map +1 -0
  689. package/lib/types/utils/object.d.ts +2 -0
  690. package/lib/types/utils/object.d.ts.map +1 -0
  691. package/lib/types/utils/once.d.ts +2 -0
  692. package/lib/types/utils/once.d.ts.map +1 -0
  693. package/lib/types/utils/sdp.d.ts +13 -0
  694. package/lib/types/utils/sdp.d.ts.map +1 -0
  695. package/lib/types/utils/string.d.ts +2 -0
  696. package/lib/types/utils/string.d.ts.map +1 -0
  697. package/lib/types/utils/update-from.d.ts +3 -0
  698. package/lib/types/utils/update-from.d.ts.map +1 -0
  699. package/lib/types/utils/webrtc.d.ts +15 -0
  700. package/lib/types/utils/webrtc.d.ts.map +1 -0
  701. package/lib/types/web-rtc-client.d.ts +211 -0
  702. package/lib/types/web-rtc-client.d.ts.map +1 -0
  703. package/lib/types/websocket-client.d.ts +134 -0
  704. package/lib/types/websocket-client.d.ts.map +1 -0
  705. package/lib/utils/Emitter.js +22 -33
  706. package/lib/utils/Heartbeat.js +54 -86
  707. package/lib/utils/PhoneNumberUtil.js +60 -77
  708. package/lib/utils/__tests__/Heartbeat.test.js +73 -170
  709. package/lib/utils/__tests__/PhoneNumberUtil.test.js +57 -131
  710. package/lib/utils/__tests__/api-requester.test.js +139 -784
  711. package/lib/utils/__tests__/array.test.js +18 -21
  712. package/lib/utils/__tests__/compare-version.test.js +12 -27
  713. package/lib/utils/__tests__/object.test.js +75 -56
  714. package/lib/utils/__tests__/sdp.test.js +99 -220
  715. package/lib/utils/__tests__/string.test.js +23 -29
  716. package/lib/utils/api-requester.js +191 -685
  717. package/lib/utils/array.js +10 -14
  718. package/lib/utils/compare-version.js +15 -18
  719. package/lib/utils/isMobile.js +3 -5
  720. package/lib/utils/new-from.js +9 -14
  721. package/lib/utils/object.js +12 -26
  722. package/lib/utils/once.js +15 -15
  723. package/lib/utils/sdp.js +97 -150
  724. package/lib/utils/string.js +8 -12
  725. package/lib/utils/update-from.js +11 -18
  726. package/lib/utils/webrtc.js +38 -39
  727. package/lib/web-rtc-client.js +1999 -7696
  728. package/lib/websocket-client.js +357 -1021
  729. package/package.json +40 -34
  730. package/src/__tests__/{api-client.test.js → api-client.test.ts} +71 -29
  731. package/src/__tests__/{web-rtc-client.test.js → web-rtc-client.test.ts} +95 -35
  732. package/src/api/agentd.ts +37 -0
  733. package/src/api/amid.ts +16 -0
  734. package/src/api/application.ts +96 -0
  735. package/src/api/auth.ts +259 -0
  736. package/src/api/call-logd.ts +38 -0
  737. package/src/api/calld.ts +183 -0
  738. package/src/api/chatd.ts +83 -0
  739. package/src/api/confd.ts +110 -0
  740. package/src/api/ctid-ng.ts +152 -0
  741. package/src/api/dird.ts +146 -0
  742. package/src/api/webhookd.ts +30 -0
  743. package/src/{api-client.js → api-client.ts} +99 -65
  744. package/src/checker/{Checker.js → Checker.ts} +27 -20
  745. package/src/checker/checks/{aor.js → aor.ts} +10 -6
  746. package/src/checker/checks/{api.js → api.ts} +18 -17
  747. package/src/checker/checks/{ice-ipv4.js → ice-ipv4.ts} +23 -26
  748. package/src/checker/checks/{index.js → index.ts} +1 -9
  749. package/src/checker/checks/{symmetric-nat.js → symmetric-nat.ts} +14 -15
  750. package/src/checker/checks/{wazo-websocket.js → wazo-websocket.ts} +7 -5
  751. package/src/checker/checks/{webrtc-transport.js → webrtc-transport.ts} +3 -2
  752. package/src/checker/checks/{webrtc.js → webrtc.ts} +3 -4
  753. package/src/domain/{AdHocAPIConference.js → AdHocAPIConference.ts} +38 -54
  754. package/src/domain/{Agent.js → Agent.ts} +11 -7
  755. package/src/domain/BadResponse.ts +29 -0
  756. package/src/domain/{Call.js → Call.ts} +62 -46
  757. package/src/domain/{CallLog.js → CallLog.ts} +61 -63
  758. package/src/domain/{CallSession.js → CallSession.ts} +55 -52
  759. package/src/domain/{ChatMessage.js → ChatMessage.ts} +32 -21
  760. package/src/domain/{ChatRoom.js → ChatRoom.ts} +15 -11
  761. package/src/domain/{Contact.js → Contact.ts} +373 -261
  762. package/src/domain/{Country.js → Country.ts} +0 -0
  763. package/src/domain/Device/{DebugDevice.js → DebugDevice.ts} +3 -5
  764. package/src/domain/Device/{Device.js → Device.ts} +0 -11
  765. package/src/domain/DirectorySource.ts +13 -0
  766. package/src/domain/{ExternalApp.js → ExternalApp.ts} +14 -13
  767. package/src/domain/{Features.js → Features.ts} +43 -17
  768. package/src/domain/{ForwardOption.js → ForwardOption.ts} +16 -16
  769. package/src/domain/{IndirectTransfer.js → IndirectTransfer.ts} +21 -19
  770. package/src/domain/{Line.js → Line.ts} +39 -26
  771. package/src/domain/{Meeting.js → Meeting.ts} +36 -29
  772. package/src/domain/{MeetingAuthorization.js → MeetingAuthorization.ts} +13 -12
  773. package/src/domain/{MeetingStatus.js → MeetingStatus.ts} +2 -6
  774. package/src/domain/{NotificationOptions.js → NotificationOptions.ts} +14 -13
  775. package/src/domain/Phone/{CTIPhone.js → CTIPhone.ts} +90 -60
  776. package/src/domain/Phone/{Phone.js → Phone.ts} +27 -72
  777. package/src/domain/Phone/{WebRTCPhone.js → WebRTCPhone.ts} +434 -413
  778. package/src/domain/{Profile.js → Profile.ts} +117 -100
  779. package/src/domain/{Recording.js → Recording.ts} +25 -16
  780. package/src/domain/{Relocation.js → Relocation.ts} +15 -14
  781. package/src/domain/{Room.js → Room.ts} +58 -27
  782. package/src/domain/{SFUNotAvailableError.js → SFUNotAvailableError.ts} +2 -2
  783. package/src/domain/ServerError.ts +12 -0
  784. package/src/domain/{Session.js → Session.ts} +89 -67
  785. package/src/domain/{SipLine.js → SipLine.ts} +52 -45
  786. package/src/domain/{Subscription.js → Subscription.ts} +22 -13
  787. package/src/domain/{SwitchboardCall.js → SwitchboardCall.ts} +48 -43
  788. package/src/domain/{Voicemail.js → Voicemail.ts} +38 -34
  789. package/src/domain/__tests__/{Agent.test.js → Agent.test.ts} +11 -19
  790. package/src/domain/__tests__/{Call.test.js → Call.test.ts} +12 -9
  791. package/src/domain/__tests__/CallLog.test.ts +65 -0
  792. package/src/domain/__tests__/{CallSession.test.js → CallSession.test.ts} +15 -19
  793. package/src/domain/__tests__/Contact.test.ts +238 -0
  794. package/src/domain/__tests__/{IndirectTransfer.test.js → IndirectTransfer.test.ts} +38 -31
  795. package/src/domain/__tests__/Line.test.ts +53 -0
  796. package/src/domain/__tests__/{Meeting.test.js → Meeting.test.ts} +12 -38
  797. package/src/domain/__tests__/{MeetingAuthorization.test.js → MeetingAuthorization.test.ts} +13 -21
  798. package/src/domain/__tests__/Profile.test.ts +139 -0
  799. package/src/domain/__tests__/{Room.test.js → Room.test.ts} +114 -76
  800. package/src/domain/__tests__/{Session.test.js → Session.test.ts} +137 -162
  801. package/src/domain/__tests__/{SipLine.test.js → SipLine.test.ts} +7 -3
  802. package/src/domain/__tests__/{Voicemail.test.js → Voicemail.test.ts} +26 -20
  803. package/src/domain/types.ts +227 -0
  804. package/src/global.d.ts +5 -0
  805. package/src/{index.js → index.ts} +4 -28
  806. package/src/lib/WazoSessionDescriptionHandler.ts +534 -0
  807. package/{config.js → src/pubkey.ts} +3 -3
  808. package/src/service/{CallApi.js → CallApi.ts} +14 -18
  809. package/src/service/{IssueReporter.js → IssueReporter.ts} +105 -56
  810. package/src/service/__tests__/{IssueReporter.test.js → IssueReporter.test.ts} +27 -23
  811. package/src/service/getApiClient.ts +94 -0
  812. package/src/simple/{Auth.js → Auth.ts} +127 -100
  813. package/src/simple/{Configuration.js → Configuration.ts} +2 -3
  814. package/src/simple/{Directory.js → Directory.ts} +2 -3
  815. package/src/simple/Phone.ts +623 -0
  816. package/src/simple/Websocket.ts +119 -0
  817. package/src/simple/{index.js → index.ts} +51 -21
  818. package/src/simple/room/{LocalParticipant.js → LocalParticipant.ts} +1 -3
  819. package/src/simple/room/{Participant.js → Participant.ts} +108 -46
  820. package/src/simple/room/{RemoteParticipant.js → RemoteParticipant.ts} +5 -4
  821. package/src/simple/room/{Room.js → Room.ts} +266 -183
  822. package/src/simple/room/{SipRoom.js → SipRoom.ts} +46 -29
  823. package/src/simple/room/{Stream.js → Stream.ts} +8 -6
  824. package/src/simple/room/__tests__/{Participant.test.js → Participant.test.ts} +9 -15
  825. package/src/simple/room/__tests__/{RemoteParticipant.test.js → RemoteParticipant.test.ts} +5 -1
  826. package/src/simple/utils.ts +12 -0
  827. package/src/types/WebSocketMessage.ts +335 -0
  828. package/src/types/global.d.ts +26 -0
  829. package/src/utils/Emitter.ts +34 -0
  830. package/src/utils/{Heartbeat.js → Heartbeat.ts} +17 -11
  831. package/src/utils/{PhoneNumberUtil.js → PhoneNumberUtil.ts} +12 -18
  832. package/src/utils/__tests__/{Heartbeat.test.js → Heartbeat.test.ts} +0 -15
  833. package/src/utils/__tests__/{PhoneNumberUtil.test.js → PhoneNumberUtil.test.ts} +6 -4
  834. package/src/utils/__tests__/{api-requester.test.js → api-requester.test.ts} +75 -24
  835. package/src/utils/__tests__/{array.test.js → array.test.ts} +10 -2
  836. package/src/utils/__tests__/{compare-version.test.js → compare-version.test.ts} +0 -0
  837. package/src/utils/__tests__/object.test.ts +77 -0
  838. package/src/utils/__tests__/{sdp.test.js → sdp.test.ts} +15 -37
  839. package/src/utils/__tests__/{string.test.js → string.test.ts} +4 -2
  840. package/src/utils/{api-requester.js → api-requester.ts} +104 -83
  841. package/src/utils/{array.js → array.ts} +2 -2
  842. package/src/utils/{compare-version.js → compare-version.ts} +3 -2
  843. package/src/utils/{isMobile.js → isMobile.ts} +1 -1
  844. package/src/utils/{new-from.js → new-from.ts} +3 -6
  845. package/src/utils/{object.js → object.ts} +3 -6
  846. package/src/utils/{once.js → once.ts} +5 -5
  847. package/src/utils/sdp.ts +119 -0
  848. package/src/utils/{string.js → string.ts} +2 -3
  849. package/src/utils/update-from.ts +11 -0
  850. package/src/utils/{webrtc.js → webrtc.ts} +21 -3
  851. package/src/{web-rtc-client.js → web-rtc-client.ts} +786 -457
  852. package/src/{websocket-client.js → websocket-client.ts} +146 -144
  853. package/esm/simple/Softphone.js +0 -394
  854. package/lib/simple/Softphone.js +0 -396
  855. package/src/api/agentd.js +0 -74
  856. package/src/api/amid.js +0 -13
  857. package/src/api/application.js +0 -137
  858. package/src/api/auth.js +0 -279
  859. package/src/api/call-logd.js +0 -20
  860. package/src/api/calld.js +0 -214
  861. package/src/api/chatd.js +0 -80
  862. package/src/api/confd.js +0 -127
  863. package/src/api/ctid-ng.js +0 -153
  864. package/src/api/dird.js +0 -159
  865. package/src/api/webhookd.js +0 -31
  866. package/src/domain/BadResponse.js +0 -42
  867. package/src/domain/DirectorySource.js +0 -16
  868. package/src/domain/ServerError.js +0 -18
  869. package/src/domain/__tests__/CallLog.test.js +0 -75
  870. package/src/domain/__tests__/Contact.test.js +0 -170
  871. package/src/domain/__tests__/Line.test.js +0 -73
  872. package/src/domain/__tests__/Profile.test.js +0 -104
  873. package/src/domain/types.js +0 -248
  874. package/src/lib/WazoSessionDescriptionHandler.js +0 -467
  875. package/src/service/getApiClient.js +0 -122
  876. package/src/simple/Phone.js +0 -425
  877. package/src/simple/Softphone.js +0 -392
  878. package/src/simple/Websocket.js +0 -86
  879. package/src/simple/utils.js +0 -17
  880. package/src/types/WebSocketMessage.js +0 -232
  881. package/src/utils/Emitter.js +0 -26
  882. package/src/utils/__tests__/object.test.js +0 -35
  883. package/src/utils/sdp.js +0 -140
  884. package/src/utils/update-from.js +0 -15
@@ -1,926 +1,437 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var EventEmitter = require('events');
6
- var sessionDescriptionHandler = require('sip.js/lib/platform/web/session-description-handler/session-description-handler');
7
- require('sip.js/lib/platform/web/session-description-handler/session-description-handler-options');
8
- var moment = require('moment');
9
- require('js-base64');
10
- var sdpParser = require('sdp-transform');
11
-
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
-
14
- var EventEmitter__default = /*#__PURE__*/_interopDefaultLegacy(EventEmitter);
15
- var moment__default = /*#__PURE__*/_interopDefaultLegacy(moment);
16
- var sdpParser__default = /*#__PURE__*/_interopDefaultLegacy(sdpParser);
17
-
18
- /* */
19
- /* global navigator */
20
- const isMobile = () => typeof navigator !== 'undefined' && navigator.product === 'ReactNative';
21
-
22
- /* */
23
-
24
- IssueReporter$1 ? IssueReporter$1.loggerFor('api') : console;
25
-
26
- // Use a function here to be able to mock it in tests
27
- const realFetch = () => {
28
- if (typeof document !== 'undefined' && window.fetch) {
29
- // Browser
30
- return window.fetch;
31
- }
32
-
33
- if (isMobile()) {
34
- // React native
35
- return fetch;
36
- }
37
-
38
- // nodejs
39
- // this package is disable for react-native in package.json because it requires nodejs modules
40
- // Used to trick the optimizer to avoid requiring `node-fetch/lib/index` directly
41
- // It causes to require it on browsers when delivered by a nodejs engine (cf: vitejs).
42
- try {
43
- // $FlowFixMe
44
- return require(Math.random() >= 0 ? 'node-fetch/lib/index' : '');
45
- } catch (e) {
46
- return fetch;
47
- }
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
48
4
  };
49
-
50
- /* global window */
51
-
52
- const TRACE = 'trace';
53
- const DEBUG = 'debug';
54
- const INFO = 'info';
55
- const LOG = 'log';
56
- const WARN = 'warn';
57
- const ERROR = 'error';
58
- const CONSOLE_METHODS = [INFO, LOG, WARN, ERROR];
59
- const LOG_LEVELS = [TRACE, DEBUG, INFO, LOG, WARN, ERROR];
60
- const CATEGORY_PREFIX = 'logger-category=';
61
-
62
- const MAX_REMOTE_RETRY = 100;
63
-
64
- const addLevelsTo = (instance , withMethods = false) => {
65
- instance.TRACE = TRACE;
66
- instance.DEBUG = DEBUG;
67
- instance.INFO = INFO;
68
- instance.LOG = LOG;
69
- instance.WARN = WARN;
70
- instance.ERROR = ERROR;
71
-
72
- if (withMethods) {
73
- instance.trace = (...args) => instance.apply(null, [TRACE, ...args]);
74
- instance.debug = (...args) => instance.apply(null, [DEBUG, ...args]);
75
- instance.info = (...args) => instance.apply(null, [INFO, ...args]);
76
- instance.log = (...args) => instance.apply(null, [LOG, ...args]);
77
- instance.warn = (...args) => instance.apply(null, [WARN, ...args]);
78
- instance.error = (...args) => instance.apply(null, [ERROR, ...args]);
79
- }
80
-
81
- return instance;
82
- };
83
-
84
- const safeStringify = (object ) => {
85
- const result = '{"message": "Not parsable JSON"}';
86
- try {
87
- return JSON.stringify(object);
88
- } catch (e) {
89
- // Nothing to do
90
- }
91
-
92
- return result;
93
- };
94
-
95
- class IssueReporter {
96
-
97
-
98
-
99
-
100
-
101
-
102
-
103
-
104
-
105
-
106
-
107
-
108
-
109
-
110
-
111
-
112
- constructor() {
113
- addLevelsTo(this);
114
-
115
- this.oldConsoleMethods = null;
116
- this.enabled = false;
117
- this.remoteClientConfiguration = null;
118
- this.buffer = [];
119
- this.bufferTimeout = null;
120
- this._boundProcessBuffer = this._processBuffer.bind(this);
121
- this._boundParseLoggerBody = this._parseLoggerBody.bind(this);
122
- this._callback = null;
123
- }
124
-
125
- init() {
126
- this._catchConsole();
127
- }
128
-
129
- setCallback(cb ) {
130
- this._callback = cb;
131
- }
132
-
133
- configureRemoteClient(configuration = { tag: 'wazo-sdk', host: null, port: null, level: null, extra: {} }) {
134
- this.remoteClientConfiguration = configuration;
135
- }
136
-
137
- enable() {
138
- if (!this.oldConsoleMethods) {
139
- this.init();
140
- }
141
-
142
- this.enabled = true;
143
- }
144
-
145
- disable() {
146
- this.enabled = false;
147
- }
148
-
149
- loggerFor(category ) {
150
- const logger = (level , ...args ) => {
151
- this.log.apply(this, [level, this._makeCategory(category), ...args]);
152
- };
153
-
154
- return addLevelsTo(logger, true);
155
- }
156
-
157
- removeSlashes(str ) {
158
- return str.replace(/"/g, "'").replace(/\\/g, '');
159
- }
160
-
161
- log(level , ...args ) {
162
- if (!this.enabled) {
163
- return;
164
- }
165
-
166
- // Handle category label
167
- let category = null;
168
- let skipSendToRemote = false;
169
- let extra = {};
170
- if (args[0].indexOf(CATEGORY_PREFIX) === 0) {
171
- category = args[0].split('=')[1];
172
- // eslint-disable-next-line no-param-reassign
173
- args.splice(0, 1);
174
- }
175
-
176
- // Handle extra data as object for the last argument
177
- const lastArg = args[args.length - 1];
178
- if (lastArg && ((typeof lastArg === 'object' && Object.keys(lastArg).length) || lastArg instanceof Error)) {
179
- if (lastArg instanceof Error) {
180
- extra = {
181
- errorMessage: lastArg.message,
182
- errorStack: lastArg.stack,
183
- errorType: lastArg.constructor.name,
184
- skipSendToRemote: lastArg.skipSendToRemote,
185
- };
186
- } else {
187
- extra = lastArg;
188
- }
189
- // eslint-disable-next-line no-param-reassign
190
- args.splice(1, 1);
191
- }
192
-
193
- if (extra.skipSendToRemote) {
194
- skipSendToRemote = true;
195
- delete extra.skipSendToRemote;
196
- }
197
-
198
- const date = moment__default['default']().format('YYYY-MM-DD HH:mm:ss.SSS');
199
- const message = args.join(', ');
200
- let consoleMessage = message;
201
-
202
- if (Object.keys(extra).length) {
203
- const parsedExtra = safeStringify(extra);
204
- consoleMessage = `${consoleMessage} (${parsedExtra})`;
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.wazoMediaStreamFactory = void 0;
7
+ /* global RTCSessionDescriptionInit, navigator */
8
+ const events_1 = __importDefault(require("events"));
9
+ const session_description_handler_1 = require("sip.js/lib/platform/web/session-description-handler/session-description-handler");
10
+ const IssueReporter_1 = __importDefault(require("../service/IssueReporter"));
11
+ const sdp_1 = require("../utils/sdp");
12
+ const wazoLogger = IssueReporter_1.default ? IssueReporter_1.default.loggerFor('webrtc-sdh') : console;
13
+ // Customized mediaStreamFactory allowing to send screensharing stream directory when upgrading
14
+ const wazoMediaStreamFactory = (constraints) => {
15
+ // @see sip.js/lib/platform/web/session-description-handler/media-stream-factory-default
16
+ if (!constraints.audio && !constraints.video) {
17
+ return Promise.resolve(new MediaStream());
205
18
  }
206
-
207
- if (category) {
208
- consoleMessage = `[${category}] ${consoleMessage}`;
19
+ if (navigator.mediaDevices === undefined) {
20
+ return Promise.reject(new Error('Media devices not available in insecure contexts.'));
209
21
  }
210
-
211
- // Log the message in the console anyway (but don't console.error on mobile)
212
- const consoleLevel = isMobile() && level === 'error' ? WARN : level;
213
-
214
- // eslint-disable-next-line
215
- const oldMethod = this.oldConsoleMethods[consoleLevel] || this.oldConsoleMethods.log;
216
- oldMethod.apply(oldMethod, [date, consoleMessage]);
217
-
218
- if (this._callback) {
219
- this._callback(level, consoleMessage);
22
+ // We have to make a `getUserMedia` on desktop but a `getDisplayMedia` in browsers when screensharing
23
+ if (constraints.screen && !constraints.desktop) {
24
+ return navigator.mediaDevices.getDisplayMedia.call(navigator.mediaDevices, constraints);
220
25
  }
221
-
222
- if (!skipSendToRemote) {
223
- this._sendToRemoteLogger(level, { date, message, category, ...extra });
26
+ return navigator.mediaDevices.getUserMedia.call(navigator.mediaDevices, constraints);
27
+ };
28
+ exports.wazoMediaStreamFactory = wazoMediaStreamFactory;
29
+ class WazoSessionDescriptionHandler extends session_description_handler_1.SessionDescriptionHandler {
30
+ // eslint-disable-next-line @typescript-eslint/default-param-last
31
+ constructor(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration, isWeb, session) {
32
+ super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
33
+ this.eventEmitter = new events_1.default();
34
+ this.isWeb = isWeb;
35
+ this.session = session;
224
36
  }
225
- }
226
-
227
- logRequest(url , options , response , start ) {
228
- if (!this.enabled) {
229
- return;
37
+ on(event, callback) {
38
+ this.eventEmitter.on(event, callback);
230
39
  }
231
- const { status } = response;
232
- const duration = new Date() - start;
233
-
234
- let level = TRACE;
235
- if (status >= 400 && status < 500) {
236
- level = WARN;
237
- } else if (status >= 500) {
238
- level = ERROR;
40
+ off(event, callback) {
41
+ this.eventEmitter.removeListener(event, callback);
239
42
  }
240
-
241
- this.log(level, this._makeCategory('http'), url, {
242
- status,
243
- body: this.removeSlashes(JSON.stringify(options.body)),
244
- method: options.method,
245
- headers: options.headers,
246
- duration,
247
- });
248
- }
249
-
250
- // Logs aren't stored anymore
251
- getLogs() {
252
- console.warn('IssueReporter\'s logs aren\'t stored anymore. Please use fluentd to store them');
253
- return [];
254
- }
255
-
256
- getParsedLogs() {
257
- console.warn('IssueReporter\'s logs aren\'t stored anymore. Please use fluentd to store them');
258
- return [];
259
- }
260
-
261
- getReport() {
262
- return this.getParsedLogs().join('\r\n');
263
- }
264
-
265
- _catchConsole() {
266
- this.oldConsoleMethods = {};
267
- CONSOLE_METHODS.forEach((methodName ) => {
268
- // eslint-disable-next-line
269
- this.oldConsoleMethods[methodName] = console[methodName];
270
- window.console[methodName] = (...args) => {
271
- // Store message
43
+ setRemoteSessionDescription(sessionDescription) {
272
44
  try {
273
- this.log(methodName, args.join(' '));
274
- // Use old console method to log it normally
275
- this.oldConsoleMethods[methodName].apply(null, args);
276
- } catch (e) {
277
- // Avoid circular structure issues
45
+ const result = super.setRemoteSessionDescription(sessionDescription);
46
+ this.eventEmitter.emit('setDescription', sessionDescription);
47
+ return result;
278
48
  }
279
- };
280
- });
281
- }
282
-
283
- _sendToRemoteLogger(level , payload = {}) {
284
- if (!this.remoteClientConfiguration) {
285
- return;
286
- }
287
-
288
- const { level: minLevel, bufferSize } = this.remoteClientConfiguration;
289
- if (!minLevel || this._isLevelAbove(minLevel, level)) {
290
- return;
291
- }
292
-
293
- payload.level = level;
294
-
295
- if (bufferSize > 0) {
296
- return this._addToBuffer(payload);
297
- }
298
-
299
- this._sendDebugToGrafana(payload);
300
- }
301
-
302
- _parseLoggerBody(payload ) {
303
- const { level } = payload;
304
- const { maxMessageSize, extra } = this.remoteClientConfiguration || {};
305
-
306
- delete payload.level;
307
-
308
- if (maxMessageSize && typeof payload.message === 'string' && payload.message.length > maxMessageSize) {
309
- payload.message = `${payload.message.substr(0, maxMessageSize)}...`;
310
- }
311
-
312
- return safeStringify({
313
- level,
314
- ...payload,
315
- ...extra,
316
- });
317
- }
318
-
319
- _addToBuffer(payload ) {
320
- // Reset buffer timer
321
- if (this.bufferTimeout) {
322
- clearTimeout(this.bufferTimeout);
323
- this.bufferTimeout = null;
324
- }
325
-
326
- this.buffer.push(payload);
327
-
328
- // $FlowFixMe
329
- const { bufferSize, bufferTimeout } = this.remoteClientConfiguration;
330
-
331
- if (this.buffer.length > bufferSize) {
332
- return this._processBuffer();
333
- }
334
-
335
- if (bufferTimeout > 0) {
336
- this.bufferTimeout = setTimeout(this._boundProcessBuffer, bufferTimeout);
337
- }
338
- }
339
-
340
- _processBuffer() {
341
- this._sendDebugToGrafana(this.buffer);
342
-
343
- this.buffer = [];
344
- if (this.bufferTimeout) {
345
- clearTimeout(this.bufferTimeout);
346
- this.bufferTimeout = null;
347
- }
348
- }
349
-
350
- _sendDebugToGrafana(payload , retry = 0) {
351
- if (!this.remoteClientConfiguration || retry >= MAX_REMOTE_RETRY) {
352
- return;
353
- }
354
-
355
- const { tag, host, port } = this.remoteClientConfiguration;
356
- const isArray = Array.isArray(payload);
357
- const isSecure = +port === 443;
358
- const url = `http${isSecure ? 's' : ''}://${host}${isSecure ? '' : `:${port}`}/${tag}`;
359
- const body = isArray ? `[${payload.map(this._boundParseLoggerBody).join(',')}]` : this._parseLoggerBody(payload);
360
-
361
- realFetch()(url, {
362
- method: 'POST',
363
- headers: {
364
- Accept: 'application/json',
365
- 'Content-Type': 'application/json',
366
- },
367
- // $FlowFixMe
368
- body,
369
- }).catch((e ) => {
370
- // $FlowFixMe
371
- e.skipSendToRemote = true;
372
- this.log('error', this._makeCategory('grafana'), 'Sending log to grafana, error', e);
373
-
374
- setTimeout(() => {
375
- if (isArray) {
376
- payload = payload.map(message => this._writeRetryCount(message, retry + 1));
377
- } else if (payload && typeof payload === 'object') {
378
- payload = this._writeRetryCount(payload, retry + 1);
49
+ catch (error) {
50
+ this.logger.error(`SessionDescriptionHandler.setRemoteSessionDescription: ${error}`);
51
+ throw error;
379
52
  }
380
-
381
- this._sendDebugToGrafana(payload, retry + 1);
382
- }, 5000 + retry * 1000);
383
- });
384
- }
385
-
386
- _writeRetryCount(message , count ) {
387
- if (message && typeof message === 'object') {
388
- // $FlowFixMe
389
- message._retry = count;
390
- }
391
-
392
- return message;
393
- }
394
-
395
- _isLevelAbove(level1 , level2 ) {
396
- const index1 = LOG_LEVELS.indexOf(level1);
397
- const index2 = LOG_LEVELS.indexOf(level2);
398
- if (index1 === -1 || index2 === -1) {
399
- return false;
400
- }
401
-
402
- return index1 > index2;
403
- }
404
-
405
- _makeCategory(category ) {
406
- return `${CATEGORY_PREFIX}${category}`;
407
- }
408
- }
409
-
410
- var IssueReporter$1 = new IssueReporter();
411
-
412
- /* */
413
-
414
- const parseCandidate = (candidate ) => {
415
- if (!candidate) {
416
- return null;
417
- }
418
- const result = sdpParser__default['default'].parse(candidate.indexOf('a=') === 0 ? candidate : `a=${candidate}`);
419
-
420
- return result.candidates ? result.candidates[0] : null;
421
- };
422
-
423
- const getSrflxOrRelay = (candidates ) =>
424
- candidates
425
- .filter(candidate => candidate && (candidate.type === 'srflx' || candidate.type === 'relay'));
426
-
427
- const fixSdp = (sdp , candidates , forcePort = true) => {
428
- const parsedSdp = sdpParser__default['default'].parse(sdp);
429
- const mainCandidate = getSrflxOrRelay(candidates)[0];
430
- const ip = mainCandidate ? mainCandidate.ip : null;
431
-
432
- if (ip) {
433
- parsedSdp.origin.address = ip;
434
- }
435
-
436
- parsedSdp.media = parsedSdp.media.map(media => {
437
- const port = forcePort ? (mainCandidate ? mainCandidate.port : media.port) : media.port;
438
- return {
439
- ...media,
440
- port,
441
- candidates: (media.candidates || []).concat(candidates),
442
- direction: port < 10 ? 'inactive' : media.direction,
443
- };
444
- });
445
-
446
- let fixed = sdpParser__default['default'].write(parsedSdp);
447
-
448
- if (ip) {
449
- fixed = fixed.replace(/IN IP4 0.0.0.0/g, `IN IP4 ${ip}`);
450
- }
451
-
452
- return fixed;
453
- };
454
-
455
- const addIcesInAllBundles = (sdp ) => {
456
- const parsedSdp = sdpParser__default['default'].parse(sdp);
457
-
458
- const mediaWithCandidate = parsedSdp.media.find(media => !!media.candidates);
459
- if (!mediaWithCandidate) {
460
- return sdp;
461
- }
462
-
463
- const { candidates } = mediaWithCandidate;
464
-
465
- parsedSdp.media = parsedSdp.media.map(media => ({
466
- ...media,
467
- candidates: media.candidates || candidates,
468
- }));
469
-
470
- return sdpParser__default['default'].write(parsedSdp);
471
- };
472
-
473
- /* global RTCSessionDescriptionInit, navigator */
474
-
475
- const wazoLogger = IssueReporter$1 ? IssueReporter$1.loggerFor('webrtc-sdh') : console;
476
-
477
- // Customized mediaStreamFactory allowing to send screensharing stream directory when upgrading
478
- const wazoMediaStreamFactory = (constraints ) => {
479
- // @see sip.js/lib/platform/web/session-description-handler/media-stream-factory-default
480
- if (!constraints.audio && !constraints.video) {
481
- return Promise.resolve(new MediaStream());
482
- }
483
-
484
- if (navigator.mediaDevices === undefined) {
485
- return Promise.reject(new Error('Media devices not available in insecure contexts.'));
486
- }
487
-
488
- // We have to make a `getUserMedia` on desktop but a `getDisplayMedia` in browsers when screensharing
489
- if (constraints.screen && !constraints.desktop) {
490
- return navigator.mediaDevices.getDisplayMedia.call(navigator.mediaDevices, constraints);
491
- }
492
-
493
- return navigator.mediaDevices.getUserMedia.call(navigator.mediaDevices, constraints);
494
- };
495
-
496
- class WazoSessionDescriptionHandler extends sessionDescriptionHandler.SessionDescriptionHandler {
497
-
498
-
499
- constructor(
500
- logger ,
501
- mediaStreamFactory ,
502
- sessionDescriptionHandlerConfiguration ,
503
- isWeb ,
504
- session ,
505
- ) {
506
- super(logger, mediaStreamFactory, sessionDescriptionHandlerConfiguration);
507
-
508
- this.eventEmitter = new EventEmitter__default['default']();
509
- this.isWeb = isWeb;
510
- this.session = session;
511
- }
512
-
513
- on(event , callback ) {
514
- this.eventEmitter.on(event, callback);
515
- }
516
-
517
- off(event , callback ) {
518
- this.eventEmitter.removeListener(event, callback);
519
- }
520
-
521
- // $FlowFixMe
522
- setRemoteSessionDescription(sessionDescription ) {
523
- try {
524
- const result = super.setRemoteSessionDescription(sessionDescription);
525
-
526
- this.eventEmitter.emit('setDescription', sessionDescription);
527
-
528
- return result;
529
- } catch (error) {
530
- this.logger.error('SessionDescriptionHandler.setRemoteSessionDescription error', error);
531
- throw error;
532
53
  }
533
- }
534
-
535
- // Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
536
- getDescription(options = {}, modifiers ) {
537
- this.logger.debug('SessionDescriptionHandler.getDescription');
538
- if (this._peerConnection === undefined) {
539
- return Promise.reject(new Error('Peer connection closed.'));
540
- }
541
- // Callback on data channel creation
542
- this.onDataChannel = options.onDataChannel;
543
-
544
- // ICE will restart upon applying an offer created with the iceRestart option
545
- const iceRestart = options.offerOptions ? options.offerOptions.iceRestart : false;
546
-
547
- const isConference = options ? !!options.conference : false;
548
- const audioOnly = options ? !!options.audioOnly : false;
549
-
550
- // We should wait for ice when iceRestart (reinvite) or for the first invite
551
- // We shouldn't wait for ice when holding or resuming the call
552
- // We shouldn't wait for ice when receiving a reinvite (eg: pendingReinviteAck = true)
553
- const shouldWaitForIce = !this.session.pendingReinviteAck && (iceRestart || ('constraints' in options));
554
-
555
- // ICE gathering timeout may be set on a per call basis, otherwise the configured default is used
556
- const iceTimeout = options.iceGatheringTimeout === undefined
557
- ? this.sessionDescriptionHandlerConfiguration.iceGatheringTimeout
558
- : options.iceGatheringTimeout;
559
-
560
- wazoLogger.trace('getting SDP description', { iceRestart, shouldWaitForIce, iceTimeout });
561
-
562
- // Fetch ice ourselves for re-invite
563
- this.gatheredCandidates = [];
564
- if (!this.peerConnectionDelegate) {
565
- this.peerConnectionDelegate = {};
566
- }
567
- this.peerConnectionDelegate.onicecandidate = event => {
568
- wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : { done: true });
569
- if (event.candidate) {
570
- this.gatheredCandidates.push(parseCandidate(event.candidate.candidate));
571
-
572
- // When receiving a `srflx` or a `relay` candidate, consider the negotiation done.
573
- if (event.candidate.candidate.indexOf('srflx') !== -1 || event.candidate.candidate.indexOf('relay') !== -1) {
574
- wazoLogger.info('A valid ice was found, triggering ice gathering complete callback.', {
575
- ice: event.candidate.candidate,
576
- });
577
- this.iceGatheringComplete();
578
- }
579
- }
580
- };
581
-
582
- return this.getLocalMediaStream(options)
583
- .then(() => this.updateDirection(options, isConference, audioOnly))
584
- .then(() => this.createDataChannel(options))
585
- .then(() => {
586
- if (isConference && (options.constraints && !options.constraints.video) && !('hold' in options) && !audioOnly) {
587
- // Add a video an empty bundle to be able to replaceTrack when joining a conference without video
588
- if (this.peerConnection.addTransceiver) {
589
- this.peerConnection.addTransceiver('video', { streams: [this._localMediaStream], direction: 'sendrecv' });
590
- }
54
+ // Overridden to avoid to fix ice-candidates missing in the SDP in react-native and chrome canary.
55
+ getDescription(options = {}, modifiers) {
56
+ var _a;
57
+ this.logger.debug('SessionDescriptionHandler.getDescription');
58
+ if (this._peerConnection === undefined) {
59
+ return Promise.reject(new Error('Peer connection closed.'));
591
60
  }
592
- })
593
- .then(() => this.createLocalOfferOrAnswer(options))
594
- .then(sessionDescription => this.setLocalSessionDescription(sessionDescription))
595
- .then(() => this.waitForIceGatheringComplete(iceRestart, iceTimeout))
596
- .then(() => this.getLocalSessionDescription())
597
- .then(description => {
598
- const { sdp } = description;
599
-
600
- // Check if we got ICEs
601
- if (sdp.indexOf('a=candidate') !== -1) {
602
- return {
603
- type: description.type,
604
- sdp: addIcesInAllBundles(sdp),
605
- };
61
+ // Callback on data channel creation
62
+ // @ts-ignore
63
+ this.onDataChannel = options.onDataChannel;
64
+ // ICE will restart upon applying an offer created with the iceRestart option
65
+ const iceRestart = options.offerOptions ? options.offerOptions.iceRestart : false;
66
+ const isConference = options ? !!options.conference : false;
67
+ const audioOnly = options ? !!options.audioOnly : false;
68
+ // We should wait for ice when iceRestart (reinvite) or for the first invite
69
+ // We shouldn't wait for ice when holding or resuming the call
70
+ // We shouldn't wait for ice when receiving a reinvite (eg: pendingReinviteAck = true)
71
+ // @ts-ignore
72
+ const shouldWaitForIce = !this.session.pendingReinviteAck && (iceRestart || 'constraints' in options);
73
+ // ICE gathering timeout may be set on a per call basis, otherwise the configured default is used
74
+ const iceTimeout = options.iceGatheringTimeout === undefined ? (_a = this.sessionDescriptionHandlerConfiguration) === null || _a === void 0 ? void 0 : _a.iceGatheringTimeout : options.iceGatheringTimeout;
75
+ wazoLogger.trace('getting SDP description', {
76
+ iceRestart,
77
+ shouldWaitForIce,
78
+ iceTimeout,
79
+ });
80
+ // Fetch ice ourselves for re-invite
81
+ this.gatheredCandidates = [];
82
+ if (!this.peerConnectionDelegate) {
83
+ this.peerConnectionDelegate = {};
606
84
  }
607
-
608
- wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
609
-
610
- // @TODO: find a better way to set sdp in answer.
611
- // We can't call createAnswer again, so we have to put candidates manually with fixSdp
612
- // In reinvite, createOffer doesn't update the SDP
613
- return {
614
- type: description.type,
615
- // Fix sdp only when no candidates
616
- sdp: fixSdp(sdp, this.gatheredCandidates, options && options.constraints ? options.constraints.video : false),
617
- };
618
- })
619
- .then((sessionDescription) => this.applyModifiers(sessionDescription, modifiers))
620
- .then((sessionDescription) => ({ body: sessionDescription.sdp, contentType: 'application/sdp' }))
621
- .catch((error) => {
622
- wazoLogger.error('error when creating media', error);
623
- this.logger.error(`SessionDescriptionHandler.getDescription failed - ${error}`);
624
- throw error;
625
- });
626
- }
627
-
628
- // Overridden to avoid to use peerConnection.getReceivers and peerConnection.getSenders in react-native
629
- sendDtmf(tones , options = {}) {
630
- if (this.isWeb) {
631
- return super.sendDtmf(tones, options);
632
- }
633
-
634
- this.logger.debug(`DTMF sent via INFO: ${tones.toString()}`);
635
-
636
- const body = {
637
- contentDisposition: 'render',
638
- contentType: 'application/dtmf-relay',
639
- content: `Signal=${tones}\r\nDuration=${options.duration || 1000}`,
640
- };
641
- const requestOptions = { body };
642
-
643
- return this.session.info({ requestOptions });
644
- }
645
-
646
- // Overridden to avoid to use peerConnection.getReceivers and peerConnection.getSenders in react-native
647
- close() {
648
- wazoLogger.info('closing sdh');
649
-
650
- if (this.isWeb) {
651
- return super.close();
652
- }
653
-
654
- // react-native
655
- this.logger.debug('SessionDescriptionHandler.close');
656
- if (this._peerConnection === undefined) {
657
- return;
658
- }
659
-
660
- // Closing senders via getLocalStreams
661
- this.peerConnection.getLocalStreams().forEach(stream => {
662
- stream.getTracks().forEach((track) => {
663
- track.stop();
664
- });
665
- });
666
-
667
- // Closing receivers via getRemoteStreams
668
- this.peerConnection.getRemoteStreams().forEach(stream => {
669
- stream.getTracks().forEach(track => {
670
- track.stop();
671
- });
672
- });
673
-
674
- if (this._dataChannel) {
675
- this._dataChannel.close();
676
- }
677
- this._peerConnection.close();
678
- this._peerConnection = undefined;
679
- }
680
-
681
- // Overridden to send `inactive` in conference
682
- updateDirection(options , isConference = false,
683
- audioOnly = false) {
684
- if (this._peerConnection === undefined) {
685
- return Promise.reject(new Error('Peer connection closed.'));
686
- }
687
-
688
- // Waiting for `getTransceivers` API on mobile
689
- if (!this.isWeb) {
690
- return Promise.resolve();
691
- }
692
-
693
- switch (this._peerConnection.signalingState) {
694
- case 'stable': {
695
- // if we are stable, assume we are creating a local offer
696
- this.logger.debug('SessionDescriptionHandler.updateDirection - setting offer direction');
697
- // determine the direction to offer given the current direction and hold state
698
- const directionToOffer = (currentDirection , transceiver /* RTCRtpTransceiver */) => {
699
- if (isConference) {
700
- if (audioOnly && transceiver.receiver.track && transceiver.receiver.track.kind === 'video') {
701
- return 'sendonly';
85
+ this.peerConnectionDelegate.onicecandidate = event => {
86
+ wazoLogger.trace('onicecandidate', event.candidate ? event.candidate.candidate : {
87
+ done: true,
88
+ });
89
+ if (event.candidate) {
90
+ // @ts-ignore @REEVALUATE
91
+ this.gatheredCandidates.push((0, sdp_1.parseCandidate)(event.candidate.candidate));
92
+ // When receiving a `srflx` or a `relay` candidate, consider the negotiation done.
93
+ if (event.candidate.candidate.indexOf('srflx') !== -1 || event.candidate.candidate.indexOf('relay') !== -1) {
94
+ wazoLogger.info('A valid ice was found, triggering ice gathering complete callback.', {
95
+ ice: event.candidate.candidate,
96
+ });
97
+ this.iceGatheringComplete();
98
+ }
702
99
  }
703
- return options && options.hold ? 'sendonly' : 'sendrecv';
704
- }
705
-
706
- switch (currentDirection) {
707
- case 'inactive':
708
- return options && options.hold ? 'inactive' : (isConference && !audioOnly ? 'sendrecv' : 'recvonly');
709
- case 'recvonly':
710
- return options && options.hold ? 'inactive' : 'recvonly';
711
- case 'sendonly':
712
- return options && options.hold ? 'sendonly' : 'sendrecv';
713
- case 'sendrecv':
714
- return options && options.hold ? 'sendonly' : 'sendrecv';
715
- case 'stopped':
716
- return 'stopped';
717
- default:
718
- throw new Error('Should never happen');
719
- }
720
100
  };
721
- // set the transceiver direction to the offer direction
722
- this._peerConnection.getTransceivers().forEach((transceiver) => {
723
- if (transceiver.direction /* guarding, but should always be true */) {
724
- const offerDirection = directionToOffer(transceiver.direction, transceiver);
725
- if (transceiver.direction !== offerDirection) {
726
- // eslint-disable-next-line no-param-reassign
727
- transceiver.direction = offerDirection;
101
+ return this.getLocalMediaStream(options).then(() => this.updateDirection(options, isConference, audioOnly)).then(() => this.createDataChannel(options)).then(() => {
102
+ var _a;
103
+ if (isConference && options.constraints && !options.constraints.video && !('hold' in options) && !audioOnly) {
104
+ // Add a video an empty bundle to be able to replaceTrack when joining a conference without video
105
+ if ((_a = this.peerConnection) === null || _a === void 0 ? void 0 : _a.addTransceiver) {
106
+ this.peerConnection.addTransceiver('video', {
107
+ streams: [this._localMediaStream],
108
+ direction: 'sendrecv',
109
+ });
110
+ }
728
111
  }
729
- }
730
- });
731
- }
732
- break;
733
- case 'have-remote-offer': {
734
- // if we have a remote offer, assume we are creating a local answer
735
- this.logger.debug('SessionDescriptionHandler.updateDirection - setting answer direction');
736
-
737
- // FIXME: This is not the correct way to determine the answer direction as it is only
738
- // considering first match in the offered SDP and using that to determine the answer direction.
739
- // While that may be fine for our current use cases, it is not a generally correct approach.
740
- // determine the offered direction
741
- const offeredDirection = (() => {
742
- const description = this._peerConnection.remoteDescription;
743
- if (!description) {
744
- throw new Error('Failed to read remote offer');
745
- }
746
- const searchResult = /a=sendrecv\r\n|a=sendonly\r\n|a=recvonly\r\n|a=inactive\r\n/.exec(description.sdp);
747
- if (searchResult) {
748
- switch (searchResult[0]) {
749
- case 'a=inactive\r\n':
750
- return 'inactive';
751
- case 'a=recvonly\r\n':
752
- return 'recvonly';
753
- case 'a=sendonly\r\n':
754
- return 'sendonly';
755
- case 'a=sendrecv\r\n':
756
- return 'sendrecv';
757
- default:
758
- throw new Error('Should never happen');
112
+ })
113
+ .then(() => this.createLocalOfferOrAnswer(options))
114
+ .then((sessionDescription) => this.setLocalSessionDescription(sessionDescription))
115
+ .then(() => this.waitForIceGatheringComplete(iceRestart, iceTimeout))
116
+ .then(() => this.getLocalSessionDescription())
117
+ .then((description) => {
118
+ const { sdp, } = description;
119
+ // Check if we got ICEs
120
+ if (sdp.indexOf('a=candidate') !== -1) {
121
+ return {
122
+ type: description.type,
123
+ sdp: (0, sdp_1.addIcesInAllBundles)(sdp),
124
+ };
759
125
  }
760
- }
761
- return 'sendrecv';
762
- })();
763
-
764
- // determine the answer direction based on the offered direction and our hold state
765
- const answerDirection = (() => {
766
- switch (offeredDirection) {
767
- case 'inactive':
768
- return 'inactive';
769
- case 'recvonly':
770
- return 'sendonly';
771
- case 'sendonly':
772
- return options && options.hold ? 'inactive' : 'recvonly';
773
- case 'sendrecv':
774
- return options && options.hold ? 'sendonly' : 'sendrecv';
775
- default:
776
- throw new Error('Should never happen');
777
- }
778
- })();
779
-
780
- // set the transceiver direction to the answer direction
781
- this._peerConnection.getTransceivers().forEach((transceiver) => {
782
- if (transceiver.stopped) {
126
+ wazoLogger.info('No ICE candidates found in SDP, fixing it with gathered ices', this.gatheredCandidates);
127
+ // @TODO: find a better way to set sdp in answer.
128
+ // We can't call createAnswer again, so we have to put candidates manually with fixSdp
129
+ // In reinvite, createOffer doesn't update the SDP
130
+ return {
131
+ type: description.type,
132
+ // Fix sdp only when no candidates
133
+ // @ts-ignore
134
+ sdp: (0, sdp_1.fixSdp)(sdp, this.gatheredCandidates, options && options.constraints ? options.constraints.video : false),
135
+ };
136
+ })
137
+ .then((sessionDescription) => this.applyModifiers(sessionDescription, modifiers))
138
+ .then((sessionDescription) => ({
139
+ body: sessionDescription.sdp,
140
+ contentType: 'application/sdp',
141
+ }))
142
+ .catch((error) => {
143
+ wazoLogger.error('error when creating media', error);
144
+ this.logger.error(`SessionDescriptionHandler.getDescription failed - ${error}`);
145
+ throw error;
146
+ });
147
+ }
148
+ // Overridden to avoid to use peerConnection.getReceivers and peerConnection.getSenders in react-native
149
+ sendDtmf(tones, options = { duration: 0, interToneGap: 0 }) {
150
+ if (this.isWeb) {
151
+ return super.sendDtmf(tones, options);
152
+ }
153
+ this.logger.debug(`DTMF sent via INFO: ${tones.toString()}`);
154
+ const body = {
155
+ contentDisposition: 'render',
156
+ contentType: 'application/dtmf-relay',
157
+ content: `Signal=${tones}\r\nDuration=${options.duration || 1000}`,
158
+ };
159
+ const requestOptions = {
160
+ body,
161
+ };
162
+ // @ts-ignore @REEVALUATE: session.info is asynched
163
+ return this.session.info({
164
+ requestOptions,
165
+ });
166
+ }
167
+ // Overridden to avoid to use peerConnection.getReceivers and peerConnection.getSenders in react-native
168
+ close() {
169
+ var _a, _b;
170
+ wazoLogger.info('closing sdh');
171
+ if (this.isWeb) {
172
+ return super.close();
173
+ }
174
+ // react-native
175
+ this.logger.debug('SessionDescriptionHandler.close');
176
+ if (this._peerConnection === undefined) {
783
177
  return;
784
- }
785
- if (transceiver.direction /* guarding, but should always be true */) {
786
- const { receiver } = transceiver;
787
- if (isConference && audioOnly && receiver.track && receiver.track.kind === 'video') {
788
- // eslint-disable-next-line no-param-reassign
789
- transceiver.direction = 'inactive';
790
- return;
791
- }
792
-
793
- if (transceiver.direction !== 'stopped' && transceiver.direction !== answerDirection) {
794
- // eslint-disable-next-line no-param-reassign
795
- transceiver.direction = answerDirection;
796
- }
797
- }
178
+ }
179
+ // Closing senders via getLocalStreams
180
+ // @ts-ignore
181
+ (_a = this.peerConnection) === null || _a === void 0 ? void 0 : _a.getLocalStreams().forEach(stream => {
182
+ stream.getTracks().forEach((track) => {
183
+ track.stop();
184
+ });
185
+ });
186
+ // Closing receivers via getRemoteStreams
187
+ // @ts-ignore
188
+ (_b = this.peerConnection) === null || _b === void 0 ? void 0 : _b.getRemoteStreams().forEach(stream => {
189
+ stream.getTracks().forEach((track) => {
190
+ track.stop();
191
+ });
798
192
  });
799
- }
800
- break;
801
- case 'have-local-offer':
802
- case 'have-local-pranswer':
803
- case 'have-remote-pranswer':
804
- case 'closed':
805
- default:
806
- return Promise.reject(new Error(`Invalid signaling state ${this._peerConnection.signalingState}`));
193
+ if (this._dataChannel) {
194
+ this._dataChannel.close();
195
+ }
196
+ this._peerConnection.close();
197
+ this._peerConnection = undefined;
807
198
  }
808
- return Promise.resolve();
809
- }
810
-
811
- // Overridden to not reuse video track in SFU mode
812
- setLocalMediaStream(stream ) {
813
- this.logger.debug('SessionDescriptionHandler.setLocalMediaStream');
814
-
815
- if (!this._peerConnection) {
816
- throw new Error('Peer connection undefined.');
199
+ // Overridden to send `inactive` in conference
200
+ updateDirection(options, isConference = false, audioOnly = false) {
201
+ if (this._peerConnection === undefined) {
202
+ return Promise.reject(new Error('Peer connection closed.'));
203
+ }
204
+ // Waiting for `getTransceivers` API on mobile
205
+ if (!this.isWeb) {
206
+ return Promise.resolve();
207
+ }
208
+ switch (this._peerConnection.signalingState) {
209
+ case 'stable':
210
+ {
211
+ // if we are stable, assume we are creating a local offer
212
+ this.logger.debug('SessionDescriptionHandler.updateDirection - setting offer direction');
213
+ // determine the direction to offer given the current direction and hold state
214
+ const directionToOffer = (currentDirection, transceiver) => {
215
+ if (isConference) {
216
+ if (audioOnly && transceiver.receiver.track && transceiver.receiver.track.kind === 'video') {
217
+ return 'sendonly';
218
+ }
219
+ return options && options.hold ? 'sendonly' : 'sendrecv';
220
+ }
221
+ switch (currentDirection) {
222
+ case 'inactive':
223
+ return options && options.hold ? 'inactive' : isConference && !audioOnly ? 'sendrecv' : 'recvonly';
224
+ case 'recvonly':
225
+ return options && options.hold ? 'inactive' : 'recvonly';
226
+ case 'sendonly':
227
+ return options && options.hold ? 'sendonly' : 'sendrecv';
228
+ case 'sendrecv':
229
+ return options && options.hold ? 'sendonly' : 'sendrecv';
230
+ case 'stopped':
231
+ return 'stopped';
232
+ default:
233
+ throw new Error('Should never happen');
234
+ }
235
+ };
236
+ // set the transceiver direction to the offer direction
237
+ this._peerConnection.getTransceivers().forEach(transceiver => {
238
+ if (transceiver.direction
239
+ /* guarding, but should always be true */
240
+ ) {
241
+ const offerDirection = directionToOffer(transceiver.direction, transceiver);
242
+ if (transceiver.direction !== offerDirection) {
243
+ // @ts-ignore - @REEVALUATE
244
+ // eslint-disable-next-line no-param-reassign
245
+ transceiver.direction = offerDirection;
246
+ }
247
+ }
248
+ });
249
+ }
250
+ break;
251
+ case 'have-remote-offer':
252
+ {
253
+ // if we have a remote offer, assume we are creating a local answer
254
+ this.logger.debug('SessionDescriptionHandler.updateDirection - setting answer direction');
255
+ // FIXME: This is not the correct way to determine the answer direction as it is only
256
+ // considering first match in the offered SDP and using that to determine the answer direction.
257
+ // While that may be fine for our current use cases, it is not a generally correct approach.
258
+ // determine the offered direction
259
+ const offeredDirection = (() => {
260
+ const description = this._peerConnection.remoteDescription;
261
+ if (!description) {
262
+ throw new Error('Failed to read remote offer');
263
+ }
264
+ const searchResult = /a=sendrecv\r\n|a=sendonly\r\n|a=recvonly\r\n|a=inactive\r\n/.exec(description.sdp);
265
+ if (searchResult) {
266
+ switch (searchResult[0]) {
267
+ case 'a=inactive\r\n':
268
+ return 'inactive';
269
+ case 'a=recvonly\r\n':
270
+ return 'recvonly';
271
+ case 'a=sendonly\r\n':
272
+ return 'sendonly';
273
+ case 'a=sendrecv\r\n':
274
+ return 'sendrecv';
275
+ default:
276
+ throw new Error('Should never happen');
277
+ }
278
+ }
279
+ return 'sendrecv';
280
+ })();
281
+ // determine the answer direction based on the offered direction and our hold state
282
+ const answerDirection = (() => {
283
+ switch (offeredDirection) {
284
+ case 'inactive':
285
+ return 'inactive';
286
+ case 'recvonly':
287
+ return 'sendonly';
288
+ case 'sendonly':
289
+ return options && options.hold ? 'inactive' : 'recvonly';
290
+ case 'sendrecv':
291
+ return options && options.hold ? 'sendonly' : 'sendrecv';
292
+ default:
293
+ throw new Error('Should never happen');
294
+ }
295
+ })();
296
+ // set the transceiver direction to the answer direction
297
+ this._peerConnection.getTransceivers().forEach(transceiver => {
298
+ // @ts-ignore
299
+ if (transceiver.stopped) {
300
+ return;
301
+ }
302
+ if (transceiver.direction
303
+ /* guarding, but should always be true */
304
+ ) {
305
+ const { receiver, } = transceiver;
306
+ if (isConference && audioOnly && receiver.track && receiver.track.kind === 'video') {
307
+ // eslint-disable-next-line no-param-reassign
308
+ transceiver.direction = 'inactive';
309
+ return;
310
+ }
311
+ if (transceiver.direction !== 'stopped' && transceiver.direction !== answerDirection) {
312
+ // eslint-disable-next-line no-param-reassign
313
+ transceiver.direction = answerDirection;
314
+ }
315
+ }
316
+ });
317
+ }
318
+ break;
319
+ case 'have-local-offer':
320
+ case 'have-local-pranswer':
321
+ case 'have-remote-pranswer':
322
+ case 'closed':
323
+ default:
324
+ return Promise.reject(new Error(`Invalid signaling state ${this._peerConnection.signalingState}`));
325
+ }
326
+ return Promise.resolve();
817
327
  }
818
- const pc = this._peerConnection;
819
- const { sfu } = pc;
820
- const localStream = this._localMediaStream;
821
-
822
- const trackUpdates = [];
823
-
824
- const updateTrack = (newTrack ) => {
825
- const { kind } = newTrack;
826
- if (kind !== 'audio' && kind !== 'video') {
827
- throw new Error(`Unknown new track kind ${kind}.`);
828
- }
829
- const sender = pc.getSenders && pc.getSenders().find((otherSender) =>
830
- otherSender.track && otherSender.track.kind === kind);
831
-
832
- // Do not reuse sender video tracks in SFU
833
- if (sender && (!sfu || newTrack.kind === 'audio')) {
834
- if (sender.track) {
835
- // eslint-disable-next-line no-param-reassign
836
- newTrack.enabled = sender.track.enabled;
328
+ // Overridden to not reuse video track in SFU mode
329
+ setLocalMediaStream(stream) {
330
+ this.logger.debug('SessionDescriptionHandler.setLocalMediaStream');
331
+ if (!this._peerConnection) {
332
+ throw new Error('Peer connection undefined.');
837
333
  }
838
- trackUpdates.push(
839
- new Promise((resolve) => {
840
- this.logger.debug(`SessionDescriptionHandler.setLocalMediaStream - replacing sender ${kind} track`);
841
- resolve();
842
- }).then(() =>
843
- sender
844
- .replaceTrack(newTrack)
845
- .then(() => {
846
- const oldTrack = localStream.getTracks().find((localTrack) => localTrack.kind === kind);
847
- if (oldTrack) {
848
- oldTrack.stop();
849
- localStream.removeTrack(oldTrack);
850
- sessionDescriptionHandler.SessionDescriptionHandler.dispatchRemoveTrackEvent(localStream, oldTrack);
334
+ const pc = this._peerConnection;
335
+ const { sfu, } = pc;
336
+ const localStream = this._localMediaStream;
337
+ const trackUpdates = [];
338
+ const updateTrack = (newTrack) => {
339
+ const { kind, } = newTrack;
340
+ if (kind !== 'audio' && kind !== 'video') {
341
+ throw new Error(`Unknown new track kind ${kind}.`);
342
+ }
343
+ const sender = pc.getSenders && pc.getSenders().find((otherSender) => otherSender.track && otherSender.track.kind === kind);
344
+ // Do not reuse sender video tracks in SFU
345
+ if (sender && (!sfu || newTrack.kind === 'audio')) {
346
+ if (sender.track) {
347
+ // eslint-disable-next-line no-param-reassign
348
+ newTrack.enabled = sender.track.enabled;
851
349
  }
852
- localStream.addTrack(newTrack);
853
- sessionDescriptionHandler.SessionDescriptionHandler.dispatchAddTrackEvent(localStream, newTrack);
854
- })
855
- .catch((error ) => {
856
- this.logger.error(
857
- `SessionDescriptionHandler.setLocalMediaStream - failed to replace sender ${kind} track`,
858
- );
859
- throw error;
860
- })),
861
- );
862
- } else {
863
- trackUpdates.push(
864
- new Promise((resolve) => {
865
- this.logger.debug(`SessionDescriptionHandler.setLocalMediaStream - adding sender ${kind} track`);
866
- resolve();
867
- }).then(() => {
868
- // Review: could make streamless tracks a configurable option?
869
- // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/addTrack#Usage_notes
870
- try {
871
- if (pc.addTrack) {
872
- pc.addTrack(newTrack, localStream);
873
- } else {
874
- pc.addStream(localStream);
875
- }
876
- } catch (error) {
877
- this.logger.error(`SessionDescriptionHandler.setLocalMediaStream - failed to add sender ${kind} track`);
878
- throw error;
350
+ trackUpdates.push(new Promise(resolve => {
351
+ this.logger.debug(`SessionDescriptionHandler.setLocalMediaStream - replacing sender ${kind} track`);
352
+ resolve(null);
353
+ }).then(() => sender.replaceTrack(newTrack).then(() => {
354
+ const oldTrack = localStream.getTracks().find(localTrack => localTrack.kind === kind);
355
+ if (oldTrack) {
356
+ oldTrack.stop();
357
+ localStream.removeTrack(oldTrack);
358
+ // @ts-ignore
359
+ session_description_handler_1.SessionDescriptionHandler.dispatchRemoveTrackEvent(localStream, oldTrack);
360
+ }
361
+ localStream.addTrack(newTrack);
362
+ // @ts-ignore
363
+ session_description_handler_1.SessionDescriptionHandler.dispatchAddTrackEvent(localStream, newTrack);
364
+ }).catch((error) => {
365
+ this.logger.error(`SessionDescriptionHandler.setLocalMediaStream - failed to replace sender ${kind} track`);
366
+ throw error;
367
+ })));
879
368
  }
880
- localStream.addTrack(newTrack);
881
- sessionDescriptionHandler.SessionDescriptionHandler.dispatchAddTrackEvent(localStream, newTrack);
882
- }),
883
- );
884
- }
885
- };
886
-
887
- // update peer connection audio tracks
888
- const audioTracks = stream.getAudioTracks();
889
- if (audioTracks.length) {
890
- updateTrack(audioTracks[0]);
891
- }
892
-
893
- // update peer connection video tracks
894
- const videoTracks = stream.getVideoTracks();
895
- if (videoTracks.length) {
896
- updateTrack(videoTracks[0]);
897
- }
898
-
899
- return trackUpdates.reduce((p, x) => p.then(() => x), Promise.resolve());
900
- }
901
-
902
- // Overridden to avoid replacing constraints with `localMediaStreamConstraints`
903
- getLocalMediaStream(options ) {
904
- this.logger.debug('WazoSessionDescriptionHandler.getLocalMediaStream');
905
- if (this._peerConnection === undefined) {
906
- return Promise.reject(new Error('Peer connection closed.'));
369
+ else {
370
+ trackUpdates.push(new Promise(resolve => {
371
+ this.logger.debug(`SessionDescriptionHandler.setLocalMediaStream - adding sender ${kind} track`);
372
+ resolve(null);
373
+ }).then(() => {
374
+ // Review: could make streamless tracks a configurable option?
375
+ // https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/addTrack#Usage_notes
376
+ try {
377
+ if (pc.addTrack) {
378
+ pc.addTrack(newTrack, localStream);
379
+ }
380
+ else {
381
+ pc.addStream(localStream);
382
+ }
383
+ }
384
+ catch (error) {
385
+ this.logger.error(`SessionDescriptionHandler.setLocalMediaStream - failed to add sender ${kind} track`);
386
+ throw error;
387
+ }
388
+ localStream.addTrack(newTrack);
389
+ // @ts-ignore
390
+ session_description_handler_1.SessionDescriptionHandler.dispatchAddTrackEvent(localStream, newTrack);
391
+ }));
392
+ }
393
+ };
394
+ // update peer connection audio tracks
395
+ const audioTracks = stream.getAudioTracks();
396
+ if (audioTracks.length) {
397
+ updateTrack(audioTracks[0]);
398
+ }
399
+ // update peer connection video tracks
400
+ const videoTracks = stream.getVideoTracks();
401
+ if (videoTracks.length) {
402
+ updateTrack(videoTracks[0]);
403
+ }
404
+ return trackUpdates.reduce((p, x) => p.then(() => x), Promise.resolve());
907
405
  }
908
- let constraints = options.constraints ? { ...options.constraints } : {};
909
- // if we already have a local media stream...
910
- if (this.localMediaStreamConstraints) {
911
- // if constraints have not changed, do not get a new media stream
912
- if (JSON.stringify(this.localMediaStreamConstraints.audio) === JSON.stringify(constraints.audio)
913
- && JSON.stringify(this.localMediaStreamConstraints.video) === JSON.stringify(constraints.video)) {
914
- return Promise.resolve();
915
- }
916
- } else if (constraints.audio === undefined && constraints.video === undefined) {
917
- // if no constraints have been specified, default to audio for initial media stream
918
- constraints = { audio: true };
406
+ // Overridden to avoid replacing constraints with `localMediaStreamConstraints`
407
+ getLocalMediaStream(options) {
408
+ this.logger.debug('WazoSessionDescriptionHandler.getLocalMediaStream');
409
+ if (this._peerConnection === undefined) {
410
+ return Promise.reject(new Error('Peer connection closed.'));
411
+ }
412
+ let constraints = options.constraints ? Object.assign({}, options.constraints) : {};
413
+ // if we already have a local media stream...
414
+ // @ts-ignore
415
+ if (this.localMediaStreamConstraints) {
416
+ // if constraints have not changed, do not get a new media stream
417
+ // @ts-ignore
418
+ if (JSON.stringify(this.localMediaStreamConstraints.audio) === JSON.stringify(constraints.audio) && JSON.stringify(this.localMediaStreamConstraints.video) === JSON.stringify(constraints.video)) {
419
+ return Promise.resolve();
420
+ }
421
+ }
422
+ else if (constraints.audio === undefined && constraints.video === undefined) {
423
+ // if no constraints have been specified, default to audio for initial media stream
424
+ constraints = {
425
+ audio: true,
426
+ };
427
+ }
428
+ // @ts-ignore
429
+ this.localMediaStreamConstraints = constraints;
430
+ // @ts-ignore
431
+ return this.mediaStreamFactory(constraints, this).then(mediaStream => {
432
+ this.setLocalMediaStream(mediaStream);
433
+ return mediaStream;
434
+ });
919
435
  }
920
- this.localMediaStreamConstraints = constraints;
921
- return this.mediaStreamFactory(constraints, this).then((mediaStream) => this.setLocalMediaStream(mediaStream));
922
- }
923
436
  }
924
-
925
437
  exports.default = WazoSessionDescriptionHandler;
926
- exports.wazoMediaStreamFactory = wazoMediaStreamFactory;