@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.
- package/CHANGELOG.md +24 -0
- package/es/assets/request-camera-en.js +2 -0
- package/es/assets/request-camera-en.js.d.ts +2 -0
- package/es/assets/request-camera-en.js.map +1 -0
- package/es/assets/request-camera-en.png +0 -0
- package/es/assets/request-camera-zh.js +2 -0
- package/es/assets/request-camera-zh.js.d.ts +2 -0
- package/es/assets/request-camera-zh.js.map +1 -0
- package/es/assets/request-camera-zh.png +0 -0
- package/es/assets/request-microphone-en.js +2 -0
- package/es/assets/request-microphone-en.js.d.ts +2 -0
- package/es/assets/request-microphone-en.js.map +1 -0
- package/es/assets/request-microphone-en.png +0 -0
- package/es/assets/request-microphone-zh.js +2 -0
- package/es/assets/request-microphone-zh.js.d.ts +2 -0
- package/es/assets/request-microphone-zh.js.map +1 -0
- package/es/assets/request-microphone-zh.png +0 -0
- package/es/assets/reset-camera-en.js +2 -0
- package/es/assets/reset-camera-en.js.d.ts +2 -0
- package/es/assets/reset-camera-en.js.map +1 -0
- package/es/assets/reset-camera-en.png +0 -0
- package/es/assets/reset-camera-zh.js +2 -0
- package/es/assets/reset-camera-zh.js.d.ts +2 -0
- package/es/assets/reset-camera-zh.js.map +1 -0
- package/es/assets/reset-camera-zh.png +0 -0
- package/es/assets/reset-microphone-en.js +2 -0
- package/es/assets/reset-microphone-en.js.d.ts +2 -0
- package/es/assets/reset-microphone-en.js.map +1 -0
- package/es/assets/reset-microphone-en.png +0 -0
- package/es/assets/reset-microphone-zh.js +2 -0
- package/es/assets/reset-microphone-zh.js.d.ts +2 -0
- package/es/assets/reset-microphone-zh.js.map +1 -0
- package/es/assets/reset-microphone-zh.png +0 -0
- package/es/assets/save-default-audio1-en.js +2 -0
- package/es/assets/save-default-audio1-en.js.d.ts +2 -0
- package/es/assets/save-default-audio1-en.js.map +1 -0
- package/es/assets/save-default-audio1-en.png +0 -0
- package/es/assets/save-default-audio1-zh.js +2 -0
- package/es/assets/save-default-audio1-zh.js.d.ts +2 -0
- package/es/assets/save-default-audio1-zh.js.map +1 -0
- package/es/assets/save-default-audio1-zh.png +0 -0
- package/es/assets/save-default-audio2-en.js +2 -0
- package/es/assets/save-default-audio2-en.js.d.ts +2 -0
- package/es/assets/save-default-audio2-en.js.map +1 -0
- package/es/assets/save-default-audio2-en.png +0 -0
- package/es/assets/save-default-audio2-zh.js +2 -0
- package/es/assets/save-default-audio2-zh.js.d.ts +2 -0
- package/es/assets/save-default-audio2-zh.js.map +1 -0
- package/es/assets/save-default-audio2-zh.png +0 -0
- package/es/components/ConfigProvider/index.js +1 -0
- package/es/components/ConfigProvider/index.js.map +1 -1
- package/es/hooks/index.d.ts +4 -0
- package/es/hooks/index.js +4 -0
- package/es/hooks/index.js.map +1 -1
- package/es/hooks/useRefValue.d.ts +2 -2
- package/es/hooks/useRefValue.js.map +1 -1
- package/es/hooks/useStompSocket.d.ts +63 -0
- package/es/hooks/useStompSocket.js +182 -0
- package/es/hooks/useStompSocket.js.map +1 -0
- package/es/hooks/useUserMedia.d.ts +104 -0
- package/es/hooks/useUserMedia.js +787 -0
- package/es/hooks/useUserMedia.js.map +1 -0
- package/es/locales/index.d.ts +57 -0
- package/es/locales/langs/en-US.d.ts +19 -0
- package/es/locales/langs/en-US.js +20 -1
- package/es/locales/langs/en-US.js.map +1 -1
- package/es/locales/langs/zh-CN.d.ts +19 -0
- package/es/locales/langs/zh-CN.js +20 -1
- package/es/locales/langs/zh-CN.js.map +1 -1
- package/es/utils/stream.d.ts +68 -0
- package/es/utils/stream.js +122 -0
- package/es/utils/stream.js.map +1 -0
- package/lib/assets/request-camera-en.js +26 -0
- package/lib/assets/request-camera-en.js.d.ts +2 -0
- package/lib/assets/request-camera-en.js.map +7 -0
- package/lib/assets/request-camera-en.png +0 -0
- package/lib/assets/request-camera-zh.js +26 -0
- package/lib/assets/request-camera-zh.js.d.ts +2 -0
- package/lib/assets/request-camera-zh.js.map +7 -0
- package/lib/assets/request-camera-zh.png +0 -0
- package/lib/assets/request-microphone-en.js +26 -0
- package/lib/assets/request-microphone-en.js.d.ts +2 -0
- package/lib/assets/request-microphone-en.js.map +7 -0
- package/lib/assets/request-microphone-en.png +0 -0
- package/lib/assets/request-microphone-zh.js +26 -0
- package/lib/assets/request-microphone-zh.js.d.ts +2 -0
- package/lib/assets/request-microphone-zh.js.map +7 -0
- package/lib/assets/request-microphone-zh.png +0 -0
- package/lib/assets/reset-camera-en.js +26 -0
- package/lib/assets/reset-camera-en.js.d.ts +2 -0
- package/lib/assets/reset-camera-en.js.map +7 -0
- package/lib/assets/reset-camera-en.png +0 -0
- package/lib/assets/reset-camera-zh.js +26 -0
- package/lib/assets/reset-camera-zh.js.d.ts +2 -0
- package/lib/assets/reset-camera-zh.js.map +7 -0
- package/lib/assets/reset-camera-zh.png +0 -0
- package/lib/assets/reset-microphone-en.js +26 -0
- package/lib/assets/reset-microphone-en.js.d.ts +2 -0
- package/lib/assets/reset-microphone-en.js.map +7 -0
- package/lib/assets/reset-microphone-en.png +0 -0
- package/lib/assets/reset-microphone-zh.js +26 -0
- package/lib/assets/reset-microphone-zh.js.d.ts +2 -0
- package/lib/assets/reset-microphone-zh.js.map +7 -0
- package/lib/assets/reset-microphone-zh.png +0 -0
- package/lib/assets/save-default-audio1-en.js +26 -0
- package/lib/assets/save-default-audio1-en.js.d.ts +2 -0
- package/lib/assets/save-default-audio1-en.js.map +7 -0
- package/lib/assets/save-default-audio1-en.png +0 -0
- package/lib/assets/save-default-audio1-zh.js +26 -0
- package/lib/assets/save-default-audio1-zh.js.d.ts +2 -0
- package/lib/assets/save-default-audio1-zh.js.map +7 -0
- package/lib/assets/save-default-audio1-zh.png +0 -0
- package/lib/assets/save-default-audio2-en.js +26 -0
- package/lib/assets/save-default-audio2-en.js.d.ts +2 -0
- package/lib/assets/save-default-audio2-en.js.map +7 -0
- package/lib/assets/save-default-audio2-en.png +0 -0
- package/lib/assets/save-default-audio2-zh.js +26 -0
- package/lib/assets/save-default-audio2-zh.js.d.ts +2 -0
- package/lib/assets/save-default-audio2-zh.js.map +7 -0
- package/lib/assets/save-default-audio2-zh.png +0 -0
- package/lib/components/ConfigProvider/index.js +1 -0
- package/lib/components/ConfigProvider/index.js.map +2 -2
- package/lib/hooks/index.d.ts +4 -0
- package/lib/hooks/index.js +12 -1
- package/lib/hooks/index.js.map +2 -2
- package/lib/hooks/useRefValue.d.ts +2 -2
- package/lib/hooks/useRefValue.js.map +2 -2
- package/lib/hooks/useStompSocket.d.ts +63 -0
- package/lib/hooks/useStompSocket.js +154 -0
- package/lib/hooks/useStompSocket.js.map +7 -0
- package/lib/hooks/useUserMedia.d.ts +104 -0
- package/lib/hooks/useUserMedia.js +541 -0
- package/lib/hooks/useUserMedia.js.map +7 -0
- package/lib/locales/index.d.ts +57 -0
- package/lib/locales/langs/en-US.d.ts +19 -0
- package/lib/locales/langs/en-US.js +20 -1
- package/lib/locales/langs/en-US.js.map +2 -2
- package/lib/locales/langs/zh-CN.d.ts +19 -0
- package/lib/locales/langs/zh-CN.js +20 -1
- package/lib/locales/langs/zh-CN.js.map +2 -2
- package/lib/utils/stream.d.ts +68 -0
- package/lib/utils/stream.js +101 -0
- package/lib/utils/stream.js.map +7 -0
- 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
|