ue-softphone-sdk 2.2.4 → 2.2.6

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 (389) hide show
  1. package/dist/{index.d.ts → types/index.d.ts} +3 -7
  2. package/dist/ue-softphone-sdk.js +7 -2
  3. package/package.json +5 -6
  4. package/{new-rollup.config.mjs → rollup-new.config.mjs} +1 -1
  5. package/rollup.config.js +14 -15
  6. package/src/index.ts +28 -53
  7. package/tsconfig.json +10 -26
  8. package/dist/api/bye.d.ts +0 -16
  9. package/dist/api/dtmf.d.ts +0 -15
  10. package/dist/api/emitter.d.ts +0 -88
  11. package/dist/api/exceptions/content-type-unsupported.d.ts +0 -8
  12. package/dist/api/exceptions/index.d.ts +0 -5
  13. package/dist/api/exceptions/request-pending.d.ts +0 -9
  14. package/dist/api/exceptions/session-description-handler.d.ts +0 -8
  15. package/dist/api/exceptions/session-terminated.d.ts +0 -8
  16. package/dist/api/exceptions/state-transition.d.ts +0 -8
  17. package/dist/api/index.d.ts +0 -58
  18. package/dist/api/info.d.ts +0 -16
  19. package/dist/api/invitation-accept-options.d.ts +0 -19
  20. package/dist/api/invitation-progress-options.d.ts +0 -38
  21. package/dist/api/invitation-reject-options.d.ts +0 -25
  22. package/dist/api/invitation.d.ts +0 -179
  23. package/dist/api/inviter-cancel-options.d.ts +0 -9
  24. package/dist/api/inviter-invite-options.d.ts +0 -28
  25. package/dist/api/inviter-options.d.ts +0 -43
  26. package/dist/api/inviter.d.ts +0 -236
  27. package/dist/api/message.d.ts +0 -16
  28. package/dist/api/messager-message-options.d.ts +0 -11
  29. package/dist/api/messager-options.d.ts +0 -17
  30. package/dist/api/messager.d.ts +0 -26
  31. package/dist/api/notification.d.ts +0 -16
  32. package/dist/api/notifier.d.ts +0 -8
  33. package/dist/api/publisher-options.d.ts +0 -33
  34. package/dist/api/publisher-publish-options.d.ts +0 -6
  35. package/dist/api/publisher-state.d.ts +0 -21
  36. package/dist/api/publisher-unpublish-options.d.ts +0 -6
  37. package/dist/api/publisher.d.ts +0 -65
  38. package/dist/api/referral.d.ts +0 -38
  39. package/dist/api/registerer-options.d.ts +0 -46
  40. package/dist/api/registerer-register-options.d.ts +0 -11
  41. package/dist/api/registerer-state.d.ts +0 -21
  42. package/dist/api/registerer-unregister-options.d.ts +0 -16
  43. package/dist/api/registerer.d.ts +0 -144
  44. package/dist/api/session-bye-options.d.ts +0 -11
  45. package/dist/api/session-delegate.d.ts +0 -73
  46. package/dist/api/session-description-handler-factory.d.ts +0 -15
  47. package/dist/api/session-description-handler.d.ts +0 -74
  48. package/dist/api/session-info-options.d.ts +0 -11
  49. package/dist/api/session-invite-options.d.ts +0 -28
  50. package/dist/api/session-message-options.d.ts +0 -11
  51. package/dist/api/session-options.d.ts +0 -8
  52. package/dist/api/session-refer-options.d.ts +0 -14
  53. package/dist/api/session-state.d.ts +0 -45
  54. package/dist/api/session.d.ts +0 -359
  55. package/dist/api/subscriber-options.d.ts +0 -11
  56. package/dist/api/subscriber-subscribe-options.d.ts +0 -6
  57. package/dist/api/subscriber.d.ts +0 -94
  58. package/dist/api/subscription-delegate.d.ts +0 -12
  59. package/dist/api/subscription-options.d.ts +0 -8
  60. package/dist/api/subscription-state.d.ts +0 -19
  61. package/dist/api/subscription-subscribe-options.d.ts +0 -6
  62. package/dist/api/subscription-unsubscribe-options.d.ts +0 -6
  63. package/dist/api/subscription.d.ts +0 -84
  64. package/dist/api/transport-state.d.ts +0 -37
  65. package/dist/api/transport.d.ts +0 -159
  66. package/dist/api/user-agent-delegate.d.ts +0 -84
  67. package/dist/api/user-agent-options.d.ts +0 -253
  68. package/dist/api/user-agent-state.d.ts +0 -14
  69. package/dist/api/user-agent.d.ts +0 -200
  70. package/dist/core/dialogs/dialog-state.d.ts +0 -34
  71. package/dist/core/dialogs/dialog.d.ts +0 -161
  72. package/dist/core/dialogs/index.d.ts +0 -4
  73. package/dist/core/dialogs/session-dialog.d.ts +0 -196
  74. package/dist/core/dialogs/subscription-dialog.d.ts +0 -120
  75. package/dist/core/exceptions/exception.d.ts +0 -8
  76. package/dist/core/exceptions/index.d.ts +0 -3
  77. package/dist/core/exceptions/transaction-state-error.d.ts +0 -8
  78. package/dist/core/exceptions/transport-error.d.ts +0 -8
  79. package/dist/core/index.d.ts +0 -15
  80. package/dist/core/log/index.d.ts +0 -3
  81. package/dist/core/log/levels.d.ts +0 -10
  82. package/dist/core/log/logger-factory.d.ts +0 -21
  83. package/dist/core/log/logger.d.ts +0 -19
  84. package/dist/core/messages/body.d.ts +0 -64
  85. package/dist/core/messages/digest-authentication.d.ts +0 -51
  86. package/dist/core/messages/incoming-message.d.ts +0 -79
  87. package/dist/core/messages/incoming-request-message.d.ts +0 -10
  88. package/dist/core/messages/incoming-request.d.ts +0 -67
  89. package/dist/core/messages/incoming-response-message.d.ts +0 -10
  90. package/dist/core/messages/incoming-response.d.ts +0 -12
  91. package/dist/core/messages/index.d.ts +0 -13
  92. package/dist/core/messages/md5.d.ts +0 -32
  93. package/dist/core/messages/methods/ack.d.ts +0 -18
  94. package/dist/core/messages/methods/bye.d.ts +0 -21
  95. package/dist/core/messages/methods/cancel.d.ts +0 -21
  96. package/dist/core/messages/methods/constants.d.ts +0 -20
  97. package/dist/core/messages/methods/index.d.ts +0 -13
  98. package/dist/core/messages/methods/info.d.ts +0 -21
  99. package/dist/core/messages/methods/invite.d.ts +0 -86
  100. package/dist/core/messages/methods/message.d.ts +0 -21
  101. package/dist/core/messages/methods/notify.d.ts +0 -21
  102. package/dist/core/messages/methods/prack.d.ts +0 -21
  103. package/dist/core/messages/methods/publish.d.ts +0 -21
  104. package/dist/core/messages/methods/refer.d.ts +0 -21
  105. package/dist/core/messages/methods/register.d.ts +0 -21
  106. package/dist/core/messages/methods/subscribe.d.ts +0 -54
  107. package/dist/core/messages/outgoing-request-message.d.ts +0 -94
  108. package/dist/core/messages/outgoing-request.d.ts +0 -67
  109. package/dist/core/messages/outgoing-response.d.ts +0 -42
  110. package/dist/core/messages/parser.d.ts +0 -14
  111. package/dist/core/messages/utils.d.ts +0 -24
  112. package/dist/core/session/index.d.ts +0 -2
  113. package/dist/core/session/session-delegate.d.ts +0 -70
  114. package/dist/core/session/session.d.ts +0 -134
  115. package/dist/core/subscription/index.d.ts +0 -2
  116. package/dist/core/subscription/subscription-delegate.d.ts +0 -27
  117. package/dist/core/subscription/subscription.d.ts +0 -55
  118. package/dist/core/timers.d.ts +0 -20
  119. package/dist/core/transactions/client-transaction.d.ts +0 -45
  120. package/dist/core/transactions/index.d.ts +0 -10
  121. package/dist/core/transactions/invite-client-transaction.d.ts +0 -116
  122. package/dist/core/transactions/invite-server-transaction.d.ts +0 -127
  123. package/dist/core/transactions/non-invite-client-transaction.d.ts +0 -69
  124. package/dist/core/transactions/non-invite-server-transaction.d.ts +0 -57
  125. package/dist/core/transactions/server-transaction.d.ts +0 -35
  126. package/dist/core/transactions/transaction-state.d.ts +0 -13
  127. package/dist/core/transactions/transaction-user.d.ts +0 -72
  128. package/dist/core/transactions/transaction.d.ts +0 -79
  129. package/dist/core/transport.d.ts +0 -31
  130. package/dist/core/user-agent-core/allowed-methods.d.ts +0 -4
  131. package/dist/core/user-agent-core/index.d.ts +0 -3
  132. package/dist/core/user-agent-core/user-agent-core-configuration.d.ts +0 -99
  133. package/dist/core/user-agent-core/user-agent-core-delegate.d.ts +0 -37
  134. package/dist/core/user-agent-core/user-agent-core.d.ts +0 -179
  135. package/dist/core/user-agents/bye-user-agent-client.d.ts +0 -10
  136. package/dist/core/user-agents/bye-user-agent-server.d.ts +0 -10
  137. package/dist/core/user-agents/cancel-user-agent-client.d.ts +0 -10
  138. package/dist/core/user-agents/index.d.ts +0 -26
  139. package/dist/core/user-agents/info-user-agent-client.d.ts +0 -10
  140. package/dist/core/user-agents/info-user-agent-server.d.ts +0 -10
  141. package/dist/core/user-agents/invite-user-agent-client.d.ts +0 -35
  142. package/dist/core/user-agents/invite-user-agent-server.d.ts +0 -77
  143. package/dist/core/user-agents/message-user-agent-client.d.ts +0 -10
  144. package/dist/core/user-agents/message-user-agent-server.d.ts +0 -10
  145. package/dist/core/user-agents/notify-user-agent-client.d.ts +0 -10
  146. package/dist/core/user-agents/notify-user-agent-server.d.ts +0 -16
  147. package/dist/core/user-agents/prack-user-agent-client.d.ts +0 -10
  148. package/dist/core/user-agents/prack-user-agent-server.d.ts +0 -16
  149. package/dist/core/user-agents/publish-user-agent-client.d.ts +0 -10
  150. package/dist/core/user-agents/re-invite-user-agent-client.d.ts +0 -18
  151. package/dist/core/user-agents/re-invite-user-agent-server.d.ts +0 -41
  152. package/dist/core/user-agents/re-subscribe-user-agent-client.d.ts +0 -17
  153. package/dist/core/user-agents/re-subscribe-user-agent-server.d.ts +0 -10
  154. package/dist/core/user-agents/refer-user-agent-client.d.ts +0 -10
  155. package/dist/core/user-agents/refer-user-agent-server.d.ts +0 -16
  156. package/dist/core/user-agents/register-user-agent-client.d.ts +0 -10
  157. package/dist/core/user-agents/register-user-agent-server.d.ts +0 -11
  158. package/dist/core/user-agents/subscribe-user-agent-client.d.ts +0 -65
  159. package/dist/core/user-agents/subscribe-user-agent-server.d.ts +0 -11
  160. package/dist/core/user-agents/user-agent-client.d.ts +0 -103
  161. package/dist/core/user-agents/user-agent-server.d.ts +0 -79
  162. package/dist/grammar/grammar.d.ts +0 -26
  163. package/dist/grammar/index.d.ts +0 -4
  164. package/dist/grammar/name-addr-header.d.ts +0 -24
  165. package/dist/grammar/parameters.d.ts +0 -16
  166. package/dist/grammar/pegjs/dist/grammar.d.ts +0 -50
  167. package/dist/grammar/uri.d.ts +0 -62
  168. package/dist/main.d.ts +0 -9
  169. package/dist/new-index.d.ts +0 -199
  170. package/dist/platform/web/index.d.ts +0 -4
  171. package/dist/platform/web/modifiers/index.d.ts +0 -5
  172. package/dist/platform/web/modifiers/modifiers.d.ts +0 -41
  173. package/dist/platform/web/session-description-handler/index.d.ts +0 -14
  174. package/dist/platform/web/session-description-handler/media-stream-factory-default.d.ts +0 -6
  175. package/dist/platform/web/session-description-handler/media-stream-factory.d.ts +0 -6
  176. package/dist/platform/web/session-description-handler/peer-connection-configuration-default.d.ts +0 -5
  177. package/dist/platform/web/session-description-handler/peer-connection-delegate.d.ts +0 -63
  178. package/dist/platform/web/session-description-handler/session-description-handler-configuration.d.ts +0 -16
  179. package/dist/platform/web/session-description-handler/session-description-handler-factory-default.d.ts +0 -11
  180. package/dist/platform/web/session-description-handler/session-description-handler-factory-options.d.ts +0 -9
  181. package/dist/platform/web/session-description-handler/session-description-handler-factory.d.ts +0 -16
  182. package/dist/platform/web/session-description-handler/session-description-handler-options.d.ts +0 -47
  183. package/dist/platform/web/session-description-handler/session-description-handler.d.ts +0 -212
  184. package/dist/platform/web/simple-user/index.d.ts +0 -7
  185. package/dist/platform/web/simple-user/simple-user-delegate.d.ts +0 -72
  186. package/dist/platform/web/simple-user/simple-user-options.d.ts +0 -90
  187. package/dist/platform/web/simple-user/simple-user.d.ts +0 -226
  188. package/dist/platform/web/transport/index.d.ts +0 -6
  189. package/dist/platform/web/transport/transport-options.d.ts +0 -30
  190. package/dist/platform/web/transport/transport.d.ts +0 -125
  191. package/dist/ue-softphone-sdk.js.map +0 -1
  192. package/dist/version.d.ts +0 -1
  193. package/dist/webPhoneSdk.d.ts +0 -24
  194. package/dist/webrtc.d.ts +0 -17
  195. package/src/api/api-extractor.json +0 -358
  196. package/src/api/bye.ts +0 -27
  197. package/src/api/dtmf.ts +0 -27
  198. package/src/api/emitter.ts +0 -110
  199. package/src/api/exceptions/content-type-unsupported.ts +0 -11
  200. package/src/api/exceptions/index.ts +0 -5
  201. package/src/api/exceptions/request-pending.ts +0 -12
  202. package/src/api/exceptions/session-description-handler.ts +0 -11
  203. package/src/api/exceptions/session-terminated.ts +0 -11
  204. package/src/api/exceptions/state-transition.ts +0 -11
  205. package/src/api/index.ts +0 -58
  206. package/src/api/info.ts +0 -27
  207. package/src/api/invitation-accept-options.ts +0 -20
  208. package/src/api/invitation-progress-options.ts +0 -36
  209. package/src/api/invitation-reject-options.ts +0 -22
  210. package/src/api/invitation.ts +0 -816
  211. package/src/api/inviter-cancel-options.ts +0 -9
  212. package/src/api/inviter-invite-options.ts +0 -29
  213. package/src/api/inviter-options.ts +0 -44
  214. package/src/api/inviter.ts +0 -1126
  215. package/src/api/message.ts +0 -27
  216. package/src/api/messager-message-options.ts +0 -12
  217. package/src/api/messager-options.ts +0 -18
  218. package/src/api/messager.ts +0 -89
  219. package/src/api/notification.ts +0 -27
  220. package/src/api/notifier.ts +0 -7
  221. package/src/api/publisher-options.ts +0 -34
  222. package/src/api/publisher-publish-options.ts +0 -6
  223. package/src/api/publisher-state.ts +0 -21
  224. package/src/api/publisher-unpublish-options.ts +0 -6
  225. package/src/api/publisher.ts +0 -418
  226. package/src/api/referral.ts +0 -89
  227. package/src/api/registerer-options.ts +0 -55
  228. package/src/api/registerer-register-options.ts +0 -12
  229. package/src/api/registerer-state.ts +0 -21
  230. package/src/api/registerer-unregister-options.ts +0 -17
  231. package/src/api/registerer.ts +0 -814
  232. package/src/api/session-bye-options.ts +0 -12
  233. package/src/api/session-delegate.ts +0 -80
  234. package/src/api/session-description-handler-factory.ts +0 -16
  235. package/src/api/session-description-handler.ts +0 -89
  236. package/src/api/session-info-options.ts +0 -12
  237. package/src/api/session-invite-options.ts +0 -29
  238. package/src/api/session-message-options.ts +0 -12
  239. package/src/api/session-options.ts +0 -8
  240. package/src/api/session-refer-options.ts +0 -15
  241. package/src/api/session-state.ts +0 -45
  242. package/src/api/session.ts +0 -1448
  243. package/src/api/subscriber-options.ts +0 -12
  244. package/src/api/subscriber-subscribe-options.ts +0 -6
  245. package/src/api/subscriber.ts +0 -536
  246. package/src/api/subscription-delegate.ts +0 -13
  247. package/src/api/subscription-options.ts +0 -8
  248. package/src/api/subscription-state.ts +0 -19
  249. package/src/api/subscription-subscribe-options.ts +0 -6
  250. package/src/api/subscription-unsubscribe-options.ts +0 -6
  251. package/src/api/subscription.ts +0 -161
  252. package/src/api/transport-state.ts +0 -37
  253. package/src/api/transport.ts +0 -169
  254. package/src/api/user-agent-delegate.ts +0 -95
  255. package/src/api/user-agent-options.ts +0 -322
  256. package/src/api/user-agent-state.ts +0 -14
  257. package/src/api/user-agent.ts +0 -1014
  258. package/src/core/api-extractor.json +0 -358
  259. package/src/core/dialogs/dialog-state.ts +0 -35
  260. package/src/core/dialogs/dialog.ts +0 -605
  261. package/src/core/dialogs/index.ts +0 -4
  262. package/src/core/dialogs/session-dialog.ts +0 -996
  263. package/src/core/dialogs/subscription-dialog.ts +0 -557
  264. package/src/core/exceptions/exception.ts +0 -11
  265. package/src/core/exceptions/index.ts +0 -3
  266. package/src/core/exceptions/transaction-state-error.ts +0 -11
  267. package/src/core/exceptions/transport-error.ts +0 -11
  268. package/src/core/index.ts +0 -19
  269. package/src/core/log/index.ts +0 -3
  270. package/src/core/log/levels.ts +0 -10
  271. package/src/core/log/logger-factory.ts +0 -119
  272. package/src/core/log/logger.ts +0 -42
  273. package/src/core/messages/body.ts +0 -171
  274. package/src/core/messages/digest-authentication.ts +0 -190
  275. package/src/core/messages/incoming-message.ts +0 -152
  276. package/src/core/messages/incoming-request-message.ts +0 -14
  277. package/src/core/messages/incoming-request.ts +0 -75
  278. package/src/core/messages/incoming-response-message.ts +0 -14
  279. package/src/core/messages/incoming-response.ts +0 -13
  280. package/src/core/messages/index.ts +0 -18
  281. package/src/core/messages/md5.ts +0 -437
  282. package/src/core/messages/methods/ack.ts +0 -22
  283. package/src/core/messages/methods/bye.ts +0 -22
  284. package/src/core/messages/methods/cancel.ts +0 -22
  285. package/src/core/messages/methods/constants.ts +0 -21
  286. package/src/core/messages/methods/index.ts +0 -13
  287. package/src/core/messages/methods/info.ts +0 -22
  288. package/src/core/messages/methods/invite.ts +0 -104
  289. package/src/core/messages/methods/message.ts +0 -22
  290. package/src/core/messages/methods/notify.ts +0 -22
  291. package/src/core/messages/methods/prack.ts +0 -22
  292. package/src/core/messages/methods/publish.ts +0 -22
  293. package/src/core/messages/methods/refer.ts +0 -22
  294. package/src/core/messages/methods/register.ts +0 -22
  295. package/src/core/messages/methods/subscribe.ts +0 -59
  296. package/src/core/messages/outgoing-request-message.ts +0 -299
  297. package/src/core/messages/outgoing-request.ts +0 -77
  298. package/src/core/messages/outgoing-response.ts +0 -174
  299. package/src/core/messages/parser.ts +0 -265
  300. package/src/core/messages/utils.ts +0 -144
  301. package/src/core/session/index.ts +0 -2
  302. package/src/core/session/session-delegate.ts +0 -88
  303. package/src/core/session/session.ts +0 -158
  304. package/src/core/subscription/index.ts +0 -2
  305. package/src/core/subscription/subscription-delegate.ts +0 -30
  306. package/src/core/subscription/subscription.ts +0 -61
  307. package/src/core/timers.ts +0 -24
  308. package/src/core/transactions/client-transaction.ts +0 -78
  309. package/src/core/transactions/index.ts +0 -10
  310. package/src/core/transactions/invite-client-transaction.ts +0 -504
  311. package/src/core/transactions/invite-server-transaction.ts +0 -432
  312. package/src/core/transactions/non-invite-client-transaction.ts +0 -257
  313. package/src/core/transactions/non-invite-server-transaction.ts +0 -241
  314. package/src/core/transactions/server-transaction.ts +0 -47
  315. package/src/core/transactions/transaction-state.ts +0 -13
  316. package/src/core/transactions/transaction-user.ts +0 -82
  317. package/src/core/transactions/transaction.ts +0 -149
  318. package/src/core/transport.ts +0 -32
  319. package/src/core/user-agent-core/allowed-methods.ts +0 -19
  320. package/src/core/user-agent-core/index.ts +0 -3
  321. package/src/core/user-agent-core/user-agent-core-configuration.ts +0 -111
  322. package/src/core/user-agent-core/user-agent-core-delegate.ts +0 -50
  323. package/src/core/user-agent-core/user-agent-core.ts +0 -905
  324. package/src/core/user-agents/bye-user-agent-client.ts +0 -16
  325. package/src/core/user-agents/bye-user-agent-server.ts +0 -14
  326. package/src/core/user-agents/cancel-user-agent-client.ts +0 -14
  327. package/src/core/user-agents/index.ts +0 -26
  328. package/src/core/user-agents/info-user-agent-client.ts +0 -15
  329. package/src/core/user-agents/info-user-agent-server.ts +0 -14
  330. package/src/core/user-agents/invite-user-agent-client.ts +0 -405
  331. package/src/core/user-agents/invite-user-agent-server.ts +0 -269
  332. package/src/core/user-agents/message-user-agent-client.ts +0 -14
  333. package/src/core/user-agents/message-user-agent-server.ts +0 -14
  334. package/src/core/user-agents/notify-user-agent-client.ts +0 -15
  335. package/src/core/user-agents/notify-user-agent-server.ts +0 -30
  336. package/src/core/user-agents/prack-user-agent-client.ts +0 -16
  337. package/src/core/user-agents/prack-user-agent-server.ts +0 -37
  338. package/src/core/user-agents/publish-user-agent-client.ts +0 -14
  339. package/src/core/user-agents/re-invite-user-agent-client.ts +0 -127
  340. package/src/core/user-agents/re-invite-user-agent-server.ts +0 -109
  341. package/src/core/user-agents/re-subscribe-user-agent-client.ts +0 -78
  342. package/src/core/user-agents/re-subscribe-user-agent-server.ts +0 -14
  343. package/src/core/user-agents/refer-user-agent-client.ts +0 -15
  344. package/src/core/user-agents/refer-user-agent-server.ts +0 -30
  345. package/src/core/user-agents/register-user-agent-client.ts +0 -14
  346. package/src/core/user-agents/register-user-agent-server.ts +0 -14
  347. package/src/core/user-agents/subscribe-user-agent-client.ts +0 -341
  348. package/src/core/user-agents/subscribe-user-agent-server.ts +0 -14
  349. package/src/core/user-agents/user-agent-client.ts +0 -378
  350. package/src/core/user-agents/user-agent-server.ts +0 -276
  351. package/src/grammar/grammar.ts +0 -55
  352. package/src/grammar/index.ts +0 -4
  353. package/src/grammar/name-addr-header.ts +0 -58
  354. package/src/grammar/parameters.ts +0 -45
  355. package/src/grammar/pegjs/README.md +0 -9
  356. package/src/grammar/pegjs/dist/grammar.ts +0 -1557
  357. package/src/grammar/pegjs/src/grammar.pegjs +0 -1009
  358. package/src/grammar/uri.ts +0 -370
  359. package/src/main.ts +0 -26
  360. package/src/new-index.ts +0 -2478
  361. package/src/platform/react/README.md +0 -1
  362. package/src/platform/web/index.ts +0 -4
  363. package/src/platform/web/modifiers/index.ts +0 -5
  364. package/src/platform/web/modifiers/modifiers.ts +0 -180
  365. package/src/platform/web/session-description-handler/api-extractor.json +0 -358
  366. package/src/platform/web/session-description-handler/index.ts +0 -14
  367. package/src/platform/web/session-description-handler/media-stream-factory-default.ts +0 -22
  368. package/src/platform/web/session-description-handler/media-stream-factory.ts +0 -10
  369. package/src/platform/web/session-description-handler/peer-connection-configuration-default.ts +0 -17
  370. package/src/platform/web/session-description-handler/peer-connection-delegate.ts +0 -72
  371. package/src/platform/web/session-description-handler/session-description-handler-configuration.ts +0 -17
  372. package/src/platform/web/session-description-handler/session-description-handler-factory-default.ts +0 -45
  373. package/src/platform/web/session-description-handler/session-description-handler-factory-options.ts +0 -10
  374. package/src/platform/web/session-description-handler/session-description-handler-factory.ts +0 -17
  375. package/src/platform/web/session-description-handler/session-description-handler-options.ts +0 -56
  376. package/src/platform/web/session-description-handler/session-description-handler.ts +0 -938
  377. package/src/platform/web/simple-user/api-extractor.json +0 -358
  378. package/src/platform/web/simple-user/index.ts +0 -7
  379. package/src/platform/web/simple-user/simple-user-delegate.ts +0 -82
  380. package/src/platform/web/simple-user/simple-user-options.ts +0 -102
  381. package/src/platform/web/simple-user/simple-user.ts +0 -1099
  382. package/src/platform/web/transport/api-extractor.json +0 -358
  383. package/src/platform/web/transport/index.ts +0 -6
  384. package/src/platform/web/transport/transport-options.ts +0 -34
  385. package/src/platform/web/transport/transport.ts +0 -742
  386. package/src/version.ts +0 -8
  387. package/src/webPhoneSdk.ts +0 -67
  388. package/src/webrtc.ts +0 -318
  389. /package/dist/{config.d.ts → types/config.d.ts} +0 -0
@@ -1,1099 +0,0 @@
1
- import {
2
- Info,
3
- Invitation,
4
- InvitationAcceptOptions,
5
- Inviter,
6
- InviterInviteOptions,
7
- InviterOptions,
8
- Message,
9
- Messager,
10
- Referral,
11
- Registerer,
12
- RegistererOptions,
13
- RegistererRegisterOptions,
14
- RegistererState,
15
- RegistererUnregisterOptions,
16
- RequestPendingError,
17
- Session,
18
- SessionInviteOptions,
19
- SessionState,
20
- UserAgent,
21
- UserAgentOptions,
22
- UserAgentState
23
- } from "../../../api";
24
- import { Logger } from "../../../core";
25
- import { SessionDescriptionHandler, SessionDescriptionHandlerOptions } from "../session-description-handler";
26
- import { Transport } from "../transport";
27
- import { SimpleUserDelegate } from "./simple-user-delegate";
28
- import { SimpleUserOptions } from "./simple-user-options";
29
-
30
- /**
31
- * A simple SIP user class.
32
- * @remarks
33
- * While this class is completely functional for simple use cases, it is not intended
34
- * to provide an interface which is suitable for most (must less all) applications.
35
- * While this class has many limitations (for example, it only handles a single concurrent session),
36
- * it is, however, intended to serve as a simple example of using the SIP.js API.
37
- * @public
38
- */
39
- export class SimpleUser {
40
- /** Delegate. */
41
- public delegate: SimpleUserDelegate | undefined;
42
-
43
- private attemptingReconnection = false;
44
- private connectRequested = false;
45
- private logger: Logger;
46
- private held = false;
47
- private muted = false;
48
- private options: SimpleUserOptions;
49
- private registerer: Registerer | undefined = undefined;
50
- private registerRequested = false;
51
- private session: Session | undefined = undefined;
52
- private userAgent: UserAgent;
53
-
54
- /**
55
- * Constructs a new instance of the `SimpleUser` class.
56
- * @param server - SIP WebSocket Server URL.
57
- * @param options - Options bucket. See {@link SimpleUserOptions} for details.
58
- */
59
- constructor(server: string, options: SimpleUserOptions = {}) {
60
- // Delegate
61
- this.delegate = options.delegate;
62
-
63
- // Copy options
64
- this.options = { ...options };
65
-
66
- // UserAgentOptions
67
- const userAgentOptions: UserAgentOptions = {
68
- ...options.userAgentOptions
69
- };
70
-
71
- // Transport
72
- if (!userAgentOptions.transportConstructor) {
73
- userAgentOptions.transportConstructor = Transport;
74
- }
75
-
76
- // TransportOptions
77
- if (!userAgentOptions.transportOptions) {
78
- userAgentOptions.transportOptions = {
79
- server
80
- };
81
- }
82
-
83
- // URI
84
- if (!userAgentOptions.uri) {
85
- // If an AOR was provided, convert it to a URI
86
- if (options.aor) {
87
- const uri = UserAgent.makeURI(options.aor);
88
- if (!uri) {
89
- throw new Error(`Failed to create valid URI from ${options.aor}`);
90
- }
91
- userAgentOptions.uri = uri;
92
- }
93
- }
94
-
95
- // UserAgent
96
- this.userAgent = new UserAgent(userAgentOptions);
97
-
98
- // UserAgent's delegate
99
- this.userAgent.delegate = {
100
- // Handle connection with server established
101
- onConnect: (): void => {
102
- this.logger.log(`[${this.id}] Connected`);
103
- if (this.delegate && this.delegate.onServerConnect) {
104
- this.delegate.onServerConnect();
105
- }
106
- if (this.registerer && this.registerRequested) {
107
- this.logger.log(`[${this.id}] Registering...`);
108
- this.registerer.register().catch((e: Error) => {
109
- this.logger.error(`[${this.id}] Error occurred registering after connection with server was obtained.`);
110
- this.logger.error(e.toString());
111
- });
112
- }
113
- },
114
- // Handle connection with server lost
115
- onDisconnect: (error?: Error): void => {
116
- this.logger.log(`[${this.id}] Disconnected`);
117
- if (this.delegate && this.delegate.onServerDisconnect) {
118
- this.delegate.onServerDisconnect(error);
119
- }
120
- if (this.session) {
121
- this.logger.log(`[${this.id}] Hanging up...`);
122
- this.hangup() // cleanup hung calls
123
- .catch((e: Error) => {
124
- this.logger.error(`[${this.id}] Error occurred hanging up call after connection with server was lost.`);
125
- this.logger.error(e.toString());
126
- });
127
- }
128
- if (this.registerer) {
129
- this.logger.log(`[${this.id}] Unregistering...`);
130
- this.registerer
131
- .unregister() // cleanup invalid registrations
132
- .catch((e: Error) => {
133
- this.logger.error(`[${this.id}] Error occurred unregistering after connection with server was lost.`);
134
- this.logger.error(e.toString());
135
- });
136
- }
137
- // Only attempt to reconnect if network/server dropped the connection.
138
- if (error) {
139
- this.attemptReconnection();
140
- }
141
- },
142
- // Handle incoming invitations
143
- onInvite: (invitation: Invitation): void => {
144
- this.logger.log(`[${this.id}] Received INVITE`);
145
-
146
- // Guard against a pre-existing session. This implementation only supports one session at a time.
147
- // However an incoming INVITE request may be received at any time and/or while in the process
148
- // of sending an outgoing INVITE request. So we reject any incoming INVITE in those cases.
149
- if (this.session) {
150
- this.logger.warn(`[${this.id}] Session already in progress, rejecting INVITE...`);
151
- invitation
152
- .reject()
153
- .then(() => {
154
- this.logger.log(`[${this.id}] Rejected INVITE`);
155
- })
156
- .catch((error: Error) => {
157
- this.logger.error(`[${this.id}] Failed to reject INVITE`);
158
- this.logger.error(error.toString());
159
- });
160
- return;
161
- }
162
-
163
- // Use our configured constraints as options for any Inviter created as result of a REFER
164
- const referralInviterOptions: InviterOptions = {
165
- sessionDescriptionHandlerOptions: { constraints: this.constraints }
166
- };
167
-
168
- // Initialize our session
169
- this.initSession(invitation, referralInviterOptions);
170
-
171
- // Delegate
172
- if (this.delegate && this.delegate.onCallReceived) {
173
- this.delegate.onCallReceived();
174
- } else {
175
- this.logger.warn(`[${this.id}] No handler available, rejecting INVITE...`);
176
- invitation
177
- .reject()
178
- .then(() => {
179
- this.logger.log(`[${this.id}] Rejected INVITE`);
180
- })
181
- .catch((error: Error) => {
182
- this.logger.error(`[${this.id}] Failed to reject INVITE`);
183
- this.logger.error(error.toString());
184
- });
185
- }
186
- },
187
- // Handle incoming messages
188
- onMessage: (message: Message): void => {
189
- message.accept().then(() => {
190
- if (this.delegate && this.delegate.onMessageReceived) {
191
- this.delegate.onMessageReceived(message.request.body);
192
- }
193
- });
194
- }
195
- };
196
-
197
- // Use the SIP.js logger
198
- this.logger = this.userAgent.getLogger("sip.SimpleUser");
199
-
200
- // Monitor network connectivity and attempt reconnection when we come online
201
- window.addEventListener("online", () => {
202
- this.logger.log(`[${this.id}] Online`);
203
- this.attemptReconnection();
204
- });
205
- }
206
-
207
- /**
208
- * Instance identifier.
209
- * @internal
210
- */
211
- get id(): string {
212
- return (this.options.userAgentOptions && this.options.userAgentOptions.displayName) || "Anonymous";
213
- }
214
-
215
- /** The local media stream. Undefined if call not answered. */
216
- get localMediaStream(): MediaStream | undefined {
217
- const sdh = this.session?.sessionDescriptionHandler;
218
- if (!sdh) {
219
- return undefined;
220
- }
221
- if (!(sdh instanceof SessionDescriptionHandler)) {
222
- throw new Error("Session description handler not instance of web SessionDescriptionHandler");
223
- }
224
- return sdh.localMediaStream;
225
- }
226
-
227
- /** The remote media stream. Undefined if call not answered. */
228
- get remoteMediaStream(): MediaStream | undefined {
229
- const sdh = this.session?.sessionDescriptionHandler;
230
- if (!sdh) {
231
- return undefined;
232
- }
233
- if (!(sdh instanceof SessionDescriptionHandler)) {
234
- throw new Error("Session description handler not instance of web SessionDescriptionHandler");
235
- }
236
- return sdh.remoteMediaStream;
237
- }
238
-
239
- /**
240
- * The local audio track, if available.
241
- * @deprecated Use localMediaStream and get track from the stream.
242
- */
243
- get localAudioTrack(): MediaStreamTrack | undefined {
244
- return this.localMediaStream?.getTracks().find((track) => track.kind === "audio");
245
- }
246
-
247
- /**
248
- * The local video track, if available.
249
- * @deprecated Use localMediaStream and get track from the stream.
250
- */
251
- get localVideoTrack(): MediaStreamTrack | undefined {
252
- return this.localMediaStream?.getTracks().find((track) => track.kind === "video");
253
- }
254
-
255
- /**
256
- * The remote audio track, if available.
257
- * @deprecated Use remoteMediaStream and get track from the stream.
258
- */
259
- get remoteAudioTrack(): MediaStreamTrack | undefined {
260
- return this.remoteMediaStream?.getTracks().find((track) => track.kind === "audio");
261
- }
262
-
263
- /**
264
- * The remote video track, if available.
265
- * @deprecated Use remoteMediaStream and get track from the stream.
266
- */
267
- get remoteVideoTrack(): MediaStreamTrack | undefined {
268
- return this.remoteMediaStream?.getTracks().find((track) => track.kind === "video");
269
- }
270
-
271
- /**
272
- * Connect.
273
- * @remarks
274
- * Start the UserAgent's WebSocket Transport.
275
- */
276
- public connect(): Promise<void> {
277
- this.logger.log(`[${this.id}] Connecting UserAgent...`);
278
- this.connectRequested = true;
279
- if (this.userAgent.state !== UserAgentState.Started) {
280
- return this.userAgent.start();
281
- }
282
- return this.userAgent.reconnect();
283
- }
284
-
285
- /**
286
- * Disconnect.
287
- * @remarks
288
- * Stop the UserAgent's WebSocket Transport.
289
- */
290
- public disconnect(): Promise<void> {
291
- this.logger.log(`[${this.id}] Disconnecting UserAgent...`);
292
- this.connectRequested = false;
293
- return this.userAgent.stop();
294
- }
295
-
296
- /**
297
- * Return true if connected.
298
- */
299
- public isConnected(): boolean {
300
- return this.userAgent.isConnected();
301
- }
302
-
303
- /**
304
- * Start receiving incoming calls.
305
- * @remarks
306
- * Send a REGISTER request for the UserAgent's AOR.
307
- * Resolves when the REGISTER request is sent, otherwise rejects.
308
- */
309
- public register(
310
- registererOptions?: RegistererOptions,
311
- registererRegisterOptions?: RegistererRegisterOptions
312
- ): Promise<void> {
313
- this.logger.log(`[${this.id}] Registering UserAgent...`);
314
- this.registerRequested = true;
315
-
316
- if (!this.registerer) {
317
- this.registerer = new Registerer(this.userAgent, registererOptions);
318
- this.registerer.stateChange.addListener((state: RegistererState) => {
319
- switch (state) {
320
- case RegistererState.Initial:
321
- break;
322
- case RegistererState.Registered:
323
- if (this.delegate && this.delegate.onRegistered) {
324
- this.delegate.onRegistered();
325
- }
326
- break;
327
- case RegistererState.Unregistered:
328
- if (this.delegate && this.delegate.onUnregistered) {
329
- this.delegate.onUnregistered();
330
- }
331
- break;
332
- case RegistererState.Terminated:
333
- this.registerer = undefined;
334
- break;
335
- default:
336
- throw new Error("Unknown registerer state.");
337
- }
338
- });
339
- }
340
-
341
- return this.registerer.register(registererRegisterOptions).then(() => {
342
- return;
343
- });
344
- }
345
-
346
- /**
347
- * Stop receiving incoming calls.
348
- * @remarks
349
- * Send an un-REGISTER request for the UserAgent's AOR.
350
- * Resolves when the un-REGISTER request is sent, otherwise rejects.
351
- */
352
- public unregister(registererUnregisterOptions?: RegistererUnregisterOptions): Promise<void> {
353
- this.logger.log(`[${this.id}] Unregistering UserAgent...`);
354
- this.registerRequested = false;
355
-
356
- if (!this.registerer) {
357
- return Promise.resolve();
358
- }
359
-
360
- return this.registerer.unregister(registererUnregisterOptions).then(() => {
361
- return;
362
- });
363
- }
364
-
365
- /**
366
- * Make an outgoing call.
367
- * @remarks
368
- * Send an INVITE request to create a new Session.
369
- * Resolves when the INVITE request is sent, otherwise rejects.
370
- * Use `onCallAnswered` delegate method to determine if Session is established.
371
- * @param destination - The target destination to call. A SIP address to send the INVITE to.
372
- * @param inviterOptions - Optional options for Inviter constructor.
373
- * @param inviterInviteOptions - Optional options for Inviter.invite().
374
- */
375
- public call(
376
- destination: string,
377
- inviterOptions?: InviterOptions,
378
- inviterInviteOptions?: InviterInviteOptions
379
- ): Promise<void> {
380
- this.logger.log(`[${this.id}] Beginning Session...`);
381
-
382
- if (this.session) {
383
- return Promise.reject(new Error("Session already exists."));
384
- }
385
-
386
- const target = UserAgent.makeURI(destination);
387
- if (!target) {
388
- return Promise.reject(new Error(`Failed to create a valid URI from "${destination}"`));
389
- }
390
-
391
- // Use our configured constraints as InviterOptions if none provided
392
- if (!inviterOptions) {
393
- inviterOptions = {};
394
- }
395
- if (!inviterOptions.sessionDescriptionHandlerOptions) {
396
- inviterOptions.sessionDescriptionHandlerOptions = {};
397
- }
398
- if (!inviterOptions.sessionDescriptionHandlerOptions.constraints) {
399
- inviterOptions.sessionDescriptionHandlerOptions.constraints = this.constraints;
400
- }
401
-
402
- // Create a new Inviter for the outgoing Session
403
- const inviter = new Inviter(this.userAgent, target, inviterOptions);
404
-
405
- // Send INVITE
406
- return this.sendInvite(inviter, inviterOptions, inviterInviteOptions).then(() => {
407
- return;
408
- });
409
- }
410
-
411
- /**
412
- * Hangup a call.
413
- * @remarks
414
- * Send a BYE request, CANCEL request or reject response to end the current Session.
415
- * Resolves when the request/response is sent, otherwise rejects.
416
- * Use `onCallTerminated` delegate method to determine if and when call is ended.
417
- */
418
- public hangup(): Promise<void> {
419
- this.logger.log(`[${this.id}] Hangup...`);
420
- return this.terminate();
421
- }
422
-
423
- /**
424
- * Answer an incoming call.
425
- * @remarks
426
- * Accept an incoming INVITE request creating a new Session.
427
- * Resolves with the response is sent, otherwise rejects.
428
- * Use `onCallAnswered` delegate method to determine if and when call is established.
429
- * @param invitationAcceptOptions - Optional options for Inviter.accept().
430
- */
431
- public answer(invitationAcceptOptions?: InvitationAcceptOptions): Promise<void> {
432
- this.logger.log(`[${this.id}] Accepting Invitation...`);
433
-
434
- if (!this.session) {
435
- return Promise.reject(new Error("Session does not exist."));
436
- }
437
-
438
- if (!(this.session instanceof Invitation)) {
439
- return Promise.reject(new Error("Session not instance of Invitation."));
440
- }
441
-
442
- // Use our configured constraints as InvitationAcceptOptions if none provided
443
- if (!invitationAcceptOptions) {
444
- invitationAcceptOptions = {};
445
- }
446
- if (!invitationAcceptOptions.sessionDescriptionHandlerOptions) {
447
- invitationAcceptOptions.sessionDescriptionHandlerOptions = {};
448
- }
449
- if (!invitationAcceptOptions.sessionDescriptionHandlerOptions.constraints) {
450
- invitationAcceptOptions.sessionDescriptionHandlerOptions.constraints = this.constraints;
451
- }
452
-
453
- return this.session.accept(invitationAcceptOptions);
454
- }
455
-
456
- /**
457
- * Decline an incoming call.
458
- * @remarks
459
- * Reject an incoming INVITE request.
460
- * Resolves with the response is sent, otherwise rejects.
461
- * Use `onCallTerminated` delegate method to determine if and when call is ended.
462
- */
463
- public decline(): Promise<void> {
464
- this.logger.log(`[${this.id}] rejecting Invitation...`);
465
-
466
- if (!this.session) {
467
- return Promise.reject(new Error("Session does not exist."));
468
- }
469
-
470
- if (!(this.session instanceof Invitation)) {
471
- return Promise.reject(new Error("Session not instance of Invitation."));
472
- }
473
-
474
- return this.session.reject();
475
- }
476
-
477
- /**
478
- * Hold call
479
- * @remarks
480
- * Send a re-INVITE with new offer indicating "hold".
481
- * Resolves when the re-INVITE request is sent, otherwise rejects.
482
- * Use `onCallHold` delegate method to determine if request is accepted or rejected.
483
- * See: https://tools.ietf.org/html/rfc6337
484
- */
485
- public hold(): Promise<void> {
486
- this.logger.log(`[${this.id}] holding session...`);
487
- return this.setHold(true);
488
- }
489
-
490
- /**
491
- * Unhold call.
492
- * @remarks
493
- * Send a re-INVITE with new offer indicating "unhold".
494
- * Resolves when the re-INVITE request is sent, otherwise rejects.
495
- * Use `onCallHold` delegate method to determine if request is accepted or rejected.
496
- * See: https://tools.ietf.org/html/rfc6337
497
- */
498
- public unhold(): Promise<void> {
499
- this.logger.log(`[${this.id}] unholding session...`);
500
- return this.setHold(false);
501
- }
502
-
503
- /**
504
- * Hold state.
505
- * @remarks
506
- * True if session media is on hold.
507
- */
508
- public isHeld(): boolean {
509
- return this.held;
510
- }
511
-
512
- /**
513
- * Mute call.
514
- * @remarks
515
- * Disable sender's media tracks.
516
- */
517
- public mute(): void {
518
- this.logger.log(`[${this.id}] disabling media tracks...`);
519
- this.setMute(true);
520
- }
521
-
522
- /**
523
- * Unmute call.
524
- * @remarks
525
- * Enable sender's media tracks.
526
- */
527
- public unmute(): void {
528
- this.logger.log(`[${this.id}] enabling media tracks...`);
529
- this.setMute(false);
530
- }
531
-
532
- /**
533
- * Mute state.
534
- * @remarks
535
- * True if sender's media track is disabled.
536
- */
537
- public isMuted(): boolean {
538
- return this.muted;
539
- }
540
-
541
- /**
542
- * Send DTMF.
543
- * @remarks
544
- * Send an INFO request with content type application/dtmf-relay.
545
- * @param tone - Tone to send.
546
- */
547
- public sendDTMF(tone: string): Promise<void> {
548
- this.logger.log(`[${this.id}] sending DTMF...`);
549
-
550
- // As RFC 6086 states, sending DTMF via INFO is not standardized...
551
- //
552
- // Companies have been using INFO messages in order to transport
553
- // Dual-Tone Multi-Frequency (DTMF) tones. All mechanisms are
554
- // proprietary and have not been standardized.
555
- // https://tools.ietf.org/html/rfc6086#section-2
556
- //
557
- // It is however widely supported based on this draft:
558
- // https://tools.ietf.org/html/draft-kaplan-dispatch-info-dtmf-package-00
559
-
560
- // Validate tone
561
- if (!/^[0-9A-D#*,]$/.exec(tone)) {
562
- return Promise.reject(new Error("Invalid DTMF tone."));
563
- }
564
-
565
- if (!this.session) {
566
- return Promise.reject(new Error("Session does not exist."));
567
- }
568
-
569
- // The UA MUST populate the "application/dtmf-relay" body, as defined
570
- // earlier, with the button pressed and the duration it was pressed
571
- // for. Technically, this actually requires the INFO to be generated
572
- // when the user *releases* the button, however if the user has still
573
- // not released a button after 5 seconds, which is the maximum duration
574
- // supported by this mechanism, the UA should generate the INFO at that
575
- // time.
576
- // https://tools.ietf.org/html/draft-kaplan-dispatch-info-dtmf-package-00#section-5.3
577
- this.logger.log(`[${this.id}] Sending DTMF tone: ${tone}`);
578
- const dtmf = tone;
579
- const duration = 2000;
580
- const body = {
581
- contentDisposition: "render",
582
- contentType: "application/dtmf-relay",
583
- content: "Signal=" + dtmf + "\r\nDuration=" + duration
584
- };
585
- const requestOptions = { body };
586
-
587
- return this.session.info({ requestOptions }).then(() => {
588
- return;
589
- });
590
- }
591
-
592
- /**
593
- * Send a message.
594
- * @remarks
595
- * Send a MESSAGE request.
596
- * @param destination - The target destination for the message. A SIP address to send the MESSAGE to.
597
- */
598
- public message(destination: string, message: string): Promise<void> {
599
- this.logger.log(`[${this.id}] sending message...`);
600
-
601
- const target = UserAgent.makeURI(destination);
602
- if (!target) {
603
- return Promise.reject(new Error(`Failed to create a valid URI from "${destination}"`));
604
- }
605
- return new Messager(this.userAgent, target, message).message();
606
- }
607
-
608
- /** Media constraints. */
609
- private get constraints(): { audio: boolean; video: boolean } {
610
- let constraints = { audio: true, video: false }; // default to audio only calls
611
- if (this.options.media?.constraints) {
612
- constraints = { ...this.options.media.constraints };
613
- }
614
- return constraints;
615
- }
616
-
617
- /**
618
- * Attempt reconnection up to `maxReconnectionAttempts` times.
619
- * @param reconnectionAttempt - Current attempt number.
620
- */
621
- private attemptReconnection(reconnectionAttempt = 1): void {
622
- const reconnectionAttempts = this.options.reconnectionAttempts || 3;
623
- const reconnectionDelay = this.options.reconnectionDelay || 4;
624
-
625
- if (!this.connectRequested) {
626
- this.logger.log(`[${this.id}] Reconnection not currently desired`);
627
- return; // If intentionally disconnected, don't reconnect.
628
- }
629
-
630
- if (this.attemptingReconnection) {
631
- this.logger.log(`[${this.id}] Reconnection attempt already in progress`);
632
- }
633
-
634
- if (reconnectionAttempt > reconnectionAttempts) {
635
- this.logger.log(`[${this.id}] Reconnection maximum attempts reached`);
636
- return;
637
- }
638
-
639
- if (reconnectionAttempt === 1) {
640
- this.logger.log(`[${this.id}] Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - trying`);
641
- } else {
642
- this.logger.log(
643
- `[${this.id}] Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - trying in ${reconnectionDelay} seconds`
644
- );
645
- }
646
-
647
- this.attemptingReconnection = true;
648
-
649
- setTimeout(
650
- () => {
651
- if (!this.connectRequested) {
652
- this.logger.log(
653
- `[${this.id}] Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - aborted`
654
- );
655
- this.attemptingReconnection = false;
656
- return; // If intentionally disconnected, don't reconnect.
657
- }
658
- this.userAgent
659
- .reconnect()
660
- .then(() => {
661
- this.logger.log(
662
- `[${this.id}] Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - succeeded`
663
- );
664
- this.attemptingReconnection = false;
665
- })
666
- .catch((error: Error) => {
667
- this.logger.log(
668
- `[${this.id}] Reconnection attempt ${reconnectionAttempt} of ${reconnectionAttempts} - failed`
669
- );
670
- this.logger.error(error.message);
671
- this.attemptingReconnection = false;
672
- this.attemptReconnection(++reconnectionAttempt);
673
- });
674
- },
675
- reconnectionAttempt === 1 ? 0 : reconnectionDelay * 1000
676
- );
677
- }
678
-
679
- /** Helper function to remove media from html elements. */
680
- private cleanupMedia(): void {
681
- if (this.options.media) {
682
- if (this.options.media.local) {
683
- if (this.options.media.local.video) {
684
- this.options.media.local.video.srcObject = null;
685
- this.options.media.local.video.pause();
686
- }
687
- }
688
- if (this.options.media.remote) {
689
- if (this.options.media.remote.audio) {
690
- this.options.media.remote.audio.srcObject = null;
691
- this.options.media.remote.audio.pause();
692
- }
693
- if (this.options.media.remote.video) {
694
- this.options.media.remote.video.srcObject = null;
695
- this.options.media.remote.video.pause();
696
- }
697
- }
698
- }
699
- }
700
-
701
- /** Helper function to enable/disable media tracks. */
702
- private enableReceiverTracks(enable: boolean): void {
703
- if (!this.session) {
704
- throw new Error("Session does not exist.");
705
- }
706
-
707
- const sessionDescriptionHandler = this.session.sessionDescriptionHandler;
708
- if (!(sessionDescriptionHandler instanceof SessionDescriptionHandler)) {
709
- throw new Error("Session's session description handler not instance of SessionDescriptionHandler.");
710
- }
711
-
712
- const peerConnection = sessionDescriptionHandler.peerConnection;
713
- if (!peerConnection) {
714
- throw new Error("Peer connection closed.");
715
- }
716
-
717
- peerConnection.getReceivers().forEach((receiver) => {
718
- if (receiver.track) {
719
- receiver.track.enabled = enable;
720
- }
721
- });
722
- }
723
-
724
- /** Helper function to enable/disable media tracks. */
725
- private enableSenderTracks(enable: boolean): void {
726
- if (!this.session) {
727
- throw new Error("Session does not exist.");
728
- }
729
-
730
- const sessionDescriptionHandler = this.session.sessionDescriptionHandler;
731
- if (!(sessionDescriptionHandler instanceof SessionDescriptionHandler)) {
732
- throw new Error("Session's session description handler not instance of SessionDescriptionHandler.");
733
- }
734
-
735
- const peerConnection = sessionDescriptionHandler.peerConnection;
736
- if (!peerConnection) {
737
- throw new Error("Peer connection closed.");
738
- }
739
-
740
- peerConnection.getSenders().forEach((sender) => {
741
- if (sender.track) {
742
- sender.track.enabled = enable;
743
- }
744
- });
745
- }
746
-
747
- /**
748
- * Setup session delegate and state change handler.
749
- * @param session - Session to setup
750
- * @param referralInviterOptions - Options for any Inviter created as result of a REFER.
751
- */
752
- private initSession(session: Session, referralInviterOptions?: InviterOptions): void {
753
- // Set session
754
- this.session = session;
755
-
756
- // Call session created callback
757
- if (this.delegate && this.delegate.onCallCreated) {
758
- this.delegate.onCallCreated();
759
- }
760
-
761
- // Setup session state change handler
762
- this.session.stateChange.addListener((state: SessionState) => {
763
- if (this.session !== session) {
764
- return; // if our session has changed, just return
765
- }
766
- this.logger.log(`[${this.id}] session state changed to ${state}`);
767
- switch (state) {
768
- case SessionState.Initial:
769
- break;
770
- case SessionState.Establishing:
771
- break;
772
- case SessionState.Established:
773
- this.setupLocalMedia();
774
- this.setupRemoteMedia();
775
- if (this.delegate && this.delegate.onCallAnswered) {
776
- this.delegate.onCallAnswered();
777
- }
778
- break;
779
- case SessionState.Terminating:
780
- // fall through
781
- case SessionState.Terminated:
782
- this.session = undefined;
783
- this.cleanupMedia();
784
- if (this.delegate && this.delegate.onCallHangup) {
785
- this.delegate.onCallHangup();
786
- }
787
- break;
788
- default:
789
- throw new Error("Unknown session state.");
790
- }
791
- });
792
-
793
- // Setup delegate
794
- this.session.delegate = {
795
- onInfo: (info: Info): void => {
796
- // As RFC 6086 states, sending DTMF via INFO is not standardized...
797
- //
798
- // Companies have been using INFO messages in order to transport
799
- // Dual-Tone Multi-Frequency (DTMF) tones. All mechanisms are
800
- // proprietary and have not been standardized.
801
- // https://tools.ietf.org/html/rfc6086#section-2
802
- //
803
- // It is however widely supported based on this draft:
804
- // https://tools.ietf.org/html/draft-kaplan-dispatch-info-dtmf-package-00
805
-
806
- // FIXME: TODO: We should reject correctly...
807
- //
808
- // If a UA receives an INFO request associated with an Info Package that
809
- // the UA has not indicated willingness to receive, the UA MUST send a
810
- // 469 (Bad Info Package) response (see Section 11.6), which contains a
811
- // Recv-Info header field with Info Packages for which the UA is willing
812
- // to receive INFO requests.
813
- // https://tools.ietf.org/html/rfc6086#section-4.2.2
814
-
815
- // No delegate
816
- if (this.delegate?.onCallDTMFReceived === undefined) {
817
- info.reject();
818
- return;
819
- }
820
-
821
- // Invalid content type
822
- const contentType = info.request.getHeader("content-type");
823
- if (!contentType || !/^application\/dtmf-relay/i.exec(contentType)) {
824
- info.reject();
825
- return;
826
- }
827
-
828
- // Invalid body
829
- const body = info.request.body.split("\r\n", 2);
830
- if (body.length !== 2) {
831
- info.reject();
832
- return;
833
- }
834
-
835
- // Invalid tone
836
- let tone: string | undefined;
837
- const toneRegExp = /^(Signal\s*?=\s*?)([0-9A-D#*]{1})(\s)?.*/;
838
- if (toneRegExp.test(body[0])) {
839
- tone = body[0].replace(toneRegExp, "$2");
840
- }
841
- if (!tone) {
842
- info.reject();
843
- return;
844
- }
845
-
846
- // Invalid duration
847
- let duration: number | undefined;
848
- const durationRegExp = /^(Duration\s?=\s?)([0-9]{1,4})(\s)?.*/;
849
- if (durationRegExp.test(body[1])) {
850
- duration = parseInt(body[1].replace(durationRegExp, "$2"), 10);
851
- }
852
- if (!duration) {
853
- info.reject();
854
- return;
855
- }
856
-
857
- info
858
- .accept()
859
- .then(() => {
860
- if (this.delegate && this.delegate.onCallDTMFReceived) {
861
- if (!tone || !duration) {
862
- throw new Error("Tone or duration undefined.");
863
- }
864
- this.delegate.onCallDTMFReceived(tone, duration);
865
- }
866
- })
867
- .catch((error: Error) => {
868
- this.logger.error(error.message);
869
- });
870
- },
871
- onRefer: (referral: Referral): void => {
872
- referral
873
- .accept()
874
- .then(() => this.sendInvite(referral.makeInviter(referralInviterOptions), referralInviterOptions))
875
- .catch((error: Error) => {
876
- this.logger.error(error.message);
877
- });
878
- }
879
- };
880
- }
881
-
882
- /** Helper function to init send then send invite. */
883
- private sendInvite(
884
- inviter: Inviter,
885
- inviterOptions?: InviterOptions,
886
- inviterInviteOptions?: InviterInviteOptions
887
- ): Promise<void> {
888
- // Initialize our session
889
- this.initSession(inviter, inviterOptions);
890
-
891
- // Send the INVITE
892
- return inviter.invite(inviterInviteOptions).then(() => {
893
- this.logger.log(`[${this.id}] sent INVITE`);
894
- });
895
- }
896
-
897
- /**
898
- * Puts Session on hold.
899
- * @param hold - Hold on if true, off if false.
900
- */
901
- private setHold(hold: boolean): Promise<void> {
902
- if (!this.session) {
903
- return Promise.reject(new Error("Session does not exist."));
904
- }
905
- const session = this.session;
906
-
907
- // Just resolve if we are already in correct state
908
- if (this.held === hold) {
909
- return Promise.resolve();
910
- }
911
-
912
- const sessionDescriptionHandler = this.session.sessionDescriptionHandler;
913
- if (!(sessionDescriptionHandler instanceof SessionDescriptionHandler)) {
914
- throw new Error("Session's session description handler not instance of SessionDescriptionHandler.");
915
- }
916
-
917
- const options: SessionInviteOptions = {
918
- requestDelegate: {
919
- onAccept: (): void => {
920
- this.held = hold;
921
- this.enableReceiverTracks(!this.held);
922
- this.enableSenderTracks(!this.held && !this.muted);
923
- if (this.delegate && this.delegate.onCallHold) {
924
- this.delegate.onCallHold(this.held);
925
- }
926
- },
927
- onReject: (): void => {
928
- this.logger.warn(`[${this.id}] re-invite request was rejected`);
929
- this.enableReceiverTracks(!this.held);
930
- this.enableSenderTracks(!this.held && !this.muted);
931
- if (this.delegate && this.delegate.onCallHold) {
932
- this.delegate.onCallHold(this.held);
933
- }
934
- }
935
- }
936
- };
937
-
938
- // Session properties used to pass options to the SessionDescriptionHandler:
939
- //
940
- // 1) Session.sessionDescriptionHandlerOptions
941
- // SDH options for the initial INVITE transaction.
942
- // - Used in all cases when handling the initial INVITE transaction as either UAC or UAS.
943
- // - May be set directly at anytime.
944
- // - May optionally be set via constructor option.
945
- // - May optionally be set via options passed to Inviter.invite() or Invitation.accept().
946
- //
947
- // 2) Session.sessionDescriptionHandlerOptionsReInvite
948
- // SDH options for re-INVITE transactions.
949
- // - Used in all cases when handling a re-INVITE transaction as either UAC or UAS.
950
- // - May be set directly at anytime.
951
- // - May optionally be set via constructor option.
952
- // - May optionally be set via options passed to Session.invite().
953
-
954
- const sessionDescriptionHandlerOptions = session.sessionDescriptionHandlerOptionsReInvite as SessionDescriptionHandlerOptions;
955
- sessionDescriptionHandlerOptions.hold = hold;
956
- session.sessionDescriptionHandlerOptionsReInvite = sessionDescriptionHandlerOptions;
957
-
958
- // Send re-INVITE
959
- return this.session
960
- .invite(options)
961
- .then(() => {
962
- // preemptively enable/disable tracks
963
- this.enableReceiverTracks(!hold);
964
- this.enableSenderTracks(!hold && !this.muted);
965
- })
966
- .catch((error: Error) => {
967
- if (error instanceof RequestPendingError) {
968
- this.logger.error(`[${this.id}] A hold request is already in progress.`);
969
- }
970
- throw error;
971
- });
972
- }
973
-
974
- /**
975
- * Puts Session on mute.
976
- * @param mute - Mute on if true, off if false.
977
- */
978
- private setMute(mute: boolean): void {
979
- if (!this.session) {
980
- this.logger.warn(`[${this.id}] A session is required to enabled/disable media tracks`);
981
- return;
982
- }
983
-
984
- if (this.session.state !== SessionState.Established) {
985
- this.logger.warn(`[${this.id}] An established session is required to enable/disable media tracks`);
986
- return;
987
- }
988
-
989
- this.muted = mute;
990
-
991
- this.enableSenderTracks(!this.held && !this.muted);
992
- }
993
-
994
- /** Helper function to attach local media to html elements. */
995
- private setupLocalMedia(): void {
996
- if (!this.session) {
997
- throw new Error("Session does not exist.");
998
- }
999
-
1000
- const mediaElement = this.options.media?.local?.video;
1001
- if (mediaElement) {
1002
- const localStream = this.localMediaStream;
1003
- if (!localStream) {
1004
- throw new Error("Local media stream undefiend.");
1005
- }
1006
- mediaElement.srcObject = localStream;
1007
- mediaElement.volume = 0;
1008
- mediaElement.play().catch((error: Error) => {
1009
- this.logger.error(`[${this.id}] Failed to play local media`);
1010
- this.logger.error(error.message);
1011
- });
1012
- }
1013
- }
1014
-
1015
- /** Helper function to attach remote media to html elements. */
1016
- private setupRemoteMedia(): void {
1017
- if (!this.session) {
1018
- throw new Error("Session does not exist.");
1019
- }
1020
-
1021
- const mediaElement = this.options.media?.remote?.video || this.options.media?.remote?.audio;
1022
-
1023
- if (mediaElement) {
1024
- const remoteStream = this.remoteMediaStream;
1025
- if (!remoteStream) {
1026
- throw new Error("Remote media stream undefiend.");
1027
- }
1028
- mediaElement.autoplay = true; // Safari hack, because you cannot call .play() from a non user action
1029
- mediaElement.srcObject = remoteStream;
1030
- mediaElement.play().catch((error: Error) => {
1031
- this.logger.error(`[${this.id}] Failed to play remote media`);
1032
- this.logger.error(error.message);
1033
- });
1034
- remoteStream.onaddtrack = (): void => {
1035
- this.logger.log(`[${this.id}] Remote media onaddtrack`);
1036
- mediaElement.load(); // Safari hack, as it doesn't work otheriwse
1037
- mediaElement.play().catch((error: Error) => {
1038
- this.logger.error(`[${this.id}] Failed to play remote media`);
1039
- this.logger.error(error.message);
1040
- });
1041
- };
1042
- }
1043
- }
1044
-
1045
- /**
1046
- * End a session.
1047
- * @remarks
1048
- * Send a BYE request, CANCEL request or reject response to end the current Session.
1049
- * Resolves when the request/response is sent, otherwise rejects.
1050
- * Use `onCallTerminated` delegate method to determine if and when Session is terminated.
1051
- */
1052
- private terminate(): Promise<void> {
1053
- this.logger.log(`[${this.id}] Terminating...`);
1054
-
1055
- if (!this.session) {
1056
- return Promise.reject(new Error("Session does not exist."));
1057
- }
1058
-
1059
- switch (this.session.state) {
1060
- case SessionState.Initial:
1061
- if (this.session instanceof Inviter) {
1062
- return this.session.cancel().then(() => {
1063
- this.logger.log(`[${this.id}] Inviter never sent INVITE (canceled)`);
1064
- });
1065
- } else if (this.session instanceof Invitation) {
1066
- return this.session.reject().then(() => {
1067
- this.logger.log(`[${this.id}] Invitation rejected (sent 480)`);
1068
- });
1069
- } else {
1070
- throw new Error("Unknown session type.");
1071
- }
1072
- case SessionState.Establishing:
1073
- if (this.session instanceof Inviter) {
1074
- return this.session.cancel().then(() => {
1075
- this.logger.log(`[${this.id}] Inviter canceled (sent CANCEL)`);
1076
- });
1077
- } else if (this.session instanceof Invitation) {
1078
- return this.session.reject().then(() => {
1079
- this.logger.log(`[${this.id}] Invitation rejected (sent 480)`);
1080
- });
1081
- } else {
1082
- throw new Error("Unknown session type.");
1083
- }
1084
- case SessionState.Established:
1085
- return this.session.bye().then(() => {
1086
- this.logger.log(`[${this.id}] Session ended (sent BYE)`);
1087
- });
1088
- case SessionState.Terminating:
1089
- break;
1090
- case SessionState.Terminated:
1091
- break;
1092
- default:
1093
- throw new Error("Unknown state");
1094
- }
1095
-
1096
- this.logger.log(`[${this.id}] Terminating in state ${this.session.state}, no action taken`);
1097
- return Promise.resolve();
1098
- }
1099
- }