@easyv/biz-components 0.0.30 → 0.0.33
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/README.md +28 -0
- package/dist/_virtual/_commonjsHelpers.es.js +0 -25
- package/dist/_virtual/_commonjsHelpers.es.js.map +1 -1
- package/dist/_virtual/index.es2.js +2 -2
- package/dist/_virtual/index.es3.js +2 -2
- package/dist/_virtual/index.es4.js +2 -2
- package/dist/_virtual/index.es5.js +2 -2
- package/dist/_virtual/index.es6.js +2 -2
- package/dist/components/AiMessageRender/AiMessageRender.es.js +11 -5
- package/dist/components/AiMessageRender/AiMessageRender.es.js.map +1 -1
- package/dist/components/ShadowDom/ShadowDom.es.js +3 -1
- package/dist/components/ShadowDom/ShadowDom.es.js.map +1 -1
- package/dist/components/VoiceAnimation/VoiceAnimation.es.js +2 -2
- package/dist/components/VoiceAnimation/VoiceAnimation.es.js.map +1 -1
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/useInitialized.d.ts +5 -0
- package/dist/hooks/useInitialized.es.js +26 -0
- package/dist/hooks/useInitialized.es.js.map +1 -0
- package/dist/hooks/useWatchValue.d.ts +18 -0
- package/dist/hooks/useWatchValue.es.js +32 -0
- package/dist/hooks/useWatchValue.es.js.map +1 -0
- package/dist/index.css +1 -0
- package/dist/index.d.ts +0 -1
- package/dist/index.es.js +4 -1
- package/dist/index.es.js.map +1 -1
- package/dist/node_modules/.pnpm/classnames@2.3.2/node_modules/classnames/index.es.js +1 -1
- package/dist/node_modules/.pnpm/co-web-worker@1.0.1/node_modules/co-web-worker/index.es.js +1 -1
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_DataView.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_DataView.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Hash.es.js +22 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Hash.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_ListCache.es.js +22 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_ListCache.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Map.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Map.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_MapCache.es.js +22 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_MapCache.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Promise.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Promise.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Set.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Set.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_SetCache.es.js +16 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_SetCache.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Stack.es.js +19 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Stack.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Symbol.es.js +6 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Symbol.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Uint8Array.es.js +6 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Uint8Array.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_WeakMap.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_WeakMap.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayFilter.es.js +14 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayFilter.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayLikeKeys.es.js +25 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayLikeKeys.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayPush.es.js +11 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayPush.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arraySome.es.js +13 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arraySome.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_assocIndexOf.es.js +14 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_assocIndexOf.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetAllKeys.es.js +10 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetAllKeys.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetTag.es.js +15 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetTag.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsArguments.es.js +10 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsArguments.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsEqual.es.js +15 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsEqual.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsEqualDeep.es.js +46 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsEqualDeep.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsNative.es.js +23 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsNative.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsTypedArray.es.js +15 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsTypedArray.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseKeys.es.js +20 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseKeys.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseTimes.es.js +11 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseTimes.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseUnary.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseUnary.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_cacheHas.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_cacheHas.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_coreJsData.es.js +6 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_coreJsData.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalArrays.es.js +51 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalArrays.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalByTag.es.js +60 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalByTag.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalObjects.es.js +51 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalObjects.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_freeGlobal.es.js +5 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_freeGlobal.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getAllKeys.es.js +10 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getAllKeys.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getMapData.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getMapData.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getNative.es.js +10 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getNative.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getRawTag.es.js +26 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getRawTag.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getSymbols.es.js +18 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getSymbols.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getTag.es.js +35 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getTag.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getValue.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getValue.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashClear.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashClear.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashDelete.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashDelete.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashGet.es.js +16 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashGet.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashHas.es.js +11 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashHas.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashSet.es.js +12 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashSet.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isIndex.es.js +11 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isIndex.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isKeyable.es.js +8 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isKeyable.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isMasked.es.js +12 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isMasked.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isPrototype.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isPrototype.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheClear.es.js +8 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheClear.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheDelete.es.js +21 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheDelete.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheGet.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheGet.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheHas.es.js +8 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheHas.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheSet.es.js +15 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheSet.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheClear.es.js +15 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheClear.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheDelete.es.js +10 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheDelete.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheGet.es.js +8 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheGet.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheHas.es.js +8 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheHas.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheSet.es.js +11 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheSet.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapToArray.es.js +11 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapToArray.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nativeCreate.es.js +6 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nativeCreate.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nativeKeys.es.js +6 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nativeKeys.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nodeUtil.es.js +19 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nodeUtil.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_objectToString.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_objectToString.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_overArg.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_overArg.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_root.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_root.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setCacheAdd.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setCacheAdd.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setCacheHas.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setCacheHas.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setToArray.es.js +11 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setToArray.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackClear.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackClear.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackDelete.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackDelete.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackGet.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackGet.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackHas.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackHas.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackSet.es.js +23 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackSet.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_toSource.es.js +19 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_toSource.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/eq.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/eq.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArguments.es.js +14 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArguments.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArray.es.js +5 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArray.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArrayLike.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArrayLike.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isBuffer.es.js +12 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isBuffer.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEqual.es.js +8 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEqual.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isFunction.es.js +14 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isFunction.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isLength.es.js +8 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isLength.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObject.es.js +8 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObject.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObjectLike.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObjectLike.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isTypedArray.es.js +9 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isTypedArray.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/keys.es.js +10 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/keys.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/stubArray.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/stubArray.es.js.map +1 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/stubFalse.es.js +7 -0
- package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/stubFalse.es.js.map +1 -0
- package/dist/node_modules/.pnpm/prop-types@15.8.1/node_modules/prop-types/index.es.js +1 -1
- package/dist/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.es.js +1 -1
- package/dist/node_modules/.pnpm/style-to-js@1.1.16/node_modules/style-to-js/cjs/index.es.js +1 -1
- package/dist/node_modules/.pnpm/style-to-object@1.0.8/node_modules/style-to-object/cjs/index.es.js +1 -1
- package/dist/style.css +1 -1
- package/dist/utils/xunFeiVoice/RecorderManager/RecorderManager.es.js +1 -15
- package/dist/utils/xunFeiVoice/RecorderManager/RecorderManager.es.js.map +1 -1
- package/dist/utils/xunFeiVoice/XFStreamVoiceManager.d.ts +12 -4
- package/dist/utils/xunFeiVoice/XFStreamVoiceManager.es.js +39 -26
- package/dist/utils/xunFeiVoice/XFStreamVoiceManager.es.js.map +1 -1
- package/dist/utils/xunFeiVoice/utils.d.ts +15 -0
- package/dist/utils/xunFeiVoice/utils.es.js +28 -0
- package/dist/utils/xunFeiVoice/utils.es.js.map +1 -1
- package/package.json +14 -9
- package/dist/_virtual/___vite-browser-external.es.js +0 -7
- package/dist/_virtual/___vite-browser-external.es.js.map +0 -1
- package/dist/_virtual/__vite-browser-external.es.js +0 -5
- package/dist/_virtual/__vite-browser-external.es.js.map +0 -1
- package/dist/_virtual/_commonjs-dynamic-modules.es.js +0 -7
- package/dist/_virtual/_commonjs-dynamic-modules.es.js.map +0 -1
- package/dist/_virtual/aes.es.js +0 -5
- package/dist/_virtual/aes.es.js.map +0 -1
- package/dist/_virtual/blowfish.es.js +0 -5
- package/dist/_virtual/blowfish.es.js.map +0 -1
- package/dist/_virtual/cipher-core.es.js +0 -5
- package/dist/_virtual/cipher-core.es.js.map +0 -1
- package/dist/_virtual/core.es.js +0 -5
- package/dist/_virtual/core.es.js.map +0 -1
- package/dist/_virtual/enc-base64.es.js +0 -5
- package/dist/_virtual/enc-base64.es.js.map +0 -1
- package/dist/_virtual/enc-base64url.es.js +0 -5
- package/dist/_virtual/enc-base64url.es.js.map +0 -1
- package/dist/_virtual/enc-utf16.es.js +0 -5
- package/dist/_virtual/enc-utf16.es.js.map +0 -1
- package/dist/_virtual/evpkdf.es.js +0 -5
- package/dist/_virtual/evpkdf.es.js.map +0 -1
- package/dist/_virtual/format-hex.es.js +0 -5
- package/dist/_virtual/format-hex.es.js.map +0 -1
- package/dist/_virtual/hmac.es.js +0 -5
- package/dist/_virtual/hmac.es.js.map +0 -1
- package/dist/_virtual/index.es7.js +0 -5
- package/dist/_virtual/index.es7.js.map +0 -1
- package/dist/_virtual/lib-typedarrays.es.js +0 -5
- package/dist/_virtual/lib-typedarrays.es.js.map +0 -1
- package/dist/_virtual/md5.es.js +0 -5
- package/dist/_virtual/md5.es.js.map +0 -1
- package/dist/_virtual/mode-cfb.es.js +0 -5
- package/dist/_virtual/mode-cfb.es.js.map +0 -1
- package/dist/_virtual/mode-ctr-gladman.es.js +0 -5
- package/dist/_virtual/mode-ctr-gladman.es.js.map +0 -1
- package/dist/_virtual/mode-ctr.es.js +0 -5
- package/dist/_virtual/mode-ctr.es.js.map +0 -1
- package/dist/_virtual/mode-ecb.es.js +0 -5
- package/dist/_virtual/mode-ecb.es.js.map +0 -1
- package/dist/_virtual/mode-ofb.es.js +0 -5
- package/dist/_virtual/mode-ofb.es.js.map +0 -1
- package/dist/_virtual/pad-ansix923.es.js +0 -5
- package/dist/_virtual/pad-ansix923.es.js.map +0 -1
- package/dist/_virtual/pad-iso10126.es.js +0 -5
- package/dist/_virtual/pad-iso10126.es.js.map +0 -1
- package/dist/_virtual/pad-iso97971.es.js +0 -5
- package/dist/_virtual/pad-iso97971.es.js.map +0 -1
- package/dist/_virtual/pad-nopadding.es.js +0 -5
- package/dist/_virtual/pad-nopadding.es.js.map +0 -1
- package/dist/_virtual/pad-zeropadding.es.js +0 -5
- package/dist/_virtual/pad-zeropadding.es.js.map +0 -1
- package/dist/_virtual/pbkdf2.es.js +0 -5
- package/dist/_virtual/pbkdf2.es.js.map +0 -1
- package/dist/_virtual/rabbit-legacy.es.js +0 -5
- package/dist/_virtual/rabbit-legacy.es.js.map +0 -1
- package/dist/_virtual/rabbit.es.js +0 -5
- package/dist/_virtual/rabbit.es.js.map +0 -1
- package/dist/_virtual/rc4.es.js +0 -5
- package/dist/_virtual/rc4.es.js.map +0 -1
- package/dist/_virtual/ripemd160.es.js +0 -5
- package/dist/_virtual/ripemd160.es.js.map +0 -1
- package/dist/_virtual/sha1.es.js +0 -5
- package/dist/_virtual/sha1.es.js.map +0 -1
- package/dist/_virtual/sha224.es.js +0 -5
- package/dist/_virtual/sha224.es.js.map +0 -1
- package/dist/_virtual/sha256.es.js +0 -5
- package/dist/_virtual/sha256.es.js.map +0 -1
- package/dist/_virtual/sha3.es.js +0 -5
- package/dist/_virtual/sha3.es.js.map +0 -1
- package/dist/_virtual/sha384.es.js +0 -5
- package/dist/_virtual/sha384.es.js.map +0 -1
- package/dist/_virtual/sha512.es.js +0 -5
- package/dist/_virtual/sha512.es.js.map +0 -1
- package/dist/_virtual/tripledes.es.js +0 -5
- package/dist/_virtual/tripledes.es.js.map +0 -1
- package/dist/_virtual/x64-core.es.js +0 -5
- package/dist/_virtual/x64-core.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/aes.es.js +0 -163
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/aes.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/blowfish.es.js +0 -1198
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/blowfish.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/cipher-core.es.js +0 -650
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/cipher-core.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/core.es.js +0 -614
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/core.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64.es.js +0 -113
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64url.es.js +0 -124
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64url.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-utf16.es.js +0 -123
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-utf16.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/evpkdf.es.js +0 -98
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/evpkdf.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/format-hex.es.js +0 -66
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/format-hex.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/hmac.es.js +0 -112
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/hmac.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/index.es.js +0 -52
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/index.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/lib-typedarrays.es.js +0 -50
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/lib-typedarrays.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/md5.es.js +0 -184
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/md5.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-cfb.es.js +0 -58
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-cfb.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr-gladman.es.js +0 -86
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr-gladman.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr.es.js +0 -46
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ecb.es.js +0 -37
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ecb.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ofb.es.js +0 -44
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ofb.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-ansix923.es.js +0 -38
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-ansix923.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso10126.es.js +0 -34
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso10126.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso97971.es.js +0 -33
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso97971.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-nopadding.es.js +0 -29
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-nopadding.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-zeropadding.es.js +0 -40
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-zeropadding.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pbkdf2.es.js +0 -105
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pbkdf2.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit-legacy.es.js +0 -135
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit-legacy.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit.es.js +0 -138
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rc4.es.js +0 -92
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rc4.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/ripemd160.es.js +0 -486
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/ripemd160.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha1.es.js +0 -96
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha1.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha224.es.js +0 -51
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha224.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha256.es.js +0 -126
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha256.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha3.es.js +0 -208
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha3.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha384.es.js +0 -53
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha384.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha512.es.js +0 -288
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha512.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/tripledes.es.js +0 -790
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/tripledes.es.js.map +0 -1
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/x64-core.es.js +0 -262
- package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/x64-core.es.js.map +0 -1
- package/dist/utils/funASR/pcm.d.ts +0 -1
- package/dist/utils/funASR/recorder.d.ts +0 -3
- package/dist/utils/funASR/wav.d.ts +0 -1
- package/dist/utils/funASR/wsConnecter.d.ts +0 -16
- package/dist/utils/xunFeiVoice/RecorderManager/RecordManager-origin.d.ts +0 -14
- package/dist/utils/xunFeiVoice/RecorderManager/RecorderManager.d.ts +0 -51
- package/dist/utils/xunFeiVoice/RecorderManager/processorSource/processor.worker.d.ts +0 -0
- package/dist/utils/xunFeiVoice/RecorderManager/processorSource/processor.worklet.d.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { RecorderManager } from './RecorderManager';
|
|
2
2
|
import { OnMessageInfo, RecordFrameInfo } from './types';
|
|
3
3
|
|
|
4
|
-
type errorType = 'socketConnect' | 'message' | 'record';
|
|
4
|
+
type errorType = 'socketConnect' | 'message' | 'record' | 'recordPermission';
|
|
5
5
|
export interface XFStreamVoiceManagerConfig {
|
|
6
6
|
onError: (errInfo: {
|
|
7
7
|
type: errorType;
|
|
@@ -13,7 +13,7 @@ export interface XFStreamVoiceManagerConfig {
|
|
|
13
13
|
*/
|
|
14
14
|
onMessage: (info: OnMessageInfo) => void;
|
|
15
15
|
/** webSocket 关闭的回调。
|
|
16
|
-
*
|
|
16
|
+
* - 每次录音都会新建一个 webSocket 连接。录音结束后关闭 webSocket
|
|
17
17
|
*/
|
|
18
18
|
onWsClose: () => void;
|
|
19
19
|
/**
|
|
@@ -33,7 +33,14 @@ export interface XFStreamVoiceManagerConfig {
|
|
|
33
33
|
* 获取链接讯飞语音识别地址的 url
|
|
34
34
|
* @returns websocket url。详情查看讯飞文档里的鉴权方法:https://www.xfyun.cn/doc/asr/voicedictation/API.html#%E6%8E%A5%E5%8F%A3%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B
|
|
35
35
|
*/
|
|
36
|
-
getWebSocketUrl
|
|
36
|
+
getWebSocketUrl: () => string;
|
|
37
|
+
/**
|
|
38
|
+
* 获取录音权限的回调, 用户初次授权或者没有给录音权限时,会调用此回调。
|
|
39
|
+
* @param status 权限状态。
|
|
40
|
+
* - denied: 已拒绝
|
|
41
|
+
* - granted: 已授权
|
|
42
|
+
*/
|
|
43
|
+
onGetMicrophonePermission?: (status: 'denied' | 'granted') => void;
|
|
37
44
|
/**
|
|
38
45
|
* 讯飞语音的 appid
|
|
39
46
|
*/
|
|
@@ -60,6 +67,7 @@ export declare class XFStreamVoiceManager {
|
|
|
60
67
|
startTimeStamp: number;
|
|
61
68
|
recordStatus: 'start' | 'stop';
|
|
62
69
|
readyToSend: boolean;
|
|
70
|
+
microphonePermissionStatus: 'denied' | 'granted' | 'prompt';
|
|
63
71
|
private inStopping;
|
|
64
72
|
private stopResolve;
|
|
65
73
|
constructor(config: XFStreamVoiceManagerConfig);
|
|
@@ -70,7 +78,7 @@ export declare class XFStreamVoiceManager {
|
|
|
70
78
|
startNewSocket(): void;
|
|
71
79
|
onFrameRecorded({ isLastFrame, frameBuffer }: RecordFrameInfo): void;
|
|
72
80
|
initializeRecorder(): void;
|
|
73
|
-
startRecord(): void
|
|
81
|
+
startRecord(): Promise<void>;
|
|
74
82
|
stopRecord(): Promise<void>;
|
|
75
83
|
closeWs(): void;
|
|
76
84
|
/** 开启持续监听 */
|
|
@@ -1,30 +1,9 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
4
|
-
import
|
|
5
|
-
import { toBase64, isWsClosed } from "./utils.es.js";
|
|
4
|
+
import { toBase64, checkMicrophonePermission, requestMicrophonePermission, isWsClosed } from "./utils.es.js";
|
|
6
5
|
import { RecorderManager } from "./RecorderManager/RecorderManager.es.js";
|
|
7
6
|
let startCount = 0;
|
|
8
|
-
const APPID = "93b73e33";
|
|
9
|
-
const API_SECRET = "ZGJhMzQ5ZTJlMDgyYmE1ZTFlZDlmYjg0";
|
|
10
|
-
const API_KEY = "fe43de7a071e3a32ec03c6f09fe7bedf";
|
|
11
|
-
function getWebSocketUrl() {
|
|
12
|
-
const url = "wss://iat-api.xfyun.cn/v2/iat";
|
|
13
|
-
const host = "iat-api.xfyun.cn";
|
|
14
|
-
const apiKey = API_KEY;
|
|
15
|
-
const apiSecret = API_SECRET;
|
|
16
|
-
const date = (/* @__PURE__ */ new Date()).toUTCString();
|
|
17
|
-
const algorithm = "hmac-sha256";
|
|
18
|
-
const headers = "host date request-line";
|
|
19
|
-
const signatureOrigin = `host: ${host}
|
|
20
|
-
date: ${date}
|
|
21
|
-
GET /v2/iat HTTP/1.1`;
|
|
22
|
-
const signatureSha = CryptoJS.HmacSHA256(signatureOrigin, apiSecret);
|
|
23
|
-
const signature = CryptoJS.enc.Base64.stringify(signatureSha);
|
|
24
|
-
const authorizationOrigin = `api_key="${apiKey}", algorithm="${algorithm}", headers="${headers}", signature="${signature}"`;
|
|
25
|
-
const authorization = window.btoa(authorizationOrigin);
|
|
26
|
-
return `${url}?authorization=${authorization}&date=${date}&host=${host}`;
|
|
27
|
-
}
|
|
28
7
|
class XFStreamVoiceManager {
|
|
29
8
|
constructor(config) {
|
|
30
9
|
__publicField(this, "wsInstance", null);
|
|
@@ -36,6 +15,7 @@ class XFStreamVoiceManager {
|
|
|
36
15
|
__publicField(this, "startTimeStamp", 0);
|
|
37
16
|
__publicField(this, "recordStatus", "stop");
|
|
38
17
|
__publicField(this, "readyToSend", false);
|
|
18
|
+
__publicField(this, "microphonePermissionStatus", "prompt");
|
|
39
19
|
__publicField(this, "inStopping", false);
|
|
40
20
|
__publicField(this, "stopResolve", null);
|
|
41
21
|
this.config = config;
|
|
@@ -111,7 +91,7 @@ class XFStreamVoiceManager {
|
|
|
111
91
|
}));
|
|
112
92
|
const params = {
|
|
113
93
|
common: {
|
|
114
|
-
app_id: this.config.xunFeiAppId
|
|
94
|
+
app_id: this.config.xunFeiAppId
|
|
115
95
|
},
|
|
116
96
|
business: {
|
|
117
97
|
language: "zh_cn",
|
|
@@ -130,7 +110,12 @@ class XFStreamVoiceManager {
|
|
|
130
110
|
this.sendMessage(JSON.stringify(params));
|
|
131
111
|
} catch (error) {
|
|
132
112
|
console.error("record error:", error);
|
|
133
|
-
|
|
113
|
+
if (error.name === "NotAllowedError") {
|
|
114
|
+
this.config.onError({ type: "recordPermission", message: "没有录音权限" });
|
|
115
|
+
this.closeWs();
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
this.config.onError({ type: "record", message: "开始录音失败!" });
|
|
134
119
|
}
|
|
135
120
|
}
|
|
136
121
|
startNewSocket() {
|
|
@@ -142,7 +127,11 @@ class XFStreamVoiceManager {
|
|
|
142
127
|
(/* @__PURE__ */ new Date()).toLocaleString()
|
|
143
128
|
);
|
|
144
129
|
startCount++;
|
|
145
|
-
const websocketUrl = (
|
|
130
|
+
const websocketUrl = (_b = (_a = this.config).getWebSocketUrl) == null ? void 0 : _b.call(_a);
|
|
131
|
+
if (!websocketUrl) {
|
|
132
|
+
this.config.onError({ type: "socketConnect", message: "获取 websocket url 失败" });
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
146
135
|
if ("WebSocket" in window) {
|
|
147
136
|
this.wsInstance = new WebSocket(websocketUrl);
|
|
148
137
|
} else {
|
|
@@ -218,7 +207,8 @@ class XFStreamVoiceManager {
|
|
|
218
207
|
(_b = (_a = this.config).onRecordStart) == null ? void 0 : _b.call(_a);
|
|
219
208
|
};
|
|
220
209
|
}
|
|
221
|
-
startRecord() {
|
|
210
|
+
async startRecord() {
|
|
211
|
+
var _a, _b;
|
|
222
212
|
if (this.isDestroy) {
|
|
223
213
|
return;
|
|
224
214
|
}
|
|
@@ -226,6 +216,29 @@ class XFStreamVoiceManager {
|
|
|
226
216
|
this.startTimeStamp = Date.now();
|
|
227
217
|
this.resultText = "";
|
|
228
218
|
this.resultTextTemp = "";
|
|
219
|
+
if (this.microphonePermissionStatus !== "granted") {
|
|
220
|
+
const currMicrophoneStatus = await checkMicrophonePermission();
|
|
221
|
+
this.microphonePermissionStatus = currMicrophoneStatus;
|
|
222
|
+
if (currMicrophoneStatus === "prompt") {
|
|
223
|
+
await requestMicrophonePermission().then(() => {
|
|
224
|
+
var _a2, _b2;
|
|
225
|
+
(_b2 = (_a2 = this.config).onGetMicrophonePermission) == null ? void 0 : _b2.call(_a2, "granted");
|
|
226
|
+
}).catch((error) => {
|
|
227
|
+
var _a2, _b2;
|
|
228
|
+
console.error("requestMicrophonePermission error:", error);
|
|
229
|
+
this.config.onError({ type: "recordPermission", message: "没有录音权限" });
|
|
230
|
+
(_b2 = (_a2 = this.config).onGetMicrophonePermission) == null ? void 0 : _b2.call(_a2, "denied");
|
|
231
|
+
});
|
|
232
|
+
this.stopRecord();
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
if (currMicrophoneStatus === "denied") {
|
|
236
|
+
this.config.onError({ type: "recordPermission", message: "没有录音权限" });
|
|
237
|
+
this.stopRecord();
|
|
238
|
+
(_b = (_a = this.config).onGetMicrophonePermission) == null ? void 0 : _b.call(_a, "denied");
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
229
242
|
this.startNewSocket();
|
|
230
243
|
}
|
|
231
244
|
async stopRecord() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XFStreamVoiceManager.es.js","sources":["../../../src/utils/xunFeiVoice/XFStreamVoiceManager.ts"],"sourcesContent":["import CryptoJS from 'crypto-js';\nimport { RecorderManager } from './RecorderManager';\nimport type { OnMessageInfo, RecordFrameInfo } from './types';\nimport { isWsClosed, toBase64 } from './utils';\n\ntype errorType = 'socketConnect' | 'message' | 'record';\nlet startCount = 0;\n\nexport interface XFStreamVoiceManagerConfig {\n onError: (errInfo: { type: errorType; message: string }) => void;\n /** ws 收到消息的回调\n * @param info.message 消息内容\n * @param info.isLatest 是否是最后一条消息。 isLatest 为 true 时, message 为完整的语音识别结果。\n */\n onMessage: (info: OnMessageInfo) => void;\n /** webSocket 关闭的回调。\n * 每次录音都会新建一个 webSocket 连接。录音结束后关闭 webSocket\n */\n onWsClose: () => void;\n /**\n * 录音开始的回调\n */\n onRecordStart?: () => void;\n /**\n * 录音开始的回调\n */\n onRecordStop?: () => void;\n /**\n * 录音最后一帧的回调。\n * @param totalData 所有的录音数据, ArrayBuffer[]。\n */\n onLastFrame?: (totalData: ArrayBuffer[]) => void;\n /**\n * 获取链接讯飞语音识别地址的 url\n * @returns websocket url。详情查看讯飞文档里的鉴权方法:https://www.xfyun.cn/doc/asr/voicedictation/API.html#%E6%8E%A5%E5%8F%A3%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B\n */\n getWebSocketUrl?: () => string;\n /**\n * 讯飞语音的 appid\n */\n xunFeiAppId: string;\n}\n\n/** 现在前端mock,后续移到接口下发 */\nconst APPID = '93b73e33';\nconst API_SECRET = 'ZGJhMzQ5ZTJlMDgyYmE1ZTFlZDlmYjg0';\nconst API_KEY = 'fe43de7a071e3a32ec03c6f09fe7bedf';\n/**\n * 获取websocket url\n * 该接口需要后端提供,这里为了方便前端处理\n */\nfunction getWebSocketUrl() {\n // 请求地址根据语种不同变化\n const url = 'wss://iat-api.xfyun.cn/v2/iat';\n const host = 'iat-api.xfyun.cn';\n const apiKey = API_KEY;\n const apiSecret = API_SECRET;\n const date = new Date().toUTCString();\n const algorithm = 'hmac-sha256';\n const headers = 'host date request-line';\n const signatureOrigin = `host: ${host}\\ndate: ${date}\\nGET /v2/iat HTTP/1.1`;\n const signatureSha = CryptoJS.HmacSHA256(signatureOrigin, apiSecret);\n const signature = CryptoJS.enc.Base64.stringify(signatureSha);\n const authorizationOrigin = `api_key=\"${apiKey}\", algorithm=\"${algorithm}\", headers=\"${headers}\", signature=\"${signature}\"`;\n const authorization = window.btoa(authorizationOrigin);\n return `${url}?authorization=${authorization}&date=${date}&host=${host}`;\n}\n\n/**\n * 讯飞流式语音识别\n * 大致流程:\n * 1. recorder start 后开始接受录音,通过 recorder.onFrameRecorded 把数据透出给上层。数据中 isLastFrame 表示是否最后一次数据, frameBuffer 表示真实数据。\n * 2. 上层拿到录音数据后,通过 ws 发送给讯飞。如果 isLastFrame 为 true 时,给讯飞的数据中 status 为 2。如果 isLastFrame 为 false 时,给讯飞的数据中 status 为 1。\n * 3. ws 返回的数据,通过 renderResult 处理。数据中 status 为 2 表示本次录音数据识别结束了,这时候需要关闭 ws,避免消耗资源。且这两个情况服务端会主动断开连接(整个会话时长最多持续60s,或者超过10s未发送数据)。\n * 讯飞流式语音文档:https://www.xfyun.cn/doc/asr/voicedictation/API.html#%E6%8E%A5%E5%8F%A3%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B\n * 4. 断开链接后会关闭 recorder ,重置录音等数据,方便下次使用。\n * 备注:使用时,建议在收到 onWsClose 事件后,才让前端恢复到可以再次输入录音的状态\n */\nexport class XFStreamVoiceManager {\n wsInstance: WebSocket | null = null;\n recorder: RecorderManager | null = null;\n isDestroy = false;\n resultText = '';\n resultTextTemp = '';\n continueRecord = false;\n startTimeStamp = 0;\n recordStatus: 'start' | 'stop' = 'stop';\n readyToSend = false;\n\n private inStopping = false;\n private stopResolve: ((value: string) => void) | null = null;\n\n constructor(public config: XFStreamVoiceManagerConfig) {\n this.initializeRecorder();\n }\n renderResult(resultData: string) {\n // 识别结束\n const jsonData = JSON.parse(resultData);\n if (jsonData.data && jsonData.data.result) {\n const data = jsonData.data.result;\n let str = '';\n const ws = data.ws;\n for (let i = 0; i < ws.length; i++) {\n str = str + ws[i].cw[0].w;\n }\n // 开启 wpgs 会有此字段(前提:在控制台开通动态修正功能)\n // 取值为 \"apd\"时表示该片结果是追加到前面的最终结果;取值为\"rpl\" 时表示替换前面的部分结果,替换范围为rg字段\n if (data.pgs) {\n if (data.pgs === 'apd') {\n // 将resultTextTemp同步给resultText\n this.resultText = this.resultTextTemp;\n }\n // 将结果存储在resultTextTemp中\n this.resultTextTemp = this.resultText + str;\n } else {\n this.resultText = this.resultText + str;\n }\n }\n /**\n * 识别结果是否结束标识:\n * 0:识别的第一块结果。\n * 1:识别中间结果。\n * 2:识别最后一块结果\n */\n if (jsonData.code === 0 && jsonData.data.status === 2) {\n this.config.onMessage({\n message: this.resultText,\n isLatest: true,\n tempMessage: this.resultTextTemp,\n });\n this.closeWs();\n return;\n }\n if (jsonData.code === 0 && jsonData.data.status === 1) {\n this.config.onMessage({\n message: this.resultText,\n isLatest: false,\n tempMessage: this.resultTextTemp,\n });\n }\n // code 不为0时表示出错\n if (jsonData.code !== 0) {\n this.closeWs();\n this.config.onError({ type: 'message', message: resultData });\n }\n }\n\n setConfig(newConfig: Partial<XFStreamVoiceManagerConfig>) {\n this.config = {\n ...this.config,\n ...newConfig,\n };\n this.recorder?.destroy();\n this.initializeRecorder();\n }\n sendMessage(message: string) {\n if (this.wsInstance?.readyState === WebSocket.OPEN && this.readyToSend) {\n this.wsInstance.send(message);\n }\n }\n\n async recordConfigSend() {\n if (this.isDestroy) {\n return;\n }\n if (this.recordStatus === 'stop') {\n this.closeWs();\n return;\n }\n try {\n // 开始录音\n await this.recorder?.start({\n sampleRate: 16000,\n frameSize: 1280,\n });\n const params = {\n common: {\n app_id: this.config.xunFeiAppId || APPID,\n },\n business: {\n language: 'zh_cn',\n domain: 'iat',\n accent: 'mandarin',\n vad_eos: 5000,\n dwa: 'wpgs',\n },\n data: {\n status: 0,\n format: 'audio/L16;rate=16000',\n encoding: 'raw',\n },\n };\n this.readyToSend = true;\n this.sendMessage(JSON.stringify(params));\n } catch (error) {\n console.error('record error:', error);\n this.config.onError({ type: 'record', message: '录音失败, 请检查权限!' });\n }\n }\n\n startNewSocket() {\n console.log(\n '%c ❤️ ==== start new socket:',\n 'color: red; font-size: 16px;',\n startCount,\n new Date().toLocaleString(),\n );\n startCount++;\n const websocketUrl = this.config.getWebSocketUrl?.() || getWebSocketUrl();\n if ('WebSocket' in window) {\n this.wsInstance = new WebSocket(websocketUrl);\n } else {\n this.config.onError({ type: 'socketConnect', message: '浏览器不支持 WebSocket' });\n return;\n }\n this.wsInstance.onmessage = (e) => {\n // 处理返回数据\n this.renderResult(e.data);\n };\n this.wsInstance.onerror = (e) => {\n console.error('socket error:', e);\n if (this.inStopping) {\n this.inStopping = false;\n this.stopResolve?.(this.resultText);\n }\n };\n this.wsInstance.onclose = async () => {\n await this.resetStatus();\n this.config.onWsClose();\n if (this.continueRecord) {\n this.readyToSend = false;\n this.startRecord();\n }\n if (this.inStopping) {\n this.inStopping = false;\n this.stopResolve?.(this.resultText);\n }\n };\n this.wsInstance.onopen = () => {\n this.recordConfigSend();\n };\n }\n\n onFrameRecorded({ isLastFrame, frameBuffer }: RecordFrameInfo) {\n if (this.isDestroy) {\n return;\n }\n if (!this.wsInstance) {\n return;\n }\n if (this.wsInstance.readyState === this.wsInstance.OPEN) {\n this.sendMessage(\n JSON.stringify({\n data: {\n status: isLastFrame ? 2 : 1,\n format: 'audio/L16;rate=16000',\n encoding: 'raw',\n audio: toBase64(frameBuffer),\n },\n }),\n );\n }\n if (isLastFrame) {\n this.readyToSend = false;\n }\n }\n\n initializeRecorder() {\n this.recorder = new RecorderManager();\n this.recorder.onFrameRecorded = (data: RecordFrameInfo) => {\n this.onFrameRecorded(data);\n };\n this.recorder.onLastFrame = (data: ArrayBuffer[]) => {\n this.config.onLastFrame?.(data);\n };\n this.recorder.onStop = () => {\n this.config.onRecordStop?.();\n };\n this.recorder.onStart = () => {\n this.config.onRecordStart?.();\n };\n }\n\n startRecord() {\n if (this.isDestroy) {\n return;\n }\n this.recordStatus = 'start';\n this.startTimeStamp = Date.now();\n this.resultText = '';\n this.resultTextTemp = '';\n this.startNewSocket();\n }\n\n async stopRecord() {\n this.recordStatus = 'stop';\n this.inStopping = true;\n console.log('stop record ====', Date.now() - this.startTimeStamp, this.recorder?.status);\n this.recorder?.stop();\n // 如果 recorder 还没有初始化完成就关闭了,那么需要手动关闭 ws,否则在收到最后一帧消息时关闭ws\n // if (this.recorder?.status !== 'initialized') {\n // this.closeWs();\n // }\n const stopPromise = new Promise((resolve) => {\n this.stopResolve = resolve;\n });\n await stopPromise;\n if (isWsClosed(this.wsInstance)) {\n this.stopResolve?.(this.resultText);\n }\n this.stopResolve = null;\n }\n\n closeWs() {\n if (this.wsInstance?.readyState !== WebSocket.CLOSED) {\n try {\n this.wsInstance?.close();\n } catch {\n // 有的浏览器在 ws 为 connecting 的时候 close 会报错,这里忽略掉\n }\n }\n }\n /** 开启持续监听 */\n async startContinueRecord() {\n this.continueRecord = true;\n await this.startRecord();\n }\n\n async stopContinueRecord() {\n this.continueRecord = false;\n await this.stopRecord();\n }\n\n async resetStatus() {\n this.recordStatus = 'stop';\n this.resultText = '';\n this.resultTextTemp = '';\n this.readyToSend = false;\n if (this.recorder?.audioContext?.state !== 'closed') {\n await this.recorder?.audioContext?.close();\n }\n }\n\n destroy() {\n this.isDestroy = true;\n this.closeWs();\n this.recorder?.destroy();\n }\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"XFStreamVoiceManager.es.js","sources":["../../../src/utils/xunFeiVoice/XFStreamVoiceManager.ts"],"sourcesContent":["import { RecorderManager } from './RecorderManager';\nimport type { OnMessageInfo, RecordFrameInfo } from './types';\nimport {\n checkMicrophonePermission,\n isWsClosed,\n requestMicrophonePermission,\n toBase64,\n} from './utils';\n\ntype errorType = 'socketConnect' | 'message' | 'record' | 'recordPermission';\nlet startCount = 0;\n\nexport interface XFStreamVoiceManagerConfig {\n onError: (errInfo: { type: errorType; message: string }) => void;\n /** ws 收到消息的回调\n * @param info.message 消息内容\n * @param info.isLatest 是否是最后一条消息。 isLatest 为 true 时, message 为完整的语音识别结果。\n */\n onMessage: (info: OnMessageInfo) => void;\n /** webSocket 关闭的回调。\n * - 每次录音都会新建一个 webSocket 连接。录音结束后关闭 webSocket\n */\n onWsClose: () => void;\n /**\n * 录音开始的回调\n */\n onRecordStart?: () => void;\n /**\n * 录音开始的回调\n */\n onRecordStop?: () => void;\n /**\n * 录音最后一帧的回调。\n * @param totalData 所有的录音数据, ArrayBuffer[]。\n */\n onLastFrame?: (totalData: ArrayBuffer[]) => void;\n /**\n * 获取链接讯飞语音识别地址的 url\n * @returns websocket url。详情查看讯飞文档里的鉴权方法:https://www.xfyun.cn/doc/asr/voicedictation/API.html#%E6%8E%A5%E5%8F%A3%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B\n */\n getWebSocketUrl: () => string;\n /**\n * 获取录音权限的回调, 用户初次授权或者没有给录音权限时,会调用此回调。\n * @param status 权限状态。\n * - denied: 已拒绝\n * - granted: 已授权\n */\n onGetMicrophonePermission?: (status: 'denied' | 'granted') => void;\n /**\n * 讯飞语音的 appid\n */\n xunFeiAppId: string;\n}\n\n/**\n * 讯飞流式语音识别\n * 大致流程:\n * 1. recorder start 后开始接受录音,通过 recorder.onFrameRecorded 把数据透出给上层。数据中 isLastFrame 表示是否最后一次数据, frameBuffer 表示真实数据。\n * 2. 上层拿到录音数据后,通过 ws 发送给讯飞。如果 isLastFrame 为 true 时,给讯飞的数据中 status 为 2。如果 isLastFrame 为 false 时,给讯飞的数据中 status 为 1。\n * 3. ws 返回的数据,通过 renderResult 处理。数据中 status 为 2 表示本次录音数据识别结束了,这时候需要关闭 ws,避免消耗资源。且这两个情况服务端会主动断开连接(整个会话时长最多持续60s,或者超过10s未发送数据)。\n * 讯飞流式语音文档:https://www.xfyun.cn/doc/asr/voicedictation/API.html#%E6%8E%A5%E5%8F%A3%E8%B0%83%E7%94%A8%E6%B5%81%E7%A8%8B\n * 4. 断开链接后会关闭 recorder ,重置录音等数据,方便下次使用。\n * 备注:使用时,建议在收到 onWsClose 事件后,才让前端恢复到可以再次输入录音的状态\n */\nexport class XFStreamVoiceManager {\n wsInstance: WebSocket | null = null;\n recorder: RecorderManager | null = null;\n isDestroy = false;\n resultText = '';\n resultTextTemp = '';\n continueRecord = false;\n startTimeStamp = 0;\n recordStatus: 'start' | 'stop' = 'stop';\n readyToSend = false;\n microphonePermissionStatus: 'denied' | 'granted' | 'prompt' = 'prompt';\n\n private inStopping = false;\n private stopResolve: ((value: string) => void) | null = null;\n\n constructor(public config: XFStreamVoiceManagerConfig) {\n this.initializeRecorder();\n }\n renderResult(resultData: string) {\n // 识别结束\n const jsonData = JSON.parse(resultData);\n if (jsonData.data && jsonData.data.result) {\n const data = jsonData.data.result;\n let str = '';\n const ws = data.ws;\n for (let i = 0; i < ws.length; i++) {\n str = str + ws[i].cw[0].w;\n }\n // 开启 wpgs 会有此字段(前提:在控制台开通动态修正功能)\n // 取值为 \"apd\"时表示该片结果是追加到前面的最终结果;取值为\"rpl\" 时表示替换前面的部分结果,替换范围为rg字段\n if (data.pgs) {\n if (data.pgs === 'apd') {\n // 将resultTextTemp同步给resultText\n this.resultText = this.resultTextTemp;\n }\n // 将结果存储在resultTextTemp中\n this.resultTextTemp = this.resultText + str;\n } else {\n this.resultText = this.resultText + str;\n }\n }\n /**\n * 识别结果是否结束标识:\n * 0:识别的第一块结果。\n * 1:识别中间结果。\n * 2:识别最后一块结果\n */\n if (jsonData.code === 0 && jsonData.data.status === 2) {\n this.config.onMessage({\n message: this.resultText,\n isLatest: true,\n tempMessage: this.resultTextTemp,\n });\n this.closeWs();\n return;\n }\n if (jsonData.code === 0 && jsonData.data.status === 1) {\n this.config.onMessage({\n message: this.resultText,\n isLatest: false,\n tempMessage: this.resultTextTemp,\n });\n }\n // code 不为0时表示出错\n if (jsonData.code !== 0) {\n this.closeWs();\n this.config.onError({ type: 'message', message: resultData });\n }\n }\n\n setConfig(newConfig: Partial<XFStreamVoiceManagerConfig>) {\n this.config = {\n ...this.config,\n ...newConfig,\n };\n this.recorder?.destroy();\n this.initializeRecorder();\n }\n sendMessage(message: string) {\n if (this.wsInstance?.readyState === WebSocket.OPEN && this.readyToSend) {\n this.wsInstance.send(message);\n }\n }\n\n async recordConfigSend() {\n if (this.isDestroy) {\n return;\n }\n if (this.recordStatus === 'stop') {\n this.closeWs();\n return;\n }\n try {\n // 开始录音\n await this.recorder?.start({\n sampleRate: 16000,\n frameSize: 1280,\n });\n const params = {\n common: {\n app_id: this.config.xunFeiAppId,\n },\n business: {\n language: 'zh_cn',\n domain: 'iat',\n accent: 'mandarin',\n vad_eos: 5000,\n dwa: 'wpgs',\n },\n data: {\n status: 0,\n format: 'audio/L16;rate=16000',\n encoding: 'raw',\n },\n };\n this.readyToSend = true;\n this.sendMessage(JSON.stringify(params));\n } catch (error) {\n console.error('record error:', error);\n if ((error as Error).name === 'NotAllowedError') {\n this.config.onError({ type: 'recordPermission', message: '没有录音权限' });\n this.closeWs();\n return;\n }\n this.config.onError({ type: 'record', message: '开始录音失败!' });\n }\n }\n\n startNewSocket() {\n console.log(\n '%c ❤️ ==== start new socket:',\n 'color: red; font-size: 16px;',\n startCount,\n new Date().toLocaleString(),\n );\n startCount++;\n const websocketUrl = this.config.getWebSocketUrl?.();\n if (!websocketUrl) {\n this.config.onError({ type: 'socketConnect', message: '获取 websocket url 失败' });\n return;\n }\n if ('WebSocket' in window) {\n this.wsInstance = new WebSocket(websocketUrl);\n } else {\n this.config.onError({ type: 'socketConnect', message: '浏览器不支持 WebSocket' });\n return;\n }\n this.wsInstance.onmessage = (e) => {\n // 处理返回数据\n this.renderResult(e.data);\n };\n this.wsInstance.onerror = (e) => {\n console.error('socket error:', e);\n if (this.inStopping) {\n this.inStopping = false;\n this.stopResolve?.(this.resultText);\n }\n };\n this.wsInstance.onclose = async () => {\n await this.resetStatus();\n this.config.onWsClose();\n if (this.continueRecord) {\n this.readyToSend = false;\n this.startRecord();\n }\n if (this.inStopping) {\n this.inStopping = false;\n this.stopResolve?.(this.resultText);\n }\n };\n this.wsInstance.onopen = () => {\n this.recordConfigSend();\n };\n }\n\n onFrameRecorded({ isLastFrame, frameBuffer }: RecordFrameInfo) {\n if (this.isDestroy) {\n return;\n }\n if (!this.wsInstance) {\n return;\n }\n if (this.wsInstance.readyState === this.wsInstance.OPEN) {\n this.sendMessage(\n JSON.stringify({\n data: {\n status: isLastFrame ? 2 : 1,\n format: 'audio/L16;rate=16000',\n encoding: 'raw',\n audio: toBase64(frameBuffer),\n },\n }),\n );\n }\n if (isLastFrame) {\n this.readyToSend = false;\n }\n }\n\n initializeRecorder() {\n this.recorder = new RecorderManager();\n this.recorder.onFrameRecorded = (data: RecordFrameInfo) => {\n this.onFrameRecorded(data);\n };\n this.recorder.onLastFrame = (data: ArrayBuffer[]) => {\n this.config.onLastFrame?.(data);\n };\n this.recorder.onStop = () => {\n this.config.onRecordStop?.();\n };\n this.recorder.onStart = () => {\n this.config.onRecordStart?.();\n };\n }\n\n async startRecord() {\n if (this.isDestroy) {\n return;\n }\n this.recordStatus = 'start';\n this.startTimeStamp = Date.now();\n this.resultText = '';\n this.resultTextTemp = '';\n if (this.microphonePermissionStatus !== 'granted') {\n const currMicrophoneStatus = await checkMicrophonePermission();\n this.microphonePermissionStatus = currMicrophoneStatus;\n if (currMicrophoneStatus === 'prompt') {\n await requestMicrophonePermission()\n .then(() => {\n this.config.onGetMicrophonePermission?.('granted');\n })\n .catch((error) => {\n console.error('requestMicrophonePermission error:', error);\n this.config.onError({ type: 'recordPermission', message: '没有录音权限' });\n this.config.onGetMicrophonePermission?.('denied');\n });\n this.stopRecord();\n return;\n }\n if (currMicrophoneStatus === 'denied') {\n this.config.onError({ type: 'recordPermission', message: '没有录音权限' });\n this.stopRecord();\n this.config.onGetMicrophonePermission?.('denied');\n return;\n }\n }\n this.startNewSocket();\n }\n\n async stopRecord() {\n this.recordStatus = 'stop';\n this.inStopping = true;\n console.log('stop record ====', Date.now() - this.startTimeStamp, this.recorder?.status);\n this.recorder?.stop();\n // 如果 recorder 还没有初始化完成就关闭了,那么需要手动关闭 ws,否则在收到最后一帧消息时关闭ws\n // if (this.recorder?.status !== 'initialized') {\n // this.closeWs();\n // }\n const stopPromise = new Promise((resolve) => {\n this.stopResolve = resolve;\n });\n await stopPromise;\n if (isWsClosed(this.wsInstance)) {\n this.stopResolve?.(this.resultText);\n }\n this.stopResolve = null;\n }\n\n closeWs() {\n if (this.wsInstance?.readyState !== WebSocket.CLOSED) {\n try {\n this.wsInstance?.close();\n } catch {\n // 有的浏览器在 ws 为 connecting 的时候 close 会报错,这里忽略掉\n }\n }\n }\n /** 开启持续监听 */\n async startContinueRecord() {\n this.continueRecord = true;\n await this.startRecord();\n }\n\n async stopContinueRecord() {\n this.continueRecord = false;\n await this.stopRecord();\n }\n\n async resetStatus() {\n this.recordStatus = 'stop';\n this.resultText = '';\n this.resultTextTemp = '';\n this.readyToSend = false;\n if (this.recorder?.audioContext?.state !== 'closed') {\n await this.recorder?.audioContext?.close();\n }\n }\n\n destroy() {\n this.isDestroy = true;\n this.closeWs();\n this.recorder?.destroy();\n }\n}\n"],"names":["_a","_b"],"mappings":"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"}
|
|
@@ -1,2 +1,17 @@
|
|
|
1
1
|
export declare function toBase64(buffer: ArrayBuffer): string;
|
|
2
2
|
export declare function isWsClosed(ws?: WebSocket | null): boolean;
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @returns
|
|
6
|
+
* granted: 已授权
|
|
7
|
+
* denied: 已拒绝
|
|
8
|
+
* prompt: 未决定
|
|
9
|
+
* error: 错误
|
|
10
|
+
*/
|
|
11
|
+
export declare function checkMicrophonePermission(): Promise<PermissionState>;
|
|
12
|
+
/**
|
|
13
|
+
* 获取用户媒体设备权限。
|
|
14
|
+
* - 如果用户拒绝授权,抛出 name 为 NotAllowedError 的 DOMException
|
|
15
|
+
* @returns {Promise<MediaStream>}
|
|
16
|
+
*/
|
|
17
|
+
export declare function requestMicrophonePermission(): Promise<MediaStream>;
|
|
@@ -13,8 +13,36 @@ function isWsClosed(ws) {
|
|
|
13
13
|
}
|
|
14
14
|
return ws.readyState === WebSocket.CLOSED;
|
|
15
15
|
}
|
|
16
|
+
async function checkMicrophonePermission() {
|
|
17
|
+
try {
|
|
18
|
+
const permissionStatus = await navigator.permissions.query({
|
|
19
|
+
name: "microphone"
|
|
20
|
+
});
|
|
21
|
+
return permissionStatus.state;
|
|
22
|
+
} catch (error) {
|
|
23
|
+
console.error("麦克风权限查询失败:", error);
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
async function requestMicrophonePermission() {
|
|
28
|
+
const mediaDevices = navigator.mediaDevices ?? {};
|
|
29
|
+
try {
|
|
30
|
+
if (typeof mediaDevices.getUserMedia === "function") {
|
|
31
|
+
console.time("mediaDevices.getUserMedia:");
|
|
32
|
+
const stream = await mediaDevices.getUserMedia({ audio: true, video: false });
|
|
33
|
+
console.timeEnd("mediaDevices.getUserMedia:");
|
|
34
|
+
return stream;
|
|
35
|
+
}
|
|
36
|
+
} catch (error) {
|
|
37
|
+
console.error("获取录音权限失败!");
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
throw new Error("浏览器不支持录音!");
|
|
41
|
+
}
|
|
16
42
|
export {
|
|
43
|
+
checkMicrophonePermission,
|
|
17
44
|
isWsClosed,
|
|
45
|
+
requestMicrophonePermission,
|
|
18
46
|
toBase64
|
|
19
47
|
};
|
|
20
48
|
//# sourceMappingURL=utils.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.es.js","sources":["../../../src/utils/xunFeiVoice/utils.ts"],"sourcesContent":["export function toBase64(buffer: ArrayBuffer) {\n let binary = '';\n const bytes = new Uint8Array(buffer);\n const len = bytes.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return window.btoa(binary);\n}\n\nexport function isWsClosed(ws?: WebSocket | null) {\n if (!ws) {\n return true;\n }\n return ws.readyState === WebSocket.CLOSED;\n}\n"],"names":[],"mappings":"AAAO,SAAS,SAAS,QAAqB;AAC5C,MAAI,SAAS;AACP,QAAA,QAAQ,IAAI,WAAW,MAAM;AACnC,QAAM,MAAM,MAAM;AAClB,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,cAAU,OAAO,aAAa,MAAM,CAAC,CAAC;AAAA,EAAA;AAEjC,SAAA,OAAO,KAAK,MAAM;AAC3B;AAEO,SAAS,WAAW,IAAuB;AAChD,MAAI,CAAC,IAAI;AACA,WAAA;AAAA,EAAA;AAEF,SAAA,GAAG,eAAe,UAAU;AACrC;"}
|
|
1
|
+
{"version":3,"file":"utils.es.js","sources":["../../../src/utils/xunFeiVoice/utils.ts"],"sourcesContent":["export function toBase64(buffer: ArrayBuffer) {\n let binary = '';\n const bytes = new Uint8Array(buffer);\n const len = bytes.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return window.btoa(binary);\n}\n\nexport function isWsClosed(ws?: WebSocket | null) {\n if (!ws) {\n return true;\n }\n return ws.readyState === WebSocket.CLOSED;\n}\n/**\n *\n * @returns\n * granted: 已授权\n * denied: 已拒绝\n * prompt: 未决定\n * error: 错误\n */\nexport async function checkMicrophonePermission() {\n try {\n const permissionStatus = await navigator.permissions.query({\n name: 'microphone' as PermissionName,\n });\n\n // 状态可能是:\n // - 'granted'(已授权)\n // - 'denied'(已拒绝)\n // - 'prompt'(未决定,浏览器会弹窗询问)\n return permissionStatus.state;\n } catch (error) {\n console.error('麦克风权限查询失败:', error);\n throw error;\n }\n}\n\n/**\n * 获取用户媒体设备权限。\n * - 如果用户拒绝授权,抛出 name 为 NotAllowedError 的 DOMException\n * @returns {Promise<MediaStream>}\n */\nexport async function requestMicrophonePermission() {\n const mediaDevices = navigator.mediaDevices ?? {};\n\n try {\n if (typeof mediaDevices.getUserMedia === 'function') {\n console.time('mediaDevices.getUserMedia:');\n const stream = await mediaDevices.getUserMedia({ audio: true, video: false });\n console.timeEnd('mediaDevices.getUserMedia:');\n return stream;\n }\n } catch (error) {\n console.error('获取录音权限失败!');\n throw error;\n }\n\n throw new Error('浏览器不支持录音!');\n}\n"],"names":[],"mappings":"AAAO,SAAS,SAAS,QAAqB;AAC5C,MAAI,SAAS;AACP,QAAA,QAAQ,IAAI,WAAW,MAAM;AACnC,QAAM,MAAM,MAAM;AAClB,WAAS,IAAI,GAAG,IAAI,KAAK,KAAK;AAC5B,cAAU,OAAO,aAAa,MAAM,CAAC,CAAC;AAAA,EAAA;AAEjC,SAAA,OAAO,KAAK,MAAM;AAC3B;AAEO,SAAS,WAAW,IAAuB;AAChD,MAAI,CAAC,IAAI;AACA,WAAA;AAAA,EAAA;AAEF,SAAA,GAAG,eAAe,UAAU;AACrC;AASA,eAAsB,4BAA4B;AAC5C,MAAA;AACF,UAAM,mBAAmB,MAAM,UAAU,YAAY,MAAM;AAAA,MACzD,MAAM;AAAA,IAAA,CACP;AAMD,WAAO,iBAAiB;AAAA,WACjB,OAAO;AACN,YAAA,MAAM,cAAc,KAAK;AAC3B,UAAA;AAAA,EAAA;AAEV;AAOA,eAAsB,8BAA8B;AAC5C,QAAA,eAAe,UAAU,gBAAgB,CAAC;AAE5C,MAAA;AACE,QAAA,OAAO,aAAa,iBAAiB,YAAY;AACnD,cAAQ,KAAK,4BAA4B;AACnC,YAAA,SAAS,MAAM,aAAa,aAAa,EAAE,OAAO,MAAM,OAAO,OAAO;AAC5E,cAAQ,QAAQ,4BAA4B;AACrC,aAAA;AAAA,IAAA;AAAA,WAEF,OAAO;AACd,YAAQ,MAAM,WAAW;AACnB,UAAA;AAAA,EAAA;AAGF,QAAA,IAAI,MAAM,WAAW;AAC7B;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@easyv/biz-components",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.33",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "dist/index.es.js",
|
|
6
6
|
"module": "dist/index.es.js",
|
|
@@ -9,16 +9,11 @@
|
|
|
9
9
|
"dist"
|
|
10
10
|
],
|
|
11
11
|
"sideEffects": false,
|
|
12
|
-
"scripts": {
|
|
13
|
-
"dev": "vite",
|
|
14
|
-
"build": "tsc && vite build",
|
|
15
|
-
"preview": "vite preview",
|
|
16
|
-
"test:ui": "cypress open"
|
|
17
|
-
},
|
|
18
12
|
"dependencies": {
|
|
19
13
|
"classnames": "^2.5.1",
|
|
20
14
|
"co-web-worker": "^1.0.1",
|
|
21
15
|
"crypto-js": "^4.2.0",
|
|
16
|
+
"lodash-es": "^4.17.21",
|
|
22
17
|
"react-markdown": "^10.1.0",
|
|
23
18
|
"rehype-highlight": "^7.0.2",
|
|
24
19
|
"remark-gfm": "^4.0.1"
|
|
@@ -30,15 +25,25 @@
|
|
|
30
25
|
},
|
|
31
26
|
"devDependencies": {
|
|
32
27
|
"@types/crypto-js": "^4.2.2",
|
|
28
|
+
"@types/lodash-es": "^4.17.12",
|
|
33
29
|
"@types/react": "18.2.0",
|
|
34
30
|
"@types/react-dom": "18.2.0",
|
|
35
31
|
"@vitejs/plugin-react": "^4.2.1",
|
|
36
32
|
"autoprefixer": "^10.4.21",
|
|
33
|
+
"cssnano": "^7.0.7",
|
|
37
34
|
"cypress": "^14.3.3",
|
|
38
35
|
"less": "^4.3.0",
|
|
39
36
|
"postcss": "^8.5.3",
|
|
40
|
-
"
|
|
37
|
+
"postcss-cli": "^10.1.0",
|
|
38
|
+
"tailwindcss": "^3.0.0",
|
|
41
39
|
"vite": "^5.0.10",
|
|
42
40
|
"vite-plugin-dts": "^3.7.0"
|
|
41
|
+
},
|
|
42
|
+
"scripts": {
|
|
43
|
+
"dev": "vite",
|
|
44
|
+
"build": "tsc && vite build && npm run build:style",
|
|
45
|
+
"build:style": "npx postcss src/index.css -o dist/index.css",
|
|
46
|
+
"preview": "vite preview",
|
|
47
|
+
"test:ui": "cypress open"
|
|
43
48
|
}
|
|
44
|
-
}
|
|
49
|
+
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import * as __viteBrowserExternal from "./__vite-browser-external.es.js";
|
|
2
|
-
import { getAugmentedNamespace } from "./_commonjsHelpers.es.js";
|
|
3
|
-
const require$$0 = /* @__PURE__ */ getAugmentedNamespace(__viteBrowserExternal);
|
|
4
|
-
export {
|
|
5
|
-
require$$0 as default
|
|
6
|
-
};
|
|
7
|
-
//# sourceMappingURL=___vite-browser-external.es.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"___vite-browser-external.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"__vite-browser-external.es.js","sources":["../../__vite-browser-external"],"sourcesContent":["export default {}"],"names":[],"mappings":"AAAA,MAAe,wBAAA,CAAA;"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
function commonjsRequire(path) {
|
|
2
|
-
throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
|
|
3
|
-
}
|
|
4
|
-
export {
|
|
5
|
-
commonjsRequire
|
|
6
|
-
};
|
|
7
|
-
//# sourceMappingURL=_commonjs-dynamic-modules.es.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_commonjs-dynamic-modules.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
|
package/dist/_virtual/aes.es.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"aes.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"blowfish.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cipher-core.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/dist/_virtual/core.es.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"core.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enc-base64.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enc-base64url.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enc-utf16.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"evpkdf.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"format-hex.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/dist/_virtual/hmac.es.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"hmac.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.es7.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"lib-typedarrays.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
package/dist/_virtual/md5.es.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"md5.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mode-cfb.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mode-ctr-gladman.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mode-ctr.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mode-ecb.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"mode-ofb.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pad-ansix923.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pad-iso10126.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pad-iso97971.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|