@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.
Files changed (377) hide show
  1. package/README.md +28 -0
  2. package/dist/_virtual/_commonjsHelpers.es.js +0 -25
  3. package/dist/_virtual/_commonjsHelpers.es.js.map +1 -1
  4. package/dist/_virtual/index.es2.js +2 -2
  5. package/dist/_virtual/index.es3.js +2 -2
  6. package/dist/_virtual/index.es4.js +2 -2
  7. package/dist/_virtual/index.es5.js +2 -2
  8. package/dist/_virtual/index.es6.js +2 -2
  9. package/dist/components/AiMessageRender/AiMessageRender.es.js +11 -5
  10. package/dist/components/AiMessageRender/AiMessageRender.es.js.map +1 -1
  11. package/dist/components/ShadowDom/ShadowDom.es.js +3 -1
  12. package/dist/components/ShadowDom/ShadowDom.es.js.map +1 -1
  13. package/dist/components/VoiceAnimation/VoiceAnimation.es.js +2 -2
  14. package/dist/components/VoiceAnimation/VoiceAnimation.es.js.map +1 -1
  15. package/dist/hooks/index.d.ts +2 -0
  16. package/dist/hooks/useInitialized.d.ts +5 -0
  17. package/dist/hooks/useInitialized.es.js +26 -0
  18. package/dist/hooks/useInitialized.es.js.map +1 -0
  19. package/dist/hooks/useWatchValue.d.ts +18 -0
  20. package/dist/hooks/useWatchValue.es.js +32 -0
  21. package/dist/hooks/useWatchValue.es.js.map +1 -0
  22. package/dist/index.css +1 -0
  23. package/dist/index.d.ts +0 -1
  24. package/dist/index.es.js +4 -1
  25. package/dist/index.es.js.map +1 -1
  26. package/dist/node_modules/.pnpm/classnames@2.3.2/node_modules/classnames/index.es.js +1 -1
  27. package/dist/node_modules/.pnpm/co-web-worker@1.0.1/node_modules/co-web-worker/index.es.js +1 -1
  28. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_DataView.es.js +7 -0
  29. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_DataView.es.js.map +1 -0
  30. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Hash.es.js +22 -0
  31. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Hash.es.js.map +1 -0
  32. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_ListCache.es.js +22 -0
  33. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_ListCache.es.js.map +1 -0
  34. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Map.es.js +7 -0
  35. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Map.es.js.map +1 -0
  36. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_MapCache.es.js +22 -0
  37. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_MapCache.es.js.map +1 -0
  38. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Promise.es.js +7 -0
  39. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Promise.es.js.map +1 -0
  40. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Set.es.js +7 -0
  41. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Set.es.js.map +1 -0
  42. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_SetCache.es.js +16 -0
  43. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_SetCache.es.js.map +1 -0
  44. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Stack.es.js +19 -0
  45. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Stack.es.js.map +1 -0
  46. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Symbol.es.js +6 -0
  47. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Symbol.es.js.map +1 -0
  48. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Uint8Array.es.js +6 -0
  49. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_Uint8Array.es.js.map +1 -0
  50. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_WeakMap.es.js +7 -0
  51. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_WeakMap.es.js.map +1 -0
  52. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayFilter.es.js +14 -0
  53. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayFilter.es.js.map +1 -0
  54. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayLikeKeys.es.js +25 -0
  55. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayLikeKeys.es.js.map +1 -0
  56. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayPush.es.js +11 -0
  57. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arrayPush.es.js.map +1 -0
  58. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arraySome.es.js +13 -0
  59. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_arraySome.es.js.map +1 -0
  60. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_assocIndexOf.es.js +14 -0
  61. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_assocIndexOf.es.js.map +1 -0
  62. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetAllKeys.es.js +10 -0
  63. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetAllKeys.es.js.map +1 -0
  64. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetTag.es.js +15 -0
  65. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseGetTag.es.js.map +1 -0
  66. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsArguments.es.js +10 -0
  67. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsArguments.es.js.map +1 -0
  68. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsEqual.es.js +15 -0
  69. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsEqual.es.js.map +1 -0
  70. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsEqualDeep.es.js +46 -0
  71. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsEqualDeep.es.js.map +1 -0
  72. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsNative.es.js +23 -0
  73. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsNative.es.js.map +1 -0
  74. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsTypedArray.es.js +15 -0
  75. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseIsTypedArray.es.js.map +1 -0
  76. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseKeys.es.js +20 -0
  77. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseKeys.es.js.map +1 -0
  78. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseTimes.es.js +11 -0
  79. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseTimes.es.js.map +1 -0
  80. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseUnary.es.js +9 -0
  81. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_baseUnary.es.js.map +1 -0
  82. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_cacheHas.es.js +7 -0
  83. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_cacheHas.es.js.map +1 -0
  84. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_coreJsData.es.js +6 -0
  85. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_coreJsData.es.js.map +1 -0
  86. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalArrays.es.js +51 -0
  87. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalArrays.es.js.map +1 -0
  88. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalByTag.es.js +60 -0
  89. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalByTag.es.js.map +1 -0
  90. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalObjects.es.js +51 -0
  91. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_equalObjects.es.js.map +1 -0
  92. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_freeGlobal.es.js +5 -0
  93. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_freeGlobal.es.js.map +1 -0
  94. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getAllKeys.es.js +10 -0
  95. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getAllKeys.es.js.map +1 -0
  96. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getMapData.es.js +9 -0
  97. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getMapData.es.js.map +1 -0
  98. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getNative.es.js +10 -0
  99. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getNative.es.js.map +1 -0
  100. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getRawTag.es.js +26 -0
  101. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getRawTag.es.js.map +1 -0
  102. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getSymbols.es.js +18 -0
  103. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getSymbols.es.js.map +1 -0
  104. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getTag.es.js +35 -0
  105. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getTag.es.js.map +1 -0
  106. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getValue.es.js +7 -0
  107. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_getValue.es.js.map +1 -0
  108. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashClear.es.js +9 -0
  109. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashClear.es.js.map +1 -0
  110. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashDelete.es.js +9 -0
  111. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashDelete.es.js.map +1 -0
  112. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashGet.es.js +16 -0
  113. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashGet.es.js.map +1 -0
  114. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashHas.es.js +11 -0
  115. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashHas.es.js.map +1 -0
  116. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashSet.es.js +12 -0
  117. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_hashSet.es.js.map +1 -0
  118. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isIndex.es.js +11 -0
  119. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isIndex.es.js.map +1 -0
  120. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isKeyable.es.js +8 -0
  121. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isKeyable.es.js.map +1 -0
  122. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isMasked.es.js +12 -0
  123. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isMasked.es.js.map +1 -0
  124. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isPrototype.es.js +9 -0
  125. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_isPrototype.es.js.map +1 -0
  126. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheClear.es.js +8 -0
  127. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheClear.es.js.map +1 -0
  128. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheDelete.es.js +21 -0
  129. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheDelete.es.js.map +1 -0
  130. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheGet.es.js +9 -0
  131. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheGet.es.js.map +1 -0
  132. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheHas.es.js +8 -0
  133. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheHas.es.js.map +1 -0
  134. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheSet.es.js +15 -0
  135. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_listCacheSet.es.js.map +1 -0
  136. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheClear.es.js +15 -0
  137. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheClear.es.js.map +1 -0
  138. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheDelete.es.js +10 -0
  139. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheDelete.es.js.map +1 -0
  140. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheGet.es.js +8 -0
  141. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheGet.es.js.map +1 -0
  142. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheHas.es.js +8 -0
  143. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheHas.es.js.map +1 -0
  144. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheSet.es.js +11 -0
  145. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapCacheSet.es.js.map +1 -0
  146. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapToArray.es.js +11 -0
  147. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_mapToArray.es.js.map +1 -0
  148. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nativeCreate.es.js +6 -0
  149. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nativeCreate.es.js.map +1 -0
  150. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nativeKeys.es.js +6 -0
  151. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nativeKeys.es.js.map +1 -0
  152. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nodeUtil.es.js +19 -0
  153. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_nodeUtil.es.js.map +1 -0
  154. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_objectToString.es.js +9 -0
  155. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_objectToString.es.js.map +1 -0
  156. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_overArg.es.js +9 -0
  157. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_overArg.es.js.map +1 -0
  158. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_root.es.js +7 -0
  159. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_root.es.js.map +1 -0
  160. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setCacheAdd.es.js +9 -0
  161. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setCacheAdd.es.js.map +1 -0
  162. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setCacheHas.es.js +7 -0
  163. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setCacheHas.es.js.map +1 -0
  164. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setToArray.es.js +11 -0
  165. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_setToArray.es.js.map +1 -0
  166. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackClear.es.js +9 -0
  167. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackClear.es.js.map +1 -0
  168. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackDelete.es.js +9 -0
  169. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackDelete.es.js.map +1 -0
  170. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackGet.es.js +7 -0
  171. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackGet.es.js.map +1 -0
  172. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackHas.es.js +7 -0
  173. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackHas.es.js.map +1 -0
  174. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackSet.es.js +23 -0
  175. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_stackSet.es.js.map +1 -0
  176. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_toSource.es.js +19 -0
  177. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/_toSource.es.js.map +1 -0
  178. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/eq.es.js +7 -0
  179. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/eq.es.js.map +1 -0
  180. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArguments.es.js +14 -0
  181. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArguments.es.js.map +1 -0
  182. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArray.es.js +5 -0
  183. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArray.es.js.map +1 -0
  184. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArrayLike.es.js +9 -0
  185. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isArrayLike.es.js.map +1 -0
  186. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isBuffer.es.js +12 -0
  187. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isBuffer.es.js.map +1 -0
  188. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEqual.es.js +8 -0
  189. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEqual.es.js.map +1 -0
  190. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isFunction.es.js +14 -0
  191. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isFunction.es.js.map +1 -0
  192. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isLength.es.js +8 -0
  193. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isLength.es.js.map +1 -0
  194. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObject.es.js +8 -0
  195. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObject.es.js.map +1 -0
  196. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObjectLike.es.js +7 -0
  197. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isObjectLike.es.js.map +1 -0
  198. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isTypedArray.es.js +9 -0
  199. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isTypedArray.es.js.map +1 -0
  200. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/keys.es.js +10 -0
  201. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/keys.es.js.map +1 -0
  202. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/stubArray.es.js +7 -0
  203. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/stubArray.es.js.map +1 -0
  204. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/stubFalse.es.js +7 -0
  205. package/dist/node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/stubFalse.es.js.map +1 -0
  206. package/dist/node_modules/.pnpm/prop-types@15.8.1/node_modules/prop-types/index.es.js +1 -1
  207. package/dist/node_modules/.pnpm/react-is@16.13.1/node_modules/react-is/index.es.js +1 -1
  208. package/dist/node_modules/.pnpm/style-to-js@1.1.16/node_modules/style-to-js/cjs/index.es.js +1 -1
  209. package/dist/node_modules/.pnpm/style-to-object@1.0.8/node_modules/style-to-object/cjs/index.es.js +1 -1
  210. package/dist/style.css +1 -1
  211. package/dist/utils/xunFeiVoice/RecorderManager/RecorderManager.es.js +1 -15
  212. package/dist/utils/xunFeiVoice/RecorderManager/RecorderManager.es.js.map +1 -1
  213. package/dist/utils/xunFeiVoice/XFStreamVoiceManager.d.ts +12 -4
  214. package/dist/utils/xunFeiVoice/XFStreamVoiceManager.es.js +39 -26
  215. package/dist/utils/xunFeiVoice/XFStreamVoiceManager.es.js.map +1 -1
  216. package/dist/utils/xunFeiVoice/utils.d.ts +15 -0
  217. package/dist/utils/xunFeiVoice/utils.es.js +28 -0
  218. package/dist/utils/xunFeiVoice/utils.es.js.map +1 -1
  219. package/package.json +14 -9
  220. package/dist/_virtual/___vite-browser-external.es.js +0 -7
  221. package/dist/_virtual/___vite-browser-external.es.js.map +0 -1
  222. package/dist/_virtual/__vite-browser-external.es.js +0 -5
  223. package/dist/_virtual/__vite-browser-external.es.js.map +0 -1
  224. package/dist/_virtual/_commonjs-dynamic-modules.es.js +0 -7
  225. package/dist/_virtual/_commonjs-dynamic-modules.es.js.map +0 -1
  226. package/dist/_virtual/aes.es.js +0 -5
  227. package/dist/_virtual/aes.es.js.map +0 -1
  228. package/dist/_virtual/blowfish.es.js +0 -5
  229. package/dist/_virtual/blowfish.es.js.map +0 -1
  230. package/dist/_virtual/cipher-core.es.js +0 -5
  231. package/dist/_virtual/cipher-core.es.js.map +0 -1
  232. package/dist/_virtual/core.es.js +0 -5
  233. package/dist/_virtual/core.es.js.map +0 -1
  234. package/dist/_virtual/enc-base64.es.js +0 -5
  235. package/dist/_virtual/enc-base64.es.js.map +0 -1
  236. package/dist/_virtual/enc-base64url.es.js +0 -5
  237. package/dist/_virtual/enc-base64url.es.js.map +0 -1
  238. package/dist/_virtual/enc-utf16.es.js +0 -5
  239. package/dist/_virtual/enc-utf16.es.js.map +0 -1
  240. package/dist/_virtual/evpkdf.es.js +0 -5
  241. package/dist/_virtual/evpkdf.es.js.map +0 -1
  242. package/dist/_virtual/format-hex.es.js +0 -5
  243. package/dist/_virtual/format-hex.es.js.map +0 -1
  244. package/dist/_virtual/hmac.es.js +0 -5
  245. package/dist/_virtual/hmac.es.js.map +0 -1
  246. package/dist/_virtual/index.es7.js +0 -5
  247. package/dist/_virtual/index.es7.js.map +0 -1
  248. package/dist/_virtual/lib-typedarrays.es.js +0 -5
  249. package/dist/_virtual/lib-typedarrays.es.js.map +0 -1
  250. package/dist/_virtual/md5.es.js +0 -5
  251. package/dist/_virtual/md5.es.js.map +0 -1
  252. package/dist/_virtual/mode-cfb.es.js +0 -5
  253. package/dist/_virtual/mode-cfb.es.js.map +0 -1
  254. package/dist/_virtual/mode-ctr-gladman.es.js +0 -5
  255. package/dist/_virtual/mode-ctr-gladman.es.js.map +0 -1
  256. package/dist/_virtual/mode-ctr.es.js +0 -5
  257. package/dist/_virtual/mode-ctr.es.js.map +0 -1
  258. package/dist/_virtual/mode-ecb.es.js +0 -5
  259. package/dist/_virtual/mode-ecb.es.js.map +0 -1
  260. package/dist/_virtual/mode-ofb.es.js +0 -5
  261. package/dist/_virtual/mode-ofb.es.js.map +0 -1
  262. package/dist/_virtual/pad-ansix923.es.js +0 -5
  263. package/dist/_virtual/pad-ansix923.es.js.map +0 -1
  264. package/dist/_virtual/pad-iso10126.es.js +0 -5
  265. package/dist/_virtual/pad-iso10126.es.js.map +0 -1
  266. package/dist/_virtual/pad-iso97971.es.js +0 -5
  267. package/dist/_virtual/pad-iso97971.es.js.map +0 -1
  268. package/dist/_virtual/pad-nopadding.es.js +0 -5
  269. package/dist/_virtual/pad-nopadding.es.js.map +0 -1
  270. package/dist/_virtual/pad-zeropadding.es.js +0 -5
  271. package/dist/_virtual/pad-zeropadding.es.js.map +0 -1
  272. package/dist/_virtual/pbkdf2.es.js +0 -5
  273. package/dist/_virtual/pbkdf2.es.js.map +0 -1
  274. package/dist/_virtual/rabbit-legacy.es.js +0 -5
  275. package/dist/_virtual/rabbit-legacy.es.js.map +0 -1
  276. package/dist/_virtual/rabbit.es.js +0 -5
  277. package/dist/_virtual/rabbit.es.js.map +0 -1
  278. package/dist/_virtual/rc4.es.js +0 -5
  279. package/dist/_virtual/rc4.es.js.map +0 -1
  280. package/dist/_virtual/ripemd160.es.js +0 -5
  281. package/dist/_virtual/ripemd160.es.js.map +0 -1
  282. package/dist/_virtual/sha1.es.js +0 -5
  283. package/dist/_virtual/sha1.es.js.map +0 -1
  284. package/dist/_virtual/sha224.es.js +0 -5
  285. package/dist/_virtual/sha224.es.js.map +0 -1
  286. package/dist/_virtual/sha256.es.js +0 -5
  287. package/dist/_virtual/sha256.es.js.map +0 -1
  288. package/dist/_virtual/sha3.es.js +0 -5
  289. package/dist/_virtual/sha3.es.js.map +0 -1
  290. package/dist/_virtual/sha384.es.js +0 -5
  291. package/dist/_virtual/sha384.es.js.map +0 -1
  292. package/dist/_virtual/sha512.es.js +0 -5
  293. package/dist/_virtual/sha512.es.js.map +0 -1
  294. package/dist/_virtual/tripledes.es.js +0 -5
  295. package/dist/_virtual/tripledes.es.js.map +0 -1
  296. package/dist/_virtual/x64-core.es.js +0 -5
  297. package/dist/_virtual/x64-core.es.js.map +0 -1
  298. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/aes.es.js +0 -163
  299. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/aes.es.js.map +0 -1
  300. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/blowfish.es.js +0 -1198
  301. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/blowfish.es.js.map +0 -1
  302. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/cipher-core.es.js +0 -650
  303. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/cipher-core.es.js.map +0 -1
  304. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/core.es.js +0 -614
  305. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/core.es.js.map +0 -1
  306. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64.es.js +0 -113
  307. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64.es.js.map +0 -1
  308. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64url.es.js +0 -124
  309. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64url.es.js.map +0 -1
  310. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-utf16.es.js +0 -123
  311. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-utf16.es.js.map +0 -1
  312. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/evpkdf.es.js +0 -98
  313. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/evpkdf.es.js.map +0 -1
  314. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/format-hex.es.js +0 -66
  315. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/format-hex.es.js.map +0 -1
  316. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/hmac.es.js +0 -112
  317. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/hmac.es.js.map +0 -1
  318. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/index.es.js +0 -52
  319. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/index.es.js.map +0 -1
  320. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/lib-typedarrays.es.js +0 -50
  321. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/lib-typedarrays.es.js.map +0 -1
  322. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/md5.es.js +0 -184
  323. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/md5.es.js.map +0 -1
  324. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-cfb.es.js +0 -58
  325. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-cfb.es.js.map +0 -1
  326. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr-gladman.es.js +0 -86
  327. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr-gladman.es.js.map +0 -1
  328. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr.es.js +0 -46
  329. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr.es.js.map +0 -1
  330. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ecb.es.js +0 -37
  331. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ecb.es.js.map +0 -1
  332. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ofb.es.js +0 -44
  333. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ofb.es.js.map +0 -1
  334. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-ansix923.es.js +0 -38
  335. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-ansix923.es.js.map +0 -1
  336. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso10126.es.js +0 -34
  337. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso10126.es.js.map +0 -1
  338. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso97971.es.js +0 -33
  339. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso97971.es.js.map +0 -1
  340. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-nopadding.es.js +0 -29
  341. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-nopadding.es.js.map +0 -1
  342. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-zeropadding.es.js +0 -40
  343. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-zeropadding.es.js.map +0 -1
  344. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pbkdf2.es.js +0 -105
  345. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pbkdf2.es.js.map +0 -1
  346. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit-legacy.es.js +0 -135
  347. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit-legacy.es.js.map +0 -1
  348. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit.es.js +0 -138
  349. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit.es.js.map +0 -1
  350. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rc4.es.js +0 -92
  351. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rc4.es.js.map +0 -1
  352. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/ripemd160.es.js +0 -486
  353. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/ripemd160.es.js.map +0 -1
  354. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha1.es.js +0 -96
  355. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha1.es.js.map +0 -1
  356. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha224.es.js +0 -51
  357. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha224.es.js.map +0 -1
  358. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha256.es.js +0 -126
  359. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha256.es.js.map +0 -1
  360. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha3.es.js +0 -208
  361. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha3.es.js.map +0 -1
  362. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha384.es.js +0 -53
  363. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha384.es.js.map +0 -1
  364. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha512.es.js +0 -288
  365. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha512.es.js.map +0 -1
  366. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/tripledes.es.js +0 -790
  367. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/tripledes.es.js.map +0 -1
  368. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/x64-core.es.js +0 -262
  369. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/x64-core.es.js.map +0 -1
  370. package/dist/utils/funASR/pcm.d.ts +0 -1
  371. package/dist/utils/funASR/recorder.d.ts +0 -3
  372. package/dist/utils/funASR/wav.d.ts +0 -1
  373. package/dist/utils/funASR/wsConnecter.d.ts +0 -16
  374. package/dist/utils/xunFeiVoice/RecorderManager/RecordManager-origin.d.ts +0 -14
  375. package/dist/utils/xunFeiVoice/RecorderManager/RecorderManager.d.ts +0 -51
  376. package/dist/utils/xunFeiVoice/RecorderManager/processorSource/processor.worker.d.ts +0 -0
  377. 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
- * 每次录音都会新建一个 webSocket 连接。录音结束后关闭 webSocket
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?: () => string;
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 CryptoJS from "../../node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/index.es.js";
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 || APPID
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
- this.config.onError({ type: "record", message: "录音失败, 请检查权限!" });
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 = ((_b = (_a = this.config).getWebSocketUrl) == null ? void 0 : _b.call(_a)) || getWebSocketUrl();
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.30",
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
- "tailwindcss": "^4.1.5",
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,5 +0,0 @@
1
- const __viteBrowserExternal = {};
2
- export {
3
- __viteBrowserExternal as default
4
- };
5
- //# sourceMappingURL=__vite-browser-external.es.js.map
@@ -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":";;;"}
@@ -1,5 +0,0 @@
1
- var aes = { exports: {} };
2
- export {
3
- aes as __module
4
- };
5
- //# sourceMappingURL=aes.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"aes.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var blowfish = { exports: {} };
2
- export {
3
- blowfish as __module
4
- };
5
- //# sourceMappingURL=blowfish.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"blowfish.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var cipherCore = { exports: {} };
2
- export {
3
- cipherCore as __module
4
- };
5
- //# sourceMappingURL=cipher-core.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cipher-core.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var core = { exports: {} };
2
- export {
3
- core as __module
4
- };
5
- //# sourceMappingURL=core.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"core.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var encBase64 = { exports: {} };
2
- export {
3
- encBase64 as __module
4
- };
5
- //# sourceMappingURL=enc-base64.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enc-base64.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var encBase64url = { exports: {} };
2
- export {
3
- encBase64url as __module
4
- };
5
- //# sourceMappingURL=enc-base64url.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enc-base64url.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var encUtf16 = { exports: {} };
2
- export {
3
- encUtf16 as __module
4
- };
5
- //# sourceMappingURL=enc-utf16.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enc-utf16.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var evpkdf = { exports: {} };
2
- export {
3
- evpkdf as __module
4
- };
5
- //# sourceMappingURL=evpkdf.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"evpkdf.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var formatHex = { exports: {} };
2
- export {
3
- formatHex as __module
4
- };
5
- //# sourceMappingURL=format-hex.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"format-hex.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var hmac = { exports: {} };
2
- export {
3
- hmac as __module
4
- };
5
- //# sourceMappingURL=hmac.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hmac.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var cjs = {};
2
- export {
3
- cjs as __exports
4
- };
5
- //# sourceMappingURL=index.es7.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.es7.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var libTypedarrays = { exports: {} };
2
- export {
3
- libTypedarrays as __module
4
- };
5
- //# sourceMappingURL=lib-typedarrays.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"lib-typedarrays.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var md5 = { exports: {} };
2
- export {
3
- md5 as __module
4
- };
5
- //# sourceMappingURL=md5.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"md5.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var modeCfb = { exports: {} };
2
- export {
3
- modeCfb as __module
4
- };
5
- //# sourceMappingURL=mode-cfb.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mode-cfb.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var modeCtrGladman = { exports: {} };
2
- export {
3
- modeCtrGladman as __module
4
- };
5
- //# sourceMappingURL=mode-ctr-gladman.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mode-ctr-gladman.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var modeCtr = { exports: {} };
2
- export {
3
- modeCtr as __module
4
- };
5
- //# sourceMappingURL=mode-ctr.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mode-ctr.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var modeEcb = { exports: {} };
2
- export {
3
- modeEcb as __module
4
- };
5
- //# sourceMappingURL=mode-ecb.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mode-ecb.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var modeOfb = { exports: {} };
2
- export {
3
- modeOfb as __module
4
- };
5
- //# sourceMappingURL=mode-ofb.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mode-ofb.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var padAnsix923 = { exports: {} };
2
- export {
3
- padAnsix923 as __module
4
- };
5
- //# sourceMappingURL=pad-ansix923.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pad-ansix923.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var padIso10126 = { exports: {} };
2
- export {
3
- padIso10126 as __module
4
- };
5
- //# sourceMappingURL=pad-iso10126.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pad-iso10126.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,5 +0,0 @@
1
- var padIso97971 = { exports: {} };
2
- export {
3
- padIso97971 as __module
4
- };
5
- //# sourceMappingURL=pad-iso97971.es.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pad-iso97971.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}