botframework-webchat-api 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.
- package/LICENSE +21 -0
- package/boot/deprecated/decorator.js +7 -0
- package/boot/deprecated/decorator.mjs +5 -0
- package/boot/deprecated/graph.js +7 -0
- package/boot/deprecated/graph.mjs +5 -0
- package/boot/deprecated/hook.js +7 -0
- package/boot/deprecated/hook.mjs +5 -0
- package/boot/deprecated/internal.js +7 -0
- package/boot/deprecated/internal.mjs +5 -0
- package/boot/deprecated/middleware.js +7 -0
- package/boot/deprecated/middleware.mjs +5 -0
- package/decorator.js +1 -1
- package/dist/StyleOptions-4TkRjGbQ.d.mts +802 -0
- package/dist/StyleOptions-4TkRjGbQ.d.ts +802 -0
- package/dist/_dtsroll-chunks/B1b7R2eH-avatarMiddleware-CHa011_j.d.ts +109 -0
- package/dist/_dtsroll-chunks/CEcj2Npa-botframework-webchat-redux-store.d.ts +16 -0
- package/dist/_dtsroll-chunks/DnThgHcF-botframework-webchat-api-middleware.d.ts +231 -0
- package/dist/_dtsroll-chunks/Dtb0H_Ee-handler-chain.d.ts +4 -0
- package/dist/_dtsroll-chunks/N-ttGLxs-botframework-webchat-base.utils.d.ts +4 -0
- package/dist/_dtsroll-chunks/qKTV3q17-avatarMiddleware-CHa011_j.d.ts +93 -0
- package/dist/botframework-webchat-api.d.mts +173 -1250
- package/dist/botframework-webchat-api.d.ts +387 -0
- package/dist/botframework-webchat-api.decorator.d.mts +71 -26
- package/dist/botframework-webchat-api.decorator.d.ts +81 -0
- package/dist/botframework-webchat-api.decorator.js +2 -0
- package/dist/botframework-webchat-api.decorator.js.map +1 -0
- package/dist/botframework-webchat-api.decorator.mjs +1 -2
- package/dist/botframework-webchat-api.decorator.mjs.map +1 -1
- package/dist/botframework-webchat-api.graph.d.mts +5 -0
- package/dist/botframework-webchat-api.graph.d.ts +2 -0
- package/dist/botframework-webchat-api.graph.js +2 -0
- package/dist/botframework-webchat-api.graph.js.map +1 -0
- package/dist/botframework-webchat-api.graph.mjs +2 -0
- package/dist/botframework-webchat-api.hook.d.mts +9 -0
- package/dist/botframework-webchat-api.hook.d.ts +9 -0
- package/dist/botframework-webchat-api.hook.js +2 -0
- package/dist/botframework-webchat-api.hook.js.map +1 -0
- package/dist/botframework-webchat-api.hook.mjs +2 -0
- package/dist/botframework-webchat-api.hook.mjs.map +1 -0
- package/dist/botframework-webchat-api.internal.d.mts +66 -1
- package/dist/botframework-webchat-api.internal.d.ts +68 -0
- package/dist/botframework-webchat-api.internal.js +2 -0
- package/dist/botframework-webchat-api.internal.js.map +1 -0
- package/dist/botframework-webchat-api.internal.mjs +1 -2
- package/dist/botframework-webchat-api.internal.mjs.map +1 -1
- package/dist/botframework-webchat-api.js +2 -0
- package/dist/botframework-webchat-api.js.map +1 -0
- package/dist/botframework-webchat-api.middleware.d.mts +45 -0
- package/dist/botframework-webchat-api.middleware.d.ts +45 -0
- package/dist/botframework-webchat-api.middleware.js +2 -0
- package/dist/botframework-webchat-api.middleware.js.map +1 -0
- package/dist/botframework-webchat-api.middleware.mjs +2 -0
- package/dist/botframework-webchat-api.middleware.mjs.map +1 -0
- package/dist/botframework-webchat-api.mjs +1 -139
- package/dist/botframework-webchat-api.mjs.LEGAL.txt +2 -27
- package/dist/botframework-webchat-api.mjs.map +1 -1
- package/dist/chunk-3YCFZWVR.js +2 -0
- package/dist/chunk-3YCFZWVR.js.map +1 -0
- package/dist/chunk-42OUJPJV.js +2 -0
- package/dist/chunk-42OUJPJV.js.map +1 -0
- package/dist/chunk-5HALOM2E.mjs +2 -0
- package/dist/chunk-5HALOM2E.mjs.map +1 -0
- package/dist/chunk-5JETBPYY.mjs +2 -0
- package/dist/chunk-5JETBPYY.mjs.map +1 -0
- package/dist/chunk-5X4VJZOM.js +2 -0
- package/dist/chunk-5X4VJZOM.js.map +1 -0
- package/dist/chunk-62M3VAKR.js +2 -0
- package/dist/chunk-62M3VAKR.js.map +1 -0
- package/dist/chunk-7GV72C4W.js +2 -0
- package/dist/chunk-7GV72C4W.js.map +1 -0
- package/dist/chunk-A6GQOZT3.js +2 -0
- package/dist/chunk-A6GQOZT3.js.map +1 -0
- package/dist/chunk-BWPBSJNH.js +2 -0
- package/dist/chunk-BWPBSJNH.js.map +1 -0
- package/dist/chunk-CIL5QUZ4.js +2 -0
- package/dist/chunk-CIL5QUZ4.js.map +1 -0
- package/dist/chunk-EVD4K5QH.mjs +2 -0
- package/dist/chunk-EVD4K5QH.mjs.map +1 -0
- package/dist/chunk-FA2GLWPN.mjs +2 -0
- package/dist/chunk-FA2GLWPN.mjs.map +1 -0
- package/dist/chunk-FD7QXXVX.js +2 -0
- package/dist/chunk-FD7QXXVX.js.map +1 -0
- package/dist/chunk-G5ZR6XJL.js +2 -0
- package/dist/chunk-G5ZR6XJL.js.map +1 -0
- package/dist/chunk-JKWDQH6P.mjs +2 -0
- package/dist/chunk-JKWDQH6P.mjs.map +1 -0
- package/dist/chunk-L5VFUNB4.js +2 -0
- package/dist/chunk-L5VFUNB4.js.map +1 -0
- package/dist/chunk-LIZ64UIL.mjs +2 -0
- package/dist/chunk-LIZ64UIL.mjs.map +1 -0
- package/dist/chunk-LW6LHF6Z.mjs +2 -0
- package/dist/chunk-LW6LHF6Z.mjs.map +1 -0
- package/dist/chunk-MMNBOGJJ.mjs +2 -0
- package/dist/chunk-MMNBOGJJ.mjs.map +1 -0
- package/dist/chunk-RLEJOP6E.mjs +2 -0
- package/dist/chunk-RLEJOP6E.mjs.map +1 -0
- package/dist/chunk-UK6V7R7K.js +2 -0
- package/dist/chunk-UK6V7R7K.js.map +1 -0
- package/dist/{chunk-J6D5YEY6.mjs → chunk-VAX7AB37.mjs} +1 -2
- package/dist/chunk-VAX7AB37.mjs.map +1 -0
- package/dist/chunk-VNGDFILB.mjs +2 -0
- package/dist/chunk-VNGDFILB.mjs.map +1 -0
- package/dist/chunk-XVCIEKX5.mjs +2 -0
- package/dist/chunk-XVCIEKX5.mjs.map +1 -0
- package/dist/hook-BXcgekzo.d.mts +536 -0
- package/dist/hook-C8NHjp6P.d.ts +536 -0
- package/dist/metafile-cjs.json +1 -0
- package/dist/metafile-esm.json +1 -1
- package/dist/templateMiddleware-BEttHPJk.d.mts +20 -0
- package/dist/templateMiddleware-BEttHPJk.d.ts +20 -0
- package/dist/types-BKuj7f2p.d.ts +228 -0
- package/dist/types-BZzd7aAk.d.mts +228 -0
- package/graph.js +3 -0
- package/hook.js +3 -0
- package/internal.js +1 -1
- package/middleware.js +3 -0
- package/package.json +158 -90
- package/src/StyleOptions.ts +400 -285
- package/src/__tests__/addMetaTag.spec.js +9 -0
- package/src/__tests__/addMetaTag.spec.mjs +9 -0
- package/src/boot/decorator.ts +21 -0
- package/src/boot/graph.ts +1 -0
- package/src/boot/hook.ts +82 -0
- package/src/boot/internal.ts +7 -0
- package/src/boot/middleware.ts +60 -0
- package/src/buildInfo.ts +9 -0
- package/src/decorator/ActivityBorder/ActivityBorderDecorator.tsx +57 -0
- package/src/decorator/ActivityBorder/private/ActivityBorderDecoratorMiddleware.ts +34 -0
- package/src/decorator/ActivityBorder/private/ActivityBorderDecoratorRequestContext.ts +48 -0
- package/src/decorator/ActivityGrouping/ActivityGroupingDecorator.tsx +43 -0
- package/src/decorator/ActivityGrouping/private/ActivityGroupingDecoratorMiddleware.ts +40 -0
- package/src/decorator/DecoratorComposer.tsx +51 -0
- package/src/decorator/internal/InternalDecoratorComposer.tsx +33 -0
- package/src/decorator/internal/LowPriorityDecoratorComposer.tsx +19 -0
- package/src/decorator/private/DecoratorComposerContext.ts +16 -0
- package/src/decorator/private/PassthroughFallback.tsx +12 -0
- package/src/decorator/private/templateDecorator.tsx +113 -0
- package/src/decorator/types.ts +4 -0
- package/src/decorator/useDecoratorRequest.ts +15 -0
- package/src/defaultStyleOptions.ts +40 -23
- package/src/env.d.ts +9 -0
- package/src/errorBox/errorBoxTelemetryPolymiddleware.ts +53 -0
- package/src/hooks/Composer.tsx +204 -142
- package/src/hooks/index.ts +19 -2
- package/src/hooks/internal/Tracker.ts +1 -1
- package/src/hooks/internal/WebChatAPIContext.ts +7 -12
- package/src/hooks/internal/WebChatReduxContext.js +3 -2
- package/src/hooks/internal/usePostVoiceActivity.ts +18 -0
- package/src/hooks/internal/useRegisterVoiceHandler.ts +23 -0
- package/src/hooks/internal/useShouldShowMicrophoneButton.ts +22 -0
- package/src/hooks/internal/useVoiceHandlers.ts +11 -0
- package/src/hooks/internal/useVoiceStateWritable.ts +18 -0
- package/src/hooks/middleware/UserlandBoundary.js +2 -2
- package/src/hooks/middleware/activityFallbackPolymiddleware.ts +23 -0
- package/src/hooks/middleware/applyMiddleware.js +5 -5
- package/src/hooks/middleware/concatMiddleware.spec.js +20 -0
- package/src/hooks/middleware/concatMiddleware.ts +7 -6
- package/src/hooks/private/reduceIterable.spec.ts +0 -2
- package/src/hooks/useActiveTyping.ts +3 -2
- package/src/hooks/useActivities.ts +62 -3
- package/src/hooks/useCreateActivityRenderer.ts +27 -6
- package/src/hooks/useCreateActivityStatusRenderer.tsx +13 -33
- package/src/hooks/useCreateAvatarRenderer.ts +19 -33
- package/src/hooks/useDebouncedNotifications.spec.js +1 -0
- package/src/hooks/useDisabled.ts +8 -2
- package/src/hooks/useLocalizer.ts +3 -3
- package/src/hooks/useRenderAttachment.ts +2 -2
- package/src/hooks/useSendBoxAttachments.ts +2 -0
- package/src/hooks/useSendFiles.ts +1 -1
- package/src/hooks/useSendTimeoutForActivity.ts +2 -0
- package/src/hooks/useStartVoice.ts +9 -0
- package/src/hooks/useStopVoice.ts +9 -0
- package/src/hooks/useStyleOptions.ts +1 -6
- package/src/hooks/useSuggestedActions.ts +9 -23
- package/src/hooks/useTrackEvent.ts +3 -3
- package/src/hooks/useUIState.ts +18 -0
- package/src/hooks/useVoiceRecordingMuted.ts +24 -0
- package/src/hooks/useVoiceState.ts +15 -0
- package/src/hooks/validation/uiState.parseUIState.spec.ts +21 -0
- package/src/hooks/validation/uiState.ts +10 -0
- package/src/index.ts +52 -94
- package/src/legacy/LegacyActivityBridge.tsx +77 -0
- package/src/legacy/LegacyActivityBridgeContext.ts +23 -0
- package/src/legacy/createActivityPolymiddlewareFromLegacy.tsx +123 -0
- package/src/legacy/createAvatarPolymiddlewareFromLegacy.tsx +102 -0
- package/src/localization/ar-SA.json +134 -111
- package/src/localization/bg-BG.json +134 -111
- package/src/localization/ca-ES.json +134 -111
- package/src/localization/cs-CZ.json +134 -111
- package/src/localization/da-DK.json +134 -111
- package/src/localization/de-DE.json +134 -111
- package/src/localization/el-GR.json +134 -111
- package/src/localization/en-US.json +45 -19
- package/src/localization/es-ES.json +134 -111
- package/src/localization/et-EE.json +134 -111
- package/src/localization/eu-ES.json +134 -111
- package/src/localization/fi-FI.json +134 -111
- package/src/localization/fr-FR.json +134 -111
- package/src/localization/gl-ES.json +134 -111
- package/src/localization/he-IL.json +134 -111
- package/src/localization/hi-IN.json +134 -111
- package/src/localization/hr-HR.json +134 -111
- package/src/localization/hu-HU.json +134 -111
- package/src/localization/id-ID.json +134 -111
- package/src/localization/it-IT.json +134 -111
- package/src/localization/ja-JP.json +134 -111
- package/src/localization/kk-KZ.json +134 -111
- package/src/localization/ko-KR.json +134 -111
- package/src/localization/lt-LT.json +134 -111
- package/src/localization/lv-LV.json +134 -111
- package/src/localization/ms-MY.json +134 -111
- package/src/localization/nb-NO.json +134 -111
- package/src/localization/nl-NL.json +134 -111
- package/src/localization/pl-PL.json +134 -111
- package/src/localization/pt-BR.json +134 -111
- package/src/localization/pt-PT.json +134 -111
- package/src/localization/ro-RO.json +134 -111
- package/src/localization/ru-RU.json +134 -111
- package/src/localization/sk-SK.json +134 -111
- package/src/localization/sl-SI.json +134 -111
- package/src/localization/sr-Cyrl-CS.json +134 -111
- package/src/localization/sr-Latn-CS.json +134 -111
- package/src/localization/sv-SE.json +134 -111
- package/src/localization/th-TH.json +134 -111
- package/src/localization/tr-TR.json +134 -111
- package/src/localization/uk-UA.json +134 -111
- package/src/localization/vi-VN.json +134 -111
- package/src/localization/yue.json +5 -16
- package/src/localization/zh-CN.json +134 -111
- package/src/localization/zh-HK.json +134 -111
- package/src/localization/zh-TW.json +134 -111
- package/src/middleware/AvatarPolymiddlewareProxy.tsx +46 -0
- package/src/middleware/SendBoxMiddleware.ts +28 -0
- package/src/middleware/SendBoxToolbarMiddleware.ts +28 -0
- package/src/middleware/private/templateMiddleware.check.test.tsx +47 -0
- package/src/{decorator → middleware}/private/templateMiddleware.test.tsx +19 -17
- package/src/middleware/private/templateMiddleware.tsx +106 -0
- package/src/middleware/useBuildRenderAvatarCallback.ts +37 -0
- package/src/normalizeStyleOptions.ts +51 -76
- package/src/providers/ActivityKeyer/ActivityKeyerComposer.tsx +197 -40
- package/src/providers/ActivityKeyer/private/someIterable.spec.ts +0 -2
- package/src/providers/ActivityListener/ActivityListenerComposer.tsx +1 -1
- package/src/providers/ActivitySendStatus/ActivitySendStatusComposer.tsx +6 -3
- package/src/providers/ActivityTyping/ActivityTypingComposer.tsx +145 -59
- package/src/providers/ActivityTyping/private/useReduceActivities.spec.tsx +236 -0
- package/src/providers/ActivityTyping/private/useReduceActivities.ts +49 -0
- package/src/providers/Capabilities/CapabilitiesComposer.tsx +53 -0
- package/src/providers/Capabilities/private/Context.ts +13 -0
- package/src/providers/Capabilities/private/capabilityRegistry.ts +45 -0
- package/src/providers/Capabilities/private/fetchCapabilitiesFromAdapter.ts +59 -0
- package/src/providers/Capabilities/private/shallowEqual.ts +18 -0
- package/src/providers/Capabilities/private/useContext.ts +12 -0
- package/src/providers/Capabilities/types/Capabilities.ts +16 -0
- package/src/providers/Capabilities/useCapabilities.ts +25 -0
- package/src/providers/GroupActivities/GroupActivitiesComposer.tsx +116 -0
- package/src/providers/GroupActivities/private/GroupActivitiesContext.ts +23 -0
- package/src/providers/GroupActivities/private/createDefaultGroupActivitiesMiddleware.ts +113 -0
- package/src/providers/GroupActivities/private/isGroupingValid.ts +41 -0
- package/src/providers/GroupActivities/private/useGroupActivitiesContext.ts +6 -0
- package/src/providers/GroupActivities/useGroupActivities.ts +20 -0
- package/src/providers/GroupActivities/useGroupActivitiesByName.ts +17 -0
- package/src/providers/SpeechToSpeech/SpeechToSpeechComposer.tsx +20 -0
- package/src/providers/SpeechToSpeech/private/VoiceHandlerBridge.tsx +23 -0
- package/src/providers/SpeechToSpeech/private/VoiceRecorderBridge.tsx +49 -0
- package/src/providers/SpeechToSpeech/private/useAudioPlayer.spec.tsx +355 -0
- package/src/providers/SpeechToSpeech/private/useAudioPlayer.ts +92 -0
- package/src/providers/SpeechToSpeech/private/useRecorder.spec.tsx +344 -0
- package/src/providers/SpeechToSpeech/private/useRecorder.ts +220 -0
- package/src/providers/StyleOptions/StyleOptionsComposer.tsx +46 -0
- package/src/providers/StyleOptions/private/StyleOptionsContext.ts +20 -0
- package/src/providers/StyleOptions/private/rectifyStyleOptions.ts +6 -0
- package/src/providers/StyleOptions/useStyleOptions.ts +6 -0
- package/src/tsconfig.json +5 -14
- package/src/types/ActivityStatusMiddleware.ts +1 -9
- package/src/types/AttachmentForScreenReaderMiddleware.ts +9 -2
- package/src/types/AvatarMiddleware.ts +12 -1
- package/src/types/CardActionMiddleware.ts +2 -0
- package/src/types/ComponentMiddleware.ts +1 -1
- package/src/types/GroupActivitiesMiddleware.ts +7 -11
- package/dist/botframework-webchat-api.decorator.mjs.LEGAL.txt +0 -0
- package/dist/botframework-webchat-api.internal.mjs.LEGAL.txt +0 -0
- package/dist/chunk-2S76JUVM.mjs +0 -3
- package/dist/chunk-2S76JUVM.mjs.LEGAL.txt +0 -0
- package/dist/chunk-2S76JUVM.mjs.map +0 -1
- package/dist/chunk-J6D5YEY6.mjs.LEGAL.txt +0 -0
- package/dist/chunk-ZAMHKQQC.mjs +0 -3
- package/dist/chunk-ZAMHKQQC.mjs.LEGAL.txt +0 -0
- package/dist/chunk-ZAMHKQQC.mjs.map +0 -1
- package/lib/StyleOptions.d.ts +0 -697
- package/lib/StyleOptions.d.ts.map +0 -1
- package/lib/StyleOptions.js +0 -2
- package/lib/decorator/index.d.ts +0 -5
- package/lib/decorator/index.d.ts.map +0 -1
- package/lib/decorator/index.js +0 -28
- package/lib/decorator/private/ActivityBorderDecoratorMiddleware.d.ts +0 -27
- package/lib/decorator/private/ActivityBorderDecoratorMiddleware.d.ts.map +0 -1
- package/lib/decorator/private/ActivityBorderDecoratorMiddleware.js +0 -19
- package/lib/decorator/private/ActivityDecorator.d.ts +0 -9
- package/lib/decorator/private/ActivityDecorator.d.ts.map +0 -1
- package/lib/decorator/private/ActivityDecorator.js +0 -36
- package/lib/decorator/private/DecoratorComposer.d.ts +0 -3
- package/lib/decorator/private/DecoratorComposer.d.ts.map +0 -1
- package/lib/decorator/private/DecoratorComposer.js +0 -13
- package/lib/decorator/private/activityDecoratorRequest.d.ts +0 -6
- package/lib/decorator/private/activityDecoratorRequest.d.ts.map +0 -1
- package/lib/decorator/private/activityDecoratorRequest.js +0 -2
- package/lib/decorator/private/createDecoratorComposer.d.ts +0 -11
- package/lib/decorator/private/createDecoratorComposer.d.ts.map +0 -1
- package/lib/decorator/private/createDecoratorComposer.js +0 -27
- package/lib/decorator/private/templateMiddleware.d.ts +0 -30
- package/lib/decorator/private/templateMiddleware.d.ts.map +0 -1
- package/lib/decorator/private/templateMiddleware.js +0 -53
- package/lib/decorator/private/templateMiddleware.test.d.ts +0 -3
- package/lib/decorator/private/templateMiddleware.test.d.ts.map +0 -1
- package/lib/defaultStyleOptions.d.ts +0 -4
- package/lib/defaultStyleOptions.d.ts.map +0 -1
- package/lib/defaultStyleOptions.js +0 -277
- package/lib/external/PrecompiledGlobalize.js +0 -6361
- package/lib/hooks/Composer.d.ts +0 -88
- package/lib/hooks/Composer.d.ts.map +0 -1
- package/lib/hooks/Composer.js +0 -605
- package/lib/hooks/index.d.ts +0 -73
- package/lib/hooks/index.d.ts.map +0 -1
- package/lib/hooks/index.js +0 -504
- package/lib/hooks/internal/ErrorBox.js +0 -47
- package/lib/hooks/internal/SendBoxMiddleware.d.ts +0 -37
- package/lib/hooks/internal/SendBoxMiddleware.d.ts.map +0 -1
- package/lib/hooks/internal/SendBoxMiddleware.js +0 -17
- package/lib/hooks/internal/SendBoxToolbarMiddleware.d.ts +0 -37
- package/lib/hooks/internal/SendBoxToolbarMiddleware.d.ts.map +0 -1
- package/lib/hooks/internal/SendBoxToolbarMiddleware.js +0 -17
- package/lib/hooks/internal/Tracker.d.ts +0 -4
- package/lib/hooks/internal/Tracker.d.ts.map +0 -1
- package/lib/hooks/internal/Tracker.js +0 -15
- package/lib/hooks/internal/WebChatAPIContext.d.ts +0 -80
- package/lib/hooks/internal/WebChatAPIContext.d.ts.map +0 -1
- package/lib/hooks/internal/WebChatAPIContext.js +0 -12
- package/lib/hooks/internal/WebChatReduxContext.js +0 -17
- package/lib/hooks/internal/defaultSelectVoice.js +0 -28
- package/lib/hooks/internal/private/templateMiddleware.d.ts +0 -3
- package/lib/hooks/internal/private/templateMiddleware.d.ts.map +0 -1
- package/lib/hooks/internal/private/templateMiddleware.js +0 -12
- package/lib/hooks/internal/useCreateActivityRendererInternal.d.ts +0 -4
- package/lib/hooks/internal/useCreateActivityRendererInternal.d.ts.map +0 -1
- package/lib/hooks/internal/useCreateActivityRendererInternal.js +0 -37
- package/lib/hooks/internal/useDebugDeps.js +0 -39
- package/lib/hooks/internal/useDirFromProps.js +0 -12
- package/lib/hooks/internal/useErrorBoxClass.js +0 -14
- package/lib/hooks/internal/useForceRender.js +0 -24
- package/lib/hooks/internal/useLocalizedGlobalize.js +0 -12
- package/lib/hooks/internal/useLocalizedStrings.js +0 -14
- package/lib/hooks/internal/useMarkActivity.js +0 -12
- package/lib/hooks/internal/usePrevious.d.ts +0 -3
- package/lib/hooks/internal/usePrevious.d.ts.map +0 -1
- package/lib/hooks/internal/usePrevious.js +0 -15
- package/lib/hooks/internal/useReadTelemetryDimensions.js +0 -20
- package/lib/hooks/internal/useSetDictateState.d.ts +0 -2
- package/lib/hooks/internal/useSetDictateState.d.ts.map +0 -1
- package/lib/hooks/internal/useSetDictateState.js +0 -12
- package/lib/hooks/internal/useTimer.d.ts +0 -5
- package/lib/hooks/internal/useTimer.d.ts.map +0 -1
- package/lib/hooks/internal/useTimer.js +0 -43
- package/lib/hooks/internal/useTracker.js +0 -42
- package/lib/hooks/internal/useValueRef.d.ts +0 -3
- package/lib/hooks/internal/useValueRef.d.ts.map +0 -1
- package/lib/hooks/internal/useValueRef.js +0 -22
- package/lib/hooks/internal/useWebChatAPIContext.d.ts +0 -83
- package/lib/hooks/internal/useWebChatAPIContext.d.ts.map +0 -1
- package/lib/hooks/internal/useWebChatAPIContext.js +0 -17
- package/lib/hooks/middleware/UserlandBoundary.js +0 -48
- package/lib/hooks/middleware/applyMiddleware.js +0 -122
- package/lib/hooks/middleware/concatMiddleware.d.ts +0 -6
- package/lib/hooks/middleware/concatMiddleware.d.ts.map +0 -1
- package/lib/hooks/middleware/concatMiddleware.js +0 -33
- package/lib/hooks/middleware/createDefaultCardActionMiddleware.d.ts +0 -3
- package/lib/hooks/middleware/createDefaultCardActionMiddleware.d.ts.map +0 -1
- package/lib/hooks/middleware/createDefaultCardActionMiddleware.js +0 -43
- package/lib/hooks/middleware/createDefaultGroupActivitiesMiddleware.d.ts +0 -7
- package/lib/hooks/middleware/createDefaultGroupActivitiesMiddleware.d.ts.map +0 -1
- package/lib/hooks/middleware/createDefaultGroupActivitiesMiddleware.js +0 -68
- package/lib/hooks/private/numberWithInfinity.d.ts +0 -3
- package/lib/hooks/private/numberWithInfinity.d.ts.map +0 -1
- package/lib/hooks/private/numberWithInfinity.js +0 -17
- package/lib/hooks/private/numberWithInfinity.spec.d.ts +0 -2
- package/lib/hooks/private/numberWithInfinity.spec.d.ts.map +0 -1
- package/lib/hooks/private/reduceIterable.d.ts +0 -2
- package/lib/hooks/private/reduceIterable.d.ts.map +0 -1
- package/lib/hooks/private/reduceIterable.js +0 -26
- package/lib/hooks/private/reduceIterable.spec.d.ts +0 -2
- package/lib/hooks/private/reduceIterable.spec.d.ts.map +0 -1
- package/lib/hooks/useActiveTyping.d.ts +0 -4
- package/lib/hooks/useActiveTyping.d.ts.map +0 -1
- package/lib/hooks/useActiveTyping.js +0 -81
- package/lib/hooks/useActivities.d.ts +0 -3
- package/lib/hooks/useActivities.d.ts.map +0 -1
- package/lib/hooks/useActivities.js +0 -14
- package/lib/hooks/useActivityKeys.d.ts +0 -3
- package/lib/hooks/useActivityKeys.d.ts.map +0 -1
- package/lib/hooks/useActivityKeys.js +0 -11
- package/lib/hooks/useActivityKeysByRead.d.ts +0 -3
- package/lib/hooks/useActivityKeysByRead.d.ts.map +0 -1
- package/lib/hooks/useActivityKeysByRead.js +0 -11
- package/lib/hooks/useAvatarForBot.d.ts +0 -5
- package/lib/hooks/useAvatarForBot.d.ts.map +0 -1
- package/lib/hooks/useAvatarForBot.js +0 -26
- package/lib/hooks/useAvatarForUser.d.ts +0 -5
- package/lib/hooks/useAvatarForUser.d.ts.map +0 -1
- package/lib/hooks/useAvatarForUser.js +0 -26
- package/lib/hooks/useByteFormatter.d.ts +0 -2
- package/lib/hooks/useByteFormatter.d.ts.map +0 -1
- package/lib/hooks/useByteFormatter.js +0 -43
- package/lib/hooks/useConnectivityStatus.d.ts +0 -2
- package/lib/hooks/useConnectivityStatus.d.ts.map +0 -1
- package/lib/hooks/useConnectivityStatus.js +0 -14
- package/lib/hooks/useCreateActivityRenderer.d.ts +0 -3
- package/lib/hooks/useCreateActivityRenderer.d.ts.map +0 -1
- package/lib/hooks/useCreateActivityRenderer.js +0 -14
- package/lib/hooks/useCreateActivityStatusRenderer.d.ts +0 -10
- package/lib/hooks/useCreateActivityStatusRenderer.d.ts.map +0 -1
- package/lib/hooks/useCreateActivityStatusRenderer.js +0 -72
- package/lib/hooks/useCreateAttachmentForScreenReaderRenderer.d.ts +0 -3
- package/lib/hooks/useCreateAttachmentForScreenReaderRenderer.d.ts.map +0 -1
- package/lib/hooks/useCreateAttachmentForScreenReaderRenderer.js +0 -12
- package/lib/hooks/useCreateAvatarRenderer.d.ts +0 -6
- package/lib/hooks/useCreateAvatarRenderer.d.ts.map +0 -1
- package/lib/hooks/useCreateAvatarRenderer.js +0 -44
- package/lib/hooks/useCreateScrollToEndButtonRenderer.d.ts +0 -3
- package/lib/hooks/useCreateScrollToEndButtonRenderer.d.ts.map +0 -1
- package/lib/hooks/useCreateScrollToEndButtonRenderer.js +0 -12
- package/lib/hooks/useDateFormatter.d.ts +0 -2
- package/lib/hooks/useDateFormatter.d.ts.map +0 -1
- package/lib/hooks/useDateFormatter.js +0 -35
- package/lib/hooks/useDebouncedNotifications.d.ts +0 -13
- package/lib/hooks/useDebouncedNotifications.d.ts.map +0 -1
- package/lib/hooks/useDebouncedNotifications.js +0 -118
- package/lib/hooks/useDictateInterims.d.ts +0 -2
- package/lib/hooks/useDictateInterims.d.ts.map +0 -1
- package/lib/hooks/useDictateInterims.js +0 -16
- package/lib/hooks/useDictateState.d.ts +0 -2
- package/lib/hooks/useDictateState.d.ts.map +0 -1
- package/lib/hooks/useDictateState.js +0 -15
- package/lib/hooks/useDirection.d.ts +0 -2
- package/lib/hooks/useDirection.d.ts.map +0 -1
- package/lib/hooks/useDirection.js +0 -38
- package/lib/hooks/useDisabled.d.ts +0 -2
- package/lib/hooks/useDisabled.d.ts.map +0 -1
- package/lib/hooks/useDisabled.js +0 -12
- package/lib/hooks/useDismissNotification.d.ts +0 -2
- package/lib/hooks/useDismissNotification.d.ts.map +0 -1
- package/lib/hooks/useDismissNotification.js +0 -12
- package/lib/hooks/useEmitTypingIndicator.d.ts +0 -2
- package/lib/hooks/useEmitTypingIndicator.d.ts.map +0 -1
- package/lib/hooks/useEmitTypingIndicator.js +0 -12
- package/lib/hooks/useGetActivitiesByKey.d.ts +0 -3
- package/lib/hooks/useGetActivitiesByKey.d.ts.map +0 -1
- package/lib/hooks/useGetActivitiesByKey.js +0 -11
- package/lib/hooks/useGetActivityByKey.d.ts +0 -3
- package/lib/hooks/useGetActivityByKey.d.ts.map +0 -1
- package/lib/hooks/useGetActivityByKey.js +0 -11
- package/lib/hooks/useGetHasAcknowledgedByActivityKey.d.ts +0 -3
- package/lib/hooks/useGetHasAcknowledgedByActivityKey.d.ts.map +0 -1
- package/lib/hooks/useGetHasAcknowledgedByActivityKey.js +0 -11
- package/lib/hooks/useGetKeyByActivity.d.ts +0 -3
- package/lib/hooks/useGetKeyByActivity.d.ts.map +0 -1
- package/lib/hooks/useGetKeyByActivity.js +0 -11
- package/lib/hooks/useGetKeyByActivityId.d.ts +0 -3
- package/lib/hooks/useGetKeyByActivityId.d.ts.map +0 -1
- package/lib/hooks/useGetKeyByActivityId.js +0 -11
- package/lib/hooks/useGetSendTimeoutForActivity.d.ts +0 -5
- package/lib/hooks/useGetSendTimeoutForActivity.d.ts.map +0 -1
- package/lib/hooks/useGetSendTimeoutForActivity.js +0 -33
- package/lib/hooks/useGrammars.d.ts +0 -2
- package/lib/hooks/useGrammars.d.ts.map +0 -1
- package/lib/hooks/useGrammars.js +0 -12
- package/lib/hooks/useGroupActivities.d.ts +0 -8
- package/lib/hooks/useGroupActivities.d.ts.map +0 -1
- package/lib/hooks/useGroupActivities.js +0 -12
- package/lib/hooks/useGroupTimestamp.d.ts +0 -2
- package/lib/hooks/useGroupTimestamp.d.ts.map +0 -1
- package/lib/hooks/useGroupTimestamp.js +0 -21
- package/lib/hooks/useLanguage.d.ts +0 -2
- package/lib/hooks/useLanguage.d.ts.map +0 -1
- package/lib/hooks/useLanguage.js +0 -19
- package/lib/hooks/useLastAcknowledgedActivityKey.d.ts +0 -3
- package/lib/hooks/useLastAcknowledgedActivityKey.d.ts.map +0 -1
- package/lib/hooks/useLastAcknowledgedActivityKey.js +0 -11
- package/lib/hooks/useLastReadActivityKey.d.ts +0 -3
- package/lib/hooks/useLastReadActivityKey.d.ts.map +0 -1
- package/lib/hooks/useLastReadActivityKey.js +0 -11
- package/lib/hooks/useLocalizer.d.ts +0 -13
- package/lib/hooks/useLocalizer.d.ts.map +0 -1
- package/lib/hooks/useLocalizer.js +0 -75
- package/lib/hooks/useMarkActivityAsSpoken.d.ts +0 -3
- package/lib/hooks/useMarkActivityAsSpoken.d.ts.map +0 -1
- package/lib/hooks/useMarkActivityAsSpoken.js +0 -16
- package/lib/hooks/useMarkActivityKeyAsRead.d.ts +0 -3
- package/lib/hooks/useMarkActivityKeyAsRead.d.ts.map +0 -1
- package/lib/hooks/useMarkActivityKeyAsRead.js +0 -11
- package/lib/hooks/useMarkAllAsAcknowledged.d.ts +0 -3
- package/lib/hooks/useMarkAllAsAcknowledged.d.ts.map +0 -1
- package/lib/hooks/useMarkAllAsAcknowledged.js +0 -11
- package/lib/hooks/useNotifications.d.ts +0 -3
- package/lib/hooks/useNotifications.d.ts.map +0 -1
- package/lib/hooks/useNotifications.js +0 -14
- package/lib/hooks/usePerformCardAction.d.ts +0 -3
- package/lib/hooks/usePerformCardAction.d.ts.map +0 -1
- package/lib/hooks/usePerformCardAction.js +0 -12
- package/lib/hooks/usePonyfill.d.ts +0 -3
- package/lib/hooks/usePonyfill.d.ts.map +0 -1
- package/lib/hooks/usePonyfill.js +0 -11
- package/lib/hooks/usePostActivity.d.ts +0 -3
- package/lib/hooks/usePostActivity.d.ts.map +0 -1
- package/lib/hooks/usePostActivity.js +0 -12
- package/lib/hooks/useReferenceGrammarID.d.ts +0 -2
- package/lib/hooks/useReferenceGrammarID.d.ts.map +0 -1
- package/lib/hooks/useReferenceGrammarID.js +0 -14
- package/lib/hooks/useRelativeTimeFormatter.d.ts +0 -2
- package/lib/hooks/useRelativeTimeFormatter.d.ts.map +0 -1
- package/lib/hooks/useRelativeTimeFormatter.js +0 -61
- package/lib/hooks/useRenderAttachment.d.ts +0 -3
- package/lib/hooks/useRenderAttachment.d.ts.map +0 -1
- package/lib/hooks/useRenderAttachment.js +0 -14
- package/lib/hooks/useRenderToast.d.ts +0 -3
- package/lib/hooks/useRenderToast.d.ts.map +0 -1
- package/lib/hooks/useRenderToast.js +0 -12
- package/lib/hooks/useRenderTypingIndicator.d.ts +0 -3
- package/lib/hooks/useRenderTypingIndicator.d.ts.map +0 -1
- package/lib/hooks/useRenderTypingIndicator.js +0 -12
- package/lib/hooks/useSendBoxAttachments.d.ts +0 -6
- package/lib/hooks/useSendBoxAttachments.d.ts.map +0 -1
- package/lib/hooks/useSendBoxAttachments.js +0 -23
- package/lib/hooks/useSendBoxValue.d.ts +0 -2
- package/lib/hooks/useSendBoxValue.d.ts.map +0 -1
- package/lib/hooks/useSendBoxValue.js +0 -16
- package/lib/hooks/useSendEvent.d.ts +0 -2
- package/lib/hooks/useSendEvent.d.ts.map +0 -1
- package/lib/hooks/useSendEvent.js +0 -12
- package/lib/hooks/useSendFiles.d.ts +0 -10
- package/lib/hooks/useSendFiles.d.ts.map +0 -1
- package/lib/hooks/useSendFiles.js +0 -35
- package/lib/hooks/useSendMessage.d.ts +0 -6
- package/lib/hooks/useSendMessage.d.ts.map +0 -1
- package/lib/hooks/useSendMessage.js +0 -33
- package/lib/hooks/useSendMessageBack.d.ts +0 -2
- package/lib/hooks/useSendMessageBack.d.ts.map +0 -1
- package/lib/hooks/useSendMessageBack.js +0 -12
- package/lib/hooks/useSendPostBack.d.ts +0 -2
- package/lib/hooks/useSendPostBack.d.ts.map +0 -1
- package/lib/hooks/useSendPostBack.js +0 -12
- package/lib/hooks/useSendStatusByActivityKey.d.ts +0 -22
- package/lib/hooks/useSendStatusByActivityKey.d.ts.map +0 -1
- package/lib/hooks/useSendStatusByActivityKey.js +0 -31
- package/lib/hooks/useSendTimeoutForActivity.d.ts +0 -4
- package/lib/hooks/useSendTimeoutForActivity.d.ts.map +0 -1
- package/lib/hooks/useSendTimeoutForActivity.js +0 -22
- package/lib/hooks/useSendTypingIndicator.d.ts +0 -2
- package/lib/hooks/useSendTypingIndicator.d.ts.map +0 -1
- package/lib/hooks/useSendTypingIndicator.js +0 -14
- package/lib/hooks/useSetNotification.d.ts +0 -3
- package/lib/hooks/useSetNotification.d.ts.map +0 -1
- package/lib/hooks/useSetNotification.js +0 -12
- package/lib/hooks/useShouldSpeakIncomingActivity.d.ts +0 -2
- package/lib/hooks/useShouldSpeakIncomingActivity.d.ts.map +0 -1
- package/lib/hooks/useShouldSpeakIncomingActivity.js +0 -22
- package/lib/hooks/useStartDictate.d.ts +0 -2
- package/lib/hooks/useStartDictate.d.ts.map +0 -1
- package/lib/hooks/useStartDictate.js +0 -12
- package/lib/hooks/useStopDictate.d.ts +0 -2
- package/lib/hooks/useStopDictate.d.ts.map +0 -1
- package/lib/hooks/useStopDictate.js +0 -12
- package/lib/hooks/useStyleOptions.d.ts +0 -3
- package/lib/hooks/useStyleOptions.d.ts.map +0 -1
- package/lib/hooks/useStyleOptions.js +0 -12
- package/lib/hooks/useSubmitSendBox.d.ts +0 -4
- package/lib/hooks/useSubmitSendBox.d.ts.map +0 -1
- package/lib/hooks/useSubmitSendBox.js +0 -49
- package/lib/hooks/useSuggestedActions.d.ts +0 -3
- package/lib/hooks/useSuggestedActions.d.ts.map +0 -1
- package/lib/hooks/useSuggestedActions.js +0 -25
- package/lib/hooks/useTimeoutForSend.d.ts +0 -3
- package/lib/hooks/useTimeoutForSend.d.ts.map +0 -1
- package/lib/hooks/useTimeoutForSend.js +0 -21
- package/lib/hooks/useTrackDimension.d.ts +0 -2
- package/lib/hooks/useTrackDimension.d.ts.map +0 -1
- package/lib/hooks/useTrackDimension.js +0 -14
- package/lib/hooks/useTrackEvent.d.ts +0 -10
- package/lib/hooks/useTrackEvent.d.ts.map +0 -1
- package/lib/hooks/useTrackEvent.js +0 -51
- package/lib/hooks/useTrackException.d.ts +0 -2
- package/lib/hooks/useTrackException.d.ts.map +0 -1
- package/lib/hooks/useTrackException.js +0 -31
- package/lib/hooks/useTrackTiming.d.ts +0 -2
- package/lib/hooks/useTrackTiming.d.ts.map +0 -1
- package/lib/hooks/useTrackTiming.js +0 -93
- package/lib/hooks/useUserID.d.ts +0 -2
- package/lib/hooks/useUserID.d.ts.map +0 -1
- package/lib/hooks/useUserID.js +0 -12
- package/lib/hooks/useUsername.d.ts +0 -2
- package/lib/hooks/useUsername.d.ts.map +0 -1
- package/lib/hooks/useUsername.js +0 -12
- package/lib/hooks/useVoiceSelector.d.ts +0 -2
- package/lib/hooks/useVoiceSelector.d.ts.map +0 -1
- package/lib/hooks/useVoiceSelector.js +0 -16
- package/lib/hooks/utils/ErrorBoundary.js +0 -68
- package/lib/hooks/utils/observableToPromise.d.ts +0 -3
- package/lib/hooks/utils/observableToPromise.d.ts.map +0 -1
- package/lib/hooks/utils/observableToPromise.js +0 -28
- package/lib/index.d.ts +0 -37
- package/lib/index.d.ts.map +0 -1
- package/lib/index.js +0 -88
- package/lib/internal.d.ts +0 -3
- package/lib/internal.d.ts.map +0 -1
- package/lib/internal.js +0 -14
- package/lib/localization/Localize.d.ts +0 -4
- package/lib/localization/Localize.d.ts.map +0 -1
- package/lib/localization/Localize.js +0 -50
- package/lib/localization/ar-EG.json +0 -42
- package/lib/localization/ar-JO.json +0 -45
- package/lib/localization/ar-SA.json +0 -112
- package/lib/localization/bg-BG.json +0 -112
- package/lib/localization/ca-ES.json +0 -112
- package/lib/localization/cs-CZ.json +0 -112
- package/lib/localization/da-DK.json +0 -112
- package/lib/localization/de-DE.json +0 -112
- package/lib/localization/el-GR.json +0 -112
- package/lib/localization/en-US.json +0 -183
- package/lib/localization/es-ES.json +0 -112
- package/lib/localization/et-EE.json +0 -112
- package/lib/localization/eu-ES.json +0 -112
- package/lib/localization/fi-FI.json +0 -112
- package/lib/localization/fr-FR.json +0 -112
- package/lib/localization/getAllLocalizedStrings.d.ts +0 -6
- package/lib/localization/getAllLocalizedStrings.d.ts.map +0 -1
- package/lib/localization/getAllLocalizedStrings.js +0 -117
- package/lib/localization/getRTLList.d.ts +0 -2
- package/lib/localization/getRTLList.d.ts.map +0 -1
- package/lib/localization/getRTLList.js +0 -46
- package/lib/localization/gl-ES.json +0 -112
- package/lib/localization/he-IL.json +0 -112
- package/lib/localization/hi-IN.json +0 -112
- package/lib/localization/hr-HR.json +0 -112
- package/lib/localization/hu-HU.json +0 -112
- package/lib/localization/id-ID.json +0 -112
- package/lib/localization/it-IT.json +0 -112
- package/lib/localization/ja-JP.json +0 -112
- package/lib/localization/kk-KZ.json +0 -112
- package/lib/localization/ko-KR.json +0 -112
- package/lib/localization/lt-LT.json +0 -112
- package/lib/localization/lv-LV.json +0 -112
- package/lib/localization/mergeLocalizedStrings.d.ts +0 -7
- package/lib/localization/mergeLocalizedStrings.d.ts.map +0 -1
- package/lib/localization/mergeLocalizedStrings.js +0 -49
- package/lib/localization/ms-MY.json +0 -112
- package/lib/localization/nb-NO.json +0 -112
- package/lib/localization/nl-NL.json +0 -112
- package/lib/localization/overrides.json +0 -257
- package/lib/localization/pl-PL.json +0 -112
- package/lib/localization/pt-BR.json +0 -112
- package/lib/localization/pt-PT.json +0 -112
- package/lib/localization/ro-RO.json +0 -112
- package/lib/localization/ru-RU.json +0 -112
- package/lib/localization/sk-SK.json +0 -112
- package/lib/localization/sl-SI.json +0 -112
- package/lib/localization/sl-SL.json +0 -3
- package/lib/localization/sr-Cyrl-CS.json +0 -112
- package/lib/localization/sr-Cyrl.json +0 -3
- package/lib/localization/sr-Latn-CS.json +0 -112
- package/lib/localization/sr-Latn.json +0 -3
- package/lib/localization/sv-SE.json +0 -112
- package/lib/localization/th-TH.json +0 -112
- package/lib/localization/tr-TR.json +0 -112
- package/lib/localization/uk-UA.json +0 -112
- package/lib/localization/vi-VN.json +0 -112
- package/lib/localization/yue.json +0 -115
- package/lib/localization/zh-CN.json +0 -112
- package/lib/localization/zh-HK.json +0 -112
- package/lib/localization/zh-TW.json +0 -112
- package/lib/normalizeStyleOptions.d.ts +0 -3
- package/lib/normalizeStyleOptions.d.ts.map +0 -1
- package/lib/normalizeStyleOptions.js +0 -147
- package/lib/patchStyleOptionsFromDeprecatedProps.js +0 -21
- package/lib/providers/ActivityAcknowledgement/ActivityAcknowledgementComposer.d.ts +0 -6
- package/lib/providers/ActivityAcknowledgement/ActivityAcknowledgementComposer.d.ts.map +0 -1
- package/lib/providers/ActivityAcknowledgement/ActivityAcknowledgementComposer.js +0 -153
- package/lib/providers/ActivityAcknowledgement/private/Context.d.ts +0 -13
- package/lib/providers/ActivityAcknowledgement/private/Context.d.ts.map +0 -1
- package/lib/providers/ActivityAcknowledgement/private/Context.js +0 -14
- package/lib/providers/ActivityAcknowledgement/private/useContext.d.ts +0 -3
- package/lib/providers/ActivityAcknowledgement/private/useContext.d.ts.map +0 -1
- package/lib/providers/ActivityAcknowledgement/private/useContext.js +0 -18
- package/lib/providers/ActivityAcknowledgement/useActivityKeysByRead.d.ts +0 -5
- package/lib/providers/ActivityAcknowledgement/useActivityKeysByRead.d.ts.map +0 -1
- package/lib/providers/ActivityAcknowledgement/useActivityKeysByRead.js +0 -15
- package/lib/providers/ActivityAcknowledgement/useGetHasAcknowledgedByActivityKey.d.ts +0 -2
- package/lib/providers/ActivityAcknowledgement/useGetHasAcknowledgedByActivityKey.d.ts.map +0 -1
- package/lib/providers/ActivityAcknowledgement/useGetHasAcknowledgedByActivityKey.js +0 -12
- package/lib/providers/ActivityAcknowledgement/useLastAcknowledgedActivityKey.d.ts +0 -2
- package/lib/providers/ActivityAcknowledgement/useLastAcknowledgedActivityKey.d.ts.map +0 -1
- package/lib/providers/ActivityAcknowledgement/useLastAcknowledgedActivityKey.js +0 -12
- package/lib/providers/ActivityAcknowledgement/useLastReadActivityKey.d.ts +0 -2
- package/lib/providers/ActivityAcknowledgement/useLastReadActivityKey.d.ts.map +0 -1
- package/lib/providers/ActivityAcknowledgement/useLastReadActivityKey.js +0 -12
- package/lib/providers/ActivityAcknowledgement/useMarkActivityKeyAsRead.d.ts +0 -2
- package/lib/providers/ActivityAcknowledgement/useMarkActivityKeyAsRead.d.ts.map +0 -1
- package/lib/providers/ActivityAcknowledgement/useMarkActivityKeyAsRead.js +0 -12
- package/lib/providers/ActivityAcknowledgement/useMarkAllAsAcknowledged.d.ts +0 -2
- package/lib/providers/ActivityAcknowledgement/useMarkAllAsAcknowledged.d.ts.map +0 -1
- package/lib/providers/ActivityAcknowledgement/useMarkAllAsAcknowledged.js +0 -12
- package/lib/providers/ActivityKeyer/ActivityKeyerComposer.d.ts +0 -20
- package/lib/providers/ActivityKeyer/ActivityKeyerComposer.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/ActivityKeyerComposer.js +0 -149
- package/lib/providers/ActivityKeyer/private/Context.d.ts +0 -13
- package/lib/providers/ActivityKeyer/private/Context.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/private/Context.js +0 -10
- package/lib/providers/ActivityKeyer/private/getActivityId.d.ts +0 -3
- package/lib/providers/ActivityKeyer/private/getActivityId.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/private/getActivityId.js +0 -10
- package/lib/providers/ActivityKeyer/private/getClientActivityId.d.ts +0 -3
- package/lib/providers/ActivityKeyer/private/getClientActivityId.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/private/getClientActivityId.js +0 -11
- package/lib/providers/ActivityKeyer/private/lastOf.d.ts +0 -2
- package/lib/providers/ActivityKeyer/private/lastOf.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/private/lastOf.js +0 -10
- package/lib/providers/ActivityKeyer/private/lastOf.spec.d.ts +0 -2
- package/lib/providers/ActivityKeyer/private/lastOf.spec.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/private/someIterable.d.ts +0 -2
- package/lib/providers/ActivityKeyer/private/someIterable.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/private/someIterable.js +0 -27
- package/lib/providers/ActivityKeyer/private/someIterable.spec.d.ts +0 -2
- package/lib/providers/ActivityKeyer/private/someIterable.spec.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/private/uniqueId.d.ts +0 -2
- package/lib/providers/ActivityKeyer/private/uniqueId.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/private/uniqueId.js +0 -15
- package/lib/providers/ActivityKeyer/private/useContext.d.ts +0 -3
- package/lib/providers/ActivityKeyer/private/useContext.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/private/useContext.js +0 -18
- package/lib/providers/ActivityKeyer/useActivityKeys.d.ts +0 -2
- package/lib/providers/ActivityKeyer/useActivityKeys.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/useActivityKeys.js +0 -12
- package/lib/providers/ActivityKeyer/useGetActivitiesByKey.d.ts +0 -3
- package/lib/providers/ActivityKeyer/useGetActivitiesByKey.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/useGetActivitiesByKey.js +0 -12
- package/lib/providers/ActivityKeyer/useGetActivityByKey.d.ts +0 -3
- package/lib/providers/ActivityKeyer/useGetActivityByKey.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/useGetActivityByKey.js +0 -12
- package/lib/providers/ActivityKeyer/useGetKeyByActivity.d.ts +0 -3
- package/lib/providers/ActivityKeyer/useGetKeyByActivity.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/useGetKeyByActivity.js +0 -12
- package/lib/providers/ActivityKeyer/useGetKeyByActivityId.d.ts +0 -2
- package/lib/providers/ActivityKeyer/useGetKeyByActivityId.d.ts.map +0 -1
- package/lib/providers/ActivityKeyer/useGetKeyByActivityId.js +0 -12
- package/lib/providers/ActivityListener/ActivityListenerComposer.d.ts +0 -7
- package/lib/providers/ActivityListener/ActivityListenerComposer.d.ts.map +0 -1
- package/lib/providers/ActivityListener/ActivityListenerComposer.js +0 -55
- package/lib/providers/ActivityListener/private/Context.d.ts +0 -8
- package/lib/providers/ActivityListener/private/Context.d.ts.map +0 -1
- package/lib/providers/ActivityListener/private/Context.js +0 -15
- package/lib/providers/ActivityListener/private/useContext.d.ts +0 -2
- package/lib/providers/ActivityListener/private/useContext.d.ts.map +0 -1
- package/lib/providers/ActivityListener/private/useContext.js +0 -13
- package/lib/providers/ActivityListener/useUpsertedActivities.d.ts +0 -3
- package/lib/providers/ActivityListener/useUpsertedActivities.d.ts.map +0 -1
- package/lib/providers/ActivityListener/useUpsertedActivities.js +0 -12
- package/lib/providers/ActivitySendStatus/ActivitySendStatusComposer.d.ts +0 -4
- package/lib/providers/ActivitySendStatus/ActivitySendStatusComposer.d.ts.map +0 -1
- package/lib/providers/ActivitySendStatus/ActivitySendStatusComposer.js +0 -149
- package/lib/providers/ActivitySendStatus/private/Context.d.ts +0 -9
- package/lib/providers/ActivitySendStatus/private/Context.d.ts.map +0 -1
- package/lib/providers/ActivitySendStatus/private/Context.js +0 -13
- package/lib/providers/ActivitySendStatus/private/isMapEqual.d.ts +0 -7
- package/lib/providers/ActivitySendStatus/private/isMapEqual.d.ts.map +0 -1
- package/lib/providers/ActivitySendStatus/private/isMapEqual.js +0 -55
- package/lib/providers/ActivitySendStatus/private/useContext.d.ts +0 -3
- package/lib/providers/ActivitySendStatus/private/useContext.d.ts.map +0 -1
- package/lib/providers/ActivitySendStatus/private/useContext.js +0 -18
- package/lib/providers/ActivitySendStatus/useSendStatusByActivityKey.d.ts +0 -22
- package/lib/providers/ActivitySendStatus/useSendStatusByActivityKey.d.ts.map +0 -1
- package/lib/providers/ActivitySendStatus/useSendStatusByActivityKey.js +0 -31
- package/lib/providers/ActivitySendStatusTelemetry/ActivitySendStatusTelemetryComposer.d.ts +0 -3
- package/lib/providers/ActivitySendStatusTelemetry/ActivitySendStatusTelemetryComposer.d.ts.map +0 -1
- package/lib/providers/ActivitySendStatusTelemetry/ActivitySendStatusTelemetryComposer.js +0 -71
- package/lib/providers/ActivityTyping/ActivityTypingComposer.d.ts +0 -9
- package/lib/providers/ActivityTyping/ActivityTypingComposer.d.ts.map +0 -1
- package/lib/providers/ActivityTyping/ActivityTypingComposer.js +0 -98
- package/lib/providers/ActivityTyping/private/Context.d.ts +0 -8
- package/lib/providers/ActivityTyping/private/Context.d.ts.map +0 -1
- package/lib/providers/ActivityTyping/private/Context.js +0 -15
- package/lib/providers/ActivityTyping/private/useContext.d.ts +0 -3
- package/lib/providers/ActivityTyping/private/useContext.d.ts.map +0 -1
- package/lib/providers/ActivityTyping/private/useContext.js +0 -13
- package/lib/providers/ActivityTyping/private/useMemoWithPrevious.d.ts +0 -3
- package/lib/providers/ActivityTyping/private/useMemoWithPrevious.d.ts.map +0 -1
- package/lib/providers/ActivityTyping/private/useMemoWithPrevious.js +0 -22
- package/lib/providers/ActivityTyping/types/AllTyping.d.ts +0 -9
- package/lib/providers/ActivityTyping/types/AllTyping.d.ts.map +0 -1
- package/lib/providers/ActivityTyping/types/AllTyping.js +0 -2
- package/lib/providers/ActivityTyping/useAllTyping.d.ts +0 -3
- package/lib/providers/ActivityTyping/useAllTyping.d.ts.map +0 -1
- package/lib/providers/ActivityTyping/useAllTyping.js +0 -12
- package/lib/providers/Ponyfill/PonyfillComposer.d.ts +0 -17
- package/lib/providers/Ponyfill/PonyfillComposer.d.ts.map +0 -1
- package/lib/providers/Ponyfill/PonyfillComposer.js +0 -87
- package/lib/providers/Ponyfill/private/PonyfillContext.d.ts +0 -8
- package/lib/providers/Ponyfill/private/PonyfillContext.d.ts.map +0 -1
- package/lib/providers/Ponyfill/private/PonyfillContext.js +0 -10
- package/lib/providers/Ponyfill/private/useContext.d.ts +0 -6
- package/lib/providers/Ponyfill/private/useContext.d.ts.map +0 -1
- package/lib/providers/Ponyfill/private/useContext.js +0 -17
- package/lib/providers/Ponyfill/usePonyfill.d.ts +0 -3
- package/lib/providers/Ponyfill/usePonyfill.d.ts.map +0 -1
- package/lib/providers/Ponyfill/usePonyfill.js +0 -12
- package/lib/tsconfig.json +0 -18
- package/lib/types/ActivityMiddleware.d.ts +0 -24
- package/lib/types/ActivityMiddleware.d.ts.map +0 -1
- package/lib/types/ActivityMiddleware.js +0 -2
- package/lib/types/ActivityStatusMiddleware.d.ts +0 -17
- package/lib/types/ActivityStatusMiddleware.d.ts.map +0 -1
- package/lib/types/ActivityStatusMiddleware.js +0 -2
- package/lib/types/AttachmentForScreenReaderMiddleware.d.ts +0 -14
- package/lib/types/AttachmentForScreenReaderMiddleware.d.ts.map +0 -1
- package/lib/types/AttachmentForScreenReaderMiddleware.js +0 -2
- package/lib/types/AttachmentMiddleware.d.ts +0 -12
- package/lib/types/AttachmentMiddleware.d.ts.map +0 -1
- package/lib/types/AttachmentMiddleware.js +0 -2
- package/lib/types/AvatarMiddleware.d.ts +0 -15
- package/lib/types/AvatarMiddleware.d.ts.map +0 -1
- package/lib/types/AvatarMiddleware.js +0 -2
- package/lib/types/CardActionMiddleware.d.ts +0 -19
- package/lib/types/CardActionMiddleware.d.ts.map +0 -1
- package/lib/types/CardActionMiddleware.js +0 -2
- package/lib/types/ComponentMiddleware.d.ts +0 -31
- package/lib/types/ComponentMiddleware.d.ts.map +0 -1
- package/lib/types/ComponentMiddleware.js +0 -2
- package/lib/types/ContextOf.d.ts +0 -4
- package/lib/types/ContextOf.d.ts.map +0 -1
- package/lib/types/ContextOf.js +0 -2
- package/lib/types/FunctionMiddleware.d.ts +0 -6
- package/lib/types/FunctionMiddleware.d.ts.map +0 -1
- package/lib/types/FunctionMiddleware.js +0 -2
- package/lib/types/GroupActivitiesMiddleware.d.ts +0 -22
- package/lib/types/GroupActivitiesMiddleware.d.ts.map +0 -1
- package/lib/types/GroupActivitiesMiddleware.js +0 -2
- package/lib/types/LocalizedStrings.d.ts +0 -5
- package/lib/types/LocalizedStrings.d.ts.map +0 -1
- package/lib/types/LocalizedStrings.js +0 -2
- package/lib/types/Notification.d.ts +0 -10
- package/lib/types/Notification.d.ts.map +0 -1
- package/lib/types/Notification.js +0 -2
- package/lib/types/PrecompiledGlobalize.d.ts +0 -13
- package/lib/types/PrecompiledGlobalize.d.ts.map +0 -1
- package/lib/types/PrecompiledGlobalize.js +0 -2
- package/lib/types/ScrollToEndButtonMiddleware.d.ts +0 -30
- package/lib/types/ScrollToEndButtonMiddleware.d.ts.map +0 -1
- package/lib/types/ScrollToEndButtonMiddleware.js +0 -2
- package/lib/types/SendStatus.d.ts +0 -3
- package/lib/types/SendStatus.d.ts.map +0 -1
- package/lib/types/SendStatus.js +0 -2
- package/lib/types/TelemetryMeasurementEvent.d.ts +0 -31
- package/lib/types/TelemetryMeasurementEvent.d.ts.map +0 -1
- package/lib/types/TelemetryMeasurementEvent.js +0 -2
- package/lib/types/ToastMiddleware.d.ts +0 -11
- package/lib/types/ToastMiddleware.d.ts.map +0 -1
- package/lib/types/ToastMiddleware.js +0 -2
- package/lib/types/Typing.d.ts +0 -8
- package/lib/types/Typing.d.ts.map +0 -1
- package/lib/types/Typing.js +0 -2
- package/lib/types/TypingIndicatorMiddleware.d.ts +0 -17
- package/lib/types/TypingIndicatorMiddleware.d.ts.map +0 -1
- package/lib/types/TypingIndicatorMiddleware.js +0 -2
- package/lib/types/WebSpeechPonyfill.d.ts +0 -19
- package/lib/types/WebSpeechPonyfill.d.ts.map +0 -1
- package/lib/types/WebSpeechPonyfill.js +0 -2
- package/lib/types/WebSpeechPonyfillFactory.d.ts +0 -6
- package/lib/types/WebSpeechPonyfillFactory.d.ts.map +0 -1
- package/lib/types/WebSpeechPonyfillFactory.js +0 -2
- package/lib/utils/createCustomEvent.d.ts +0 -4
- package/lib/utils/createCustomEvent.d.ts.map +0 -1
- package/lib/utils/createCustomEvent.js +0 -34
- package/lib/utils/findLastIndex.d.ts +0 -2
- package/lib/utils/findLastIndex.d.ts.map +0 -1
- package/lib/utils/findLastIndex.js +0 -22
- package/lib/utils/findMin.d.ts +0 -7
- package/lib/utils/findMin.d.ts.map +0 -1
- package/lib/utils/findMin.js +0 -46
- package/lib/utils/freezeArray.d.ts +0 -8
- package/lib/utils/freezeArray.d.ts.map +0 -1
- package/lib/utils/freezeArray.js +0 -19
- package/lib/utils/isObject.js +0 -12
- package/lib/utils/mapMap.d.ts +0 -6
- package/lib/utils/mapMap.d.ts.map +0 -1
- package/lib/utils/mapMap.js +0 -27
- package/lib/utils/normalizeLanguage.d.ts +0 -2
- package/lib/utils/normalizeLanguage.d.ts.map +0 -1
- package/lib/utils/normalizeLanguage.js +0 -115
- package/lib/utils/randomId.d.ts +0 -2
- package/lib/utils/randomId.d.ts.map +0 -1
- package/lib/utils/randomId.js +0 -15
- package/lib/utils/warnOnce.d.ts +0 -2
- package/lib/utils/warnOnce.d.ts.map +0 -1
- package/lib/utils/warnOnce.js +0 -16
- package/src/decorator/index.ts +0 -4
- package/src/decorator/private/ActivityBorderDecoratorMiddleware.ts +0 -31
- package/src/decorator/private/ActivityDecorator.tsx +0 -31
- package/src/decorator/private/DecoratorComposer.tsx +0 -6
- package/src/decorator/private/activityDecoratorRequest.ts +0 -6
- package/src/decorator/private/createDecoratorComposer.tsx +0 -36
- package/src/decorator/private/templateMiddleware.ts +0 -58
- package/src/hooks/internal/ErrorBox.js +0 -34
- package/src/hooks/internal/SendBoxMiddleware.ts +0 -21
- package/src/hooks/internal/SendBoxToolbarMiddleware.ts +0 -21
- package/src/hooks/internal/private/templateMiddleware.ts +0 -4
- package/src/hooks/internal/useCreateActivityRendererInternal.ts +0 -46
- package/src/hooks/internal/useDebugDeps.js +0 -30
- package/src/hooks/internal/useErrorBoxClass.js +0 -7
- package/src/hooks/middleware/createDefaultGroupActivitiesMiddleware.ts +0 -75
- package/src/hooks/useGroupActivities.ts +0 -10
- package/src/internal.ts +0 -3
- package/src/patchStyleOptionsFromDeprecatedProps.js +0 -14
- package/src/providers/ActivityTyping/private/useMemoWithPrevious.ts +0 -17
- package/src/types/ActivityMiddleware.ts +0 -36
- package/src/types/AttachmentMiddleware.ts +0 -16
- package/src/utils/isObject.js +0 -5
- package/src/utils/warnOnce.ts +0 -10
- /package/dist/{chunk-J6D5YEY6.mjs.map → botframework-webchat-api.graph.mjs.map} +0 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { useRef, useCallback, useMemo } from 'react';
|
|
2
|
+
import useCapabilities from '../../Capabilities/useCapabilities';
|
|
3
|
+
import useVoiceStateWritable from '../../../hooks/internal/useVoiceStateWritable';
|
|
4
|
+
|
|
5
|
+
const DEFAULT_SAMPLE_RATE = 24000;
|
|
6
|
+
const INT16_SCALE = 32768;
|
|
7
|
+
|
|
8
|
+
export function useAudioPlayer() {
|
|
9
|
+
const audioCtxRef = useRef<AudioContext | undefined>(undefined);
|
|
10
|
+
const lastSourceRef = useRef<AudioBufferSourceNode | undefined>(undefined);
|
|
11
|
+
const nextPlayTimeRef = useRef(0);
|
|
12
|
+
const voiceConfiguration = useCapabilities(caps => caps.voiceConfiguration);
|
|
13
|
+
const [, setVoiceState] = useVoiceStateWritable();
|
|
14
|
+
|
|
15
|
+
const sampleRate = voiceConfiguration?.sampleRate ?? DEFAULT_SAMPLE_RATE;
|
|
16
|
+
|
|
17
|
+
const queueAudio = useCallback(
|
|
18
|
+
async (base64: string) => {
|
|
19
|
+
if (!audioCtxRef.current) {
|
|
20
|
+
audioCtxRef.current = new AudioContext({ sampleRate });
|
|
21
|
+
}
|
|
22
|
+
const audioCtx = audioCtxRef.current;
|
|
23
|
+
await audioCtx.resume();
|
|
24
|
+
|
|
25
|
+
try {
|
|
26
|
+
const bytes = Uint8Array.from(atob(base64), c => c.charCodeAt(0));
|
|
27
|
+
const int16Bytes = new Int16Array(bytes.buffer);
|
|
28
|
+
const float32Bytes = new Float32Array(int16Bytes.length);
|
|
29
|
+
|
|
30
|
+
for (let i = 0; i < int16Bytes.length; i++) {
|
|
31
|
+
float32Bytes[+i] = int16Bytes.at(i) / INT16_SCALE;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const buffer = audioCtx.createBuffer(1, float32Bytes.length, audioCtx.sampleRate);
|
|
35
|
+
buffer.getChannelData(0).set(float32Bytes);
|
|
36
|
+
|
|
37
|
+
const src = audioCtx.createBufferSource();
|
|
38
|
+
src.buffer = buffer;
|
|
39
|
+
src.connect(audioCtx.destination);
|
|
40
|
+
|
|
41
|
+
// Clear previous source's onended to avoid stale callbacks
|
|
42
|
+
if (lastSourceRef.current) {
|
|
43
|
+
lastSourceRef.current.onended = null;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
src.onended = () => {
|
|
47
|
+
src.disconnect();
|
|
48
|
+
src.buffer = null;
|
|
49
|
+
// Only the last source's onended should trigger state change to 'listening'
|
|
50
|
+
if (lastSourceRef.current === src) {
|
|
51
|
+
setVoiceState('listening');
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
lastSourceRef.current = src;
|
|
56
|
+
const isFirstChunk = nextPlayTimeRef.current <= audioCtx.currentTime;
|
|
57
|
+
// Only dispatch bot_speaking on first chunk, we are resetting refs on stopAllAudio (bargein, mic off)
|
|
58
|
+
if (isFirstChunk) {
|
|
59
|
+
setVoiceState('bot_speaking');
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
nextPlayTimeRef.current = Math.max(nextPlayTimeRef.current, audioCtx.currentTime);
|
|
63
|
+
src.start(nextPlayTimeRef.current);
|
|
64
|
+
nextPlayTimeRef.current += buffer.duration;
|
|
65
|
+
} catch (error) {
|
|
66
|
+
console.warn('botframework-webchat: Error during audio playback in useAudioPlayer:', error);
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
[setVoiceState, sampleRate]
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
const stopAllAudio = useCallback(() => {
|
|
73
|
+
nextPlayTimeRef.current = 0;
|
|
74
|
+
if (lastSourceRef.current) {
|
|
75
|
+
lastSourceRef.current.onended = null;
|
|
76
|
+
lastSourceRef.current = undefined;
|
|
77
|
+
}
|
|
78
|
+
if (audioCtxRef.current) {
|
|
79
|
+
audioCtxRef.current.close();
|
|
80
|
+
audioCtxRef.current = undefined;
|
|
81
|
+
}
|
|
82
|
+
}, []);
|
|
83
|
+
|
|
84
|
+
return useMemo(
|
|
85
|
+
() =>
|
|
86
|
+
Object.freeze({
|
|
87
|
+
queueAudio,
|
|
88
|
+
stopAllAudio
|
|
89
|
+
}),
|
|
90
|
+
[queueAudio, stopAllAudio]
|
|
91
|
+
);
|
|
92
|
+
}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/** @jest-environment @happy-dom/jest-environment */
|
|
2
|
+
/// <reference types="jest" />
|
|
3
|
+
|
|
4
|
+
import { act, render, waitFor, type RenderResult } from '@testing-library/react';
|
|
5
|
+
import React, { type ComponentType } from 'react';
|
|
6
|
+
import { useRecorder } from './useRecorder';
|
|
7
|
+
|
|
8
|
+
jest.mock('../../Ponyfill/usePonyfill', () => ({ __esModule: true, default: jest.fn(() => [{ Date: global.Date }]) }));
|
|
9
|
+
jest.mock('../../Capabilities/useCapabilities', () => ({
|
|
10
|
+
__esModule: true,
|
|
11
|
+
default: jest.fn((selector: (caps: { voiceConfiguration?: { sampleRate: number } }) => unknown) =>
|
|
12
|
+
selector({ voiceConfiguration: { sampleRate: 24000 } })
|
|
13
|
+
)
|
|
14
|
+
}));
|
|
15
|
+
|
|
16
|
+
const mockTrack = {
|
|
17
|
+
stop: jest.fn()
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const mockMediaStream = {
|
|
21
|
+
getTracks: jest.fn(() => [mockTrack])
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const mockMediaDevices = {
|
|
25
|
+
getUserMedia: jest.fn().mockResolvedValue(mockMediaStream)
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const mockWorkletPort = {
|
|
29
|
+
onmessage: null as ((event: { data: unknown }) => void) | null,
|
|
30
|
+
postMessage: jest.fn()
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const mockWorkletNode = {
|
|
34
|
+
connect: jest.fn(),
|
|
35
|
+
disconnect: jest.fn(),
|
|
36
|
+
port: mockWorkletPort
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const mockSourceNode = {
|
|
40
|
+
connect: jest.fn(),
|
|
41
|
+
disconnect: jest.fn()
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const mockAudioContext = {
|
|
45
|
+
audioWorklet: {
|
|
46
|
+
addModule: jest.fn().mockResolvedValue(undefined)
|
|
47
|
+
},
|
|
48
|
+
createMediaStreamSource: jest.fn(() => mockSourceNode),
|
|
49
|
+
destination: {},
|
|
50
|
+
resume: jest.fn().mockResolvedValue(undefined),
|
|
51
|
+
state: 'running'
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// --- Global Mocks Setup ---
|
|
55
|
+
|
|
56
|
+
Object.defineProperty(global.navigator, 'mediaDevices', {
|
|
57
|
+
value: mockMediaDevices,
|
|
58
|
+
writable: true
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
global.AudioContext = jest.fn(() => mockAudioContext) as unknown as typeof AudioContext;
|
|
62
|
+
global.AudioWorkletNode = jest.fn(() => mockWorkletNode) as unknown as typeof AudioWorkletNode;
|
|
63
|
+
global.Blob = jest.fn(parts => ({ parts, type: (parts as { type?: string }[])[1]?.type })) as unknown as typeof Blob;
|
|
64
|
+
global.URL.createObjectURL = jest.fn(() => 'blob:http://localhost/mock-url');
|
|
65
|
+
global.URL.revokeObjectURL = jest.fn();
|
|
66
|
+
global.btoa = jest.fn(str => `btoa(${str})`);
|
|
67
|
+
|
|
68
|
+
// --- Tests ---
|
|
69
|
+
|
|
70
|
+
describe('useRecorder', () => {
|
|
71
|
+
let onAudioChunk: jest.Mock;
|
|
72
|
+
let HookApp: ComponentType<{ onAudioChunk: (base64: string, timestamp: string) => void }>;
|
|
73
|
+
let hookData: ReturnType<typeof useRecorder> | undefined;
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
75
|
+
let renderResult: RenderResult;
|
|
76
|
+
|
|
77
|
+
beforeEach(() => {
|
|
78
|
+
// Clear all mocks before each test
|
|
79
|
+
jest.clearAllMocks();
|
|
80
|
+
onAudioChunk = jest.fn();
|
|
81
|
+
hookData = undefined;
|
|
82
|
+
mockWorkletPort.onmessage = null;
|
|
83
|
+
(mockAudioContext.state as string) = 'running';
|
|
84
|
+
|
|
85
|
+
HookApp = ({ onAudioChunk: onChunk }) => {
|
|
86
|
+
hookData = useRecorder(onChunk);
|
|
87
|
+
return null;
|
|
88
|
+
};
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('should return record function', () => {
|
|
92
|
+
render(<HookApp onAudioChunk={onAudioChunk} />);
|
|
93
|
+
expect(typeof hookData?.record).toBe('function');
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
test('should start recording when record is called', async () => {
|
|
97
|
+
renderResult = render(<HookApp onAudioChunk={onAudioChunk} />);
|
|
98
|
+
|
|
99
|
+
act(() => {
|
|
100
|
+
hookData?.record();
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
await waitFor(() => {
|
|
104
|
+
expect(navigator.mediaDevices.getUserMedia).toHaveBeenCalledTimes(1);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
expect(global.AudioContext).toHaveBeenCalledTimes(1);
|
|
108
|
+
expect(mockAudioContext.audioWorklet.addModule).toHaveBeenCalledTimes(1);
|
|
109
|
+
expect(global.AudioWorkletNode).toHaveBeenCalledWith(expect.anything(), 'audio-recorder', {
|
|
110
|
+
processorOptions: { bufferSize: 2400 }
|
|
111
|
+
});
|
|
112
|
+
expect(mockWorkletNode.connect).toHaveBeenCalledTimes(1);
|
|
113
|
+
expect(mockWorkletPort.postMessage).toHaveBeenCalledWith({ command: 'START' });
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test('should stop recording when returned cleanup function is called', async () => {
|
|
117
|
+
renderResult = render(<HookApp onAudioChunk={onAudioChunk} />);
|
|
118
|
+
|
|
119
|
+
let stopRecording: (() => void) | undefined;
|
|
120
|
+
// Start recording
|
|
121
|
+
act(() => {
|
|
122
|
+
stopRecording = hookData?.record();
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
// Wait for async startRecording to complete
|
|
126
|
+
await waitFor(() => {
|
|
127
|
+
expect(mockWorkletPort.postMessage).toHaveBeenCalledWith({ command: 'START' });
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// Stop recording
|
|
131
|
+
act(() => {
|
|
132
|
+
stopRecording?.();
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
expect(mockWorkletPort.postMessage).toHaveBeenCalledWith({ command: 'STOP' });
|
|
136
|
+
expect(mockWorkletNode.disconnect).toHaveBeenCalledTimes(1);
|
|
137
|
+
expect(mockTrack.stop).toHaveBeenCalledTimes(1);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test('should process audio chunks sent from the worklet', async () => {
|
|
141
|
+
render(<HookApp onAudioChunk={onAudioChunk} />);
|
|
142
|
+
|
|
143
|
+
act(() => {
|
|
144
|
+
hookData?.record();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
await waitFor(() => expect(mockWorkletPort.onmessage).not.toBeNull());
|
|
148
|
+
|
|
149
|
+
// Simulate a message from the audio worklet
|
|
150
|
+
const mockAudioData = new Float32Array([0.1, 0.2, -0.1]);
|
|
151
|
+
act(() => {
|
|
152
|
+
mockWorkletPort.onmessage!({
|
|
153
|
+
data: {
|
|
154
|
+
eventType: 'audio',
|
|
155
|
+
audioData: mockAudioData
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
await waitFor(() => expect(onAudioChunk).toHaveBeenCalledTimes(1));
|
|
161
|
+
expect(global.btoa).toHaveBeenCalled();
|
|
162
|
+
// Check that timestamp is passed as second argument
|
|
163
|
+
expect(onAudioChunk).toHaveBeenCalledWith(expect.any(String), expect.any(String));
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
test('should handle suspended audio context by resuming it', async () => {
|
|
167
|
+
(mockAudioContext.state as string) = 'suspended';
|
|
168
|
+
render(<HookApp onAudioChunk={onAudioChunk} />);
|
|
169
|
+
|
|
170
|
+
act(() => {
|
|
171
|
+
hookData?.record();
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
await waitFor(() => {
|
|
175
|
+
expect(mockAudioContext.resume).toHaveBeenCalledTimes(1);
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
test('should reuse existing AudioContext on subsequent calls', async () => {
|
|
180
|
+
render(<HookApp onAudioChunk={onAudioChunk} />);
|
|
181
|
+
|
|
182
|
+
let stopRecording: (() => void) | undefined;
|
|
183
|
+
act(() => {
|
|
184
|
+
stopRecording = hookData?.record();
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
await waitFor(() => {
|
|
188
|
+
expect(mockWorkletPort.postMessage).toHaveBeenCalledWith({ command: 'START' });
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
act(() => {
|
|
192
|
+
stopRecording?.();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
act(() => {
|
|
196
|
+
hookData?.record();
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
await waitFor(() => {
|
|
200
|
+
expect(mockWorkletPort.postMessage).toHaveBeenCalledTimes(3); // START, STOP, START
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// AudioContext should only be created once
|
|
204
|
+
expect(global.AudioContext).toHaveBeenCalledTimes(1);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
test('should request microphone with correct audio constraints', async () => {
|
|
208
|
+
render(<HookApp onAudioChunk={onAudioChunk} />);
|
|
209
|
+
|
|
210
|
+
act(() => {
|
|
211
|
+
hookData?.record();
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
await waitFor(() => {
|
|
215
|
+
expect(navigator.mediaDevices.getUserMedia).toHaveBeenCalledWith({
|
|
216
|
+
audio: {
|
|
217
|
+
channelCount: 1,
|
|
218
|
+
echoCancellation: true,
|
|
219
|
+
sampleRate: 24000
|
|
220
|
+
}
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
test('should return mute function', () => {
|
|
226
|
+
render(<HookApp onAudioChunk={onAudioChunk} />);
|
|
227
|
+
expect(typeof hookData?.mute).toBe('function');
|
|
228
|
+
});
|
|
229
|
+
|
|
230
|
+
test('should send MUTE command and stop media stream when mute is called', async () => {
|
|
231
|
+
render(<HookApp onAudioChunk={onAudioChunk} />);
|
|
232
|
+
|
|
233
|
+
// Start recording first
|
|
234
|
+
act(() => {
|
|
235
|
+
hookData?.record();
|
|
236
|
+
});
|
|
237
|
+
|
|
238
|
+
await waitFor(() => {
|
|
239
|
+
expect(mockWorkletPort.postMessage).toHaveBeenCalledWith({ command: 'START' });
|
|
240
|
+
});
|
|
241
|
+
await waitFor(() => expect(mockWorkletPort.onmessage).not.toBeNull());
|
|
242
|
+
|
|
243
|
+
// Clear mocks to isolate mute behavior
|
|
244
|
+
mockWorkletPort.postMessage.mockClear();
|
|
245
|
+
mockTrack.stop.mockClear();
|
|
246
|
+
mockSourceNode.disconnect.mockClear();
|
|
247
|
+
|
|
248
|
+
// Call mute
|
|
249
|
+
act(() => {
|
|
250
|
+
hookData?.mute();
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Should send MUTE command to worklet
|
|
254
|
+
expect(mockWorkletPort.postMessage).toHaveBeenCalledWith({ command: 'MUTE' });
|
|
255
|
+
// Should stop media stream tracks (mic indicator OFF)
|
|
256
|
+
expect(mockTrack.stop).toHaveBeenCalledTimes(1);
|
|
257
|
+
// Should disconnect source node
|
|
258
|
+
expect(mockSourceNode.disconnect).toHaveBeenCalledTimes(1);
|
|
259
|
+
|
|
260
|
+
// Clear to track only muted audio
|
|
261
|
+
onAudioChunk.mockClear();
|
|
262
|
+
(global.btoa as jest.Mock).mockClear();
|
|
263
|
+
|
|
264
|
+
// Simulate audio worklet sending silent frame (all zeros) while muted
|
|
265
|
+
const silentAudioData = new Float32Array(128).fill(0);
|
|
266
|
+
act(() => {
|
|
267
|
+
mockWorkletPort.onmessage!({
|
|
268
|
+
data: {
|
|
269
|
+
eventType: 'audio',
|
|
270
|
+
audioData: silentAudioData
|
|
271
|
+
}
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
|
|
275
|
+
await waitFor(() => expect(onAudioChunk).toHaveBeenCalledTimes(1));
|
|
276
|
+
|
|
277
|
+
// Verify btoa was called with data representing zeros
|
|
278
|
+
expect(global.btoa).toHaveBeenCalled();
|
|
279
|
+
const [[btoaCall]] = (global.btoa as jest.Mock).mock.calls;
|
|
280
|
+
// All characters should be null characters (representing 16-bit zeros)
|
|
281
|
+
const allZeros = [...btoaCall].every((char: string) => char.charCodeAt(0) === 0);
|
|
282
|
+
expect(allZeros).toBe(true);
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test('should return unmute function from mute() that sends UNMUTE and restarts media stream', async () => {
|
|
286
|
+
render(<HookApp onAudioChunk={onAudioChunk} />);
|
|
287
|
+
|
|
288
|
+
// Start recording first
|
|
289
|
+
act(() => {
|
|
290
|
+
hookData?.record();
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
await waitFor(() => {
|
|
294
|
+
expect(mockWorkletPort.postMessage).toHaveBeenCalledWith({ command: 'START' });
|
|
295
|
+
});
|
|
296
|
+
await waitFor(() => expect(mockWorkletPort.onmessage).not.toBeNull());
|
|
297
|
+
|
|
298
|
+
// Call mute and get unmute function
|
|
299
|
+
let unmute: (() => void) | undefined;
|
|
300
|
+
act(() => {
|
|
301
|
+
unmute = hookData?.mute();
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
// Clear mocks to isolate unmute behavior
|
|
305
|
+
mockWorkletPort.postMessage.mockClear();
|
|
306
|
+
mockMediaDevices.getUserMedia.mockClear();
|
|
307
|
+
|
|
308
|
+
// Call unmute
|
|
309
|
+
act(() => {
|
|
310
|
+
unmute?.();
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
// Should send UNMUTE command to worklet
|
|
314
|
+
expect(mockWorkletPort.postMessage).toHaveBeenCalledWith({ command: 'UNMUTE' });
|
|
315
|
+
// Should restart media stream
|
|
316
|
+
await waitFor(() => {
|
|
317
|
+
expect(mockMediaDevices.getUserMedia).toHaveBeenCalledTimes(1);
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
// Clear mocks to track audio after unmute
|
|
321
|
+
onAudioChunk.mockClear();
|
|
322
|
+
(global.btoa as jest.Mock).mockClear();
|
|
323
|
+
|
|
324
|
+
// Simulate real audio data after unmute (non-zero values)
|
|
325
|
+
const realAudioData = new Float32Array([0.7, -0.5, 0.9, -0.2, 0.4]);
|
|
326
|
+
act(() => {
|
|
327
|
+
mockWorkletPort.onmessage!({
|
|
328
|
+
data: {
|
|
329
|
+
eventType: 'audio',
|
|
330
|
+
audioData: realAudioData
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
});
|
|
334
|
+
|
|
335
|
+
await waitFor(() => expect(onAudioChunk).toHaveBeenCalledTimes(1));
|
|
336
|
+
|
|
337
|
+
// Verify real audio (non-zero) was processed
|
|
338
|
+
expect(global.btoa).toHaveBeenCalled();
|
|
339
|
+
const [[btoaCall]] = (global.btoa as jest.Mock).mock.calls;
|
|
340
|
+
// Real audio should have non-zero bytes
|
|
341
|
+
const hasNonZero = [...btoaCall].some((char: string) => char.charCodeAt(0) !== 0);
|
|
342
|
+
expect(hasNonZero).toBe(true);
|
|
343
|
+
});
|
|
344
|
+
});
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import { useRef, useCallback, useMemo } from 'react';
|
|
2
|
+
import useCapabilities from '../../Capabilities/useCapabilities';
|
|
3
|
+
import usePonyfill from '../../Ponyfill/usePonyfill';
|
|
4
|
+
|
|
5
|
+
// Minimum AudioWorkletProcessor definition for TypeScript recognition
|
|
6
|
+
// adding reference of worker does not work
|
|
7
|
+
declare class AudioWorkletProcessor {
|
|
8
|
+
buffer: number[];
|
|
9
|
+
bufferSize: number;
|
|
10
|
+
constructor(options?: AudioWorkletNodeOptions);
|
|
11
|
+
muted: boolean;
|
|
12
|
+
process(inputs: Float32Array[][], outputs: Float32Array[][], parameters: Record<string, Float32Array>): boolean;
|
|
13
|
+
readonly port: MessagePort;
|
|
14
|
+
recording: boolean;
|
|
15
|
+
}
|
|
16
|
+
declare function registerProcessor(name: string, processorCtor: typeof AudioWorkletProcessor): void;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* CSP Compliant: check __tests__/html2/speechToSpeech/csp.recording.html for CSP compliance tests.
|
|
20
|
+
* NOTE: This code is stringified and run in an AudioWorklet context, so it must be plain JavaScript
|
|
21
|
+
* without any TypeScript annotations that could be transformed by the compiler.
|
|
22
|
+
*/
|
|
23
|
+
const audioProcessorCode = `(${function () {
|
|
24
|
+
const RENDER_QUANTUM = 128;
|
|
25
|
+
const SILENT_FRAME = new Float32Array(RENDER_QUANTUM);
|
|
26
|
+
|
|
27
|
+
class AudioRecorderProcessor extends AudioWorkletProcessor {
|
|
28
|
+
constructor(options: AudioWorkletNodeOptions) {
|
|
29
|
+
super();
|
|
30
|
+
this.buffer = [];
|
|
31
|
+
this.bufferSize = options.processorOptions.bufferSize;
|
|
32
|
+
this.muted = false;
|
|
33
|
+
this.recording = false;
|
|
34
|
+
|
|
35
|
+
this.port.onmessage = e => {
|
|
36
|
+
if (e.data.command === 'START') {
|
|
37
|
+
this.recording = true;
|
|
38
|
+
} else if (e.data.command === 'STOP') {
|
|
39
|
+
this.recording = false;
|
|
40
|
+
this.buffer = [];
|
|
41
|
+
} else if (e.data.command === 'MUTE') {
|
|
42
|
+
this.muted = true;
|
|
43
|
+
} else if (e.data.command === 'UNMUTE') {
|
|
44
|
+
this.muted = false;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
process(inputs: Float32Array[][]) {
|
|
50
|
+
if (this.recording) {
|
|
51
|
+
// Use real audio when not muted, otherwise silent frame to keep connection alive.
|
|
52
|
+
const inputAudio = inputs[0]?.[0];
|
|
53
|
+
const audioData = this.muted || !inputAudio ? SILENT_FRAME : inputAudio;
|
|
54
|
+
this.buffer.push(...audioData);
|
|
55
|
+
|
|
56
|
+
while (this.buffer.length >= this.bufferSize) {
|
|
57
|
+
const chunk = this.buffer.splice(0, this.bufferSize);
|
|
58
|
+
this.port.postMessage({ eventType: 'audio', audioData: new Float32Array(chunk) });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
registerProcessor('audio-recorder', AudioRecorderProcessor);
|
|
66
|
+
}})()`;
|
|
67
|
+
|
|
68
|
+
const INT16_MIN = -32768;
|
|
69
|
+
const INT16_MAX = 32767;
|
|
70
|
+
const INT16_SCALE = 32767;
|
|
71
|
+
const DEFAULT_SAMPLE_RATE = 24000;
|
|
72
|
+
const DEFAULT_CHUNK_SIZE_IN_MS = 100;
|
|
73
|
+
const MS_IN_SECOND = 1000;
|
|
74
|
+
|
|
75
|
+
export function useRecorder(onAudioChunk: (base64: string, timestamp: string) => void) {
|
|
76
|
+
const [{ Date }] = usePonyfill();
|
|
77
|
+
const audioCtxRef = useRef<AudioContext | undefined>(undefined);
|
|
78
|
+
const sourceRef = useRef<MediaStreamAudioSourceNode | undefined>(undefined);
|
|
79
|
+
const streamRef = useRef<MediaStream | undefined>(undefined);
|
|
80
|
+
const voiceConfiguration = useCapabilities(caps => caps.voiceConfiguration);
|
|
81
|
+
const workletRef = useRef<AudioWorkletNode | undefined>(undefined);
|
|
82
|
+
|
|
83
|
+
const chunkIntervalMs = voiceConfiguration?.chunkIntervalMs ?? DEFAULT_CHUNK_SIZE_IN_MS;
|
|
84
|
+
const sampleRate = voiceConfiguration?.sampleRate ?? DEFAULT_SAMPLE_RATE;
|
|
85
|
+
|
|
86
|
+
const stopMediaStream = useCallback(() => {
|
|
87
|
+
if (streamRef.current) {
|
|
88
|
+
streamRef.current.getTracks().forEach(track => track.stop());
|
|
89
|
+
streamRef.current = undefined;
|
|
90
|
+
}
|
|
91
|
+
}, [streamRef]);
|
|
92
|
+
|
|
93
|
+
// Acquire MediaStream and connect source to worklet
|
|
94
|
+
const acquireAndConnectMediaStream = useCallback(async () => {
|
|
95
|
+
const audioCtx = audioCtxRef.current;
|
|
96
|
+
if (!audioCtx) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const stream = await navigator.mediaDevices.getUserMedia({
|
|
101
|
+
audio: {
|
|
102
|
+
channelCount: 1,
|
|
103
|
+
echoCancellation: true,
|
|
104
|
+
sampleRate
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
streamRef.current = stream;
|
|
108
|
+
|
|
109
|
+
const source = audioCtx.createMediaStreamSource(stream);
|
|
110
|
+
if (workletRef.current) {
|
|
111
|
+
source.connect(workletRef.current);
|
|
112
|
+
}
|
|
113
|
+
sourceRef.current = source;
|
|
114
|
+
}, [audioCtxRef, sampleRate, sourceRef, streamRef, workletRef]);
|
|
115
|
+
|
|
116
|
+
const stopRecording = useCallback(() => {
|
|
117
|
+
if (workletRef.current) {
|
|
118
|
+
workletRef.current.port.postMessage({ command: 'STOP' });
|
|
119
|
+
workletRef.current.disconnect();
|
|
120
|
+
workletRef.current = undefined;
|
|
121
|
+
}
|
|
122
|
+
stopMediaStream();
|
|
123
|
+
}, [stopMediaStream, workletRef]);
|
|
124
|
+
|
|
125
|
+
const initAudio = useCallback(async () => {
|
|
126
|
+
if (audioCtxRef.current) {
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
const audioCtx = new AudioContext({ sampleRate });
|
|
130
|
+
const blob = new Blob([audioProcessorCode], {
|
|
131
|
+
type: 'application/javascript'
|
|
132
|
+
});
|
|
133
|
+
// eslint-disable-next-line no-restricted-properties
|
|
134
|
+
const url = URL.createObjectURL(blob);
|
|
135
|
+
await audioCtx.audioWorklet.addModule(url);
|
|
136
|
+
URL.revokeObjectURL(url);
|
|
137
|
+
// eslint-disable-next-line require-atomic-updates
|
|
138
|
+
audioCtxRef.current = audioCtx;
|
|
139
|
+
}, [audioCtxRef, sampleRate]);
|
|
140
|
+
|
|
141
|
+
const startRecording = useCallback(async () => {
|
|
142
|
+
await initAudio();
|
|
143
|
+
const audioCtx = audioCtxRef.current!; // audioCtx must be available after initAudio().
|
|
144
|
+
if (audioCtx.state === 'suspended') {
|
|
145
|
+
await audioCtx.resume();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const worklet = new AudioWorkletNode(audioCtx, 'audio-recorder', {
|
|
149
|
+
processorOptions: {
|
|
150
|
+
bufferSize: (sampleRate * chunkIntervalMs) / MS_IN_SECOND
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
worklet.port.onmessage = e => {
|
|
155
|
+
if (e.data.eventType === 'audio') {
|
|
156
|
+
const timestamp = new Date().toISOString();
|
|
157
|
+
const float32 = e.data.audioData;
|
|
158
|
+
const int16 = new Int16Array(float32.length);
|
|
159
|
+
for (let i = 0; i < float32.length; i++) {
|
|
160
|
+
int16[+i] = Math.max(INT16_MIN, Math.min(INT16_MAX, float32.at(i) * INT16_SCALE));
|
|
161
|
+
}
|
|
162
|
+
const base64 = btoa(String.fromCharCode(...new Uint8Array(int16.buffer)));
|
|
163
|
+
onAudioChunk(base64, timestamp);
|
|
164
|
+
}
|
|
165
|
+
};
|
|
166
|
+
|
|
167
|
+
worklet.connect(audioCtx.destination);
|
|
168
|
+
workletRef.current = worklet;
|
|
169
|
+
|
|
170
|
+
await acquireAndConnectMediaStream();
|
|
171
|
+
|
|
172
|
+
worklet.port.postMessage({ command: 'START' });
|
|
173
|
+
}, [
|
|
174
|
+
acquireAndConnectMediaStream,
|
|
175
|
+
audioCtxRef,
|
|
176
|
+
chunkIntervalMs,
|
|
177
|
+
Date,
|
|
178
|
+
initAudio,
|
|
179
|
+
onAudioChunk,
|
|
180
|
+
sampleRate,
|
|
181
|
+
workletRef
|
|
182
|
+
]);
|
|
183
|
+
|
|
184
|
+
const muteRecording = useCallback(() => {
|
|
185
|
+
// Stop MediaStream (mic indicator OFF) and disconnect source
|
|
186
|
+
stopMediaStream();
|
|
187
|
+
|
|
188
|
+
if (sourceRef.current) {
|
|
189
|
+
sourceRef.current.disconnect();
|
|
190
|
+
sourceRef.current = undefined;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Tell worklet to output silence
|
|
194
|
+
if (workletRef.current) {
|
|
195
|
+
workletRef.current.port.postMessage({ command: 'MUTE' });
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Return unmute function
|
|
199
|
+
return () => {
|
|
200
|
+
if (!audioCtxRef.current || !workletRef.current) {
|
|
201
|
+
return;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Tell worklet to use real audio
|
|
205
|
+
workletRef.current.port.postMessage({ command: 'UNMUTE' });
|
|
206
|
+
|
|
207
|
+
// Restart MediaStream and reconnect source (fire and forget)
|
|
208
|
+
acquireAndConnectMediaStream();
|
|
209
|
+
};
|
|
210
|
+
}, [acquireAndConnectMediaStream, audioCtxRef, sourceRef, stopMediaStream, workletRef]);
|
|
211
|
+
|
|
212
|
+
const record = useCallback(() => {
|
|
213
|
+
startRecording();
|
|
214
|
+
return stopRecording;
|
|
215
|
+
}, [startRecording, stopRecording]);
|
|
216
|
+
|
|
217
|
+
const mute = useCallback(() => muteRecording(), [muteRecording]);
|
|
218
|
+
|
|
219
|
+
return useMemo(() => ({ mute, record }), [mute, record]);
|
|
220
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { reactNode, validateProps } from '@msinternal/botframework-webchat-react-valibot';
|
|
2
|
+
import React, { memo, useMemo } from 'react';
|
|
3
|
+
import { custom, is, object, optional, pipe, readonly, type InferInput } from 'valibot';
|
|
4
|
+
|
|
5
|
+
import { type StyleOptions } from '../../StyleOptions';
|
|
6
|
+
import StyleOptionsContext, { StyleOptionsContextType, useStyleOptionsContext } from './private/StyleOptionsContext';
|
|
7
|
+
import rectifyStyleOptions from './private/rectifyStyleOptions';
|
|
8
|
+
|
|
9
|
+
const styleOptionsComposerPropsSchema = pipe(
|
|
10
|
+
object({
|
|
11
|
+
children: optional(reactNode()),
|
|
12
|
+
styleOptions: optional(custom<StyleOptions>(value => is(object({}), value)))
|
|
13
|
+
}),
|
|
14
|
+
readonly()
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
type StyleOptionsComposerProps = InferInput<typeof styleOptionsComposerPropsSchema>;
|
|
18
|
+
|
|
19
|
+
function StyleOptionsComposer(props: StyleOptionsComposerProps) {
|
|
20
|
+
const { children, styleOptions } = validateProps(styleOptionsComposerPropsSchema, props);
|
|
21
|
+
|
|
22
|
+
const {
|
|
23
|
+
styleOptionsState: [currentStyleOptionsState]
|
|
24
|
+
} = useStyleOptionsContext();
|
|
25
|
+
|
|
26
|
+
const context = useMemo<Readonly<StyleOptionsContextType>>(
|
|
27
|
+
() =>
|
|
28
|
+
Object.freeze({
|
|
29
|
+
styleOptionsState: Object.freeze([
|
|
30
|
+
Object.freeze(
|
|
31
|
+
rectifyStyleOptions({
|
|
32
|
+
...currentStyleOptionsState,
|
|
33
|
+
...styleOptions
|
|
34
|
+
})
|
|
35
|
+
)
|
|
36
|
+
] as const)
|
|
37
|
+
}),
|
|
38
|
+
[currentStyleOptionsState, styleOptions]
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
return <StyleOptionsContext.Provider value={context}>{children}</StyleOptionsContext.Provider>;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
StyleOptionsComposer.displayName = 'StyleOptionsComposer';
|
|
45
|
+
|
|
46
|
+
export default memo(StyleOptionsComposer);
|