@botonic/core 0.19.0 → 0.20.2-alpha.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 (368) hide show
  1. package/lib/cjs/constants.d.ts +4 -0
  2. package/lib/cjs/constants.js +8 -0
  3. package/lib/cjs/constants.js.map +1 -0
  4. package/lib/cjs/core-bot.d.ts +36 -0
  5. package/lib/cjs/core-bot.js +115 -0
  6. package/lib/cjs/core-bot.js.map +1 -0
  7. package/lib/cjs/data-provider/dynamodb-data-provider.d.ts +26 -0
  8. package/lib/cjs/data-provider/dynamodb-data-provider.js +81 -0
  9. package/lib/cjs/data-provider/dynamodb-data-provider.js.map +1 -0
  10. package/lib/cjs/data-provider/dynamodb-utils.d.ts +11 -0
  11. package/lib/cjs/data-provider/dynamodb-utils.js +120 -0
  12. package/lib/cjs/data-provider/dynamodb-utils.js.map +1 -0
  13. package/lib/cjs/data-provider/factory.d.ts +25 -0
  14. package/lib/cjs/data-provider/factory.js +31 -0
  15. package/lib/cjs/data-provider/factory.js.map +1 -0
  16. package/lib/cjs/data-provider/index.d.ts +4 -0
  17. package/lib/cjs/data-provider/index.js +8 -0
  18. package/lib/cjs/data-provider/index.js.map +1 -0
  19. package/lib/cjs/data-provider/local-data-provider.d.ts +26 -0
  20. package/lib/cjs/data-provider/local-data-provider.js +137 -0
  21. package/lib/cjs/data-provider/local-data-provider.js.map +1 -0
  22. package/lib/cjs/debug/index.d.ts +1 -0
  23. package/lib/cjs/debug/index.js +5 -0
  24. package/lib/cjs/debug/index.js.map +1 -0
  25. package/lib/cjs/debug/inspector.d.ts +24 -0
  26. package/lib/{debug → cjs/debug}/inspector.js +5 -3
  27. package/lib/cjs/debug/inspector.js.map +1 -0
  28. package/lib/cjs/handoff.d.ts +67 -0
  29. package/lib/{handoff.js → cjs/handoff.js} +2 -1
  30. package/lib/cjs/handoff.js.map +1 -0
  31. package/lib/cjs/hubtype-service.d.ts +69 -0
  32. package/lib/{hubtype-service.js → cjs/hubtype-service.js} +25 -12
  33. package/lib/cjs/hubtype-service.js.map +1 -0
  34. package/lib/cjs/i18n.d.ts +2 -0
  35. package/lib/{i18n.js → cjs/i18n.js} +0 -1
  36. package/lib/cjs/i18n.js.map +1 -0
  37. package/lib/cjs/index.d.ts +11 -0
  38. package/lib/cjs/index.js +17 -0
  39. package/lib/cjs/index.js.map +1 -0
  40. package/lib/cjs/models/events/base-event.d.ts +13 -0
  41. package/lib/{models/events/index.js → cjs/models/events/base-event.js} +1 -1
  42. package/lib/cjs/models/events/base-event.js.map +1 -0
  43. package/lib/cjs/models/events/botonic-event.d.ts +3 -0
  44. package/lib/cjs/models/events/botonic-event.js +3 -0
  45. package/lib/cjs/models/events/botonic-event.js.map +1 -0
  46. package/lib/{models/events/connections/index.d.ts → cjs/models/events/connections/connection-event.d.ts} +1 -1
  47. package/lib/{models/events/connections/index.js → cjs/models/events/connections/connection-event.js} +1 -1
  48. package/lib/cjs/models/events/connections/connection-event.js.map +1 -0
  49. package/lib/cjs/models/events/connections/index.d.ts +1 -0
  50. package/lib/cjs/models/events/connections/index.js +5 -0
  51. package/lib/cjs/models/events/connections/index.js.map +1 -0
  52. package/lib/cjs/models/events/index.d.ts +4 -0
  53. package/lib/cjs/models/events/index.js +8 -0
  54. package/lib/cjs/models/events/index.js.map +1 -0
  55. package/lib/{models → cjs/models}/events/message/buttons.d.ts +0 -0
  56. package/lib/{models → cjs/models}/events/message/buttons.js +0 -0
  57. package/lib/cjs/models/events/message/buttons.js.map +1 -0
  58. package/lib/{models → cjs/models}/events/message/carousel.d.ts +1 -1
  59. package/lib/{models → cjs/models}/events/message/carousel.js +0 -0
  60. package/lib/cjs/models/events/message/carousel.js.map +1 -0
  61. package/lib/{models → cjs/models}/events/message/custom.d.ts +2 -2
  62. package/lib/{models → cjs/models}/events/message/custom.js +0 -0
  63. package/lib/cjs/models/events/message/custom.js.map +1 -0
  64. package/lib/cjs/models/events/message/index.d.ts +9 -0
  65. package/lib/cjs/models/events/message/index.js +13 -0
  66. package/lib/cjs/models/events/message/index.js.map +1 -0
  67. package/lib/{models → cjs/models}/events/message/location.d.ts +1 -1
  68. package/lib/{models → cjs/models}/events/message/location.js +0 -0
  69. package/lib/cjs/models/events/message/location.js.map +1 -0
  70. package/lib/{models → cjs/models}/events/message/media.d.ts +1 -1
  71. package/lib/cjs/models/events/message/media.js +11 -0
  72. package/lib/cjs/models/events/message/media.js.map +1 -0
  73. package/lib/{models/events/message/index.d.ts → cjs/models/events/message/message-event.d.ts} +1 -1
  74. package/lib/{models/events/message/index.js → cjs/models/events/message/message-event.js} +1 -1
  75. package/lib/cjs/models/events/message/message-event.js.map +1 -0
  76. package/lib/{models → cjs/models}/events/message/postback.d.ts +1 -1
  77. package/lib/{models → cjs/models}/events/message/postback.js +0 -0
  78. package/lib/cjs/models/events/message/postback.js.map +1 -0
  79. package/lib/{models → cjs/models}/events/message/replies.d.ts +0 -0
  80. package/lib/{models → cjs/models}/events/message/replies.js +0 -0
  81. package/lib/cjs/models/events/message/replies.js.map +1 -0
  82. package/lib/{models → cjs/models}/events/message/text.d.ts +1 -1
  83. package/lib/{models → cjs/models}/events/message/text.js +0 -0
  84. package/lib/cjs/models/events/message/text.js.map +1 -0
  85. package/lib/cjs/models/index.d.ts +3 -0
  86. package/lib/cjs/models/index.js +7 -0
  87. package/lib/cjs/models/index.js.map +1 -0
  88. package/lib/cjs/models/legacy-types.d.ts +207 -0
  89. package/lib/cjs/models/legacy-types.js +60 -0
  90. package/lib/cjs/models/legacy-types.js.map +1 -0
  91. package/lib/{models → cjs/models}/user.d.ts +1 -1
  92. package/lib/{models → cjs/models}/user.js +0 -0
  93. package/lib/{models → cjs/models}/user.js.map +1 -1
  94. package/lib/{output-parser/index.d.ts → cjs/output-parser/botonic-output-parser.d.ts} +1 -1
  95. package/lib/{output-parser/index.js → cjs/output-parser/botonic-output-parser.js} +2 -1
  96. package/lib/cjs/output-parser/botonic-output-parser.js.map +1 -0
  97. package/lib/{output-parser → cjs/output-parser}/factory.d.ts +1 -1
  98. package/lib/{output-parser → cjs/output-parser}/factory.js +7 -8
  99. package/lib/cjs/output-parser/factory.js.map +1 -0
  100. package/lib/cjs/output-parser/index.d.ts +3 -0
  101. package/lib/cjs/output-parser/index.js +7 -0
  102. package/lib/cjs/output-parser/index.js.map +1 -0
  103. package/lib/{output-parser → cjs/output-parser}/parsers.d.ts +3 -9
  104. package/lib/{output-parser → cjs/output-parser}/parsers.js +21 -12
  105. package/lib/cjs/output-parser/parsers.js.map +1 -0
  106. package/lib/cjs/plugins.d.ts +7 -0
  107. package/lib/{plugins.js → cjs/plugins.js} +8 -5
  108. package/lib/cjs/plugins.js.map +1 -0
  109. package/lib/cjs/pusher-utils.d.ts +7 -0
  110. package/lib/cjs/pusher-utils.js +20 -0
  111. package/lib/cjs/pusher-utils.js.map +1 -0
  112. package/lib/cjs/routing/index.d.ts +2 -0
  113. package/lib/cjs/routing/index.js +6 -0
  114. package/lib/cjs/routing/index.js.map +1 -0
  115. package/lib/cjs/routing/router-utils.d.ts +11 -0
  116. package/lib/cjs/routing/router-utils.js +89 -0
  117. package/lib/cjs/routing/router-utils.js.map +1 -0
  118. package/lib/cjs/routing/router.d.ts +54 -0
  119. package/lib/cjs/routing/router.js +315 -0
  120. package/lib/cjs/routing/router.js.map +1 -0
  121. package/lib/cjs/utils.d.ts +11 -0
  122. package/lib/{utils.js → cjs/utils.js} +14 -5
  123. package/lib/cjs/utils.js.map +1 -0
  124. package/lib/esm/constants.d.ts +4 -0
  125. package/lib/esm/constants.js +5 -0
  126. package/lib/esm/constants.js.map +1 -0
  127. package/lib/esm/core-bot.d.ts +36 -0
  128. package/lib/esm/core-bot.js +111 -0
  129. package/lib/esm/core-bot.js.map +1 -0
  130. package/lib/esm/data-provider/dynamodb-data-provider.d.ts +26 -0
  131. package/lib/esm/data-provider/dynamodb-data-provider.js +77 -0
  132. package/lib/esm/data-provider/dynamodb-data-provider.js.map +1 -0
  133. package/lib/esm/data-provider/dynamodb-utils.d.ts +11 -0
  134. package/lib/esm/data-provider/dynamodb-utils.js +113 -0
  135. package/lib/esm/data-provider/dynamodb-utils.js.map +1 -0
  136. package/lib/esm/data-provider/factory.d.ts +25 -0
  137. package/lib/esm/data-provider/factory.js +27 -0
  138. package/lib/esm/data-provider/factory.js.map +1 -0
  139. package/lib/esm/data-provider/index.d.ts +4 -0
  140. package/lib/esm/data-provider/index.js +5 -0
  141. package/lib/esm/data-provider/index.js.map +1 -0
  142. package/lib/esm/data-provider/local-data-provider.d.ts +26 -0
  143. package/lib/esm/data-provider/local-data-provider.js +133 -0
  144. package/lib/esm/data-provider/local-data-provider.js.map +1 -0
  145. package/lib/esm/debug/index.d.ts +1 -0
  146. package/lib/esm/debug/index.js +2 -0
  147. package/lib/esm/debug/index.js.map +1 -0
  148. package/lib/esm/debug/inspector.d.ts +24 -0
  149. package/lib/esm/debug/inspector.js +65 -0
  150. package/lib/esm/debug/inspector.js.map +1 -0
  151. package/lib/esm/handoff.d.ts +67 -0
  152. package/lib/esm/handoff.js +171 -0
  153. package/lib/esm/handoff.js.map +1 -0
  154. package/lib/esm/hubtype-service.d.ts +69 -0
  155. package/lib/esm/hubtype-service.js +195 -0
  156. package/lib/esm/hubtype-service.js.map +1 -0
  157. package/lib/esm/i18n.d.ts +2 -0
  158. package/lib/esm/i18n.js +7 -0
  159. package/lib/esm/i18n.js.map +1 -0
  160. package/lib/esm/index.d.ts +11 -0
  161. package/lib/esm/index.js +14 -0
  162. package/lib/esm/index.js.map +1 -0
  163. package/lib/esm/models/events/base-event.d.ts +13 -0
  164. package/lib/esm/models/events/base-event.js +8 -0
  165. package/lib/esm/models/events/base-event.js.map +1 -0
  166. package/lib/esm/models/events/botonic-event.d.ts +3 -0
  167. package/lib/esm/models/events/botonic-event.js +2 -0
  168. package/lib/esm/models/events/botonic-event.js.map +1 -0
  169. package/lib/esm/models/events/connections/connection-event.d.ts +9 -0
  170. package/lib/esm/models/events/connections/connection-event.js +6 -0
  171. package/lib/esm/models/events/connections/connection-event.js.map +1 -0
  172. package/lib/esm/models/events/connections/index.d.ts +1 -0
  173. package/lib/esm/models/events/connections/index.js +2 -0
  174. package/lib/esm/models/events/connections/index.js.map +1 -0
  175. package/lib/esm/models/events/index.d.ts +4 -0
  176. package/lib/esm/models/events/index.js +5 -0
  177. package/lib/esm/models/events/index.js.map +1 -0
  178. package/lib/esm/models/events/message/buttons.d.ts +18 -0
  179. package/lib/esm/models/events/message/buttons.js +2 -0
  180. package/lib/esm/models/events/message/buttons.js.map +1 -0
  181. package/lib/esm/models/events/message/carousel.d.ts +11 -0
  182. package/lib/esm/models/events/message/carousel.js +2 -0
  183. package/lib/esm/models/events/message/carousel.js.map +1 -0
  184. package/lib/esm/models/events/message/custom.d.ts +6 -0
  185. package/lib/esm/models/events/message/custom.js +2 -0
  186. package/lib/esm/models/events/message/custom.js.map +1 -0
  187. package/lib/esm/models/events/message/index.d.ts +9 -0
  188. package/lib/esm/models/events/message/index.js +10 -0
  189. package/lib/esm/models/events/message/index.js.map +1 -0
  190. package/lib/esm/models/events/message/location.d.ts +6 -0
  191. package/lib/esm/models/events/message/location.js +2 -0
  192. package/lib/esm/models/events/message/location.js.map +1 -0
  193. package/lib/esm/models/events/message/media.d.ts +18 -0
  194. package/lib/esm/models/events/message/media.js +8 -0
  195. package/lib/esm/models/events/message/media.js.map +1 -0
  196. package/lib/esm/models/events/message/message-event.d.ts +30 -0
  197. package/lib/esm/models/events/message/message-event.js +29 -0
  198. package/lib/esm/models/events/message/message-event.js.map +1 -0
  199. package/lib/esm/models/events/message/postback.d.ts +4 -0
  200. package/lib/esm/models/events/message/postback.js +2 -0
  201. package/lib/esm/models/events/message/postback.js.map +1 -0
  202. package/lib/esm/models/events/message/replies.d.ts +7 -0
  203. package/lib/esm/models/events/message/replies.js +2 -0
  204. package/lib/esm/models/events/message/replies.js.map +1 -0
  205. package/lib/esm/models/events/message/text.d.ts +8 -0
  206. package/lib/esm/models/events/message/text.js +2 -0
  207. package/lib/esm/models/events/message/text.js.map +1 -0
  208. package/lib/esm/models/index.d.ts +3 -0
  209. package/lib/esm/models/index.js +4 -0
  210. package/lib/esm/models/index.js.map +1 -0
  211. package/lib/esm/models/legacy-types.d.ts +207 -0
  212. package/lib/esm/models/legacy-types.js +57 -0
  213. package/lib/esm/models/legacy-types.js.map +1 -0
  214. package/lib/esm/models/user.d.ts +10 -0
  215. package/lib/esm/models/user.js +2 -0
  216. package/lib/esm/models/user.js.map +1 -0
  217. package/lib/esm/output-parser/botonic-output-parser.d.ts +16 -0
  218. package/lib/esm/output-parser/botonic-output-parser.js +33 -0
  219. package/lib/esm/output-parser/botonic-output-parser.js.map +1 -0
  220. package/lib/esm/output-parser/factory.d.ts +4 -0
  221. package/lib/esm/output-parser/factory.js +28 -0
  222. package/lib/esm/output-parser/factory.js.map +1 -0
  223. package/lib/esm/output-parser/index.d.ts +3 -0
  224. package/lib/esm/output-parser/index.js +4 -0
  225. package/lib/esm/output-parser/index.js.map +1 -0
  226. package/lib/esm/output-parser/parsers.d.ts +22 -0
  227. package/lib/esm/output-parser/parsers.js +130 -0
  228. package/lib/esm/output-parser/parsers.js.map +1 -0
  229. package/lib/esm/plugins.d.ts +7 -0
  230. package/lib/esm/plugins.js +42 -0
  231. package/lib/esm/plugins.js.map +1 -0
  232. package/lib/esm/pusher-utils.d.ts +7 -0
  233. package/lib/esm/pusher-utils.js +16 -0
  234. package/lib/esm/pusher-utils.js.map +1 -0
  235. package/lib/esm/routing/index.d.ts +2 -0
  236. package/lib/esm/routing/index.js +3 -0
  237. package/lib/esm/routing/index.js.map +1 -0
  238. package/lib/esm/routing/router-utils.d.ts +11 -0
  239. package/lib/esm/routing/router-utils.js +79 -0
  240. package/lib/esm/routing/router-utils.js.map +1 -0
  241. package/lib/esm/routing/router.d.ts +54 -0
  242. package/lib/esm/routing/router.js +311 -0
  243. package/lib/esm/routing/router.js.map +1 -0
  244. package/lib/esm/utils.d.ts +11 -0
  245. package/lib/esm/utils.js +78 -0
  246. package/lib/esm/utils.js.map +1 -0
  247. package/package.json +22 -9
  248. package/src/constants.ts +6 -0
  249. package/src/core-bot.ts +213 -0
  250. package/src/data-provider/dynamodb-data-provider.ts +103 -0
  251. package/src/data-provider/dynamodb-utils.ts +149 -0
  252. package/src/data-provider/factory.ts +60 -0
  253. package/src/data-provider/index.ts +4 -0
  254. package/src/data-provider/local-data-provider.ts +154 -0
  255. package/src/{types/debug/index.d.ts → debug/index.ts} +0 -0
  256. package/src/debug/{inspector.js → inspector.ts} +39 -14
  257. package/src/{handoff.js → handoff.ts} +88 -24
  258. package/src/{hubtype-service.js → hubtype-service.ts} +85 -34
  259. package/src/{i18n.js → i18n.ts} +7 -1
  260. package/src/index.ts +13 -0
  261. package/src/models/events/base-event.ts +14 -0
  262. package/src/models/events/botonic-event.ts +24 -0
  263. package/src/models/events/connections/connection-event.ts +11 -0
  264. package/src/models/events/connections/index.ts +1 -11
  265. package/src/models/events/index.ts +4 -39
  266. package/src/models/events/message/carousel.ts +1 -1
  267. package/src/models/events/message/custom.ts +2 -2
  268. package/src/models/events/message/index.ts +9 -37
  269. package/src/models/events/message/location.ts +1 -1
  270. package/src/models/events/message/media.ts +1 -1
  271. package/src/models/events/message/message-event.ts +37 -0
  272. package/src/models/events/message/postback.ts +1 -1
  273. package/src/models/events/message/text.ts +1 -1
  274. package/src/models/index.ts +3 -0
  275. package/src/{types/index.d.ts → models/legacy-types.ts} +141 -80
  276. package/src/models/user.ts +2 -1
  277. package/src/output-parser/botonic-output-parser.ts +38 -0
  278. package/src/output-parser/factory.ts +1 -3
  279. package/src/output-parser/index.ts +3 -37
  280. package/src/output-parser/parsers.ts +27 -17
  281. package/src/{plugins.js → plugins.ts} +21 -12
  282. package/src/pusher-utils.ts +16 -0
  283. package/src/routing/index.ts +2 -0
  284. package/src/routing/router-utils.ts +100 -0
  285. package/src/routing/router.ts +409 -0
  286. package/src/{utils.js → utils.ts} +26 -13
  287. package/index.d.ts +0 -1
  288. package/lib/constants.d.ts +0 -15
  289. package/lib/constants.js +0 -19
  290. package/lib/constants.js.map +0 -1
  291. package/lib/core-bot.d.ts +0 -40
  292. package/lib/core-bot.js +0 -78
  293. package/lib/core-bot.js.map +0 -1
  294. package/lib/debug/index.d.ts +0 -1
  295. package/lib/debug/index.js +0 -9
  296. package/lib/debug/index.js.map +0 -1
  297. package/lib/debug/inspector.d.ts +0 -20
  298. package/lib/debug/inspector.js.map +0 -1
  299. package/lib/debug/inspector.test.d.ts +0 -1
  300. package/lib/debug/inspector.test.js +0 -8
  301. package/lib/debug/inspector.test.js.map +0 -1
  302. package/lib/errors.d.ts +0 -4
  303. package/lib/errors.js +0 -11
  304. package/lib/errors.js.map +0 -1
  305. package/lib/handoff.d.ts +0 -34
  306. package/lib/handoff.js.map +0 -1
  307. package/lib/handoff.test.d.ts +0 -1
  308. package/lib/handoff.test.js +0 -62
  309. package/lib/handoff.test.js.map +0 -1
  310. package/lib/hubtype-service.d.ts +0 -58
  311. package/lib/hubtype-service.js.map +0 -1
  312. package/lib/hubtype-service.test.d.ts +0 -1
  313. package/lib/hubtype-service.test.js +0 -21
  314. package/lib/hubtype-service.test.js.map +0 -1
  315. package/lib/i18n.d.ts +0 -1
  316. package/lib/i18n.js.map +0 -1
  317. package/lib/index.d.ts +0 -48
  318. package/lib/index.js +0 -58
  319. package/lib/index.js.map +0 -1
  320. package/lib/models/events/connections/index.js.map +0 -1
  321. package/lib/models/events/index.d.ts +0 -21
  322. package/lib/models/events/index.js.map +0 -1
  323. package/lib/models/events/message/buttons.js.map +0 -1
  324. package/lib/models/events/message/carousel.js.map +0 -1
  325. package/lib/models/events/message/custom.js.map +0 -1
  326. package/lib/models/events/message/index.js.map +0 -1
  327. package/lib/models/events/message/location.js.map +0 -1
  328. package/lib/models/events/message/media.js +0 -11
  329. package/lib/models/events/message/media.js.map +0 -1
  330. package/lib/models/events/message/postback.js.map +0 -1
  331. package/lib/models/events/message/replies.js.map +0 -1
  332. package/lib/models/events/message/text.js.map +0 -1
  333. package/lib/output-parser/factory.js.map +0 -1
  334. package/lib/output-parser/index.js.map +0 -1
  335. package/lib/output-parser/parsers.js.map +0 -1
  336. package/lib/output-parser/util.d.ts +0 -2
  337. package/lib/output-parser/util.js +0 -14
  338. package/lib/output-parser/util.js.map +0 -1
  339. package/lib/plugins.d.ts +0 -2
  340. package/lib/plugins.js.map +0 -1
  341. package/lib/router.d.ts +0 -55
  342. package/lib/router.js +0 -268
  343. package/lib/router.js.map +0 -1
  344. package/lib/router.test.d.ts +0 -1
  345. package/lib/router.test.js +0 -271
  346. package/lib/router.test.js.map +0 -1
  347. package/lib/utils.d.ts +0 -8
  348. package/lib/utils.js.map +0 -1
  349. package/src/constants.js +0 -15
  350. package/src/core-bot.js +0 -108
  351. package/src/debug/index.js +0 -6
  352. package/src/debug/inspector.test.js +0 -6
  353. package/src/errors.js +0 -8
  354. package/src/handoff.test.js +0 -61
  355. package/src/hubtype-service.test.js +0 -23
  356. package/src/index.js +0 -52
  357. package/src/output-parser/util.ts +0 -8
  358. package/src/router.js +0 -273
  359. package/src/router.test.js +0 -345
  360. package/src/types/constants.d.ts +0 -14
  361. package/src/types/core-bot.d.ts +0 -46
  362. package/src/types/debug/inspector.d.ts +0 -33
  363. package/src/types/handoff.d.ts +0 -84
  364. package/src/types/hubtype-service.d.ts +0 -52
  365. package/src/types/i18n.d.ts +0 -8
  366. package/src/types/plugins.d.ts +0 -13
  367. package/src/types/router.d.ts +0 -57
  368. package/src/types/utils.d.ts +0 -12
@@ -0,0 +1,213 @@
1
+ import { ulid } from 'ulid'
2
+
3
+ import { Inspector } from './debug'
4
+ import { getString } from './i18n'
5
+ import {
6
+ BotonicEvent,
7
+ BotRequest,
8
+ BotResponse,
9
+ Locales,
10
+ MessageEventAck,
11
+ MessageEventFrom,
12
+ Route,
13
+ Routes,
14
+ Session,
15
+ } from './models'
16
+ import { BotonicOutputParser } from './output-parser'
17
+ import { loadPlugins, runPlugins } from './plugins'
18
+ import { getComputedRoutes, Router } from './routing'
19
+
20
+ interface CoreBotConfig {
21
+ appId?: string
22
+ defaultDelay?: number
23
+ defaultRoutes?: Route[]
24
+ defaultTyping?: number
25
+ inspector?: Inspector
26
+ locales: Locales
27
+ plugins?: any
28
+ renderer: any
29
+ routes: Routes
30
+ theme?: any
31
+ }
32
+ export class CoreBot {
33
+ appId?: string
34
+ defaultDelay?: number
35
+ defaultRoutes: Route[]
36
+ defaultTyping?: number
37
+ inspector: Inspector
38
+ locales: Locales
39
+ plugins?: Record<string, Plugin>
40
+ renderer: any
41
+ rootElement: any
42
+ router: Router | null
43
+ routes: Routes
44
+ theme?: any
45
+ botonicOutputParser = new BotonicOutputParser()
46
+
47
+ constructor({
48
+ // TODO: Receives dataProvider
49
+ renderer,
50
+ routes,
51
+ locales,
52
+ theme,
53
+ plugins,
54
+ appId,
55
+ defaultTyping,
56
+ defaultDelay,
57
+ defaultRoutes,
58
+ inspector,
59
+ }: CoreBotConfig) {
60
+ this.renderer = renderer
61
+ this.plugins = loadPlugins(plugins)
62
+ this.theme = theme || {}
63
+ this.defaultTyping =
64
+ typeof defaultTyping !== 'undefined' ? defaultTyping : 0.6
65
+ this.defaultDelay = typeof defaultDelay !== 'undefined' ? defaultDelay : 0.4
66
+ this.locales = locales
67
+ if (appId) {
68
+ this.appId = appId
69
+ return
70
+ }
71
+ this.rootElement = null
72
+ this.inspector = inspector || new Inspector()
73
+ this.routes = routes
74
+ this.defaultRoutes = defaultRoutes || []
75
+ this.router =
76
+ this.routes instanceof Function
77
+ ? null
78
+ : new Router(
79
+ [...this.routes, ...this.defaultRoutes],
80
+ this.inspector.routeInspector
81
+ )
82
+ }
83
+
84
+ getString(id: string, session: Session): string {
85
+ // @ts-ignore
86
+ return getString(this.locales, session.__locale, id)
87
+ }
88
+
89
+ setLocale(locale: string, session: Session): void {
90
+ session.__locale = locale
91
+ }
92
+
93
+ async input({
94
+ input,
95
+ session,
96
+ lastRoutePath,
97
+ dataProvider,
98
+ }: BotRequest): Promise<BotResponse> {
99
+ session = session || {}
100
+ if (!session.__locale) session.__locale = 'en'
101
+
102
+ const parsedUserEvent = this.botonicOutputParser.parseFromUserInput(input)
103
+ const userId = session.user.id
104
+ if (dataProvider) {
105
+ // TODO: Next iterations. Review cycle of commited events to DB when messages change their ACK
106
+ // @ts-ignore
107
+ const userEvent = await dataProvider.saveEvent({
108
+ ...parsedUserEvent,
109
+ userId,
110
+ eventId: ulid(),
111
+ createdAt: new Date().toISOString(),
112
+ from: MessageEventFrom.USER,
113
+ ack: MessageEventAck.RECEIVED,
114
+ })
115
+ }
116
+
117
+ if (this.plugins) {
118
+ await runPlugins(
119
+ this.plugins,
120
+ 'pre',
121
+ input,
122
+ session,
123
+ lastRoutePath,
124
+ undefined,
125
+ undefined,
126
+ dataProvider
127
+ )
128
+ }
129
+
130
+ if (this.routes instanceof Function) {
131
+ this.router = new Router(
132
+ [
133
+ ...(await getComputedRoutes(this.routes, {
134
+ input,
135
+ session,
136
+ lastRoutePath,
137
+ })),
138
+ ...this.defaultRoutes,
139
+ ],
140
+ this.inspector.routeInspector
141
+ )
142
+ }
143
+
144
+ const output = (this.router as Router).processInput(
145
+ input,
146
+ session,
147
+ lastRoutePath
148
+ )
149
+ const request = {
150
+ getString: stringId => this.getString(stringId, session),
151
+ setLocale: locale => this.setLocale(locale, session),
152
+ session: session || {},
153
+ params: output.params || {},
154
+ input: input,
155
+ plugins: this.plugins,
156
+ defaultTyping: this.defaultTyping,
157
+ defaultDelay: this.defaultDelay,
158
+ lastRoutePath,
159
+ dataProvider,
160
+ }
161
+
162
+ const response = await this.renderer({
163
+ request,
164
+ actions: [output.fallbackAction, output.action, output.emptyAction],
165
+ })
166
+ let messageEvents: Partial<BotonicEvent>[] = []
167
+ try {
168
+ messageEvents = this.botonicOutputParser.xmlToMessageEvents(response)
169
+ } catch (e) {
170
+ // Disabling Botonic 1.0 error log for LTS version:
171
+ // console.error(e)
172
+ }
173
+
174
+ lastRoutePath = output.lastRoutePath
175
+ if (this.plugins) {
176
+ await runPlugins(
177
+ this.plugins,
178
+ 'post',
179
+ input,
180
+ session,
181
+ lastRoutePath,
182
+ response,
183
+ messageEvents,
184
+ dataProvider
185
+ )
186
+ }
187
+
188
+ if (dataProvider) {
189
+ // TODO: save bot responses to db and update user with new session and new params
190
+ for (const messageEvent of messageEvents) {
191
+ // @ts-ignore
192
+ const botEvent = await dataProvider.saveEvent({
193
+ ...messageEvent,
194
+ userId,
195
+ eventId: ulid(),
196
+ createdAt: new Date().toISOString(),
197
+ from: MessageEventFrom.BOT,
198
+ ack: MessageEventAck.SENT,
199
+ })
200
+ }
201
+ }
202
+
203
+ session.is_first_interaction = false
204
+ return {
205
+ input,
206
+ response,
207
+ messageEvents,
208
+ session,
209
+ lastRoutePath,
210
+ dataProvider,
211
+ }
212
+ }
213
+ }
@@ -0,0 +1,103 @@
1
+ import { Entity, Table } from 'dynamodb-toolbox'
2
+
3
+ import { BotonicEvent, EventTypes, User } from '../models'
4
+ import {
5
+ getConnectionEventEntity,
6
+ getMessageEventEntities,
7
+ getUserEntity,
8
+ getUserEventsTable,
9
+ GLOBAL_SECONDARY_INDEX_NAME,
10
+ SORT_KEY_NAME,
11
+ USER_PREFIX,
12
+ } from './dynamodb-utils'
13
+ import { DataProvider } from './factory'
14
+
15
+ export class DynamoDBDataProvider implements DataProvider {
16
+ region: string
17
+ tableName: string
18
+ userEventsTable: Table
19
+ userEntity: Entity<any>
20
+ eventEntity: Entity<any>
21
+ messageEventEntities: Record<string, Entity<any>>
22
+ textMessageEventEntity: Entity<any>
23
+ connectionEventEntity: Entity<any>
24
+ constructor(url: string) {
25
+ try {
26
+ ;[this.tableName, this.region] = url.split('://')[1].split('.')
27
+ this.userEventsTable = getUserEventsTable(this.tableName, this.region)
28
+ this.userEntity = getUserEntity(this.userEventsTable)
29
+ this.connectionEventEntity = getConnectionEventEntity(
30
+ this.userEventsTable
31
+ )
32
+ this.messageEventEntities = getMessageEventEntities(this.userEventsTable)
33
+ } catch (e) {
34
+ console.log({ e })
35
+ }
36
+ }
37
+
38
+ // @ts-ignore
39
+ async getUsers(limit = 10, offset = 0): Promise<User[]> {
40
+ // TODO: finish to implement with offset
41
+ const result = await this.userEventsTable.scan({
42
+ filters: { attr: SORT_KEY_NAME, beginsWith: USER_PREFIX },
43
+ limit,
44
+ })
45
+ return result.Items
46
+ }
47
+
48
+ async getUser(id: string): Promise<User | undefined> {
49
+ const userById = {
50
+ id: id,
51
+ SK: id,
52
+ }
53
+ const result = await this.userEntity.get(userById)
54
+ if (Object.keys(result).length === 0) return undefined
55
+ return result.Item
56
+ }
57
+
58
+ async getUserByWebsocketId(websocketId: string): Promise<User | undefined> {
59
+ const result = await this.userEventsTable.query(websocketId, {
60
+ index: GLOBAL_SECONDARY_INDEX_NAME,
61
+ })
62
+ if (result.Count === 0) return undefined
63
+ return result.Items[0]
64
+ }
65
+ // @ts-ignore
66
+ async getUserByField(field: string, value: any): Promise<User | undefined> {} //TODO: Implement
67
+
68
+ async saveUser(user: User): Promise<User> {
69
+ const putUser = { ...user, id: user.id, userId: user.id }
70
+ await this.userEntity.put(putUser)
71
+ return user
72
+ }
73
+ async updateUser(user: User): Promise<User> {
74
+ const updateUser = { ...user, id: user.id, userId: user.id }
75
+ const res = await this.userEntity.update(updateUser)
76
+ return user
77
+ }
78
+ // @ts-ignore
79
+ async deleteUser(id: string): Promise<User | undefined> {} // TODO: Implement
80
+
81
+ // @ts-ignore
82
+ async getEvents(limit = 10, offset = 0): Promise<BotonicEvent[]> {} // TODO: Implement
83
+
84
+ // @ts-ignore
85
+ async getEvent(id: string): Promise<BotonicEvent | undefined> {} // TODO: Implement
86
+
87
+ async saveEvent(event: BotonicEvent): Promise<BotonicEvent> {
88
+ if (event.eventType === EventTypes.CONNECTION) {
89
+ await this.connectionEventEntity.put(event)
90
+ }
91
+ if (event.eventType === EventTypes.MESSAGE) {
92
+ await this.messageEventEntities[event.type].put(event)
93
+ }
94
+ // TODO: Implementation of other event types
95
+ return event
96
+ }
97
+
98
+ // @ts-ignore
99
+ async updateEvent(event: BotonicEvent): Promise<BotonicEvent> {} // TODO: Implement
100
+
101
+ // @ts-ignore
102
+ async deleteEvent(id: string): Promise<BotonicEvent | undefined> {} // TODO: Implement
103
+ }
@@ -0,0 +1,149 @@
1
+ import { DynamoDB } from 'aws-sdk'
2
+ import { Entity, Table } from 'dynamodb-toolbox'
3
+ import { EntityAttributes } from 'dynamodb-toolbox/dist/classes/Entity'
4
+
5
+ import { MessageEventTypes } from '../models'
6
+
7
+ // Table Definitions
8
+ export const GLOBAL_SECONDARY_INDEX_NAME = 'GSI1'
9
+ export const GLOBAL_SECONDARY_INDEX_ATTR = 'websocketId'
10
+ export const PARTITION_KEY_NAME = 'PK'
11
+ export const SORT_KEY_NAME = 'SK'
12
+
13
+ // Entities Definitions
14
+ export const USER_PREFIX = 'USR#'
15
+ export const EVENT_PREFIX = 'EVT#'
16
+
17
+ function capitalize(string: string) {
18
+ return string.charAt(0).toUpperCase() + string.slice(1)
19
+ }
20
+
21
+ export function getUserEventsTable(tableName: string, region: string): Table {
22
+ const documentClient = new DynamoDB.DocumentClient({
23
+ apiVersion: '2012-08-10',
24
+ region: region,
25
+ })
26
+ return new Table({
27
+ name: tableName,
28
+ partitionKey: PARTITION_KEY_NAME,
29
+ sortKey: SORT_KEY_NAME,
30
+ entityField: true,
31
+ indexes: {
32
+ GSI1: {
33
+ partitionKey: GLOBAL_SECONDARY_INDEX_ATTR,
34
+ },
35
+ },
36
+ DocumentClient: documentClient,
37
+ })
38
+ }
39
+
40
+ export function getUserEntity(table: Table): Entity<any> {
41
+ return new Entity({
42
+ name: 'User',
43
+ attributes: {
44
+ id: { partitionKey: true, prefix: USER_PREFIX },
45
+ [`${SORT_KEY_NAME}`]: {
46
+ hidden: true,
47
+ sortKey: true,
48
+ prefix: USER_PREFIX,
49
+ },
50
+ userId: [SORT_KEY_NAME, 0],
51
+ websocketId: 'string',
52
+ isOnline: 'boolean',
53
+ route: 'string',
54
+ session: 'string',
55
+ },
56
+ table,
57
+ })
58
+ }
59
+
60
+ export function getConnectionEventEntity(table: Table): Entity<any> {
61
+ return new Entity({
62
+ name: 'Connection Event',
63
+ attributes: {
64
+ userId: { partitionKey: true, prefix: USER_PREFIX },
65
+ [`${SORT_KEY_NAME}`]: {
66
+ hidden: true,
67
+ sortKey: true,
68
+ prefix: EVENT_PREFIX,
69
+ },
70
+ eventId: [SORT_KEY_NAME, 0],
71
+ eventType: 'string',
72
+ createdAt: 'string',
73
+ modifiedAt: 'string',
74
+ status: 'string',
75
+ },
76
+ table,
77
+ })
78
+ }
79
+
80
+ export function getMessageEventEntities(
81
+ table: Table
82
+ ): Record<string, Entity<any>> {
83
+ const textAttributes: EntityAttributes = {
84
+ text: 'string',
85
+ markdown: 'boolean',
86
+ buttons: 'list',
87
+ replies: 'list',
88
+ }
89
+
90
+ const mediaAttributes: EntityAttributes = {
91
+ src: 'string',
92
+ buttons: 'list',
93
+ }
94
+
95
+ const locationAttributes: EntityAttributes = {
96
+ lat: 'number',
97
+ long: 'number',
98
+ }
99
+
100
+ const carouselAttributes: EntityAttributes = {
101
+ elements: 'list',
102
+ }
103
+
104
+ const customAttributes: EntityAttributes = {
105
+ json: 'map',
106
+ replies: 'list',
107
+ }
108
+
109
+ const entityWithAttributes = (type: string, attributes: EntityAttributes) =>
110
+ new Entity({
111
+ name: `${capitalize(type)} Message Event`, // Entity Names must be unique
112
+ attributes: {
113
+ userId: { partitionKey: true, prefix: USER_PREFIX },
114
+ [`${SORT_KEY_NAME}`]: {
115
+ hidden: true,
116
+ sortKey: true,
117
+ prefix: EVENT_PREFIX,
118
+ },
119
+ eventId: [SORT_KEY_NAME, 0],
120
+ eventType: 'string',
121
+ createdAt: 'string',
122
+ modifiedAt: 'string',
123
+ from: 'string',
124
+ ack: 'string',
125
+ typing: 'number',
126
+ delay: 'number',
127
+ type: 'string',
128
+ ...attributes,
129
+ },
130
+ table,
131
+ })
132
+
133
+ return {
134
+ text: entityWithAttributes(MessageEventTypes.TEXT, textAttributes),
135
+ audio: entityWithAttributes(MessageEventTypes.AUDIO, mediaAttributes),
136
+ image: entityWithAttributes(MessageEventTypes.IMAGE, mediaAttributes),
137
+ document: entityWithAttributes(MessageEventTypes.DOCUMENT, mediaAttributes),
138
+ video: entityWithAttributes(MessageEventTypes.VIDEO, mediaAttributes),
139
+ location: entityWithAttributes(
140
+ MessageEventTypes.LOCATION,
141
+ locationAttributes
142
+ ),
143
+ carousel: entityWithAttributes(
144
+ MessageEventTypes.CAROUSEL,
145
+ carouselAttributes
146
+ ),
147
+ custom: entityWithAttributes(MessageEventTypes.CUSTOM, customAttributes),
148
+ }
149
+ }
@@ -0,0 +1,60 @@
1
+ import { BotonicEvent, User } from '../models'
2
+ import { DynamoDBDataProvider } from './dynamodb-data-provider'
3
+ import { LocalDevDataProvider } from './local-data-provider'
4
+
5
+ export const dataProviderProtocols = {
6
+ DYNAMO_DB: 'dynamodb',
7
+ FILE: 'file',
8
+ }
9
+
10
+ export interface DataProvider {
11
+ getUsers(limit?: number, offset?: number): User[] | Promise<User[]>
12
+ getUser(id: string): User | Promise<User | undefined> | undefined
13
+ //TODO: replace getUserByWebsocketId to getUserByField?
14
+ getUserByWebsocketId(
15
+ websocketId: string
16
+ ): User | Promise<User | undefined> | undefined
17
+ getUserByField(
18
+ field: string,
19
+ value: any
20
+ ): User | Promise<User | undefined> | undefined
21
+ saveUser(user: User): User | Promise<User>
22
+ updateUser(user: User): User | Promise<User>
23
+ deleteUser(id: string): User | Promise<User | undefined> | undefined
24
+ getEvents(
25
+ limit?: number,
26
+ offset?: number
27
+ ): BotonicEvent[] | Promise<BotonicEvent[]>
28
+ getEvent(
29
+ id: string
30
+ ): BotonicEvent | Promise<BotonicEvent | undefined> | undefined
31
+ saveEvent(event: BotonicEvent): BotonicEvent | Promise<BotonicEvent>
32
+ updateEvent(event: BotonicEvent): BotonicEvent | Promise<BotonicEvent>
33
+ deleteEvent(
34
+ id: string
35
+ ): BotonicEvent | Promise<BotonicEvent | undefined> | undefined
36
+ }
37
+
38
+ /** URL examples:
39
+ * dynamodb://my-table.my-region.aws.com
40
+ * postgresql://my-database.my-db-provider.com
41
+ * file://path/to/local/db.json
42
+ */
43
+ export function dataProviderFactory(url?: string): DataProvider {
44
+ if (!url) {
45
+ return new LocalDevDataProvider()
46
+ }
47
+
48
+ const protocol = url.split('://')[0]
49
+ switch (protocol) {
50
+ case dataProviderProtocols.DYNAMO_DB:
51
+ return new DynamoDBDataProvider(url)
52
+ case dataProviderProtocols.FILE:
53
+ return new LocalDevDataProvider(url)
54
+ default:
55
+ console.error(
56
+ `Protocol ${protocol} not implemented, using local DB instead.`
57
+ )
58
+ return new LocalDevDataProvider()
59
+ }
60
+ }
@@ -0,0 +1,4 @@
1
+ export * from './dynamodb-data-provider'
2
+ export * from './dynamodb-utils'
3
+ export * from './factory'
4
+ export * from './local-data-provider'
@@ -0,0 +1,154 @@
1
+ import { JsonDB } from 'node-json-db'
2
+ import { Config } from 'node-json-db/dist/lib/JsonDBConfig'
3
+
4
+ import { BotonicEvent, User } from '../models'
5
+ import { DataProvider } from './factory'
6
+
7
+ export class LocalDevDataProvider implements DataProvider {
8
+ private readonly DB_PATH = 'tmp/localDb'
9
+ private readonly SEPARATOR = '/'
10
+ private readonly paths = {
11
+ USERS: '/users',
12
+ EVENTS: '/events',
13
+ CONNECTIONS: '/connections',
14
+ }
15
+ db: JsonDB
16
+
17
+ constructor(url?: string) {
18
+ const dbPath = url ? url.split('://')[1] : this.DB_PATH
19
+ this.db = new JsonDB(new Config(dbPath, true, false, this.SEPARATOR))
20
+ }
21
+
22
+ getUsers(limit = 10, offset = 0): User[] {
23
+ const path = this.paths.USERS
24
+ this.db.reload()
25
+ const userList = this.db.getObject<Record<string, User>>(path)
26
+ const users = Object.values(userList)
27
+ const to = limit !== 0 ? offset + limit : undefined
28
+ return users.slice(offset, to)
29
+ }
30
+
31
+ getUser(userId: string): User | undefined {
32
+ const path = this.createPath([this.paths.USERS, userId])
33
+ this.db.reload()
34
+ return this.db.exists(path) ? this.db.getObject<User>(path) : undefined
35
+ }
36
+
37
+ getUserByWebsocketId(websocketId: string): User | undefined {
38
+ return this.getUserByField('websocketId', websocketId)
39
+ }
40
+
41
+ getUserByField(field: string, value: any): User | undefined {
42
+ const path = this.paths.USERS
43
+ this.db.reload()
44
+ const dbUser = this.db.exists(path)
45
+ ? this.db.find<User>(path, (user: User) => user[field] === value)
46
+ : undefined
47
+ return dbUser
48
+ }
49
+
50
+ saveUser(user: User): User {
51
+ const path = this.createPath([this.paths.USERS, user.id])
52
+ this.db.reload()
53
+ if (!this.db.exists(path)) {
54
+ this.db.push(path, user)
55
+ }
56
+ return user
57
+ }
58
+
59
+ updateUser(user: User): User {
60
+ const path = this.createPath([this.paths.USERS, user.id])
61
+ this.db.reload()
62
+ if (this.db.exists(path)) {
63
+ this.db.push(path, user, true)
64
+ }
65
+ return user
66
+ }
67
+
68
+ deleteUser(id: string): User | undefined {
69
+ const path = this.createPath([this.paths.USERS, id])
70
+ this.db.reload()
71
+ const user = this.db.exists(path)
72
+ ? this.db.getObject<User>(path)
73
+ : undefined
74
+ if (user) {
75
+ this.db.delete(path)
76
+ return user
77
+ }
78
+ return undefined
79
+ }
80
+
81
+ getEvents(limit = 10, offset = 0): BotonicEvent[] {
82
+ const path = this.paths.EVENTS
83
+ this.db.reload()
84
+ const eventList = this.db.getObject<Record<string, BotonicEvent>>(path)
85
+ const events = Object.values(eventList)
86
+ const to = limit !== 0 ? offset + limit : undefined
87
+ return events.slice(offset, to)
88
+ }
89
+
90
+ getEvent(id: string): BotonicEvent | undefined {
91
+ const path = this.createPath([this.paths.EVENTS, id])
92
+ this.db.reload()
93
+ return this.db.exists(path)
94
+ ? this.db.getObject<BotonicEvent>(path)
95
+ : undefined
96
+ }
97
+
98
+ saveEvent(event: BotonicEvent): BotonicEvent {
99
+ const path = this.createPath([this.paths.EVENTS, event.eventId])
100
+ this.db.reload()
101
+ if (!this.db.exists(path)) {
102
+ this.db.push(path, event)
103
+ }
104
+ return event
105
+ }
106
+
107
+ updateEvent(event: BotonicEvent): BotonicEvent {
108
+ const path = this.createPath([this.paths.EVENTS, event.eventId])
109
+ this.db.reload()
110
+ if (this.db.exists(path)) {
111
+ this.db.push(path, event, true)
112
+ }
113
+ return event
114
+ }
115
+
116
+ deleteEvent(id: string): BotonicEvent | undefined {
117
+ const path = this.createPath([this.paths.EVENTS, id])
118
+ this.db.reload()
119
+ const event = this.db.exists(path)
120
+ ? this.db.getObject<BotonicEvent>(path)
121
+ : undefined
122
+ if (event) {
123
+ this.db.delete(path)
124
+ return event
125
+ }
126
+ return undefined
127
+ }
128
+
129
+ addConnection(websocketId: string) {
130
+ const path = this.createPath([this.paths.CONNECTIONS, websocketId])
131
+ this.db.reload()
132
+ if (!this.db.exists(path)) {
133
+ this.db.push(path, '', false)
134
+ }
135
+ }
136
+
137
+ updateConnection(websocketId: string, userId: string) {
138
+ const path = this.createPath([this.paths.CONNECTIONS, websocketId])
139
+ this.db.reload()
140
+ if (this.db.exists(path)) {
141
+ this.db.push(path, userId, true)
142
+ }
143
+ }
144
+
145
+ deleteConnection(websocketId: string) {
146
+ const path = this.createPath([this.paths.CONNECTIONS, websocketId])
147
+ this.db.reload()
148
+ this.db.delete(path)
149
+ }
150
+
151
+ private createPath(urlChunks: string[]): string {
152
+ return urlChunks.join(this.SEPARATOR)
153
+ }
154
+ }
File without changes