@tiny-codes/react-easy 1.4.6 → 1.4.7

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 (138) hide show
  1. package/CHANGELOG.md +10 -0
  2. package/es/assets/request-camera-en.js +2 -0
  3. package/es/assets/request-camera-en.js.d.ts +2 -0
  4. package/es/assets/request-camera-en.js.map +1 -0
  5. package/es/assets/request-camera-en.png +0 -0
  6. package/es/assets/request-camera-zh.js +2 -0
  7. package/es/assets/request-camera-zh.js.d.ts +2 -0
  8. package/es/assets/request-camera-zh.js.map +1 -0
  9. package/es/assets/request-camera-zh.png +0 -0
  10. package/es/assets/request-microphone-en.js +2 -0
  11. package/es/assets/request-microphone-en.js.d.ts +2 -0
  12. package/es/assets/request-microphone-en.js.map +1 -0
  13. package/es/assets/request-microphone-en.png +0 -0
  14. package/es/assets/request-microphone-zh.js +2 -0
  15. package/es/assets/request-microphone-zh.js.d.ts +2 -0
  16. package/es/assets/request-microphone-zh.js.map +1 -0
  17. package/es/assets/request-microphone-zh.png +0 -0
  18. package/es/assets/reset-camera-en.js +2 -0
  19. package/es/assets/reset-camera-en.js.d.ts +2 -0
  20. package/es/assets/reset-camera-en.js.map +1 -0
  21. package/es/assets/reset-camera-en.png +0 -0
  22. package/es/assets/reset-camera-zh.js +2 -0
  23. package/es/assets/reset-camera-zh.js.d.ts +2 -0
  24. package/es/assets/reset-camera-zh.js.map +1 -0
  25. package/es/assets/reset-camera-zh.png +0 -0
  26. package/es/assets/reset-microphone-en.js +2 -0
  27. package/es/assets/reset-microphone-en.js.d.ts +2 -0
  28. package/es/assets/reset-microphone-en.js.map +1 -0
  29. package/es/assets/reset-microphone-en.png +0 -0
  30. package/es/assets/reset-microphone-zh.js +2 -0
  31. package/es/assets/reset-microphone-zh.js.d.ts +2 -0
  32. package/es/assets/reset-microphone-zh.js.map +1 -0
  33. package/es/assets/reset-microphone-zh.png +0 -0
  34. package/es/assets/save-default-audio1-en.js +2 -0
  35. package/es/assets/save-default-audio1-en.js.d.ts +2 -0
  36. package/es/assets/save-default-audio1-en.js.map +1 -0
  37. package/es/assets/save-default-audio1-en.png +0 -0
  38. package/es/assets/save-default-audio1-zh.js +2 -0
  39. package/es/assets/save-default-audio1-zh.js.d.ts +2 -0
  40. package/es/assets/save-default-audio1-zh.js.map +1 -0
  41. package/es/assets/save-default-audio1-zh.png +0 -0
  42. package/es/assets/save-default-audio2-en.js +2 -0
  43. package/es/assets/save-default-audio2-en.js.d.ts +2 -0
  44. package/es/assets/save-default-audio2-en.js.map +1 -0
  45. package/es/assets/save-default-audio2-en.png +0 -0
  46. package/es/assets/save-default-audio2-zh.js +2 -0
  47. package/es/assets/save-default-audio2-zh.js.d.ts +2 -0
  48. package/es/assets/save-default-audio2-zh.js.map +1 -0
  49. package/es/assets/save-default-audio2-zh.png +0 -0
  50. package/es/components/ConfigProvider/index.js +1 -0
  51. package/es/components/ConfigProvider/index.js.map +1 -1
  52. package/es/hooks/index.d.ts +1 -0
  53. package/es/hooks/index.js +1 -0
  54. package/es/hooks/index.js.map +1 -1
  55. package/es/hooks/useRefValue.d.ts +2 -2
  56. package/es/hooks/useRefValue.js.map +1 -1
  57. package/es/hooks/useUserMedia.d.ts +104 -0
  58. package/es/hooks/useUserMedia.js +799 -0
  59. package/es/hooks/useUserMedia.js.map +1 -0
  60. package/es/locales/index.d.ts +51 -0
  61. package/es/locales/langs/en-US.d.ts +17 -0
  62. package/es/locales/langs/en-US.js +18 -1
  63. package/es/locales/langs/en-US.js.map +1 -1
  64. package/es/locales/langs/zh-CN.d.ts +17 -0
  65. package/es/locales/langs/zh-CN.js +18 -1
  66. package/es/locales/langs/zh-CN.js.map +1 -1
  67. package/es/utils/stream.d.ts +68 -0
  68. package/es/utils/stream.js +122 -0
  69. package/es/utils/stream.js.map +1 -0
  70. package/lib/assets/request-camera-en.js +26 -0
  71. package/lib/assets/request-camera-en.js.d.ts +2 -0
  72. package/lib/assets/request-camera-en.js.map +7 -0
  73. package/lib/assets/request-camera-en.png +0 -0
  74. package/lib/assets/request-camera-zh.js +26 -0
  75. package/lib/assets/request-camera-zh.js.d.ts +2 -0
  76. package/lib/assets/request-camera-zh.js.map +7 -0
  77. package/lib/assets/request-camera-zh.png +0 -0
  78. package/lib/assets/request-microphone-en.js +26 -0
  79. package/lib/assets/request-microphone-en.js.d.ts +2 -0
  80. package/lib/assets/request-microphone-en.js.map +7 -0
  81. package/lib/assets/request-microphone-en.png +0 -0
  82. package/lib/assets/request-microphone-zh.js +26 -0
  83. package/lib/assets/request-microphone-zh.js.d.ts +2 -0
  84. package/lib/assets/request-microphone-zh.js.map +7 -0
  85. package/lib/assets/request-microphone-zh.png +0 -0
  86. package/lib/assets/reset-camera-en.js +26 -0
  87. package/lib/assets/reset-camera-en.js.d.ts +2 -0
  88. package/lib/assets/reset-camera-en.js.map +7 -0
  89. package/lib/assets/reset-camera-en.png +0 -0
  90. package/lib/assets/reset-camera-zh.js +26 -0
  91. package/lib/assets/reset-camera-zh.js.d.ts +2 -0
  92. package/lib/assets/reset-camera-zh.js.map +7 -0
  93. package/lib/assets/reset-camera-zh.png +0 -0
  94. package/lib/assets/reset-microphone-en.js +26 -0
  95. package/lib/assets/reset-microphone-en.js.d.ts +2 -0
  96. package/lib/assets/reset-microphone-en.js.map +7 -0
  97. package/lib/assets/reset-microphone-en.png +0 -0
  98. package/lib/assets/reset-microphone-zh.js +26 -0
  99. package/lib/assets/reset-microphone-zh.js.d.ts +2 -0
  100. package/lib/assets/reset-microphone-zh.js.map +7 -0
  101. package/lib/assets/reset-microphone-zh.png +0 -0
  102. package/lib/assets/save-default-audio1-en.js +26 -0
  103. package/lib/assets/save-default-audio1-en.js.d.ts +2 -0
  104. package/lib/assets/save-default-audio1-en.js.map +7 -0
  105. package/lib/assets/save-default-audio1-en.png +0 -0
  106. package/lib/assets/save-default-audio1-zh.js +26 -0
  107. package/lib/assets/save-default-audio1-zh.js.d.ts +2 -0
  108. package/lib/assets/save-default-audio1-zh.js.map +7 -0
  109. package/lib/assets/save-default-audio1-zh.png +0 -0
  110. package/lib/assets/save-default-audio2-en.js +26 -0
  111. package/lib/assets/save-default-audio2-en.js.d.ts +2 -0
  112. package/lib/assets/save-default-audio2-en.js.map +7 -0
  113. package/lib/assets/save-default-audio2-en.png +0 -0
  114. package/lib/assets/save-default-audio2-zh.js +26 -0
  115. package/lib/assets/save-default-audio2-zh.js.d.ts +2 -0
  116. package/lib/assets/save-default-audio2-zh.js.map +7 -0
  117. package/lib/assets/save-default-audio2-zh.png +0 -0
  118. package/lib/components/ConfigProvider/index.js +1 -0
  119. package/lib/components/ConfigProvider/index.js.map +2 -2
  120. package/lib/hooks/index.d.ts +1 -0
  121. package/lib/hooks/index.js +3 -0
  122. package/lib/hooks/index.js.map +2 -2
  123. package/lib/hooks/useRefValue.d.ts +2 -2
  124. package/lib/hooks/useRefValue.js.map +2 -2
  125. package/lib/hooks/useUserMedia.d.ts +104 -0
  126. package/lib/hooks/useUserMedia.js +553 -0
  127. package/lib/hooks/useUserMedia.js.map +7 -0
  128. package/lib/locales/index.d.ts +51 -0
  129. package/lib/locales/langs/en-US.d.ts +17 -0
  130. package/lib/locales/langs/en-US.js +18 -1
  131. package/lib/locales/langs/en-US.js.map +2 -2
  132. package/lib/locales/langs/zh-CN.d.ts +17 -0
  133. package/lib/locales/langs/zh-CN.js +18 -1
  134. package/lib/locales/langs/zh-CN.js.map +2 -2
  135. package/lib/utils/stream.d.ts +68 -0
  136. package/lib/utils/stream.js +101 -0
  137. package/lib/utils/stream.js.map +7 -0
  138. package/package.json +1 -1
@@ -0,0 +1,799 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
3
+ function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator.return && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, catch: function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
4
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
7
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
8
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
9
+ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
10
+ function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
11
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
12
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
13
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
14
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
15
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
16
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
17
+ import { useContext, useEffect, useMemo, useRef, useState } from 'react';
18
+ import { App, Checkbox, Flex, Form, Modal, notification, Select, Typography } from 'antd';
19
+ import EasyConfigProvider from "../components/ConfigProvider";
20
+ import ReactEasyContext from "../components/ConfigProvider/context";
21
+ import { StreamTimeSlicerClass } from "../utils/stream";
22
+ import useRefFunction from "./useRefFunction";
23
+ import useRefValue from "./useRefValue";
24
+ import useT from "./useT";
25
+ import { jsx as _jsx } from "react/jsx-runtime";
26
+ import { jsxs as _jsxs } from "react/jsx-runtime";
27
+ var requestMicrophoneEnUrlPromise = import("../assets/request-microphone-en.js");
28
+ var requestMicrophoneZhUrlPromise = import("../assets/request-microphone-zh.js");
29
+ var resetMicrophoneEnUrlPromise = import("../assets/reset-microphone-en.js");
30
+ var resetMicrophoneZhUrlPromise = import("../assets/reset-microphone-zh.js");
31
+ var saveAudioDeviceEnUrlPromise1 = import("../assets/save-default-audio1-en.js");
32
+ var saveAudioDeviceZhUrlPromise1 = import("../assets/save-default-audio1-zh.js");
33
+ var saveAudioDeviceEnUrlPromise2 = import("../assets/save-default-audio2-en.js");
34
+ var saveAudioDeviceZhUrlPromise2 = import("../assets/save-default-audio2-zh.js");
35
+ var requestCameraEnUrlPromise = import("../assets/request-camera-en.js");
36
+ var requestCameraZhUrlPromise = import("../assets/request-camera-zh.js");
37
+ var resetCameraEnUrlPromise = import("../assets/reset-camera-en.js");
38
+ var resetCameraZhUrlPromise = import("../assets/reset-camera-zh.js");
39
+ var useUserMedia = function useUserMedia(props) {
40
+ var _app$modal;
41
+ var media = props.media,
42
+ pcmAudioOptions = props.pcmAudioOptions,
43
+ disabled = props.disabled,
44
+ _props$streamSliceMs = props.streamSliceMs,
45
+ streamSliceMs = _props$streamSliceMs === void 0 ? 500 : _props$streamSliceMs,
46
+ _props$soundDetection = props.soundDetectionThreshold,
47
+ soundDetectionThreshold = _props$soundDetection === void 0 ? 0 : _props$soundDetection,
48
+ _props$soundDetection2 = props.soundDetectionTimeout,
49
+ soundDetectionTimeout = _props$soundDetection2 === void 0 ? 3000 : _props$soundDetection2,
50
+ onStartRecording = props.onStartRecording,
51
+ onStopRecording = props.onStopRecording,
52
+ onStreamChunk = props.onStreamChunk,
53
+ onPcmStreamChunk = props.onPcmStreamChunk;
54
+ var context = useContext(ReactEasyContext);
55
+ var lang = context.lang;
56
+ var contextRef = useRefValue(context);
57
+ var t = useT();
58
+ var app = App.useApp();
59
+ // @ts-expect-error: because app may return a stub object when App is not used
60
+ var modal = (_app$modal = app.modal) !== null && _app$modal !== void 0 && _app$modal.confirm ? app.modal : Modal;
61
+ var modalRef = useRefValue(modal);
62
+ var _useState = useState(),
63
+ _useState2 = _slicedToArray(_useState, 2),
64
+ requestMicrophoneEnUrl = _useState2[0],
65
+ setRequestMicrophoneEnUrl = _useState2[1];
66
+ var _useState3 = useState(),
67
+ _useState4 = _slicedToArray(_useState3, 2),
68
+ requestMicrophoneZhUrl = _useState4[0],
69
+ setRequestMicrophoneZhUrl = _useState4[1];
70
+ var _useState5 = useState(),
71
+ _useState6 = _slicedToArray(_useState5, 2),
72
+ resetMicrophoneEnUrl = _useState6[0],
73
+ setResetMicrophoneEnUrl = _useState6[1];
74
+ var _useState7 = useState(),
75
+ _useState8 = _slicedToArray(_useState7, 2),
76
+ resetMicrophoneZhUrl = _useState8[0],
77
+ setResetMicrophoneZhUrl = _useState8[1];
78
+ var _useState9 = useState(),
79
+ _useState10 = _slicedToArray(_useState9, 2),
80
+ requestCameraEnUrl = _useState10[0],
81
+ setRequestCameraEnUrl = _useState10[1];
82
+ var _useState11 = useState(),
83
+ _useState12 = _slicedToArray(_useState11, 2),
84
+ requestCameraZhUrl = _useState12[0],
85
+ setRequestCameraZhUrl = _useState12[1];
86
+ var _useState13 = useState(),
87
+ _useState14 = _slicedToArray(_useState13, 2),
88
+ resetCameraEnUrl = _useState14[0],
89
+ setResetCameraEnUrl = _useState14[1];
90
+ var _useState15 = useState(),
91
+ _useState16 = _slicedToArray(_useState15, 2),
92
+ resetCameraZhUrl = _useState16[0],
93
+ setResetCameraZhUrl = _useState16[1];
94
+ var _useState17 = useState(false),
95
+ _useState18 = _slicedToArray(_useState17, 2),
96
+ isRecording = _useState18[0],
97
+ setIsRecording = _useState18[1];
98
+ var _useState19 = useState(),
99
+ _useState20 = _slicedToArray(_useState19, 2),
100
+ mediaStream = _useState20[0],
101
+ setMediaStream = _useState20[1];
102
+ var _useState21 = useState(null),
103
+ _useState22 = _slicedToArray(_useState21, 2),
104
+ mediaRecorder = _useState22[0],
105
+ setMediaRecorder = _useState22[1];
106
+ var stopSoundListeningRef = useRef(undefined);
107
+ var closePcmRef = useRef(undefined);
108
+ var includeAudio = !!media.audio;
109
+ var exactAudioDeviceIdRef = useRef(undefined);
110
+ var rafRef = useRef(0);
111
+ var isSpeakingRef = useRef(false);
112
+ var silenceVolumeThresholdRef = useRefValue(soundDetectionThreshold);
113
+ var silenceDetectDurationRef = useRefValue(soundDetectionTimeout);
114
+ var soundDetectStart = useRef(0);
115
+ var pcmSampleRateRef = useRef(0);
116
+ var onPcmStreamChunkRef = useRefValue(onPcmStreamChunk);
117
+ var pcmStreamSlicerRef = useRef(new StreamTimeSlicerClass({
118
+ timeSlice: streamSliceMs,
119
+ onSlice: function onSlice(channels) {
120
+ var _onPcmStreamChunkRef$;
121
+ (_onPcmStreamChunkRef$ = onPcmStreamChunkRef.current) === null || _onPcmStreamChunkRef$ === void 0 || _onPcmStreamChunkRef$.call(onPcmStreamChunkRef, channels, pcmSampleRateRef.current);
122
+ }
123
+ }));
124
+ var deviceType = useMemo(function () {
125
+ return media.video ? t('hooks.useUserMedia.camera') : t('hooks.useUserMedia.microphone');
126
+ }, [media, t]);
127
+ var featureName = useMemo(function () {
128
+ return media.video ? t('hooks.featureName.camera') : t('hooks.featureName.microphone');
129
+ }, [media, t]);
130
+ var showDeniedPopup = function showDeniedPopup() {
131
+ var resetMicrophoneUrl = lang === 'zh-CN' ? resetMicrophoneZhUrl : resetMicrophoneEnUrl;
132
+ var resetCameraUrl = lang === 'zh-CN' ? resetCameraZhUrl : resetCameraEnUrl;
133
+ modal.error({
134
+ title: t('hooks.useUserMedia.devicePermission', {
135
+ deviceType: deviceType
136
+ }),
137
+ width: 500,
138
+ content: /*#__PURE__*/_jsxs("div", {
139
+ children: [/*#__PURE__*/_jsx(Typography.Paragraph, {}), /*#__PURE__*/_jsx(Typography.Paragraph, {
140
+ children: /*#__PURE__*/_jsx(Typography.Text, {
141
+ strong: true,
142
+ type: "danger",
143
+ children: t('hooks.useUserMedia.deniedPermission', {
144
+ deviceType: deviceType,
145
+ featureName: featureName
146
+ })
147
+ })
148
+ }), /*#__PURE__*/_jsx(Typography.Paragraph, {
149
+ children: t('hooks.useUserMedia.reopenPermissionGuide', {
150
+ deviceType: deviceType
151
+ })
152
+ }), /*#__PURE__*/_jsx("img", {
153
+ src: media.video ? resetCameraUrl : resetMicrophoneUrl,
154
+ alt: "microphone-permission",
155
+ style: {
156
+ width: 380
157
+ }
158
+ })]
159
+ })
160
+ });
161
+ };
162
+ var recordStream = /*#__PURE__*/function () {
163
+ var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
164
+ var stream, options, recorder, ctx, sourceNode, node, setupWorklet;
165
+ return _regeneratorRuntime().wrap(function _callee2$(_context2) {
166
+ while (1) switch (_context2.prev = _context2.next) {
167
+ case 0:
168
+ _context2.prev = 0;
169
+ options = media;
170
+ if (media.audio) {
171
+ if (exactAudioDeviceIdRef.current) {
172
+ if (media.audio === true) {
173
+ options.audio = {
174
+ deviceId: {
175
+ exact: exactAudioDeviceIdRef.current
176
+ }
177
+ };
178
+ } else {
179
+ options.audio = _objectSpread({
180
+ deviceId: {
181
+ exact: exactAudioDeviceIdRef.current
182
+ }
183
+ }, media.audio);
184
+ }
185
+ }
186
+ }
187
+ _context2.next = 5;
188
+ return navigator.mediaDevices.getUserMedia(options);
189
+ case 5:
190
+ stream = _context2.sent;
191
+ setMediaStream(stream);
192
+ onStartRecording === null || onStartRecording === void 0 || onStartRecording(stream);
193
+ recorder = new MediaRecorder(stream);
194
+ recorder.ondataavailable = function (event) {
195
+ if (event.data.size > 0) {
196
+ onStreamChunk === null || onStreamChunk === void 0 || onStreamChunk(event.data);
197
+ }
198
+ };
199
+ if (streamSliceMs) {
200
+ recorder.start(streamSliceMs);
201
+ } else {
202
+ recorder.start();
203
+ }
204
+ setMediaRecorder(recorder);
205
+ setIsRecording(true);
206
+
207
+ // Capture PCM data if enabled
208
+ if (!(options.audio && onPcmStreamChunkRef.current)) {
209
+ _context2.next = 29;
210
+ break;
211
+ }
212
+ _context2.prev = 14;
213
+ ctx = new AudioContext(pcmAudioOptions === null || pcmAudioOptions === void 0 ? void 0 : pcmAudioOptions.audioContext);
214
+ pcmSampleRateRef.current = ctx.sampleRate;
215
+ // Safari might need resume
216
+ if (!(ctx.state === 'suspended')) {
217
+ _context2.next = 20;
218
+ break;
219
+ }
220
+ _context2.next = 20;
221
+ return ctx.resume();
222
+ case 20:
223
+ sourceNode = ctx.createMediaStreamSource(stream);
224
+ closePcmRef.current = function () {
225
+ var _node, _node2;
226
+ (_node = node) === null || _node === void 0 || _node.port.close();
227
+ (_node2 = node) === null || _node2 === void 0 || _node2.disconnect();
228
+ sourceNode.disconnect();
229
+ ctx.close().catch(function () {
230
+ // Ignore errors
231
+ });
232
+ };
233
+ setupWorklet = /*#__PURE__*/function () {
234
+ var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
235
+ return _regeneratorRuntime().wrap(function _callee$(_context) {
236
+ while (1) switch (_context.prev = _context.next) {
237
+ case 0:
238
+ _context.prev = 0;
239
+ _context.next = 3;
240
+ return ctx.audioWorklet.addModule(generatePcmCaptureProcessorModule());
241
+ case 3:
242
+ node = new AudioWorkletNode(ctx, 'pcm-capture', pcmAudioOptions === null || pcmAudioOptions === void 0 ? void 0 : pcmAudioOptions.workletOptions);
243
+ node.port.onmessage = function (e) {
244
+ var _e$data;
245
+ if (((_e$data = e.data) === null || _e$data === void 0 ? void 0 : _e$data.type) === 'pcm') {
246
+ var _channels = e.data.channels;
247
+ pcmStreamSlicerRef.current.push(_channels);
248
+ }
249
+ };
250
+ sourceNode.connect(node);
251
+ _context.next = 11;
252
+ break;
253
+ case 8:
254
+ _context.prev = 8;
255
+ _context.t0 = _context["catch"](0);
256
+ fallbackScriptProcessor({
257
+ ctx: ctx,
258
+ sourceNode: sourceNode,
259
+ streamSlicer: pcmStreamSlicerRef.current
260
+ });
261
+ case 11:
262
+ case "end":
263
+ return _context.stop();
264
+ }
265
+ }, _callee, null, [[0, 8]]);
266
+ }));
267
+ return function setupWorklet() {
268
+ return _ref2.apply(this, arguments);
269
+ };
270
+ }();
271
+ if ('audioWorklet' in ctx) {
272
+ setupWorklet();
273
+ } else {
274
+ fallbackScriptProcessor({
275
+ ctx: ctx,
276
+ sourceNode: sourceNode,
277
+ streamSlicer: pcmStreamSlicerRef.current
278
+ });
279
+ }
280
+ _context2.next = 29;
281
+ break;
282
+ case 26:
283
+ _context2.prev = 26;
284
+ _context2.t0 = _context2["catch"](14);
285
+ console.error('setup pcm worklet failed', _context2.t0);
286
+ case 29:
287
+ return _context2.abrupt("return", recorder);
288
+ case 32:
289
+ _context2.prev = 32;
290
+ _context2.t1 = _context2["catch"](0);
291
+ console.error(_context2.t1);
292
+ if (!(_context2.t1 instanceof Error && _context2.t1.name === 'NotAllowedError')) {
293
+ _context2.next = 39;
294
+ break;
295
+ }
296
+ showDeniedPopup();
297
+ notification.error({
298
+ message: t('hooks.useUserMedia.deniedPermission', {
299
+ deviceType: deviceType,
300
+ featureName: featureName
301
+ })
302
+ });
303
+ throw new Error(t('hooks.useUserMedia.deniedPermission', {
304
+ deviceType: deviceType,
305
+ featureName: featureName
306
+ }));
307
+ case 39:
308
+ notification.error({
309
+ message: t('hooks.useUserMedia.notSupport')
310
+ });
311
+ throw new Error(t('hooks.useUserMedia.notSupport'));
312
+ case 41:
313
+ case "end":
314
+ return _context2.stop();
315
+ }
316
+ }, _callee2, null, [[0, 32], [14, 26]]);
317
+ }));
318
+ return function recordStream() {
319
+ return _ref.apply(this, arguments);
320
+ };
321
+ }();
322
+ var startRecording = useRefFunction( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3() {
323
+ var _navigator$mediaDevic, _navigator$permission;
324
+ var result, requestMicrophoneUrl, requestCameraUrl;
325
+ return _regeneratorRuntime().wrap(function _callee3$(_context3) {
326
+ while (1) switch (_context3.prev = _context3.next) {
327
+ case 0:
328
+ if (!disabled) {
329
+ _context3.next = 2;
330
+ break;
331
+ }
332
+ throw new Error(t('hooks.useUserMedia.disabledWarning'));
333
+ case 2:
334
+ if (!isRecording) {
335
+ _context3.next = 4;
336
+ break;
337
+ }
338
+ throw new Error(t('hooks.useUserMedia.isRecordingNow'));
339
+ case 4:
340
+ if (!(!((_navigator$mediaDevic = navigator.mediaDevices) !== null && _navigator$mediaDevic !== void 0 && _navigator$mediaDevic.getUserMedia) || !((_navigator$permission = navigator.permissions) !== null && _navigator$permission !== void 0 && _navigator$permission.query))) {
341
+ _context3.next = 7;
342
+ break;
343
+ }
344
+ notification.error({
345
+ message: t('hooks.useUserMedia.notSupport')
346
+ });
347
+ throw new Error(t('hooks.useUserMedia.notSupport'));
348
+ case 7:
349
+ _context3.prev = 7;
350
+ _context3.next = 10;
351
+ return window.navigator.permissions.query({
352
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
353
+ name: media.video ? 'camera' : 'microphone'
354
+ });
355
+ case 10:
356
+ result = _context3.sent;
357
+ if (!(result.state === 'denied')) {
358
+ _context3.next = 17;
359
+ break;
360
+ }
361
+ showDeniedPopup();
362
+ notification.error({
363
+ message: t('hooks.useUserMedia.deniedPermission', {
364
+ deviceType: deviceType,
365
+ featureName: featureName
366
+ })
367
+ });
368
+ throw new Error(t('hooks.useUserMedia.deniedPermission', {
369
+ deviceType: deviceType,
370
+ featureName: featureName
371
+ }));
372
+ case 17:
373
+ if (!(result.state === 'prompt')) {
374
+ _context3.next = 23;
375
+ break;
376
+ }
377
+ requestMicrophoneUrl = lang === 'zh-CN' ? requestMicrophoneZhUrl : requestMicrophoneEnUrl;
378
+ requestCameraUrl = lang === 'zh-CN' ? requestCameraZhUrl : requestCameraEnUrl;
379
+ return _context3.abrupt("return", new Promise(function (resolve, reject) {
380
+ modal.warning({
381
+ title: t('hooks.useUserMedia.devicePermission', {
382
+ deviceType: deviceType
383
+ }),
384
+ content: /*#__PURE__*/_jsxs("div", {
385
+ children: [/*#__PURE__*/_jsx(Typography.Paragraph, {}), /*#__PURE__*/_jsx(Typography.Paragraph, {
386
+ children: /*#__PURE__*/_jsx(Typography.Text, {
387
+ strong: true,
388
+ children: t('hooks.useUserMedia.requestTip1', {
389
+ deviceType: deviceType
390
+ })
391
+ })
392
+ }), /*#__PURE__*/_jsx(Typography.Paragraph, {
393
+ children: t('hooks.useUserMedia.requestTip2', {
394
+ featureName: featureName
395
+ })
396
+ }), /*#__PURE__*/_jsx("div", {
397
+ children: /*#__PURE__*/_jsx("img", {
398
+ src: media.video ? requestCameraUrl : requestMicrophoneUrl,
399
+ alt: "microphone-permission",
400
+ style: {
401
+ width: 380
402
+ }
403
+ })
404
+ })]
405
+ }),
406
+ onOk: function onOk() {
407
+ try {
408
+ recordStream().then(function (recorder) {
409
+ resolve(recorder);
410
+ }).catch(function (error) {
411
+ reject(error);
412
+ });
413
+ } catch (error) {
414
+ console.error(error);
415
+ reject(error);
416
+ }
417
+ },
418
+ width: 500
419
+ });
420
+ }));
421
+ case 23:
422
+ _context3.next = 25;
423
+ return recordStream();
424
+ case 25:
425
+ return _context3.abrupt("return", _context3.sent);
426
+ case 26:
427
+ _context3.next = 32;
428
+ break;
429
+ case 28:
430
+ _context3.prev = 28;
431
+ _context3.t0 = _context3["catch"](7);
432
+ console.error(_context3.t0);
433
+ throw _context3.t0;
434
+ case 32:
435
+ case "end":
436
+ return _context3.stop();
437
+ }
438
+ }, _callee3, null, [[7, 28]]);
439
+ })));
440
+ var stopRecording = useRefFunction(function () {
441
+ var _stopSoundListeningRe, _closePcmRef$current;
442
+ mediaRecorder === null || mediaRecorder === void 0 || mediaRecorder.stop();
443
+ mediaStream === null || mediaStream === void 0 || mediaStream.getTracks().forEach(function (t) {
444
+ return t.stop();
445
+ });
446
+ setMediaStream(undefined);
447
+ setIsRecording(false);
448
+ isSpeakingRef.current = false;
449
+ cancelAnimationFrame(rafRef.current);
450
+ (_stopSoundListeningRe = stopSoundListeningRef.current) === null || _stopSoundListeningRe === void 0 || _stopSoundListeningRe.call(stopSoundListeningRef);
451
+ (_closePcmRef$current = closePcmRef.current) === null || _closePcmRef$current === void 0 || _closePcmRef$current.call(closePcmRef);
452
+ onStopRecording === null || onStopRecording === void 0 || onStopRecording();
453
+ });
454
+
455
+ // Wait for sound. If keep silent for a while, show a modal to let user reselect audio device
456
+ var waitForSound = useRefFunction(function (mediaStream) {
457
+ var ctx = new AudioContext();
458
+ var source = ctx.createMediaStreamSource(mediaStream);
459
+ var analyser = ctx.createAnalyser();
460
+ analyser.fftSize = 2048;
461
+ source.connect(analyser);
462
+ soundDetectStart.current = Date.now();
463
+ var data = new Uint8Array(analyser.fftSize);
464
+ var cancelDetect = function cancelDetect() {
465
+ var _stopSoundListeningRe2;
466
+ cancelAnimationFrame(rafRef.current);
467
+ rafRef.current = 0;
468
+ (_stopSoundListeningRe2 = stopSoundListeningRef.current) === null || _stopSoundListeningRe2 === void 0 || _stopSoundListeningRe2.call(stopSoundListeningRef);
469
+ };
470
+ var loop = function loop() {
471
+ analyser.getByteTimeDomainData(data);
472
+ // Calculate RMS
473
+ var sum = 0;
474
+ var _iterator = _createForOfIteratorHelper(data),
475
+ _step;
476
+ try {
477
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
478
+ var value = _step.value;
479
+ var v = (value - 128) / 128;
480
+ sum += v * v;
481
+ }
482
+ } catch (err) {
483
+ _iterator.e(err);
484
+ } finally {
485
+ _iterator.f();
486
+ }
487
+ var rms = Math.sqrt(sum / data.length); // 0~1
488
+ if (rms > silenceVolumeThresholdRef.current) {
489
+ if (!isSpeakingRef.current) {
490
+ isSpeakingRef.current = true;
491
+ cancelDetect();
492
+ return;
493
+ }
494
+ } else {
495
+ if (Date.now() > soundDetectStart.current + silenceDetectDurationRef.current) {
496
+ navigator.mediaDevices.enumerateDevices().then(function (devices) {
497
+ var audioInputs = devices.filter(function (d) {
498
+ return d.kind === 'audioinput';
499
+ });
500
+ modalRef.current.confirm({
501
+ title: t('hooks.useUserMedia.soundDetectTitle'),
502
+ content: /*#__PURE__*/_jsx(EasyConfigProvider, _objectSpread(_objectSpread({}, contextRef.current), {}, {
503
+ children: /*#__PURE__*/_jsx(SaveAudioDeviceForm, {
504
+ devices: audioInputs,
505
+ mediaStream: mediaStream,
506
+ onDeviceChange: function onDeviceChange(deviceId) {
507
+ return exactAudioDeviceIdRef.current = deviceId;
508
+ }
509
+ })
510
+ })),
511
+ width: 500,
512
+ onOk: function onOk() {
513
+ if (exactAudioDeviceIdRef.current) {
514
+ stopRecording();
515
+ setTimeout(function () {
516
+ startRecording();
517
+ });
518
+ }
519
+ },
520
+ onCancel: function onCancel() {
521
+ cancelDetect();
522
+ }
523
+ });
524
+ });
525
+ cancelDetect();
526
+ return;
527
+ }
528
+ }
529
+ rafRef.current = requestAnimationFrame(loop);
530
+ };
531
+ loop();
532
+ stopSoundListeningRef.current = function () {
533
+ analyser.disconnect();
534
+ source.disconnect();
535
+ ctx.close().catch(function () {
536
+ // Ignore errors
537
+ });
538
+ stopSoundListeningRef.current = undefined;
539
+ };
540
+ });
541
+
542
+ // Component destroy
543
+ useEffect(function () {
544
+ return stopRecording;
545
+ }, []);
546
+
547
+ // Stop recording when disabled has been changed
548
+ useEffect(function () {
549
+ if (disabled && isRecording) {
550
+ stopRecording();
551
+ }
552
+ }, [disabled, isRecording]);
553
+
554
+ // Update PCM stream slicer time slice when input sample rate changes
555
+ useEffect(function () {
556
+ if (streamSliceMs && pcmStreamSlicerRef.current.timeSlice !== streamSliceMs) {
557
+ pcmStreamSlicerRef.current.timeSlice = streamSliceMs;
558
+ }
559
+ }, [streamSliceMs]);
560
+
561
+ // Detect sound activity (only for audio or media with audio)
562
+ useEffect(function () {
563
+ if (includeAudio && mediaStream && !isSpeakingRef.current) {
564
+ try {
565
+ waitForSound(mediaStream);
566
+ } catch (e) {
567
+ console.warn('Audio volume detecting failed:', e);
568
+ }
569
+ }
570
+ return function () {
571
+ var _stopSoundListeningRe3;
572
+ (_stopSoundListeningRe3 = stopSoundListeningRef.current) === null || _stopSoundListeningRe3 === void 0 || _stopSoundListeningRe3.call(stopSoundListeningRef);
573
+ };
574
+ }, [includeAudio, mediaStream, t]);
575
+ useEffect(function () {
576
+ requestMicrophoneEnUrlPromise.then(function (module) {
577
+ setRequestMicrophoneEnUrl(module.default);
578
+ });
579
+ requestMicrophoneZhUrlPromise.then(function (module) {
580
+ setRequestMicrophoneZhUrl(module.default);
581
+ });
582
+ resetMicrophoneEnUrlPromise.then(function (module) {
583
+ setResetMicrophoneEnUrl(module.default);
584
+ });
585
+ resetMicrophoneZhUrlPromise.then(function (module) {
586
+ setResetMicrophoneZhUrl(module.default);
587
+ });
588
+ requestCameraEnUrlPromise.then(function (module) {
589
+ setRequestCameraEnUrl(module.default);
590
+ });
591
+ requestCameraZhUrlPromise.then(function (module) {
592
+ setRequestCameraZhUrl(module.default);
593
+ });
594
+ resetCameraEnUrlPromise.then(function (module) {
595
+ setResetCameraEnUrl(module.default);
596
+ });
597
+ resetCameraZhUrlPromise.then(function (module) {
598
+ setResetCameraZhUrl(module.default);
599
+ });
600
+ }, []);
601
+ return {
602
+ isRecording: isRecording,
603
+ startRecording: startRecording,
604
+ stopRecording: stopRecording
605
+ };
606
+ };
607
+ function SaveAudioDeviceForm(props) {
608
+ var devices = props.devices,
609
+ mediaStream = props.mediaStream,
610
+ onDeviceChange = props.onDeviceChange;
611
+ var _Form$useForm = Form.useForm(),
612
+ _Form$useForm2 = _slicedToArray(_Form$useForm, 1),
613
+ form = _Form$useForm2[0];
614
+ var t = useT();
615
+ var _useContext = useContext(ReactEasyContext),
616
+ lang = _useContext.lang;
617
+ var _useState23 = useState(),
618
+ _useState24 = _slicedToArray(_useState23, 2),
619
+ saveAudioDeviceEnUrl1 = _useState24[0],
620
+ setSaveAudioDeviceEnUrl1 = _useState24[1];
621
+ var _useState25 = useState(),
622
+ _useState26 = _slicedToArray(_useState25, 2),
623
+ saveAudioDeviceEnUrl2 = _useState26[0],
624
+ setSaveAudioDeviceEnUrl2 = _useState26[1];
625
+ var _useState27 = useState(),
626
+ _useState28 = _slicedToArray(_useState27, 2),
627
+ saveAudioDeviceZhUrl1 = _useState28[0],
628
+ setSaveAudioDeviceZhUrl1 = _useState28[1];
629
+ var _useState29 = useState(),
630
+ _useState30 = _slicedToArray(_useState29, 2),
631
+ saveAudioDeviceZhUrl2 = _useState30[0],
632
+ setSaveAudioDeviceZhUrl2 = _useState30[1];
633
+ var _useState31 = useState(false),
634
+ _useState32 = _slicedToArray(_useState31, 2),
635
+ saveDefaultAudioDevicePermanently = _useState32[0],
636
+ setSaveDefaultAudioDevicePermanently = _useState32[1];
637
+ var audioInputs = useMemo(function () {
638
+ return devices.filter(function (d) {
639
+ return d.kind === 'audioinput';
640
+ });
641
+ }, [devices]);
642
+ var _useState33 = useState(function () {
643
+ var _mediaStream$getAudio, _mediaStream$getAudio2, _audioInputs$;
644
+ return (_mediaStream$getAudio = (_mediaStream$getAudio2 = mediaStream.getAudioTracks()[0]) === null || _mediaStream$getAudio2 === void 0 || (_mediaStream$getAudio2 = _mediaStream$getAudio2.getSettings()) === null || _mediaStream$getAudio2 === void 0 ? void 0 : _mediaStream$getAudio2.deviceId) !== null && _mediaStream$getAudio !== void 0 ? _mediaStream$getAudio : (_audioInputs$ = audioInputs[0]) === null || _audioInputs$ === void 0 ? void 0 : _audioInputs$.deviceId;
645
+ }),
646
+ _useState34 = _slicedToArray(_useState33, 2),
647
+ selectedDeviceId = _useState34[0],
648
+ setSelectedDeviceId = _useState34[1];
649
+ var openDataImageInNewTab = useRefFunction(function (dataUrl) {
650
+ var _meta$match;
651
+ if (!dataUrl) return;
652
+ var _dataUrl$split = dataUrl.split(','),
653
+ _dataUrl$split2 = _slicedToArray(_dataUrl$split, 2),
654
+ meta = _dataUrl$split2[0],
655
+ b64 = _dataUrl$split2[1];
656
+ var mime = ((_meta$match = meta.match(/data:(.*);base64/)) === null || _meta$match === void 0 ? void 0 : _meta$match[1]) || 'image/png';
657
+ var binary = atob(b64);
658
+ var len = binary.length;
659
+ var bytes = new Uint8Array(len);
660
+ for (var i = 0; i < len; i++) bytes[i] = binary.charCodeAt(i);
661
+ var blob = new Blob([bytes], {
662
+ type: mime
663
+ });
664
+ var url = URL.createObjectURL(blob);
665
+ window.open(url);
666
+ });
667
+ useEffect(function () {
668
+ saveAudioDeviceEnUrlPromise1.then(function (module) {
669
+ setSaveAudioDeviceEnUrl1(module.default);
670
+ });
671
+ saveAudioDeviceEnUrlPromise2.then(function (module) {
672
+ setSaveAudioDeviceEnUrl2(module.default);
673
+ });
674
+ saveAudioDeviceZhUrlPromise1.then(function (module) {
675
+ setSaveAudioDeviceZhUrl1(module.default);
676
+ });
677
+ saveAudioDeviceZhUrlPromise2.then(function (module) {
678
+ setSaveAudioDeviceZhUrl2(module.default);
679
+ });
680
+ }, []);
681
+ return /*#__PURE__*/_jsxs(Form, {
682
+ layout: "vertical",
683
+ form: form,
684
+ children: [/*#__PURE__*/_jsx(Typography.Paragraph, {}), /*#__PURE__*/_jsx(Typography.Paragraph, {
685
+ children: /*#__PURE__*/_jsx(Typography.Text, {
686
+ children: t('hooks.useUserMedia.soundDetectDescription')
687
+ })
688
+ }), /*#__PURE__*/_jsx(Form.Item, {
689
+ label: t('hooks.useUserMedia.chooseMicrophoneDevice'),
690
+ children: /*#__PURE__*/_jsx(Select, {
691
+ options: audioInputs.map(function (input) {
692
+ return {
693
+ label: input.label,
694
+ value: input.deviceId
695
+ };
696
+ }),
697
+ defaultValue: selectedDeviceId,
698
+ onChange: function onChange(id) {
699
+ setSelectedDeviceId(id);
700
+ onDeviceChange(id);
701
+ }
702
+ })
703
+ }), /*#__PURE__*/_jsx(Form.Item, {
704
+ style: {
705
+ marginBottom: 0
706
+ },
707
+ children: /*#__PURE__*/_jsx(Checkbox, {
708
+ onChange: function onChange(e) {
709
+ return setSaveDefaultAudioDevicePermanently(e.target.checked);
710
+ },
711
+ children: t('hooks.useUserMedia.rememberDefaultAudioDevice')
712
+ })
713
+ }), saveDefaultAudioDevicePermanently && /*#__PURE__*/_jsxs("div", {
714
+ children: [/*#__PURE__*/_jsx(Typography.Paragraph, {
715
+ children: /*#__PURE__*/_jsx(Typography.Text, {
716
+ children: t('hooks.useUserMedia.rememberDefaultAudioDeviceTip')
717
+ })
718
+ }), /*#__PURE__*/_jsxs(Flex, {
719
+ gap: 8,
720
+ align: "flex-start",
721
+ children: [/*#__PURE__*/_jsx("div", {
722
+ style: {
723
+ flex: 1,
724
+ minWidth: 0
725
+ },
726
+ children: /*#__PURE__*/_jsx("a", {
727
+ href: "#",
728
+ onClick: function onClick(e) {
729
+ e.preventDefault();
730
+ openDataImageInNewTab(lang === 'zh-CN' ? saveAudioDeviceZhUrl1 : saveAudioDeviceEnUrl1);
731
+ },
732
+ children: /*#__PURE__*/_jsx("img", {
733
+ src: lang === 'zh-CN' ? saveAudioDeviceZhUrl1 : saveAudioDeviceEnUrl1,
734
+ alt: "the first step to save default audio device",
735
+ style: {
736
+ width: '100%',
737
+ height: 'auto'
738
+ }
739
+ })
740
+ })
741
+ }), /*#__PURE__*/_jsx("div", {
742
+ style: {
743
+ flex: 1,
744
+ minWidth: 0
745
+ },
746
+ children: /*#__PURE__*/_jsx("a", {
747
+ href: "#",
748
+ onClick: function onClick(e) {
749
+ e.preventDefault();
750
+ openDataImageInNewTab(lang === 'zh-CN' ? saveAudioDeviceZhUrl2 : saveAudioDeviceEnUrl2);
751
+ },
752
+ children: /*#__PURE__*/_jsx("img", {
753
+ src: lang === 'zh-CN' ? saveAudioDeviceZhUrl2 : saveAudioDeviceEnUrl2,
754
+ alt: "the second step to save default audio device",
755
+ style: {
756
+ width: '100%',
757
+ height: 'auto'
758
+ }
759
+ })
760
+ })
761
+ })]
762
+ })]
763
+ })]
764
+ });
765
+ }
766
+ function generatePcmCaptureProcessorModule() {
767
+ var workletCode = "\nclass PcmCaptureProcessor extends AudioWorkletProcessor {\n process(inputs, outputs, parameters) {\n const channelsIn = inputs[0];\n if (channelsIn && channelsIn[0]) {\n const channels = channelsIn.map((ch) => {\n const copy = new Float32Array(ch.length);\n copy.set(ch);\n return copy;\n });\n this.port.postMessage({ type: 'pcm', channels }, channels.map(ch => ch.buffer));\n }\n return true;\n }\n}\nregisterProcessor('pcm-capture', PcmCaptureProcessor);\n";
768
+
769
+ // Create a Blob from the worklet code and return its URL
770
+ var blob = new Blob([workletCode], {
771
+ type: 'application/javascript'
772
+ });
773
+ var blobUrl = URL.createObjectURL(blob);
774
+ return blobUrl;
775
+ }
776
+ function fallbackScriptProcessor(options) {
777
+ var ctx = options.ctx,
778
+ sourceNode = options.sourceNode,
779
+ streamSlicer = options.streamSlicer;
780
+ var bufferSize = 128;
781
+ var processor = ctx.createScriptProcessor(bufferSize, 1, 1);
782
+ processor.onaudioprocess = function (ev) {
783
+ var channels = [];
784
+ for (var i = 0; i < ev.inputBuffer.numberOfChannels; i++) {
785
+ var input = ev.inputBuffer.getChannelData(i);
786
+ var copy = new Float32Array(input.length);
787
+ copy.set(input);
788
+ channels.push(copy);
789
+ }
790
+ streamSlicer.push(channels);
791
+ };
792
+ sourceNode.connect(processor);
793
+ // 可不输出:processor.connect(ctx!.destination);不连接 destination 在部分浏览器会被自动 GC,可连到 destination 或 gain(0)
794
+ var gain = ctx.createGain();
795
+ gain.gain.value = 0;
796
+ processor.connect(gain).connect(ctx.destination);
797
+ }
798
+ export default useUserMedia;
799
+ //# sourceMappingURL=useUserMedia.js.map