botframework-webchat-core 4.18.1 → 4.19.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 (547) hide show
  1. package/LICENSE +21 -0
  2. package/activity.js +3 -0
  3. package/boot/deprecated/activity.js +7 -0
  4. package/boot/deprecated/activity.mjs +5 -0
  5. package/boot/deprecated/graph.js +7 -0
  6. package/boot/deprecated/graph.mjs +5 -0
  7. package/boot/deprecated/internal.js +7 -0
  8. package/boot/deprecated/internal.mjs +5 -0
  9. package/dist/WebChatActivity-CYqxBG_4.d.mts +271 -0
  10. package/dist/WebChatActivity-CYqxBG_4.d.ts +271 -0
  11. package/dist/_dtsroll-chunks/B7Whm73Q-tagged.d.ts +71 -0
  12. package/dist/_dtsroll-chunks/C-MxR98A-botframework-webchat-core-debug-api.d.ts +135 -0
  13. package/dist/_dtsroll-chunks/CAquHfZK-botframework-webchat-base.utils.d.ts +17 -0
  14. package/dist/_dtsroll-chunks/CDVed0Q--botframework-webchat-core.org-schema.d.ts +601 -0
  15. package/dist/_dtsroll-chunks/vlDgTKWF-botframework-webchat-core-graph.d.ts +239 -0
  16. package/dist/botframework-webchat-core.activity.d.mts +23 -0
  17. package/dist/botframework-webchat-core.activity.d.ts +23 -0
  18. package/dist/botframework-webchat-core.activity.js +2 -0
  19. package/dist/botframework-webchat-core.activity.js.map +1 -0
  20. package/dist/botframework-webchat-core.activity.mjs +2 -0
  21. package/dist/botframework-webchat-core.activity.mjs.map +1 -0
  22. package/dist/botframework-webchat-core.d.mts +267 -662
  23. package/dist/botframework-webchat-core.d.ts +556 -0
  24. package/dist/botframework-webchat-core.graph.d.mts +9 -0
  25. package/dist/botframework-webchat-core.graph.d.ts +9 -0
  26. package/dist/botframework-webchat-core.graph.js +2 -0
  27. package/dist/botframework-webchat-core.graph.js.map +1 -0
  28. package/dist/botframework-webchat-core.graph.mjs +2 -0
  29. package/dist/botframework-webchat-core.graph.mjs.map +1 -0
  30. package/dist/botframework-webchat-core.internal.d.mts +61 -0
  31. package/dist/botframework-webchat-core.internal.d.ts +61 -0
  32. package/dist/botframework-webchat-core.internal.js +2 -0
  33. package/dist/botframework-webchat-core.internal.js.map +1 -0
  34. package/dist/botframework-webchat-core.internal.mjs +2 -0
  35. package/dist/botframework-webchat-core.internal.mjs.map +1 -0
  36. package/dist/botframework-webchat-core.js +2 -0
  37. package/dist/botframework-webchat-core.js.map +1 -0
  38. package/dist/botframework-webchat-core.json-ld.d.mts +2 -0
  39. package/dist/botframework-webchat-core.json-ld.d.ts +2 -0
  40. package/dist/botframework-webchat-core.json-ld.js +2 -0
  41. package/dist/botframework-webchat-core.json-ld.js.map +1 -0
  42. package/dist/botframework-webchat-core.json-ld.mjs +2 -0
  43. package/dist/botframework-webchat-core.json-ld.mjs.map +1 -0
  44. package/dist/botframework-webchat-core.mjs +1 -2
  45. package/dist/botframework-webchat-core.mjs.map +1 -1
  46. package/dist/botframework-webchat-core.org-schema.d.mts +2 -0
  47. package/dist/botframework-webchat-core.org-schema.d.ts +2 -0
  48. package/dist/botframework-webchat-core.org-schema.js +2 -0
  49. package/dist/botframework-webchat-core.org-schema.js.map +1 -0
  50. package/dist/botframework-webchat-core.org-schema.mjs +2 -0
  51. package/dist/botframework-webchat-core.org-schema.mjs.map +1 -0
  52. package/dist/chunk-A4GEFYZJ.mjs +2 -0
  53. package/dist/chunk-A4GEFYZJ.mjs.map +1 -0
  54. package/dist/chunk-HZWWJL43.mjs +2 -0
  55. package/dist/chunk-HZWWJL43.mjs.map +1 -0
  56. package/dist/chunk-ICNZKQJW.mjs +2 -0
  57. package/dist/chunk-ICNZKQJW.mjs.map +1 -0
  58. package/dist/chunk-K6E6QQMQ.js +2 -0
  59. package/dist/chunk-K6E6QQMQ.js.map +1 -0
  60. package/dist/chunk-KPT5FBH2.mjs +2 -0
  61. package/dist/chunk-KPT5FBH2.mjs.map +1 -0
  62. package/dist/chunk-LO5BZSVE.js +2 -0
  63. package/dist/chunk-LO5BZSVE.js.map +1 -0
  64. package/dist/chunk-LP2X2JTR.js +2 -0
  65. package/dist/chunk-LP2X2JTR.js.map +1 -0
  66. package/dist/chunk-RUERYYZO.js +2 -0
  67. package/dist/chunk-RUERYYZO.js.map +1 -0
  68. package/dist/chunk-XOE3AOSM.js +2 -0
  69. package/dist/chunk-XOE3AOSM.js.map +1 -0
  70. package/dist/chunk-Y6ZDNVRT.mjs +2 -0
  71. package/dist/chunk-Y6ZDNVRT.mjs.map +1 -0
  72. package/{lib/createStore.d.ts → dist/createStore-CcvouBrW.d.mts} +29 -7
  73. package/dist/createStore-CcvouBrW.d.ts +65 -0
  74. package/dist/metafile-cjs.json +1 -0
  75. package/dist/metafile-esm.json +1 -1
  76. package/graph.js +3 -0
  77. package/internal.js +3 -0
  78. package/json-ld.js +3 -0
  79. package/org-schema.js +3 -0
  80. package/package.json +147 -73
  81. package/src/__tests__/activityFromBot.spec.js +2 -0
  82. package/src/__tests__/addMetaTag.spec.js +8 -0
  83. package/src/__tests__/addMetaTag.spec.mjs +8 -0
  84. package/src/__tests__/connectSaga.spec.js +2 -0
  85. package/src/__tests__/deleteKey.spec.js +2 -0
  86. package/src/__tests__/detectSlowConnectionSaga.spec.js +3 -1
  87. package/src/__tests__/observeOnce.spec.js +2 -0
  88. package/src/__tests__/speakableActivity.spec.js +2 -0
  89. package/src/__tests__/uniqueID.spec.js +2 -0
  90. package/src/actions/clearSuggestedActions.ts +20 -0
  91. package/src/actions/{connect.js → connect.ts} +9 -1
  92. package/src/actions/muteVoiceRecording.ts +17 -0
  93. package/src/actions/postVoiceActivity.ts +21 -0
  94. package/src/actions/registerActionSink.ts +29 -0
  95. package/src/actions/registerVoiceHandler.ts +24 -0
  96. package/src/actions/{sendEvent.js → sendEvent.ts} +1 -1
  97. package/src/actions/{sendMessageBack.js → sendMessageBack.ts} +1 -1
  98. package/src/actions/{sendPostBack.js → sendPostBack.ts} +1 -1
  99. package/src/actions/{setDictateInterims.js → setDictateInterims.ts} +1 -1
  100. package/src/actions/{setDictateState.js → setDictateState.ts} +1 -1
  101. package/src/actions/{setLanguage.js → setLanguage.ts} +1 -1
  102. package/src/actions/{setSendBox.js → setSendBox.ts} +1 -1
  103. package/src/actions/{setSendTimeout.js → setSendTimeout.ts} +1 -1
  104. package/src/actions/setSendTypingIndicator.ts +1 -1
  105. package/src/actions/setSuggestedActions.ts +35 -0
  106. package/src/actions/setVoiceState.ts +21 -0
  107. package/src/actions/startVoiceRecording.ts +17 -0
  108. package/src/actions/stopVoiceRecording.ts +17 -0
  109. package/src/actions/{submitSendBox.js → submitSendBox.ts} +1 -1
  110. package/src/actions/unmuteVoiceRecording.ts +17 -0
  111. package/src/actions/unregisterActionSink.ts +29 -0
  112. package/src/actions/unregisterVoiceHandler.ts +19 -0
  113. package/src/boot/activity.ts +19 -0
  114. package/src/boot/graph.ts +18 -0
  115. package/src/boot/internal.ts +11 -0
  116. package/src/boot/json-ld.ts +6 -0
  117. package/src/boot/org-schema.ts +29 -0
  118. package/src/buildInfo.ts +9 -0
  119. package/src/constants/{ActivityClientState.js → ActivityClientState.ts} +3 -3
  120. package/src/constants/DictateState.ts +10 -0
  121. package/src/createPromiseQueue.js +8 -6
  122. package/src/createReducer.ts +28 -20
  123. package/src/createSagas.ts +6 -3
  124. package/src/createStore.ts +26 -10
  125. package/src/env.d.ts +12 -0
  126. package/src/graph/createGraphFromStore.ts +121 -0
  127. package/src/index.ts +62 -45
  128. package/src/internal/StoreDebugAPIRegistry.ts +4 -0
  129. package/src/internal/actions/setRawState.ts +48 -0
  130. package/src/internal/types/suggestedActions.ts +11 -0
  131. package/src/internal/types/suggestedActionsOriginActivity.ts +16 -0
  132. package/src/reducers/activities/combineActivitiesReducer.ts +58 -0
  133. package/src/reducers/activities/createGroupedActivitiesReducer.ts +297 -0
  134. package/src/reducers/activities/patchActivity.ts +37 -0
  135. package/src/reducers/activities/sort/deleteActivityByLocalId.activity.spec.ts +144 -0
  136. package/src/reducers/activities/sort/deleteActivityByLocalId.howTo.spec.ts +148 -0
  137. package/src/reducers/activities/sort/deleteActivityByLocalId.howToWithLivestream.spec.ts +248 -0
  138. package/src/reducers/activities/sort/deleteActivityByLocalId.livestream.spec.ts +156 -0
  139. package/src/reducers/activities/sort/deleteActivityByLocalId.ts +177 -0
  140. package/src/reducers/activities/sort/private/computePartListTimestamp.ts +9 -0
  141. package/src/reducers/activities/sort/private/computeSortedActivities.ts +51 -0
  142. package/src/reducers/activities/sort/private/getLogicalTimestamp.spec.ts +49 -0
  143. package/src/reducers/activities/sort/private/getLogicalTimestamp.ts +33 -0
  144. package/src/reducers/activities/sort/private/getPartGroupingMetadataMap.spec.ts +92 -0
  145. package/src/reducers/activities/sort/private/getPartGroupingMetadataMap.ts +37 -0
  146. package/src/reducers/activities/sort/private/insertSorted.spec.ts +106 -0
  147. package/src/reducers/activities/sort/private/insertSorted.ts +18 -0
  148. package/src/reducers/activities/sort/property/LocalId.ts +60 -0
  149. package/src/reducers/activities/sort/property/Position.ts +39 -0
  150. package/src/reducers/activities/sort/property/ReceivedAt.ts +45 -0
  151. package/src/reducers/activities/sort/property/SendStatus.ts +51 -0
  152. package/src/reducers/activities/sort/queryLocalIdByActivityId.ts +6 -0
  153. package/src/reducers/activities/sort/queryLocalIdByClientActivityId.ts +6 -0
  154. package/src/reducers/activities/sort/types.ts +80 -0
  155. package/src/reducers/activities/sort/updateActivityChannelData.ts +101 -0
  156. package/src/reducers/activities/sort/updateSendState.ts +22 -0
  157. package/src/reducers/activities/sort/upsert.activity.spec.ts +500 -0
  158. package/src/reducers/activities/sort/upsert.howTo.spec.ts +368 -0
  159. package/src/reducers/activities/sort/upsert.howToWithLivestream.spec.ts +384 -0
  160. package/src/reducers/activities/sort/upsert.livestream.spec.ts +418 -0
  161. package/src/reducers/activities/sort/upsert.ts +498 -0
  162. package/src/reducers/activities/tsconfig.json +4 -0
  163. package/src/reducers/createNotificationsReducer.ts +4 -4
  164. package/src/reducers/suggestedActions.ts +21 -0
  165. package/src/reducers/suggestedActionsOriginActivity.ts +24 -0
  166. package/src/reducers/voiceActivity.ts +102 -0
  167. package/src/sagas/actionSinkSaga.ts +39 -0
  168. package/src/sagas/observeActivitySaga.ts +51 -1
  169. package/src/sagas/postActivitySaga.ts +17 -10
  170. package/src/sagas/postVoiceActivitySaga.ts +76 -0
  171. package/src/sagas/queueIncomingActivitySaga.ts +10 -4
  172. package/src/sagas/sendMessageToPostActivitySaga.ts +4 -1
  173. package/src/sagas/speakActivityAndStartDictateOnIncomingActivityFromOthersSaga.js +10 -4
  174. package/src/sagas/startDictateOnSpeakCompleteSaga.js +3 -3
  175. package/src/sagas/startSpeakActivityOnPostActivitySaga.js +15 -5
  176. package/src/sagas/stopDictateOnCardActionSaga.js +11 -3
  177. package/src/sagas/stopSpeakingActivityOnInputSaga.js +22 -4
  178. package/src/selectors/combineSelectors.ts +1 -1
  179. package/src/tsconfig.json +3 -15
  180. package/src/types/StoreDebugAPI.ts +25 -0
  181. package/src/types/WebChatActivity.ts +31 -14
  182. package/src/types/external/DirectLineActivity.ts +1 -1
  183. package/src/types/external/Observable.ts +4 -1
  184. package/src/types/internal/GlobalScopeClock.ts +10 -10
  185. package/src/types/internal/ReduxState.ts +2 -0
  186. package/src/types/internal/WebChatOutgoingActivity.ts +1 -1
  187. package/src/utils/dateToLocaleISOString.chatham.spec.js +1 -2
  188. package/src/utils/dateToLocaleISOString.japan.spec.js +1 -2
  189. package/src/utils/dateToLocaleISOString.newfoundland.spec.js +1 -2
  190. package/src/utils/dateToLocaleISOString.pacific.spec.js +1 -2
  191. package/src/utils/dateToLocaleISOString.utc.spec.js +1 -3
  192. package/src/utils/deleteKey.ts +1 -1
  193. package/src/utils/getActivityLivestreamingMetadata.spec.ts +297 -0
  194. package/src/utils/getActivityLivestreamingMetadata.ts +197 -0
  195. package/src/utils/getOrgSchemaMessage.spec.ts +4 -1
  196. package/src/utils/getOrgSchemaMessage.ts +16 -16
  197. package/src/utils/onErrorResumeNext.ts +1 -1
  198. package/src/utils/voiceActivity/getVoiceActivityRole.spec.ts +150 -0
  199. package/src/utils/voiceActivity/getVoiceActivityRole.ts +16 -0
  200. package/src/utils/voiceActivity/getVoiceActivityText.spec.ts +100 -0
  201. package/src/utils/voiceActivity/getVoiceActivityText.ts +11 -0
  202. package/src/utils/voiceActivity/isVoiceActivity.spec.ts +202 -0
  203. package/src/utils/voiceActivity/isVoiceActivity.ts +21 -0
  204. package/src/utils/voiceActivity/isVoiceTranscriptActivity.spec.ts +224 -0
  205. package/src/utils/voiceActivity/isVoiceTranscriptActivity.ts +24 -0
  206. package/dist/botframework-webchat-core.mjs.LEGAL.txt +0 -0
  207. package/lib/actions/clearSuggestedActions.js +0 -15
  208. package/lib/actions/connect.js +0 -33
  209. package/lib/actions/connectionStatusUpdate.js +0 -20
  210. package/lib/actions/deleteActivity.d.ts +0 -13
  211. package/lib/actions/deleteActivity.d.ts.map +0 -1
  212. package/lib/actions/deleteActivity.js +0 -19
  213. package/lib/actions/disconnect.js +0 -21
  214. package/lib/actions/dismissNotification.d.ts +0 -12
  215. package/lib/actions/dismissNotification.d.ts.map +0 -1
  216. package/lib/actions/dismissNotification.js +0 -19
  217. package/lib/actions/emitTypingIndicator.js +0 -15
  218. package/lib/actions/incomingActivity.d.ts +0 -14
  219. package/lib/actions/incomingActivity.d.ts.map +0 -1
  220. package/lib/actions/incomingActivity.js +0 -19
  221. package/lib/actions/markActivity.d.ts +0 -17
  222. package/lib/actions/markActivity.d.ts.map +0 -1
  223. package/lib/actions/markActivity.js +0 -22
  224. package/lib/actions/postActivity.d.ts +0 -64
  225. package/lib/actions/postActivity.d.ts.map +0 -1
  226. package/lib/actions/postActivity.js +0 -31
  227. package/lib/actions/queueIncomingActivity.js +0 -18
  228. package/lib/actions/reconnect.js +0 -17
  229. package/lib/actions/sagaError.d.ts +0 -8
  230. package/lib/actions/sagaError.d.ts.map +0 -1
  231. package/lib/actions/sagaError.js +0 -15
  232. package/lib/actions/sendEvent.js +0 -19
  233. package/lib/actions/sendFiles.d.ts +0 -19
  234. package/lib/actions/sendFiles.d.ts.map +0 -1
  235. package/lib/actions/sendFiles.js +0 -20
  236. package/lib/actions/sendMessage.d.ts +0 -19
  237. package/lib/actions/sendMessage.d.ts.map +0 -1
  238. package/lib/actions/sendMessage.js +0 -24
  239. package/lib/actions/sendMessageBack.js +0 -20
  240. package/lib/actions/sendPostBack.js +0 -18
  241. package/lib/actions/setClockSkewAdjustment.js +0 -12
  242. package/lib/actions/setDictateInterims.js +0 -18
  243. package/lib/actions/setDictateState.js +0 -18
  244. package/lib/actions/setLanguage.js +0 -18
  245. package/lib/actions/setNotification.d.ts +0 -10
  246. package/lib/actions/setNotification.d.ts.map +0 -1
  247. package/lib/actions/setNotification.js +0 -37
  248. package/lib/actions/setReferenceGrammarID.js +0 -18
  249. package/lib/actions/setSendBox.js +0 -18
  250. package/lib/actions/setSendBoxAttachments.d.ts +0 -13
  251. package/lib/actions/setSendBoxAttachments.d.ts.map +0 -1
  252. package/lib/actions/setSendBoxAttachments.js +0 -18
  253. package/lib/actions/setSendTimeout.js +0 -18
  254. package/lib/actions/setSendTypingIndicator.d.ts +0 -11
  255. package/lib/actions/setSendTypingIndicator.d.ts.map +0 -1
  256. package/lib/actions/setSendTypingIndicator.js +0 -18
  257. package/lib/actions/setSuggestedActions.js +0 -20
  258. package/lib/actions/startDictate.js +0 -15
  259. package/lib/actions/startSpeakingActivity.js +0 -15
  260. package/lib/actions/stopDictate.js +0 -15
  261. package/lib/actions/stopSpeakingActivity.js +0 -15
  262. package/lib/actions/submitSendBox.js +0 -22
  263. package/lib/actions/updateConnectionStatus.js +0 -18
  264. package/lib/constants/ActivityClientState.js +0 -16
  265. package/lib/constants/DictateState.js +0 -17
  266. package/lib/createPromiseQueue.js +0 -30
  267. package/lib/createReducer.d.ts +0 -60
  268. package/lib/createReducer.d.ts.map +0 -1
  269. package/lib/createReducer.js +0 -45
  270. package/lib/createSagas.d.ts +0 -8
  271. package/lib/createSagas.d.ts.map +0 -1
  272. package/lib/createSagas.js +0 -112
  273. package/lib/createStore.d.ts.map +0 -1
  274. package/lib/createStore.js +0 -131
  275. package/lib/definitions/activityFromBot.js +0 -11
  276. package/lib/definitions/speakableActivity.js +0 -10
  277. package/lib/definitions/speakingActivity.js +0 -13
  278. package/lib/index.d.ts +0 -76
  279. package/lib/index.d.ts.map +0 -1
  280. package/lib/index.js +0 -309
  281. package/lib/reducers/connectivityStatus.js +0 -49
  282. package/lib/reducers/createActivitiesReducer.d.ts +0 -12
  283. package/lib/reducers/createActivitiesReducer.d.ts.map +0 -1
  284. package/lib/reducers/createActivitiesReducer.js +0 -267
  285. package/lib/reducers/createInternalReducer.d.ts +0 -10
  286. package/lib/reducers/createInternalReducer.d.ts.map +0 -1
  287. package/lib/reducers/createInternalReducer.js +0 -19
  288. package/lib/reducers/createNotificationsReducer.d.ts +0 -11
  289. package/lib/reducers/createNotificationsReducer.d.ts.map +0 -1
  290. package/lib/reducers/createNotificationsReducer.js +0 -55
  291. package/lib/reducers/createTypingReducer.d.ts +0 -14
  292. package/lib/reducers/createTypingReducer.d.ts.map +0 -1
  293. package/lib/reducers/createTypingReducer.js +0 -50
  294. package/lib/reducers/dictateInterims.js +0 -23
  295. package/lib/reducers/dictateState.js +0 -38
  296. package/lib/reducers/language.js +0 -23
  297. package/lib/reducers/private/findBeforeAfter.d.ts +0 -4
  298. package/lib/reducers/private/findBeforeAfter.d.ts.map +0 -1
  299. package/lib/reducers/private/findBeforeAfter.js +0 -24
  300. package/lib/reducers/readyState.js +0 -23
  301. package/lib/reducers/referenceGrammarID.js +0 -23
  302. package/lib/reducers/sendBoxAttachments.d.ts +0 -9
  303. package/lib/reducers/sendBoxAttachments.d.ts.map +0 -1
  304. package/lib/reducers/sendBoxAttachments.js +0 -23
  305. package/lib/reducers/sendBoxValue.js +0 -23
  306. package/lib/reducers/sendTimeout.js +0 -23
  307. package/lib/reducers/sendTypingIndicator.js +0 -23
  308. package/lib/reducers/shouldSpeakIncomingActivity.js +0 -25
  309. package/lib/reducers/suggestedActions.js +0 -32
  310. package/lib/sagas/clearSuggestedActionsOnPostActivitySaga.js +0 -62
  311. package/lib/sagas/connectSaga.js +0 -445
  312. package/lib/sagas/connectionStatusToNotificationSaga.js +0 -107
  313. package/lib/sagas/connectionStatusUpdateSaga.js +0 -63
  314. package/lib/sagas/detectSlowConnectionSaga.d.ts +0 -5
  315. package/lib/sagas/detectSlowConnectionSaga.d.ts.map +0 -1
  316. package/lib/sagas/detectSlowConnectionSaga.js +0 -50
  317. package/lib/sagas/effects/forever.js +0 -19
  318. package/lib/sagas/effects/forkPut.js +0 -51
  319. package/lib/sagas/effects/observeEach.js +0 -45
  320. package/lib/sagas/effects/observeOnce.d.ts +0 -3
  321. package/lib/sagas/effects/observeOnce.d.ts.map +0 -1
  322. package/lib/sagas/effects/observeOnce.js +0 -42
  323. package/lib/sagas/effects/whileConnected.d.ts +0 -7
  324. package/lib/sagas/effects/whileConnected.d.ts.map +0 -1
  325. package/lib/sagas/effects/whileConnected.js +0 -55
  326. package/lib/sagas/emitTypingIndicatorToPostActivitySaga.js +0 -63
  327. package/lib/sagas/markAllAsSpokenOnStopSpeakActivitySaga.js +0 -78
  328. package/lib/sagas/observeActivitySaga.d.ts +0 -2
  329. package/lib/sagas/observeActivitySaga.d.ts.map +0 -1
  330. package/lib/sagas/observeActivitySaga.js +0 -117
  331. package/lib/sagas/postActivitySaga.d.ts +0 -3
  332. package/lib/sagas/postActivitySaga.d.ts.map +0 -1
  333. package/lib/sagas/postActivitySaga.js +0 -264
  334. package/lib/sagas/queueIncomingActivitySaga.d.ts +0 -3
  335. package/lib/sagas/queueIncomingActivitySaga.d.ts.map +0 -1
  336. package/lib/sagas/queueIncomingActivitySaga.js +0 -197
  337. package/lib/sagas/sendEventToPostActivitySaga.js +0 -68
  338. package/lib/sagas/sendFilesToPostActivitySaga.js +0 -85
  339. package/lib/sagas/sendMessageBackToPostActivitySaga.js +0 -70
  340. package/lib/sagas/sendMessageToPostActivitySaga.d.ts +0 -2
  341. package/lib/sagas/sendMessageToPostActivitySaga.d.ts.map +0 -1
  342. package/lib/sagas/sendMessageToPostActivitySaga.js +0 -91
  343. package/lib/sagas/sendPostBackToPostActivitySaga.js +0 -69
  344. package/lib/sagas/sendTypingIndicatorOnSetSendBoxSaga.d.ts +0 -3
  345. package/lib/sagas/sendTypingIndicatorOnSetSendBoxSaga.d.ts.map +0 -1
  346. package/lib/sagas/sendTypingIndicatorOnSetSendBoxSaga.js +0 -145
  347. package/lib/sagas/speakActivityAndStartDictateOnIncomingActivityFromOthersSaga.js +0 -106
  348. package/lib/sagas/startDictateOnSpeakCompleteSaga.js +0 -65
  349. package/lib/sagas/startSpeakActivityOnPostActivitySaga.js +0 -62
  350. package/lib/sagas/stopDictateOnCardActionSaga.js +0 -65
  351. package/lib/sagas/stopSpeakingActivityOnInputSaga.js +0 -68
  352. package/lib/sagas/submitSendBoxSaga.js +0 -84
  353. package/lib/selectors/activities.d.ts +0 -9
  354. package/lib/selectors/activities.d.ts.map +0 -1
  355. package/lib/selectors/activities.js +0 -33
  356. package/lib/selectors/combineSelectors.js +0 -31
  357. package/lib/selectors/dictateState.js +0 -12
  358. package/lib/selectors/language.d.ts +0 -4
  359. package/lib/selectors/language.d.ts.map +0 -1
  360. package/lib/selectors/language.js +0 -12
  361. package/lib/selectors/notifications.js +0 -13
  362. package/lib/selectors/sendBoxAttachments.js +0 -11
  363. package/lib/selectors/sendBoxValue.js +0 -12
  364. package/lib/selectors/sendTimeout.d.ts +0 -4
  365. package/lib/selectors/sendTimeout.d.ts.map +0 -1
  366. package/lib/selectors/sendTimeout.js +0 -12
  367. package/lib/selectors/sendTypingIndicator.d.ts +0 -4
  368. package/lib/selectors/sendTypingIndicator.d.ts.map +0 -1
  369. package/lib/selectors/sendTypingIndicator.js +0 -12
  370. package/lib/selectors/shouldSpeakIncomingActivity.js +0 -12
  371. package/lib/types/AnyAnd.d.ts +0 -2
  372. package/lib/types/AnyAnd.d.ts.map +0 -1
  373. package/lib/types/AnyAnd.js +0 -6
  374. package/lib/types/GlobalScopePonyfill.d.ts +0 -8
  375. package/lib/types/GlobalScopePonyfill.d.ts.map +0 -1
  376. package/lib/types/GlobalScopePonyfill.js +0 -6
  377. package/lib/types/OneOrMany.d.ts +0 -3
  378. package/lib/types/OneOrMany.d.ts.map +0 -1
  379. package/lib/types/OneOrMany.js +0 -6
  380. package/lib/types/SendBoxAttachment.d.ts +0 -5
  381. package/lib/types/SendBoxAttachment.d.ts.map +0 -1
  382. package/lib/types/SendBoxAttachment.js +0 -6
  383. package/lib/types/WebChatActivity.d.ts +0 -128
  384. package/lib/types/WebChatActivity.d.ts.map +0 -1
  385. package/lib/types/WebChatActivity.js +0 -6
  386. package/lib/types/external/DirectLineActivity.d.ts +0 -3
  387. package/lib/types/external/DirectLineActivity.d.ts.map +0 -1
  388. package/lib/types/external/DirectLineActivity.js +0 -6
  389. package/lib/types/external/DirectLineAnimationCard.d.ts +0 -6
  390. package/lib/types/external/DirectLineAnimationCard.d.ts.map +0 -1
  391. package/lib/types/external/DirectLineAnimationCard.js +0 -6
  392. package/lib/types/external/DirectLineAttachment.d.ts +0 -9
  393. package/lib/types/external/DirectLineAttachment.d.ts.map +0 -1
  394. package/lib/types/external/DirectLineAttachment.js +0 -6
  395. package/lib/types/external/DirectLineAudioCard.d.ts +0 -6
  396. package/lib/types/external/DirectLineAudioCard.d.ts.map +0 -1
  397. package/lib/types/external/DirectLineAudioCard.js +0 -6
  398. package/lib/types/external/DirectLineBasicCardEssence.d.ts +0 -12
  399. package/lib/types/external/DirectLineBasicCardEssence.d.ts.map +0 -1
  400. package/lib/types/external/DirectLineBasicCardEssence.js +0 -6
  401. package/lib/types/external/DirectLineCardAction.d.ts +0 -110
  402. package/lib/types/external/DirectLineCardAction.d.ts.map +0 -1
  403. package/lib/types/external/DirectLineCardAction.js +0 -6
  404. package/lib/types/external/DirectLineCardImage.d.ts +0 -8
  405. package/lib/types/external/DirectLineCardImage.d.ts.map +0 -1
  406. package/lib/types/external/DirectLineCardImage.js +0 -6
  407. package/lib/types/external/DirectLineHeroCard.d.ts +0 -6
  408. package/lib/types/external/DirectLineHeroCard.d.ts.map +0 -1
  409. package/lib/types/external/DirectLineHeroCard.js +0 -6
  410. package/lib/types/external/DirectLineJSBotConnection.d.ts +0 -3
  411. package/lib/types/external/DirectLineJSBotConnection.d.ts.map +0 -1
  412. package/lib/types/external/DirectLineJSBotConnection.js +0 -6
  413. package/lib/types/external/DirectLineMediaCardEssence.d.ts +0 -21
  414. package/lib/types/external/DirectLineMediaCardEssence.d.ts.map +0 -1
  415. package/lib/types/external/DirectLineMediaCardEssence.js +0 -6
  416. package/lib/types/external/DirectLineOAuthCard.d.ts +0 -8
  417. package/lib/types/external/DirectLineOAuthCard.d.ts.map +0 -1
  418. package/lib/types/external/DirectLineOAuthCard.js +0 -6
  419. package/lib/types/external/DirectLineReceiptCard.d.ts +0 -28
  420. package/lib/types/external/DirectLineReceiptCard.d.ts.map +0 -1
  421. package/lib/types/external/DirectLineReceiptCard.js +0 -6
  422. package/lib/types/external/DirectLineSignInCard.d.ts +0 -8
  423. package/lib/types/external/DirectLineSignInCard.d.ts.map +0 -1
  424. package/lib/types/external/DirectLineSignInCard.js +0 -6
  425. package/lib/types/external/DirectLineSuggestedAction.d.ts +0 -7
  426. package/lib/types/external/DirectLineSuggestedAction.d.ts.map +0 -1
  427. package/lib/types/external/DirectLineSuggestedAction.js +0 -6
  428. package/lib/types/external/DirectLineThumbnailCard.d.ts +0 -6
  429. package/lib/types/external/DirectLineThumbnailCard.d.ts.map +0 -1
  430. package/lib/types/external/DirectLineThumbnailCard.js +0 -6
  431. package/lib/types/external/DirectLineVideoCard.d.ts +0 -6
  432. package/lib/types/external/DirectLineVideoCard.d.ts.map +0 -1
  433. package/lib/types/external/DirectLineVideoCard.js +0 -6
  434. package/lib/types/external/Observable.d.ts +0 -49
  435. package/lib/types/external/Observable.d.ts.map +0 -1
  436. package/lib/types/external/Observable.js +0 -6
  437. package/lib/types/external/OrgSchema/Action.d.ts +0 -29
  438. package/lib/types/external/OrgSchema/Action.d.ts.map +0 -1
  439. package/lib/types/external/OrgSchema/Action.js +0 -38
  440. package/lib/types/external/OrgSchema/Claim.d.ts +0 -35
  441. package/lib/types/external/OrgSchema/Claim.d.ts.map +0 -1
  442. package/lib/types/external/OrgSchema/Claim.js +0 -41
  443. package/lib/types/external/OrgSchema/CreativeWork.d.ts +0 -57
  444. package/lib/types/external/OrgSchema/CreativeWork.d.ts.map +0 -1
  445. package/lib/types/external/OrgSchema/CreativeWork.js +0 -52
  446. package/lib/types/external/OrgSchema/DefinedTerm.d.ts +0 -26
  447. package/lib/types/external/OrgSchema/DefinedTerm.d.ts.map +0 -1
  448. package/lib/types/external/OrgSchema/DefinedTerm.js +0 -33
  449. package/lib/types/external/OrgSchema/Project.d.ts +0 -20
  450. package/lib/types/external/OrgSchema/Project.d.ts.map +0 -1
  451. package/lib/types/external/OrgSchema/Project.js +0 -32
  452. package/lib/types/external/OrgSchema/Thing.d.ts +0 -53
  453. package/lib/types/external/OrgSchema/Thing.d.ts.map +0 -1
  454. package/lib/types/external/OrgSchema/Thing.js +0 -54
  455. package/lib/types/external/OrgSchema/VoteAction.d.ts +0 -22
  456. package/lib/types/external/OrgSchema/VoteAction.d.ts.map +0 -1
  457. package/lib/types/external/OrgSchema/VoteAction.js +0 -34
  458. package/lib/types/external/OrgSchema/private/orgSchemaProperties.d.ts +0 -3
  459. package/lib/types/external/OrgSchema/private/orgSchemaProperties.d.ts.map +0 -1
  460. package/lib/types/external/OrgSchema/private/orgSchemaProperties.js +0 -22
  461. package/lib/types/external/OrgSchema/private/orgSchemaProperty.d.ts +0 -4
  462. package/lib/types/external/OrgSchema/private/orgSchemaProperty.d.ts.map +0 -1
  463. package/lib/types/external/OrgSchema/private/orgSchemaProperty.js +0 -15
  464. package/lib/types/internal/GlobalScopeClock.d.ts +0 -15
  465. package/lib/types/internal/GlobalScopeClock.d.ts.map +0 -1
  466. package/lib/types/internal/GlobalScopeClock.js +0 -6
  467. package/lib/types/internal/Notification.d.ts +0 -10
  468. package/lib/types/internal/Notification.d.ts.map +0 -1
  469. package/lib/types/internal/Notification.js +0 -6
  470. package/lib/types/internal/ReduxState.d.ts +0 -19
  471. package/lib/types/internal/ReduxState.d.ts.map +0 -1
  472. package/lib/types/internal/ReduxState.js +0 -6
  473. package/lib/types/internal/SendStatus.d.ts +0 -7
  474. package/lib/types/internal/SendStatus.d.ts.map +0 -1
  475. package/lib/types/internal/SendStatus.js +0 -19
  476. package/lib/types/internal/WebChatOutgoingActivity.d.ts +0 -49
  477. package/lib/types/internal/WebChatOutgoingActivity.d.ts.map +0 -1
  478. package/lib/types/internal/WebChatOutgoingActivity.js +0 -6
  479. package/lib/utils/dateToLocaleISOString.d.ts +0 -2
  480. package/lib/utils/dateToLocaleISOString.d.ts.map +0 -1
  481. package/lib/utils/dateToLocaleISOString.js +0 -52
  482. package/lib/utils/deleteKey.d.ts +0 -2
  483. package/lib/utils/deleteKey.d.ts.map +0 -1
  484. package/lib/utils/deleteKey.js +0 -30
  485. package/lib/utils/getOrgSchemaMessage.d.ts +0 -4
  486. package/lib/utils/getOrgSchemaMessage.d.ts.map +0 -1
  487. package/lib/utils/getOrgSchemaMessage.js +0 -21
  488. package/lib/utils/isForbiddenPropertyName.d.ts +0 -2
  489. package/lib/utils/isForbiddenPropertyName.d.ts.map +0 -1
  490. package/lib/utils/isForbiddenPropertyName.js +0 -16
  491. package/lib/utils/onErrorResumeNext.d.ts +0 -3
  492. package/lib/utils/onErrorResumeNext.d.ts.map +0 -1
  493. package/lib/utils/onErrorResumeNext.js +0 -19
  494. package/lib/utils/once.d.ts +0 -2
  495. package/lib/utils/once.d.ts.map +0 -1
  496. package/lib/utils/once.js +0 -16
  497. package/lib/utils/singleToArray.d.ts +0 -2
  498. package/lib/utils/singleToArray.d.ts.map +0 -1
  499. package/lib/utils/singleToArray.js +0 -10
  500. package/lib/utils/sleep.d.ts +0 -3
  501. package/lib/utils/sleep.d.ts.map +0 -1
  502. package/lib/utils/sleep.js +0 -12
  503. package/lib/utils/uniqueID.d.ts +0 -2
  504. package/lib/utils/uniqueID.d.ts.map +0 -1
  505. package/lib/utils/uniqueID.js +0 -14
  506. package/lib/utils/warnOnce.d.ts +0 -2
  507. package/lib/utils/warnOnce.d.ts.map +0 -1
  508. package/lib/utils/warnOnce.js +0 -14
  509. package/src/actions/clearSuggestedActions.js +0 -9
  510. package/src/actions/setSuggestedActions.js +0 -12
  511. package/src/constants/DictateState.js +0 -7
  512. package/src/reducers/createActivitiesReducer.ts +0 -304
  513. package/src/reducers/private/findBeforeAfter.spec.ts +0 -90
  514. package/src/reducers/private/findBeforeAfter.ts +0 -30
  515. package/src/reducers/suggestedActions.js +0 -23
  516. package/src/types/OneOrMany.ts +0 -3
  517. package/src/types/external/OrgSchema/Action.spec.ts +0 -35
  518. package/src/types/external/OrgSchema/Action.ts +0 -52
  519. package/src/types/external/OrgSchema/Claim.spec.ts +0 -45
  520. package/src/types/external/OrgSchema/Claim.ts +0 -48
  521. package/src/types/external/OrgSchema/CreativeWork.parseCreativeWork.spec.ts +0 -51
  522. package/src/types/external/OrgSchema/CreativeWork.ts +0 -83
  523. package/src/types/external/OrgSchema/DefinedTerm.ts +0 -37
  524. package/src/types/external/OrgSchema/Project.parseProject.spec.ts +0 -17
  525. package/src/types/external/OrgSchema/Project.ts +0 -29
  526. package/src/types/external/OrgSchema/Thing.parseThing.spec.ts +0 -54
  527. package/src/types/external/OrgSchema/Thing.ts +0 -94
  528. package/src/types/external/OrgSchema/VoteAction.spec.ts +0 -35
  529. package/src/types/external/OrgSchema/VoteAction.ts +0 -31
  530. package/src/types/external/OrgSchema/private/orgSchemaProperties.spec.ts +0 -41
  531. package/src/types/external/OrgSchema/private/orgSchemaProperties.ts +0 -23
  532. package/src/types/external/OrgSchema/private/orgSchemaProperty.spec.ts +0 -21
  533. package/src/types/external/OrgSchema/private/orgSchemaProperty.ts +0 -6
  534. package/src/utils/isForbiddenPropertyName.spec.js +0 -6
  535. package/src/utils/isForbiddenPropertyName.ts +0 -33
  536. package/src/utils/singleToArray.ts +0 -3
  537. package/src/utils/warnOnce.ts +0 -5
  538. /package/src/actions/{connectionStatusUpdate.js → connectionStatusUpdate.ts} +0 -0
  539. /package/src/actions/{disconnect.js → disconnect.ts} +0 -0
  540. /package/src/actions/{emitTypingIndicator.js → emitTypingIndicator.ts} +0 -0
  541. /package/src/actions/{queueIncomingActivity.js → queueIncomingActivity.ts} +0 -0
  542. /package/src/actions/{reconnect.js → reconnect.ts} +0 -0
  543. /package/src/actions/{startDictate.js → startDictate.ts} +0 -0
  544. /package/src/actions/{startSpeakingActivity.js → startSpeakingActivity.ts} +0 -0
  545. /package/src/actions/{stopDictate.js → stopDictate.ts} +0 -0
  546. /package/src/actions/{stopSpeakingActivity.js → stopSpeakingActivity.ts} +0 -0
  547. /package/src/actions/{updateConnectionStatus.js → updateConnectionStatus.ts} +0 -0
@@ -0,0 +1,144 @@
1
+ /* eslint-disable no-restricted-globals */
2
+ import { expect } from '@jest/globals';
3
+ import { scenario } from '@testduet/given-when-then';
4
+ import deleteActivityByLocalId from './deleteActivityByLocalId';
5
+ import { getLocalIdFromActivity, type LocalId } from './property/LocalId';
6
+ import { type Activity, type ActivityMapEntry, type SortedChatHistoryEntry } from './types';
7
+ import upsert, { INITIAL_STATE } from './upsert';
8
+
9
+ function activityToExpectation(activity: Activity, expectedPosition: number = expect.any(Number) as any): Activity {
10
+ return {
11
+ ...activity,
12
+ channelData: {
13
+ ...activity.channelData,
14
+ 'webchat:internal:position': expectedPosition
15
+ } as any
16
+ };
17
+ }
18
+
19
+ scenario('deleting activity', bdd => {
20
+ const activity1: Activity = {
21
+ channelData: {
22
+ 'webchat:internal:local-id': '_:a-00001' as LocalId,
23
+ 'webchat:internal:position': 0,
24
+ 'webchat:send-status': undefined
25
+ },
26
+ from: { id: 'bot', role: 'bot' },
27
+ id: 'a-00001',
28
+ text: 'Hello, World!',
29
+ timestamp: new Date(1_000).toISOString(),
30
+ type: 'message'
31
+ };
32
+
33
+ const activity2: Activity = {
34
+ channelData: {
35
+ 'webchat:internal:local-id': '_:a-00002' as LocalId,
36
+ 'webchat:internal:position': 0,
37
+ 'webchat:send-status': undefined
38
+ },
39
+ from: { id: 'bot', role: 'bot' },
40
+ id: 'a-00002',
41
+ text: 'Aloha!',
42
+ timestamp: new Date(2_000).toISOString(),
43
+ type: 'message'
44
+ };
45
+
46
+ bdd
47
+ .given('an initial state', () => INITIAL_STATE)
48
+ .when('2 activities are upserted', state => upsert({ Date }, upsert({ Date }, state, activity1), activity2))
49
+ .then('should have 2 activities', (_, state) => {
50
+ expect(state.activityIdToLocalIdMap).toHaveProperty('size', 2);
51
+ expect(state.activityMap).toHaveProperty('size', 2);
52
+ expect(state.howToGroupingMap).toHaveProperty('size', 0);
53
+ expect(state.livestreamSessionMap).toHaveProperty('size', 0);
54
+ expect(state.sortedActivities).toHaveLength(2);
55
+ expect(state.sortedChatHistoryList).toHaveLength(2);
56
+ })
57
+ .when('the first activity is deleted', (_, state) =>
58
+ deleteActivityByLocalId(state, getLocalIdFromActivity(state.sortedActivities[0]!))
59
+ )
60
+ .then('should have 1 activity', (_, state) => {
61
+ expect(state.activityIdToLocalIdMap).toHaveProperty('size', 1);
62
+ expect(state.activityMap).toHaveProperty('size', 1);
63
+ expect(state.howToGroupingMap).toHaveProperty('size', 0);
64
+ expect(state.livestreamSessionMap).toHaveProperty('size', 0);
65
+ expect(state.sortedActivities).toHaveLength(1);
66
+ expect(state.sortedChatHistoryList).toHaveLength(1);
67
+ })
68
+ .and('`activityIdToLocalIdMap` should match', (_, state) => {
69
+ expect(state.activityIdToLocalIdMap).toEqual(new Map<string, LocalId>([['a-00002', '_:a-00002' as LocalId]]));
70
+ })
71
+ .and('`activityMap` should match', (_, state) => {
72
+ expect(state.activityMap).toEqual(
73
+ new Map<LocalId, ActivityMapEntry>([
74
+ [
75
+ '_:a-00002' as LocalId,
76
+ {
77
+ activity: activityToExpectation(activity2, 2_000),
78
+ activityLocalId: '_:a-00002' as LocalId,
79
+ logicalTimestamp: 2_000,
80
+ type: 'activity'
81
+ } satisfies ActivityMapEntry
82
+ ]
83
+ ])
84
+ );
85
+ })
86
+ .and('`sortedActivities` should match', (_, state) => {
87
+ expect(state.sortedActivities).toEqual([activityToExpectation(activity2, 2_000)]);
88
+ })
89
+ .and('`sortedChatHistoryList` should match', (_, state) => {
90
+ expect(state.sortedChatHistoryList).toEqual([
91
+ {
92
+ activityLocalId: '_:a-00002' as LocalId,
93
+ logicalTimestamp: 2_000,
94
+ type: 'activity'
95
+ } satisfies SortedChatHistoryEntry
96
+ ]);
97
+ });
98
+ });
99
+
100
+ scenario('deleting an outgoing activity', bdd => {
101
+ const activity1: Activity = {
102
+ channelData: {
103
+ clientActivityID: 'caid-00001',
104
+ 'webchat:internal:local-id': '_:a-00001' as LocalId,
105
+ 'webchat:internal:position': 0,
106
+ 'webchat:send-status': 'sending'
107
+ } as any,
108
+ from: { id: 'user', role: 'user' },
109
+ id: 'a-00001',
110
+ text: 'Hello, World!',
111
+ timestamp: new Date(1_000).toISOString(),
112
+ type: 'message'
113
+ };
114
+
115
+ bdd
116
+ .given('an initial state', () => INITIAL_STATE)
117
+ .when('1 activity are upserted', state => upsert({ Date }, state, activity1))
118
+ .then('should have 1 activity', (_, state) => {
119
+ expect(state.activityIdToLocalIdMap).toHaveProperty('size', 1);
120
+ expect(state.activityMap).toHaveProperty('size', 1);
121
+ expect(state.clientActivityIdToLocalIdMap).toHaveProperty('size', 1);
122
+ expect(state.howToGroupingMap).toHaveProperty('size', 0);
123
+ expect(state.livestreamSessionMap).toHaveProperty('size', 0);
124
+ expect(state.sortedActivities).toHaveLength(1);
125
+ expect(state.sortedChatHistoryList).toHaveLength(1);
126
+ })
127
+ .and('`clientActivityIdToLocalMap` should match', (_, state) => {
128
+ expect(state.clientActivityIdToLocalIdMap).toEqual(
129
+ new Map<string, LocalId>([['caid-00001', '_:a-00001' as LocalId]])
130
+ );
131
+ })
132
+ .when('the first activity is deleted', (_, state) =>
133
+ deleteActivityByLocalId(state, getLocalIdFromActivity(state.sortedActivities[0]!))
134
+ )
135
+ .then('should have no activities', (_, state) => {
136
+ expect(state.activityIdToLocalIdMap).toHaveProperty('size', 0);
137
+ expect(state.activityMap).toHaveProperty('size', 0);
138
+ expect(state.clientActivityIdToLocalIdMap).toHaveProperty('size', 0);
139
+ expect(state.howToGroupingMap).toHaveProperty('size', 0);
140
+ expect(state.livestreamSessionMap).toHaveProperty('size', 0);
141
+ expect(state.sortedActivities).toHaveLength(0);
142
+ expect(state.sortedChatHistoryList).toHaveLength(0);
143
+ });
144
+ });
@@ -0,0 +1,148 @@
1
+ /* eslint-disable no-restricted-globals */
2
+ import { expect } from '@jest/globals';
3
+ import { scenario } from '@testduet/given-when-then';
4
+ import { parse } from 'valibot';
5
+ import type { WebChatActivity } from '../../../types/WebChatActivity';
6
+ import deleteActivityByLocalId from './deleteActivityByLocalId';
7
+ import { getLocalIdFromActivity, LocalIdSchema, type LocalId } from './property/LocalId';
8
+ import type {
9
+ Activity,
10
+ ActivityMapEntry,
11
+ HowToGroupingId,
12
+ HowToGroupingMapEntry,
13
+ SortedChatHistoryEntry
14
+ } from './types';
15
+ import upsert, { INITIAL_STATE } from './upsert';
16
+
17
+ type SingularOrPlural<T> = T | readonly T[];
18
+
19
+ function activityToExpectation(activity: Activity, expectedPosition: number = expect.any(Number) as any): Activity {
20
+ return {
21
+ ...activity,
22
+ channelData: {
23
+ ...activity.channelData,
24
+ 'webchat:internal:position': expectedPosition
25
+ } as any
26
+ };
27
+ }
28
+
29
+ function buildActivity(
30
+ activity: { id: string; text: string; timestamp: string },
31
+ messageEntity: { isPartOf: SingularOrPlural<{ '@id': string; '@type': string }>; position: number } | undefined
32
+ ): WebChatActivity {
33
+ const { id } = activity;
34
+
35
+ return {
36
+ channelData: {
37
+ 'webchat:internal:local-id': parse(LocalIdSchema, `_:${id}`),
38
+ 'webchat:internal:position': 0,
39
+ 'webchat:send-status': undefined
40
+ },
41
+ ...(messageEntity
42
+ ? {
43
+ entities: [
44
+ {
45
+ '@context': 'https://schema.org',
46
+ '@id': '',
47
+ '@type': 'Message',
48
+ type: 'https://schema.org/Message',
49
+ ...messageEntity
50
+ } as any
51
+ ]
52
+ }
53
+ : {}),
54
+ from: { id: 'bot', role: 'bot' },
55
+ type: 'message',
56
+ ...activity
57
+ };
58
+ }
59
+
60
+ scenario('deleting an activity in the same grouping', bdd => {
61
+ const activity1 = buildActivity(
62
+ { id: 'a-00001', text: 'Hello, World!', timestamp: new Date(1_000).toISOString() },
63
+ { isPartOf: [{ '@id': '_:how-to:00001', '@type': 'HowTo' }], position: 1 }
64
+ );
65
+
66
+ const activity2 = buildActivity(
67
+ { id: 'a-00002', text: 'Aloha!', timestamp: new Date(2_000).toISOString() },
68
+ { isPartOf: [{ '@id': '_:how-to:00001', '@type': 'HowTo' }], position: 2 }
69
+ );
70
+
71
+ bdd
72
+ .given('an initial state', () => INITIAL_STATE)
73
+ .when('2 activities are upserted', state => upsert({ Date }, upsert({ Date }, state, activity1), activity2))
74
+ .then('should have 2 activities', (_, state) => {
75
+ expect(state.activityMap).toHaveProperty('size', 2);
76
+ expect(state.howToGroupingMap).toHaveProperty('size', 1);
77
+ expect(state.livestreamSessionMap).toHaveProperty('size', 0);
78
+ expect(state.sortedActivities).toHaveLength(2);
79
+ expect(state.sortedChatHistoryList).toHaveLength(1);
80
+ })
81
+ .when('the second activity is deleted', (_, state) =>
82
+ deleteActivityByLocalId(state, getLocalIdFromActivity(state.sortedActivities[1]))
83
+ )
84
+ .then('should have 1 activity', (_, state) => {
85
+ expect(state.activityMap).toHaveProperty('size', 1);
86
+ expect(state.howToGroupingMap).toHaveProperty('size', 1);
87
+ expect(state.livestreamSessionMap).toHaveProperty('size', 0);
88
+ expect(state.sortedActivities).toHaveLength(1);
89
+ expect(state.sortedChatHistoryList).toHaveLength(1);
90
+ })
91
+ .and('`activityMap` should match', (_, state) => {
92
+ expect(state.activityMap).toEqual(
93
+ new Map<LocalId, ActivityMapEntry>([
94
+ [
95
+ '_:a-00001' as LocalId,
96
+ {
97
+ activity: activityToExpectation(activity1, 1_000),
98
+ activityLocalId: '_:a-00001' as LocalId,
99
+ logicalTimestamp: 1_000,
100
+ type: 'activity'
101
+ } satisfies ActivityMapEntry
102
+ ]
103
+ ])
104
+ );
105
+ })
106
+ .and('`howToGroupingMap` should match', (_, state) => {
107
+ expect(state.howToGroupingMap).toEqual(
108
+ new Map<HowToGroupingId, HowToGroupingMapEntry>([
109
+ [
110
+ '_:how-to:00001' as HowToGroupingId,
111
+ {
112
+ logicalTimestamp: 1_000,
113
+ partList: [
114
+ {
115
+ activityLocalId: '_:a-00001' as LocalId,
116
+ logicalTimestamp: 1_000,
117
+ position: 1,
118
+ type: 'activity'
119
+ }
120
+ ]
121
+ }
122
+ ]
123
+ ])
124
+ );
125
+ })
126
+ .and('`sortedActivities` should match', (_, state) => {
127
+ expect(state.sortedActivities).toEqual([activityToExpectation(activity1, 1_000)]);
128
+ })
129
+ .and('`sortedChatHistoryList` should match', (_, state) => {
130
+ expect(state.sortedChatHistoryList).toEqual([
131
+ {
132
+ howToGroupingId: '_:how-to:00001' as HowToGroupingId,
133
+ logicalTimestamp: 1_000,
134
+ type: 'how to grouping'
135
+ } satisfies SortedChatHistoryEntry
136
+ ]);
137
+ })
138
+ .when('the first activity is deleted', (_, state) =>
139
+ deleteActivityByLocalId(state, getLocalIdFromActivity(state.sortedActivities[0]))
140
+ )
141
+ .then('should have no activities', (_, state) => {
142
+ expect(state.activityMap).toHaveProperty('size', 0);
143
+ expect(state.howToGroupingMap).toHaveProperty('size', 0);
144
+ expect(state.livestreamSessionMap).toHaveProperty('size', 0);
145
+ expect(state.sortedActivities).toHaveLength(0);
146
+ expect(state.sortedChatHistoryList).toHaveLength(0);
147
+ });
148
+ });
@@ -0,0 +1,248 @@
1
+ /* eslint-disable no-restricted-globals */
2
+ import { expect } from '@jest/globals';
3
+ import { scenario } from '@testduet/given-when-then';
4
+ import { parse } from 'valibot';
5
+ import type { WebChatActivity } from '../../../types/WebChatActivity';
6
+ import deleteActivityByLocalId from './deleteActivityByLocalId';
7
+ import { getLocalIdFromActivity, LocalIdSchema, type LocalId } from './property/LocalId';
8
+ import {
9
+ HowToGroupingId,
10
+ type HowToGroupingMapEntry,
11
+ type LivestreamSessionId,
12
+ type LivestreamSessionMapEntry,
13
+ type LivestreamSessionMapEntryActivityEntry
14
+ } from './types';
15
+ import upsert, { INITIAL_STATE } from './upsert';
16
+
17
+ type SingularOrPlural<T> = T | readonly T[];
18
+
19
+ function buildActivity(
20
+ activity:
21
+ | {
22
+ channelData:
23
+ | {
24
+ streamId: string;
25
+ streamSequence?: never;
26
+ streamType: 'final';
27
+ }
28
+ | undefined;
29
+ id: string;
30
+ text: string;
31
+ timestamp: string;
32
+ type: 'message';
33
+ }
34
+ | {
35
+ channelData:
36
+ | {
37
+ streamId: string;
38
+ streamSequence: number;
39
+ streamType: 'informative' | 'streaming';
40
+ }
41
+ | {
42
+ streamId?: never;
43
+ streamSequence: 1;
44
+ streamType: 'informative' | 'streaming';
45
+ }
46
+ | undefined;
47
+ id: string;
48
+ text: string;
49
+ timestamp: string;
50
+ type: 'typing';
51
+ },
52
+ messageEntity: { isPartOf: SingularOrPlural<{ '@id': string; '@type': string }>; position: number } | undefined
53
+ ): WebChatActivity {
54
+ const { id } = activity;
55
+
56
+ return {
57
+ ...(messageEntity
58
+ ? {
59
+ entities: [
60
+ {
61
+ '@context': 'https://schema.org',
62
+ '@id': '',
63
+ '@type': 'Message',
64
+ type: 'https://schema.org/Message',
65
+ ...messageEntity
66
+ } as any
67
+ ]
68
+ }
69
+ : {}),
70
+ from: { id: 'bot', role: 'bot' },
71
+ ...activity,
72
+ channelData: {
73
+ 'webchat:internal:local-id': parse(LocalIdSchema, `_:${id}`),
74
+ 'webchat:internal:position': 0,
75
+ 'webchat:send-status': undefined,
76
+ ...activity.channelData
77
+ }
78
+ } as any;
79
+ }
80
+
81
+ scenario('delete livestream activities in part grouping', bdd => {
82
+ const activity1 = buildActivity(
83
+ {
84
+ channelData: { streamSequence: 1, streamType: 'streaming' },
85
+ id: 'a-00001',
86
+ text: 'A quick',
87
+ timestamp: new Date(1_000).toISOString(),
88
+ type: 'typing'
89
+ },
90
+ { isPartOf: [{ '@id': '_:how-to:00001', '@type': 'HowTo' }], position: 1 }
91
+ );
92
+
93
+ const activity2 = buildActivity(
94
+ {
95
+ channelData: { streamId: 'a-00001', streamSequence: 2, streamType: 'streaming' },
96
+ id: 'a-00002',
97
+ text: 'A quick brown fox',
98
+ timestamp: new Date(2_000).toISOString(),
99
+ type: 'typing'
100
+ },
101
+ { isPartOf: [{ '@id': '_:how-to:00001', '@type': 'HowTo' }], position: 1 }
102
+ );
103
+
104
+ const activity3 = buildActivity(
105
+ {
106
+ channelData: { streamId: 'a-00001', streamType: 'final' },
107
+ id: 'a-00003',
108
+ text: 'A quick brown fox jumped over the lazy dogs.',
109
+ timestamp: new Date(3_000).toISOString(),
110
+ type: 'message'
111
+ },
112
+ { isPartOf: [{ '@id': '_:how-to:00001', '@type': 'HowTo' }], position: 1 }
113
+ );
114
+
115
+ const activity4 = buildActivity(
116
+ {
117
+ channelData: undefined,
118
+ id: 'a-00004',
119
+ text: 'Hello, World!',
120
+ timestamp: new Date(4_000).toISOString(),
121
+ type: 'message'
122
+ },
123
+ { isPartOf: [{ '@id': '_:how-to:00001', '@type': 'HowTo' }], position: 2 }
124
+ );
125
+
126
+ bdd
127
+ .given('an initial state', () => INITIAL_STATE)
128
+ .when('4 activities are upserted', state =>
129
+ upsert(
130
+ { Date },
131
+ upsert({ Date }, upsert({ Date }, upsert({ Date }, state, activity1), activity2), activity3),
132
+ activity4
133
+ )
134
+ )
135
+ .then('should have 4 activities in map, 2 visible', (_, state) => {
136
+ expect(state.activityMap).toHaveProperty('size', 4);
137
+ expect(state.howToGroupingMap).toHaveProperty('size', 1);
138
+ expect(state.livestreamSessionMap).toHaveProperty('size', 1);
139
+ expect(state.sortedActivities).toHaveLength(2);
140
+ expect(state.sortedChatHistoryList).toHaveLength(1);
141
+ })
142
+ .when('the last livestream activity is delete', (_, state) =>
143
+ deleteActivityByLocalId(state, getLocalIdFromActivity(state.sortedActivities[0]))
144
+ )
145
+ .then('should have 3 activities', (_, state) => {
146
+ expect(state.activityMap).toHaveProperty('size', 3);
147
+ expect(state.howToGroupingMap).toHaveProperty('size', 1);
148
+ expect(state.livestreamSessionMap).toHaveProperty('size', 1);
149
+ expect(state.sortedActivities).toHaveLength(3);
150
+ expect(state.sortedChatHistoryList).toHaveLength(1);
151
+ })
152
+ .and('`livestreamSessionMap` should match', (_, state) => {
153
+ expect(state.livestreamSessionMap).toEqual(
154
+ new Map<LivestreamSessionId, LivestreamSessionMapEntry>([
155
+ [
156
+ 'a-00001' as LivestreamSessionId,
157
+ {
158
+ activities: [
159
+ {
160
+ activityLocalId: '_:a-00001' as LocalId,
161
+ logicalTimestamp: 1_000,
162
+ sequenceNumber: 1,
163
+ type: 'activity'
164
+ } satisfies LivestreamSessionMapEntryActivityEntry,
165
+ {
166
+ activityLocalId: '_:a-00002' as LocalId,
167
+ logicalTimestamp: 2_000,
168
+ sequenceNumber: 2,
169
+ type: 'activity'
170
+ } satisfies LivestreamSessionMapEntryActivityEntry
171
+ ],
172
+ finalized: false,
173
+ logicalTimestamp: 1_000
174
+ }
175
+ ]
176
+ ])
177
+ );
178
+ })
179
+ .and('`howToGroupingMap` should match', (_, state) => {
180
+ expect(state.howToGroupingMap).toEqual(
181
+ new Map<HowToGroupingId, HowToGroupingMapEntry>([
182
+ [
183
+ '_:how-to:00001' as HowToGroupingId,
184
+ {
185
+ logicalTimestamp: 4_000,
186
+ partList: [
187
+ {
188
+ livestreamSessionId: 'a-00001' as LivestreamSessionId,
189
+ logicalTimestamp: 1_000,
190
+ position: 1,
191
+ type: 'livestream session'
192
+ },
193
+ {
194
+ activityLocalId: '_:a-00004' as LocalId,
195
+ logicalTimestamp: 4_000,
196
+ position: 2,
197
+ type: 'activity'
198
+ }
199
+ ]
200
+ }
201
+ ]
202
+ ])
203
+ );
204
+ })
205
+ .when('all livestream activities are delete', (_, state) =>
206
+ deleteActivityByLocalId(
207
+ deleteActivityByLocalId(state, getLocalIdFromActivity(state.sortedActivities[1])),
208
+ getLocalIdFromActivity(state.sortedActivities[0])
209
+ )
210
+ )
211
+ .then('should have 1 activity', (_, state) => {
212
+ expect(state.activityMap).toHaveProperty('size', 1);
213
+ expect(state.howToGroupingMap).toHaveProperty('size', 1);
214
+ expect(state.livestreamSessionMap).toHaveProperty('size', 0);
215
+ expect(state.sortedActivities).toHaveLength(1);
216
+ expect(state.sortedChatHistoryList).toHaveLength(1);
217
+ })
218
+ .and('`howToGroupingMap` should match', (_, state) => {
219
+ expect(state.howToGroupingMap).toEqual(
220
+ new Map<HowToGroupingId, HowToGroupingMapEntry>([
221
+ [
222
+ '_:how-to:00001' as HowToGroupingId,
223
+ {
224
+ logicalTimestamp: 4_000,
225
+ partList: [
226
+ {
227
+ activityLocalId: '_:a-00004' as LocalId,
228
+ logicalTimestamp: 4_000,
229
+ position: 2,
230
+ type: 'activity'
231
+ }
232
+ ]
233
+ }
234
+ ]
235
+ ])
236
+ );
237
+ })
238
+ .when('all activities are delete', (_, state) =>
239
+ deleteActivityByLocalId(state, getLocalIdFromActivity(state.sortedActivities[0]))
240
+ )
241
+ .then('should have no activities', (_, state) => {
242
+ expect(state.activityMap).toHaveProperty('size', 0);
243
+ expect(state.howToGroupingMap).toHaveProperty('size', 0);
244
+ expect(state.livestreamSessionMap).toHaveProperty('size', 0);
245
+ expect(state.sortedActivities).toHaveLength(0);
246
+ expect(state.sortedChatHistoryList).toHaveLength(0);
247
+ });
248
+ });
@@ -0,0 +1,156 @@
1
+ /* eslint-disable no-restricted-globals */
2
+ import { expect } from '@jest/globals';
3
+ import { scenario } from '@testduet/given-when-then';
4
+ import { parse } from 'valibot';
5
+ import type { WebChatActivity } from '../../../types/WebChatActivity';
6
+ import deleteActivityByLocalId from './deleteActivityByLocalId';
7
+ import { getLocalIdFromActivity, LocalIdSchema, type LocalId } from './property/LocalId';
8
+ import { LivestreamSessionId, type LivestreamSessionMapEntry } from './types';
9
+ import upsert, { INITIAL_STATE } from './upsert';
10
+
11
+ function buildActivity(
12
+ activity:
13
+ | {
14
+ channelData:
15
+ | {
16
+ streamId: string;
17
+ streamSequence?: never;
18
+ streamType: 'final';
19
+ }
20
+ | undefined;
21
+ id: string;
22
+ text: string;
23
+ timestamp: string;
24
+ type: 'message';
25
+ }
26
+ | {
27
+ channelData:
28
+ | {
29
+ streamId: string;
30
+ streamSequence: number;
31
+ streamType: 'informative' | 'streaming';
32
+ }
33
+ | {
34
+ streamId?: never;
35
+ streamSequence: 1;
36
+ streamType: 'informative' | 'streaming';
37
+ }
38
+ | undefined;
39
+ id: string;
40
+ text: string;
41
+ timestamp: string;
42
+ type: 'typing';
43
+ }
44
+ ): WebChatActivity {
45
+ const { id } = activity;
46
+
47
+ return {
48
+ from: { id: 'bot', role: 'bot' },
49
+ ...activity,
50
+ channelData: {
51
+ 'webchat:internal:local-id': parse(LocalIdSchema, `_:${id}`),
52
+ 'webchat:internal:position': 0,
53
+ 'webchat:send-status': undefined,
54
+ ...activity.channelData
55
+ }
56
+ } as any;
57
+ }
58
+
59
+ scenario('deleting an activity', bdd => {
60
+ const activity1 = buildActivity({
61
+ channelData: {
62
+ streamSequence: 1,
63
+ streamType: 'streaming'
64
+ },
65
+ id: 'a-00001',
66
+ text: 'A quick',
67
+ timestamp: new Date(1_000).toISOString(),
68
+ type: 'typing'
69
+ });
70
+
71
+ const activity2 = buildActivity({
72
+ channelData: {
73
+ streamId: 'a-00001',
74
+ streamSequence: 2,
75
+ streamType: 'streaming'
76
+ },
77
+ id: 'a-00002',
78
+ text: 'A quick brown fox',
79
+ timestamp: new Date(2_000).toISOString(),
80
+ type: 'typing'
81
+ });
82
+
83
+ const activity3 = buildActivity({
84
+ channelData: {
85
+ streamId: 'a-00001',
86
+ streamType: 'final'
87
+ },
88
+ id: 'a-00003',
89
+ text: 'A quick brown fox jumped over the lazy dogs.',
90
+ timestamp: new Date(3_000).toISOString(),
91
+ type: 'message'
92
+ });
93
+
94
+ bdd
95
+ .given('an initial state', () => INITIAL_STATE)
96
+ .when('3 activities are upserted', state =>
97
+ upsert({ Date }, upsert({ Date }, upsert({ Date }, state, activity1), activity2), activity3)
98
+ )
99
+ .then('should have 3 activities in map, 1 visible', (_, state) => {
100
+ expect(state.activityMap).toHaveProperty('size', 3);
101
+ expect(state.howToGroupingMap).toHaveProperty('size', 0);
102
+ expect(state.livestreamSessionMap).toHaveProperty('size', 1);
103
+ expect(state.sortedActivities).toHaveLength(1);
104
+ expect(state.sortedChatHistoryList).toHaveLength(1);
105
+ })
106
+ .when('the last activity is delete', (_, state) =>
107
+ deleteActivityByLocalId(state, getLocalIdFromActivity(state.sortedActivities[0]))
108
+ )
109
+ .then('should have 2 activities', (_, state) => {
110
+ expect(state.activityMap).toHaveProperty('size', 2);
111
+ expect(state.howToGroupingMap).toHaveProperty('size', 0);
112
+ expect(state.livestreamSessionMap).toHaveProperty('size', 1);
113
+ expect(state.sortedActivities).toHaveLength(2);
114
+ expect(state.sortedChatHistoryList).toHaveLength(1);
115
+ })
116
+ .and('`livestreamSessionMap` should match', (_, state) => {
117
+ expect(state.livestreamSessionMap).toEqual(
118
+ new Map<LivestreamSessionId, LivestreamSessionMapEntry>([
119
+ [
120
+ 'a-00001' as LivestreamSessionId,
121
+ {
122
+ activities: [
123
+ {
124
+ activityLocalId: '_:a-00001' as LocalId,
125
+ logicalTimestamp: 1_000,
126
+ sequenceNumber: 1,
127
+ type: 'activity'
128
+ },
129
+ {
130
+ activityLocalId: '_:a-00002' as LocalId,
131
+ logicalTimestamp: 2_000,
132
+ sequenceNumber: 2,
133
+ type: 'activity'
134
+ }
135
+ ],
136
+ finalized: false,
137
+ logicalTimestamp: 1_000
138
+ }
139
+ ]
140
+ ])
141
+ );
142
+ })
143
+ .when('all activities are delete', (_, state) =>
144
+ deleteActivityByLocalId(
145
+ deleteActivityByLocalId(state, getLocalIdFromActivity(state.sortedActivities[1])),
146
+ getLocalIdFromActivity(state.sortedActivities[0])
147
+ )
148
+ )
149
+ .then('should have no activities', (_, state) => {
150
+ expect(state.activityMap).toHaveProperty('size', 0);
151
+ expect(state.howToGroupingMap).toHaveProperty('size', 0);
152
+ expect(state.livestreamSessionMap).toHaveProperty('size', 0);
153
+ expect(state.sortedActivities).toHaveLength(0);
154
+ expect(state.sortedChatHistoryList).toHaveLength(0);
155
+ });
156
+ });