@tiny-codes/react-easy 1.4.6 → 1.4.8

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