@botonic/core 1.0.0-dev.2 → 2.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/CHANGELOG.md +226 -0
  2. package/README.md +7 -9
  3. package/package.json +19 -57
  4. package/src/index.d.ts +4 -0
  5. package/src/index.js +5 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/core-bot/index.d.ts +33 -0
  8. package/src/lib/core-bot/index.js +113 -0
  9. package/src/lib/core-bot/index.js.map +1 -0
  10. package/src/lib/hubtype-service/handoff.d.ts +4 -0
  11. package/src/lib/hubtype-service/handoff.js +32 -0
  12. package/src/lib/hubtype-service/handoff.js.map +1 -0
  13. package/src/lib/hubtype-service/index.d.ts +10 -0
  14. package/src/lib/hubtype-service/index.js +96 -0
  15. package/src/lib/hubtype-service/index.js.map +1 -0
  16. package/src/lib/messages/button.d.ts +8 -0
  17. package/src/lib/messages/button.js +10 -0
  18. package/src/lib/messages/button.js.map +1 -0
  19. package/src/lib/plugins/index.d.ts +2 -0
  20. package/src/lib/plugins/index.js +23 -0
  21. package/src/lib/plugins/index.js.map +1 -0
  22. package/src/lib/routes/index.d.ts +0 -0
  23. package/src/lib/routes/index.js +2 -0
  24. package/src/lib/routes/index.js.map +1 -0
  25. package/src/lib/routes/router.d.ts +14 -0
  26. package/src/lib/routes/router.js +68 -0
  27. package/src/lib/routes/router.js.map +1 -0
  28. package/src/lib/routes/types.d.ts +15 -0
  29. package/src/lib/routes/types.js +2 -0
  30. package/src/lib/routes/types.js.map +1 -0
  31. package/{lib/cjs/utils.d.ts → src/lib/utils/index.d.ts} +0 -4
  32. package/{lib/esm/utils.js → src/lib/utils/index.js} +1 -34
  33. package/src/lib/utils/index.js.map +1 -0
  34. package/lib/cjs/constants.d.ts +0 -4
  35. package/lib/cjs/constants.js +0 -8
  36. package/lib/cjs/constants.js.map +0 -1
  37. package/lib/cjs/core-bot.d.ts +0 -36
  38. package/lib/cjs/core-bot.js +0 -96
  39. package/lib/cjs/core-bot.js.map +0 -1
  40. package/lib/cjs/debug/index.d.ts +0 -1
  41. package/lib/cjs/debug/index.js +0 -5
  42. package/lib/cjs/debug/index.js.map +0 -1
  43. package/lib/cjs/debug/inspector.d.ts +0 -24
  44. package/lib/cjs/debug/inspector.js +0 -72
  45. package/lib/cjs/debug/inspector.js.map +0 -1
  46. package/lib/cjs/handoff.d.ts +0 -67
  47. package/lib/cjs/handoff.js +0 -186
  48. package/lib/cjs/handoff.js.map +0 -1
  49. package/lib/cjs/hubtype-service.d.ts +0 -69
  50. package/lib/cjs/hubtype-service.js +0 -190
  51. package/lib/cjs/hubtype-service.js.map +0 -1
  52. package/lib/cjs/i18n.d.ts +0 -2
  53. package/lib/cjs/i18n.js +0 -11
  54. package/lib/cjs/i18n.js.map +0 -1
  55. package/lib/cjs/index.d.ts +0 -11
  56. package/lib/cjs/index.js +0 -15
  57. package/lib/cjs/index.js.map +0 -1
  58. package/lib/cjs/models/bot-state.d.ts +0 -11
  59. package/lib/cjs/models/bot-state.js +0 -3
  60. package/lib/cjs/models/bot-state.js.map +0 -1
  61. package/lib/cjs/models/channels.d.ts +0 -9
  62. package/lib/cjs/models/channels.js +0 -14
  63. package/lib/cjs/models/channels.js.map +0 -1
  64. package/lib/cjs/models/events/base-event.d.ts +0 -20
  65. package/lib/cjs/models/events/base-event.js +0 -17
  66. package/lib/cjs/models/events/base-event.js.map +0 -1
  67. package/lib/cjs/models/events/botonic-event.d.ts +0 -4
  68. package/lib/cjs/models/events/botonic-event.js +0 -3
  69. package/lib/cjs/models/events/botonic-event.js.map +0 -1
  70. package/lib/cjs/models/events/connection/connection-event.d.ts +0 -9
  71. package/lib/cjs/models/events/connection/connection-event.js +0 -9
  72. package/lib/cjs/models/events/connection/connection-event.js.map +0 -1
  73. package/lib/cjs/models/events/connection/index.d.ts +0 -1
  74. package/lib/cjs/models/events/connection/index.js +0 -5
  75. package/lib/cjs/models/events/connection/index.js.map +0 -1
  76. package/lib/cjs/models/events/index.d.ts +0 -4
  77. package/lib/cjs/models/events/index.js +0 -8
  78. package/lib/cjs/models/events/index.js.map +0 -1
  79. package/lib/cjs/models/events/integration/index.d.ts +0 -1
  80. package/lib/cjs/models/events/integration/index.js +0 -5
  81. package/lib/cjs/models/events/integration/index.js.map +0 -1
  82. package/lib/cjs/models/events/integration/integration-event.d.ts +0 -6
  83. package/lib/cjs/models/events/integration/integration-event.js +0 -3
  84. package/lib/cjs/models/events/integration/integration-event.js.map +0 -1
  85. package/lib/cjs/models/events/message/buttons.d.ts +0 -18
  86. package/lib/cjs/models/events/message/buttons.js +0 -3
  87. package/lib/cjs/models/events/message/buttons.js.map +0 -1
  88. package/lib/cjs/models/events/message/carousel.d.ts +0 -11
  89. package/lib/cjs/models/events/message/carousel.js +0 -3
  90. package/lib/cjs/models/events/message/carousel.js.map +0 -1
  91. package/lib/cjs/models/events/message/custom.d.ts +0 -6
  92. package/lib/cjs/models/events/message/custom.js +0 -3
  93. package/lib/cjs/models/events/message/custom.js.map +0 -1
  94. package/lib/cjs/models/events/message/index.d.ts +0 -9
  95. package/lib/cjs/models/events/message/index.js +0 -13
  96. package/lib/cjs/models/events/message/index.js.map +0 -1
  97. package/lib/cjs/models/events/message/location.d.ts +0 -6
  98. package/lib/cjs/models/events/message/location.js +0 -3
  99. package/lib/cjs/models/events/message/location.js.map +0 -1
  100. package/lib/cjs/models/events/message/media.d.ts +0 -18
  101. package/lib/cjs/models/events/message/media.js +0 -11
  102. package/lib/cjs/models/events/message/media.js.map +0 -1
  103. package/lib/cjs/models/events/message/message-event.d.ts +0 -30
  104. package/lib/cjs/models/events/message/message-event.js +0 -32
  105. package/lib/cjs/models/events/message/message-event.js.map +0 -1
  106. package/lib/cjs/models/events/message/postback.d.ts +0 -4
  107. package/lib/cjs/models/events/message/postback.js +0 -3
  108. package/lib/cjs/models/events/message/postback.js.map +0 -1
  109. package/lib/cjs/models/events/message/replies.d.ts +0 -7
  110. package/lib/cjs/models/events/message/replies.js +0 -3
  111. package/lib/cjs/models/events/message/replies.js.map +0 -1
  112. package/lib/cjs/models/events/message/text.d.ts +0 -8
  113. package/lib/cjs/models/events/message/text.js +0 -3
  114. package/lib/cjs/models/events/message/text.js.map +0 -1
  115. package/lib/cjs/models/index.d.ts +0 -6
  116. package/lib/cjs/models/index.js +0 -10
  117. package/lib/cjs/models/index.js.map +0 -1
  118. package/lib/cjs/models/legacy-types.d.ts +0 -184
  119. package/lib/cjs/models/legacy-types.js +0 -59
  120. package/lib/cjs/models/legacy-types.js.map +0 -1
  121. package/lib/cjs/models/session.d.ts +0 -3
  122. package/lib/cjs/models/session.js +0 -3
  123. package/lib/cjs/models/session.js.map +0 -1
  124. package/lib/cjs/models/user.d.ts +0 -14
  125. package/lib/cjs/models/user.js +0 -3
  126. package/lib/cjs/models/user.js.map +0 -1
  127. package/lib/cjs/output-parser/botonic-output-parser.d.ts +0 -16
  128. package/lib/cjs/output-parser/botonic-output-parser.js +0 -37
  129. package/lib/cjs/output-parser/botonic-output-parser.js.map +0 -1
  130. package/lib/cjs/output-parser/factory.d.ts +0 -4
  131. package/lib/cjs/output-parser/factory.js +0 -32
  132. package/lib/cjs/output-parser/factory.js.map +0 -1
  133. package/lib/cjs/output-parser/index.d.ts +0 -3
  134. package/lib/cjs/output-parser/index.js +0 -7
  135. package/lib/cjs/output-parser/index.js.map +0 -1
  136. package/lib/cjs/output-parser/parsers.d.ts +0 -22
  137. package/lib/cjs/output-parser/parsers.js +0 -147
  138. package/lib/cjs/output-parser/parsers.js.map +0 -1
  139. package/lib/cjs/plugins.d.ts +0 -6
  140. package/lib/cjs/plugins.js +0 -48
  141. package/lib/cjs/plugins.js.map +0 -1
  142. package/lib/cjs/routing/index.d.ts +0 -2
  143. package/lib/cjs/routing/index.js +0 -6
  144. package/lib/cjs/routing/index.js.map +0 -1
  145. package/lib/cjs/routing/router-utils.d.ts +0 -11
  146. package/lib/cjs/routing/router-utils.js +0 -89
  147. package/lib/cjs/routing/router-utils.js.map +0 -1
  148. package/lib/cjs/routing/router.d.ts +0 -54
  149. package/lib/cjs/routing/router.js +0 -319
  150. package/lib/cjs/routing/router.js.map +0 -1
  151. package/lib/cjs/utils.js +0 -90
  152. package/lib/cjs/utils.js.map +0 -1
  153. package/lib/esm/constants.d.ts +0 -4
  154. package/lib/esm/constants.js +0 -5
  155. package/lib/esm/constants.js.map +0 -1
  156. package/lib/esm/core-bot.d.ts +0 -36
  157. package/lib/esm/core-bot.js +0 -92
  158. package/lib/esm/core-bot.js.map +0 -1
  159. package/lib/esm/debug/index.d.ts +0 -1
  160. package/lib/esm/debug/index.js +0 -2
  161. package/lib/esm/debug/index.js.map +0 -1
  162. package/lib/esm/debug/inspector.d.ts +0 -24
  163. package/lib/esm/debug/inspector.js +0 -65
  164. package/lib/esm/debug/inspector.js.map +0 -1
  165. package/lib/esm/handoff.d.ts +0 -67
  166. package/lib/esm/handoff.js +0 -173
  167. package/lib/esm/handoff.js.map +0 -1
  168. package/lib/esm/hubtype-service.d.ts +0 -69
  169. package/lib/esm/hubtype-service.js +0 -185
  170. package/lib/esm/hubtype-service.js.map +0 -1
  171. package/lib/esm/i18n.d.ts +0 -2
  172. package/lib/esm/i18n.js +0 -7
  173. package/lib/esm/i18n.js.map +0 -1
  174. package/lib/esm/index.d.ts +0 -11
  175. package/lib/esm/index.js +0 -12
  176. package/lib/esm/index.js.map +0 -1
  177. package/lib/esm/models/bot-state.d.ts +0 -11
  178. package/lib/esm/models/bot-state.js +0 -2
  179. package/lib/esm/models/bot-state.js.map +0 -1
  180. package/lib/esm/models/channels.d.ts +0 -9
  181. package/lib/esm/models/channels.js +0 -11
  182. package/lib/esm/models/channels.js.map +0 -1
  183. package/lib/esm/models/events/base-event.d.ts +0 -20
  184. package/lib/esm/models/events/base-event.js +0 -14
  185. package/lib/esm/models/events/base-event.js.map +0 -1
  186. package/lib/esm/models/events/botonic-event.d.ts +0 -4
  187. package/lib/esm/models/events/botonic-event.js +0 -2
  188. package/lib/esm/models/events/botonic-event.js.map +0 -1
  189. package/lib/esm/models/events/connection/connection-event.d.ts +0 -9
  190. package/lib/esm/models/events/connection/connection-event.js +0 -6
  191. package/lib/esm/models/events/connection/connection-event.js.map +0 -1
  192. package/lib/esm/models/events/connection/index.d.ts +0 -1
  193. package/lib/esm/models/events/connection/index.js +0 -2
  194. package/lib/esm/models/events/connection/index.js.map +0 -1
  195. package/lib/esm/models/events/index.d.ts +0 -4
  196. package/lib/esm/models/events/index.js +0 -5
  197. package/lib/esm/models/events/index.js.map +0 -1
  198. package/lib/esm/models/events/integration/index.d.ts +0 -1
  199. package/lib/esm/models/events/integration/index.js +0 -2
  200. package/lib/esm/models/events/integration/index.js.map +0 -1
  201. package/lib/esm/models/events/integration/integration-event.d.ts +0 -6
  202. package/lib/esm/models/events/integration/integration-event.js +0 -2
  203. package/lib/esm/models/events/integration/integration-event.js.map +0 -1
  204. package/lib/esm/models/events/message/buttons.d.ts +0 -18
  205. package/lib/esm/models/events/message/buttons.js +0 -2
  206. package/lib/esm/models/events/message/buttons.js.map +0 -1
  207. package/lib/esm/models/events/message/carousel.d.ts +0 -11
  208. package/lib/esm/models/events/message/carousel.js +0 -2
  209. package/lib/esm/models/events/message/carousel.js.map +0 -1
  210. package/lib/esm/models/events/message/custom.d.ts +0 -6
  211. package/lib/esm/models/events/message/custom.js +0 -2
  212. package/lib/esm/models/events/message/custom.js.map +0 -1
  213. package/lib/esm/models/events/message/index.d.ts +0 -9
  214. package/lib/esm/models/events/message/index.js +0 -10
  215. package/lib/esm/models/events/message/index.js.map +0 -1
  216. package/lib/esm/models/events/message/location.d.ts +0 -6
  217. package/lib/esm/models/events/message/location.js +0 -2
  218. package/lib/esm/models/events/message/location.js.map +0 -1
  219. package/lib/esm/models/events/message/media.d.ts +0 -18
  220. package/lib/esm/models/events/message/media.js +0 -8
  221. package/lib/esm/models/events/message/media.js.map +0 -1
  222. package/lib/esm/models/events/message/message-event.d.ts +0 -30
  223. package/lib/esm/models/events/message/message-event.js +0 -29
  224. package/lib/esm/models/events/message/message-event.js.map +0 -1
  225. package/lib/esm/models/events/message/postback.d.ts +0 -4
  226. package/lib/esm/models/events/message/postback.js +0 -2
  227. package/lib/esm/models/events/message/postback.js.map +0 -1
  228. package/lib/esm/models/events/message/replies.d.ts +0 -7
  229. package/lib/esm/models/events/message/replies.js +0 -2
  230. package/lib/esm/models/events/message/replies.js.map +0 -1
  231. package/lib/esm/models/events/message/text.d.ts +0 -8
  232. package/lib/esm/models/events/message/text.js +0 -2
  233. package/lib/esm/models/events/message/text.js.map +0 -1
  234. package/lib/esm/models/index.d.ts +0 -6
  235. package/lib/esm/models/index.js +0 -7
  236. package/lib/esm/models/index.js.map +0 -1
  237. package/lib/esm/models/legacy-types.d.ts +0 -184
  238. package/lib/esm/models/legacy-types.js +0 -56
  239. package/lib/esm/models/legacy-types.js.map +0 -1
  240. package/lib/esm/models/session.d.ts +0 -3
  241. package/lib/esm/models/session.js +0 -2
  242. package/lib/esm/models/session.js.map +0 -1
  243. package/lib/esm/models/user.d.ts +0 -14
  244. package/lib/esm/models/user.js +0 -2
  245. package/lib/esm/models/user.js.map +0 -1
  246. package/lib/esm/output-parser/botonic-output-parser.d.ts +0 -16
  247. package/lib/esm/output-parser/botonic-output-parser.js +0 -33
  248. package/lib/esm/output-parser/botonic-output-parser.js.map +0 -1
  249. package/lib/esm/output-parser/factory.d.ts +0 -4
  250. package/lib/esm/output-parser/factory.js +0 -28
  251. package/lib/esm/output-parser/factory.js.map +0 -1
  252. package/lib/esm/output-parser/index.d.ts +0 -3
  253. package/lib/esm/output-parser/index.js +0 -4
  254. package/lib/esm/output-parser/index.js.map +0 -1
  255. package/lib/esm/output-parser/parsers.d.ts +0 -22
  256. package/lib/esm/output-parser/parsers.js +0 -130
  257. package/lib/esm/output-parser/parsers.js.map +0 -1
  258. package/lib/esm/plugins.d.ts +0 -6
  259. package/lib/esm/plugins.js +0 -43
  260. package/lib/esm/plugins.js.map +0 -1
  261. package/lib/esm/routing/index.d.ts +0 -2
  262. package/lib/esm/routing/index.js +0 -3
  263. package/lib/esm/routing/index.js.map +0 -1
  264. package/lib/esm/routing/router-utils.d.ts +0 -11
  265. package/lib/esm/routing/router-utils.js +0 -79
  266. package/lib/esm/routing/router-utils.js.map +0 -1
  267. package/lib/esm/routing/router.d.ts +0 -54
  268. package/lib/esm/routing/router.js +0 -315
  269. package/lib/esm/routing/router.js.map +0 -1
  270. package/lib/esm/utils.d.ts +0 -11
  271. package/lib/esm/utils.js.map +0 -1
  272. package/src/constants.ts +0 -6
  273. package/src/core-bot.ts +0 -181
  274. package/src/debug/index.ts +0 -1
  275. package/src/debug/inspector.ts +0 -102
  276. package/src/handoff.ts +0 -271
  277. package/src/hubtype-service.ts +0 -266
  278. package/src/i18n.ts +0 -12
  279. package/src/index.ts +0 -11
  280. package/src/models/bot-state.ts +0 -12
  281. package/src/models/channels.ts +0 -9
  282. package/src/models/events/base-event.ts +0 -22
  283. package/src/models/events/botonic-event.ts +0 -26
  284. package/src/models/events/connection/connection-event.ts +0 -11
  285. package/src/models/events/connection/index.ts +0 -1
  286. package/src/models/events/index.ts +0 -4
  287. package/src/models/events/integration/index.ts +0 -1
  288. package/src/models/events/integration/integration-event.ts +0 -13
  289. package/src/models/events/message/buttons.ts +0 -23
  290. package/src/models/events/message/carousel.ts +0 -13
  291. package/src/models/events/message/custom.ts +0 -7
  292. package/src/models/events/message/index.ts +0 -9
  293. package/src/models/events/message/location.ts +0 -7
  294. package/src/models/events/message/media.ts +0 -28
  295. package/src/models/events/message/message-event.ts +0 -37
  296. package/src/models/events/message/postback.ts +0 -5
  297. package/src/models/events/message/replies.ts +0 -8
  298. package/src/models/events/message/text.ts +0 -12
  299. package/src/models/index.ts +0 -6
  300. package/src/models/legacy-types.ts +0 -262
  301. package/src/models/session.ts +0 -3
  302. package/src/models/user.ts +0 -16
  303. package/src/output-parser/botonic-output-parser.ts +0 -38
  304. package/src/output-parser/factory.ts +0 -38
  305. package/src/output-parser/index.ts +0 -3
  306. package/src/output-parser/parsers.ts +0 -202
  307. package/src/plugins.ts +0 -59
  308. package/src/routing/index.ts +0 -2
  309. package/src/routing/router-utils.ts +0 -100
  310. package/src/routing/router.ts +0 -415
  311. package/src/utils.ts +0 -90
package/src/handoff.ts DELETED
@@ -1,271 +0,0 @@
1
- import axios from 'axios'
2
-
3
- import { PATH_PAYLOAD_IDENTIFIER } from './constants'
4
- import { BotState, Session } from './models'
5
-
6
- const HUBTYPE_API_URL = 'https://api.hubtype.com'
7
-
8
- export interface HubtypeAgentsInfo {
9
- attending_count: number
10
- email: string
11
- idle_count: number
12
- last_message_sent: string
13
- status: string
14
- }
15
- export interface HubtypeSession extends Session {
16
- _hubtype_api?: string
17
- _access_token: string
18
- }
19
-
20
- export interface SessionWithBotonicAction extends Session {
21
- _botonic_action: string
22
- }
23
- export interface BackendContext {
24
- timeoutMs: number
25
- }
26
-
27
- export interface VacationRange {
28
- end_date: number // timestamp
29
- id: number
30
- start_date: number // timestamp
31
- }
32
-
33
- function contextDefaults(context: any): BackendContext {
34
- return {
35
- timeoutMs: context.timeoutMs || 10000,
36
- }
37
- }
38
-
39
- export async function getOpenQueues(
40
- session: HubtypeSession,
41
- context = {}
42
- ): Promise<{ queues: string[] }> {
43
- //be aware of https://github.com/axios/axios/issues/1543
44
- const baseUrl = session._hubtype_api || HUBTYPE_API_URL
45
- const endpointUrl = `${baseUrl}/v1/queues/get_open_queues/`
46
- context = contextDefaults(context)
47
- const resp = await axios({
48
- headers: {
49
- Authorization: `Bearer ${session._access_token}`,
50
- },
51
- method: 'post',
52
- url: endpointUrl,
53
- data: { bot_id: session.bot.id },
54
- timeout: (context as BackendContext).timeoutMs,
55
- })
56
- return resp.data
57
- }
58
-
59
- export class HandOffBuilder {
60
- _botState: any
61
- _queue: string
62
- _onFinish: string
63
- _email: string
64
- _agentId: string
65
- _note: string
66
- _caseInfo: string
67
- _shadowing: boolean
68
-
69
- constructor(botState: any) {
70
- this._botState = botState
71
- }
72
-
73
- withQueue(queueNameOrId: string): this {
74
- this._queue = queueNameOrId
75
- return this
76
- }
77
-
78
- withOnFinishPayload(payload: string): this {
79
- this._onFinish = payload
80
- return this
81
- }
82
-
83
- withOnFinishPath(path: string): this {
84
- this._onFinish = `${PATH_PAYLOAD_IDENTIFIER}${path}`
85
- return this
86
- }
87
-
88
- withAgentEmail(email: string): this {
89
- this._email = email
90
- return this
91
- }
92
-
93
- withAgentId(agentId: string): this {
94
- this._agentId = agentId
95
- return this
96
- }
97
-
98
- withNote(note: string): this {
99
- this._note = note
100
- return this
101
- }
102
-
103
- withCaseInfo(caseInfo: string): this {
104
- this._caseInfo = caseInfo
105
- return this
106
- }
107
-
108
- withShadowing(shadowing = true): this {
109
- this._shadowing = shadowing
110
- return this
111
- }
112
-
113
- async handOff(): Promise<void> {
114
- return _humanHandOff(
115
- this._botState,
116
- this._queue,
117
- this._onFinish,
118
- this._email,
119
- this._agentId,
120
- this._caseInfo,
121
- this._note,
122
- this._shadowing
123
- )
124
- }
125
- }
126
-
127
- /**
128
- * @deprecated use {@link HandOffBuilder} class instead
129
- */
130
- export async function humanHandOff(session, queueNameOrId = '', onFinish) {
131
- const builder = new HandOffBuilder(session)
132
- if (queueNameOrId) {
133
- builder.withQueue(queueNameOrId)
134
- }
135
- if (onFinish) {
136
- if (onFinish.path) {
137
- builder.withOnFinishPath(onFinish.path)
138
- } else if (onFinish.payload) {
139
- builder.withOnFinishPayload(onFinish.payload)
140
- } else {
141
- throw new Error('onFinish requires payload or path field')
142
- }
143
- }
144
- return builder.handOff()
145
- }
146
-
147
- interface HubtypeHandoffParams {
148
- queue?: string
149
- agent_email?: string
150
- agent_id?: string
151
- case_info?: string
152
- note?: string
153
- shadowing?: boolean
154
- on_finish?: string
155
- }
156
- async function _humanHandOff(
157
- botState: any,
158
- queueNameOrId = '',
159
- onFinish: string,
160
- agentEmail = '',
161
- agentId = '',
162
- caseInfo = '',
163
- note = '',
164
- shadowing = false
165
- ) {
166
- const params: HubtypeHandoffParams = {}
167
- if (queueNameOrId) {
168
- params.queue = queueNameOrId
169
- }
170
- if (agentEmail) {
171
- params.agent_email = agentEmail
172
- }
173
- if (agentId) {
174
- params.agent_id = agentId
175
- }
176
- if (caseInfo) {
177
- params.case_info = caseInfo
178
- }
179
- if (note) {
180
- params.note = note
181
- }
182
- if (shadowing) {
183
- params.shadowing = shadowing
184
- }
185
- if (onFinish) {
186
- params.on_finish = onFinish
187
- }
188
- botState.botonicAction = `create_case:${JSON.stringify(params)}`
189
- botState.isHandoff = true
190
- }
191
-
192
- export async function storeCaseRating(
193
- session: HubtypeSession,
194
- rating: number,
195
- context: any = {}
196
- ): Promise<{ status: string }> {
197
- const baseUrl = session._hubtype_api || HUBTYPE_API_URL
198
- const chatId = session.user.id
199
- context = contextDefaults(context)
200
- const resp = await axios({
201
- headers: {
202
- Authorization: `Bearer ${session._access_token}`,
203
- },
204
- method: 'post',
205
- url: `${baseUrl}/v1/chats/${chatId}/store_case_rating/`,
206
- data: { chat_id: chatId, rating },
207
- timeout: (context as BackendContext).timeoutMs,
208
- })
209
- return resp.data
210
- }
211
-
212
- export async function getAvailableAgentsByQueue(
213
- session: HubtypeSession,
214
- queueId: string
215
- ): Promise<{ agents: string[] }> {
216
- const baseUrl = session._hubtype_api || HUBTYPE_API_URL
217
- const resp = await axios({
218
- headers: {
219
- Authorization: `Bearer ${session._access_token}`,
220
- },
221
- method: 'post',
222
- url: `${baseUrl}/v1/queues/${queueId}/get_available_agents/`,
223
- })
224
- return resp.data
225
- }
226
-
227
- export async function getAvailableAgents(
228
- session: HubtypeSession
229
- ): Promise<{ agents: HubtypeAgentsInfo[] }> {
230
- const baseUrl = session._hubtype_api || HUBTYPE_API_URL
231
- const botId = session.bot.id
232
- const resp = await axios({
233
- headers: {
234
- Authorization: `Bearer ${session._access_token}`,
235
- },
236
- method: 'post',
237
- url: `${baseUrl}/v1/bots/${botId}/get_agents/`,
238
- })
239
- return resp.data
240
- }
241
-
242
- export async function getAgentVacationRanges(
243
- session: HubtypeSession,
244
- { agentId, agentEmail }: { agentId?: string; agentEmail?: string }
245
- ): Promise<{ vacation_ranges: VacationRange[] }> {
246
- const baseUrl = session._hubtype_api || HUBTYPE_API_URL
247
- const botId = session.bot.id
248
- const resp = await axios({
249
- headers: {
250
- Authorization: `Bearer ${session._access_token}`,
251
- },
252
- method: 'get',
253
- url: `${baseUrl}/v1/bots/${botId}/get_agent_vacation_ranges/`,
254
- params: { agent_id: agentId, agent_email: agentEmail },
255
- })
256
- return resp.data
257
- }
258
-
259
- export function cancelHandoff(
260
- botState: BotState,
261
- typification: string | null = null
262
- ): void {
263
- let action = 'discard_case'
264
- if (typification) action = `${action}:${JSON.stringify({ typification })}`
265
- botState.botonicAction = action
266
- botState.isHandoff = false // TODO: Review handoff functionalities
267
- }
268
-
269
- export function deleteUser(botState: BotState): void {
270
- botState.botonicAction = `delete_user`
271
- }
@@ -1,266 +0,0 @@
1
- import axios, { AxiosResponse } from 'axios'
2
- import Pusher, { AuthOptions, Channel } from 'pusher-js'
3
- import Channels from 'pusher-js/types/src/core/channels/channels'
4
-
5
- import { Input } from './models'
6
- import { getWebpackEnvVar } from './utils'
7
-
8
- interface UnsentInput {
9
- id: string
10
- ack: number
11
- unsentInput: Input
12
- }
13
- interface BotonicHeaders {
14
- 'X-BOTONIC-USER-ID': string
15
- 'X-BOTONIC-LAST-MESSAGE-ID': string
16
- 'X-BOTONIC-LAST-MESSAGE-UPDATE-DATE': string
17
- }
18
- interface ServerConfig {
19
- activityTimeout?: number
20
- pongTimeout?: number
21
- }
22
- interface HubtypeServiceArgs {
23
- appId: string
24
- user: any
25
- lastMessageId: string
26
- lastMessageUpdateDate: string
27
- onEvent: any
28
- unsentInputs: () => UnsentInput[]
29
- server: ServerConfig
30
- }
31
-
32
- const _WEBCHAT_PUSHER_KEY_ = getWebpackEnvVar(
33
- // @ts-ignore
34
- typeof WEBCHAT_PUSHER_KEY !== 'undefined' && WEBCHAT_PUSHER_KEY,
35
- 'WEBCHAT_PUSHER_KEY',
36
- '434ca667c8e6cb3f641c'
37
- )
38
- const _HUBTYPE_API_URL_ = getWebpackEnvVar(
39
- // @ts-ignore
40
- typeof HUBTYPE_API_URL !== 'undefined' && HUBTYPE_API_URL,
41
- 'HUBTYPE_API_URL',
42
- 'https://api.hubtype.com'
43
- )
44
-
45
- const ACTIVITY_TIMEOUT = 20 * 1000 // https://pusher.com/docs/channels/using_channels/connection#activitytimeout-integer-
46
- const PONG_TIMEOUT = 5 * 1000 // https://pusher.com/docs/channels/using_channels/connection#pongtimeout-integer-
47
-
48
- /**
49
- * Calls Hubtype APIs from Webchat
50
- */
51
- export class HubtypeService {
52
- appId: string
53
- user: any
54
- lastMessageId: string
55
- lastMessageUpdateDate: string
56
- onEvent: any
57
- unsentInputs: () => UnsentInput[]
58
- pusher: Pusher | null
59
- channel: Channel
60
- server: ServerConfig
61
- PUSHER_CONNECT_TIMEOUT_MS = 10000
62
- constructor({
63
- appId,
64
- user,
65
- lastMessageId,
66
- lastMessageUpdateDate,
67
- onEvent,
68
- unsentInputs,
69
- server,
70
- }: HubtypeServiceArgs) {
71
- this.appId = appId
72
- this.user = user || {}
73
- this.lastMessageId = lastMessageId
74
- this.lastMessageUpdateDate = lastMessageUpdateDate
75
- this.onEvent = onEvent
76
- this.unsentInputs = unsentInputs
77
- this.server = server
78
- if (this.user.id && (lastMessageId || lastMessageUpdateDate)) {
79
- // It's safe not awaiting Promise because:
80
- // * it will never be called from AWS lambda
81
- // * though init() is called again from postMesage, it does nothing if Pusher already created
82
- // @ts-ignore
83
- this.init()
84
- }
85
- }
86
-
87
- /**
88
- * @returns {Promise<void>}
89
- */
90
- init(user, lastMessageId, lastMessageUpdateDate): Promise<void> {
91
- if (user) this.user = user
92
- if (lastMessageId) this.lastMessageId = lastMessageId
93
- if (lastMessageUpdateDate)
94
- this.lastMessageUpdateDate = lastMessageUpdateDate
95
- return this._initPusher()
96
- }
97
-
98
- /**
99
- * @returns {Promise<void>}
100
- */
101
- _initPusher(): Promise<void> {
102
- if (this.pusher) return Promise.resolve()
103
- if (!this.user.id || !this.appId) {
104
- // TODO recover user & appId somehow
105
- return Promise.reject('No User or appId. Clear cache and reload')
106
- }
107
- this.pusher = new Pusher(_WEBCHAT_PUSHER_KEY_, {
108
- cluster: 'eu',
109
- authEndpoint: `${_HUBTYPE_API_URL_}/v1/provider_accounts/webhooks/webchat/${this.appId}/auth/`,
110
- forceTLS: true,
111
- auth: {
112
- headers: this.constructHeaders(),
113
- } as AuthOptions,
114
- ...this.resolveServerConfig(),
115
- })
116
- this.channel = this.pusher.subscribe(this.pusherChannel)
117
- const connectionPromise = new Promise<void>((resolve, reject) => {
118
- const cleanAndReject = msg => {
119
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
120
- clearTimeout(connectTimeout)
121
- this.destroyPusher()
122
- reject(msg)
123
- }
124
- const connectTimeout = setTimeout(
125
- () => cleanAndReject('Connection Timeout'),
126
- this.PUSHER_CONNECT_TIMEOUT_MS
127
- )
128
- this.channel.bind('pusher:subscription_succeeded', () => {
129
- // Once subscribed, we know that authentication has been done: https://pusher.com/docs/channels/server_api/authenticating-users
130
- this.onConnectionRegained()
131
- clearTimeout(connectTimeout)
132
- resolve()
133
- })
134
- this.channel.bind('botonic_response', data => this.onPusherEvent(data))
135
- this.channel.bind('update_message_info', data => this.onPusherEvent(data))
136
-
137
- this.pusher &&
138
- this.pusher.connection.bind('error', event => {
139
- if (event.type == 'WebSocketError') this.handleConnectionChange(false)
140
- else {
141
- const errorMsg =
142
- event.error && event.error.data
143
- ? event.error.data.code || event.error.data.message
144
- : 'Connection error'
145
- cleanAndReject(`Pusher error (${errorMsg})`)
146
- }
147
- })
148
- })
149
- this.pusher.connection.bind('state_change', states => {
150
- if (states.current === 'connecting') this.updateAuthHeaders()
151
- if (states.current === 'connected') this.handleConnectionChange(true)
152
- if (states.current === 'unavailable') this.handleConnectionChange(false)
153
- })
154
-
155
- return connectionPromise
156
- }
157
-
158
- constructHeaders(): BotonicHeaders {
159
- const headers = {}
160
- if (this.user && this.user.id) headers['X-BOTONIC-USER-ID'] = this.user.id
161
- if (this.lastMessageId)
162
- headers['X-BOTONIC-LAST-MESSAGE-ID'] = this.lastMessageId
163
- if (this.lastMessageUpdateDate)
164
- headers['X-BOTONIC-LAST-MESSAGE-UPDATE-DATE'] = this.lastMessageUpdateDate
165
- return headers as BotonicHeaders
166
- }
167
-
168
- resolveServerConfig(): ServerConfig {
169
- if (!this.server) {
170
- return { activityTimeout: ACTIVITY_TIMEOUT, pongTimeout: PONG_TIMEOUT }
171
- }
172
- return {
173
- activityTimeout: this.server.activityTimeout || ACTIVITY_TIMEOUT,
174
- pongTimeout: this.server.pongTimeout || PONG_TIMEOUT,
175
- }
176
- }
177
-
178
- updateAuthHeaders(): void {
179
- if (this.pusher) {
180
- this.pusher.config.auth.headers = {
181
- ...this.pusher.config.auth.headers,
182
- ...this.constructHeaders(),
183
- }
184
- }
185
- }
186
-
187
- handleConnectionChange(online: boolean): void {
188
- this.onPusherEvent({ action: 'connection_change', online })
189
- }
190
-
191
- onPusherEvent(event: any): void {
192
- if (this.onEvent && typeof this.onEvent === 'function') this.onEvent(event)
193
- }
194
-
195
- get pusherChannel(): string {
196
- return `private-encrypted-${this.appId}-${this.user.id}`
197
- }
198
-
199
- handleSentInput(message: any): void {
200
- this.onEvent({
201
- action: 'update_message_info',
202
- message: { id: message.id, ack: 1 },
203
- })
204
- }
205
-
206
- handleUnsentInput(message: any): void {
207
- this.onEvent({
208
- action: 'update_message_info',
209
- message: { id: message.id, ack: 0, unsentInput: message },
210
- })
211
- }
212
-
213
- /**
214
- * @return {Promise<void>}
215
- */
216
- async postMessage(user: any, message: any): Promise<void> {
217
- try {
218
- // @ts-ignore
219
- await this.init(user)
220
- await axios.post(
221
- `${_HUBTYPE_API_URL_}/v1/provider_accounts/webhooks/webchat/${this.appId}/`,
222
- {
223
- sender: this.user,
224
- message: message,
225
- },
226
- {
227
- validateStatus: status => status === 200,
228
- }
229
- )
230
- this.handleSentInput(message)
231
- } catch (e) {
232
- this.handleUnsentInput(message)
233
- }
234
- return Promise.resolve()
235
- }
236
-
237
- static async getWebchatVisibility({
238
- appId,
239
- }: {
240
- appId: string
241
- }): Promise<AxiosResponse<any>> {
242
- return axios.get(
243
- `${_HUBTYPE_API_URL_}/v1/provider_accounts/${appId}/visibility/`
244
- )
245
- }
246
-
247
- destroyPusher(): void {
248
- if (!this.pusher) return
249
- this.pusher.disconnect()
250
- this.pusher.unsubscribe(this.pusherChannel)
251
- this.pusher.unbind_all()
252
- this.pusher.channels = {} as Channels
253
- this.pusher = null
254
- }
255
-
256
- async onConnectionRegained(): Promise<void> {
257
- await this.resendUnsentInputs()
258
- }
259
-
260
- async resendUnsentInputs(): Promise<void> {
261
- for (const message of this.unsentInputs()) {
262
- message.unsentInput &&
263
- (await this.postMessage(this.user, message.unsentInput))
264
- }
265
- }
266
- }
package/src/i18n.ts DELETED
@@ -1,12 +0,0 @@
1
- // eslint-disable-next-line filenames/match-regex
2
- import { Locales } from './models'
3
-
4
- export const getString = (
5
- locales: Locales,
6
- locale: string,
7
- stringID: string
8
- ): string => {
9
- let l = stringID.split('.').reduce((o, i) => o[i], locales[locale])
10
- if (l instanceof Array) l = l[Math.floor(Math.random() * l.length)]
11
- return String(l)
12
- }
package/src/index.ts DELETED
@@ -1,11 +0,0 @@
1
- export * from './constants'
2
- export * from './core-bot'
3
- export * from './debug'
4
- export * from './handoff'
5
- export * from './hubtype-service'
6
- export * from './i18n'
7
- export * from './models'
8
- export * from './output-parser'
9
- export * from './plugins'
10
- export * from './routing'
11
- export * from './utils'
@@ -1,12 +0,0 @@
1
- import { RoutePath } from './legacy-types'
2
-
3
- export interface BotState {
4
- botId: string
5
- isFirstInteraction: boolean
6
- isHandoff: boolean
7
- isShadowing: boolean
8
- lastRoutePath: RoutePath
9
- locale?: string
10
- retries: number
11
- botonicAction?: any
12
- }
@@ -1,9 +0,0 @@
1
- export enum Channels {
2
- DEV = 'dev',
3
- FACEBOOK = 'facebook',
4
- GENERIC = 'generic',
5
- TELEGRAM = 'telegram',
6
- TWITTER = 'twitter',
7
- WEBCHAT = 'webchat',
8
- WHATSAPP = 'whatsapp',
9
- }
@@ -1,22 +0,0 @@
1
- export enum EventTypes {
2
- CONNECTION = 'connection',
3
- MESSAGE = 'message',
4
- ACK = 'ack',
5
- TRACK = 'track',
6
- // Integration Events
7
- NEW_USER = 'newUser',
8
- RECEIVED_MESSAGE = 'receivedMessage',
9
- BOT_EXECUTED = 'botExecuted',
10
- BOT_ACTION = 'botAction',
11
- ACTION_SENT = 'actionSent',
12
- }
13
-
14
- export interface BaseEvent {
15
- eventId: string
16
- userId: string
17
- eventType: EventTypes
18
- createdAt: string
19
- modifiedAt?: string
20
- channel: string
21
- idFromChannel: string
22
- }
@@ -1,26 +0,0 @@
1
- import { ConnectionEvent } from './connection'
2
- import { IntegrationEvent } from './integration'
3
- import {
4
- AudioMessageEvent,
5
- CarouselMessageEvent,
6
- CustomMessageEvent,
7
- DocumentMessageEvent,
8
- ImageMessageEvent,
9
- LocationMessageEvent,
10
- PostbackMessageEvent,
11
- TextMessageEvent,
12
- VideoMessageEvent,
13
- } from './message'
14
-
15
- export type BotonicEvent =
16
- | TextMessageEvent
17
- | PostbackMessageEvent
18
- | AudioMessageEvent
19
- | DocumentMessageEvent
20
- | ImageMessageEvent
21
- | VideoMessageEvent
22
- | LocationMessageEvent
23
- | CarouselMessageEvent
24
- | CustomMessageEvent
25
- | ConnectionEvent
26
- | IntegrationEvent
@@ -1,11 +0,0 @@
1
- import { BaseEvent, EventTypes } from '../base-event'
2
-
3
- export enum ConnectionEventStatuses {
4
- CONNECTED = 'connected',
5
- DISCONNECTED = 'disconnected',
6
- }
7
-
8
- export interface ConnectionEvent extends BaseEvent {
9
- eventType: EventTypes.CONNECTION
10
- status: ConnectionEventStatuses
11
- }
@@ -1 +0,0 @@
1
- export * from './connection-event'
@@ -1,4 +0,0 @@
1
- export * from './base-event'
2
- export * from './botonic-event'
3
- export * from './connection'
4
- export * from './message'
@@ -1 +0,0 @@
1
- export * from './integration-event'
@@ -1,13 +0,0 @@
1
- import { BaseEvent, EventTypes } from '../base-event'
2
-
3
- export type IntegrationEventType =
4
- | EventTypes.NEW_USER
5
- | EventTypes.RECEIVED_MESSAGE
6
- | EventTypes.BOT_EXECUTED
7
- | EventTypes.BOT_ACTION
8
- | EventTypes.ACTION_SENT
9
-
10
- export interface IntegrationEvent extends BaseEvent {
11
- eventType: IntegrationEventType
12
- details: any
13
- }
@@ -1,23 +0,0 @@
1
- export interface BaseButton {
2
- title: string
3
- }
4
-
5
- export interface WebviewButton extends BaseButton {
6
- webview: any
7
- params?: any
8
- }
9
-
10
- export interface UrlButton extends BaseButton {
11
- url: string
12
- target?: string
13
- }
14
-
15
- export interface PayloadButton extends BaseButton {
16
- payload: string
17
- }
18
-
19
- export type Button = PayloadButton | UrlButton | WebviewButton
20
-
21
- export interface WithButtons {
22
- buttons?: Button[]
23
- }