@hamsa-ai/voice-agents-sdk 0.3.1 → 0.4.0-beta.2

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.umd.js","sources":["../node_modules/tslib/tslib.es6.js","../node_modules/events/events.js","../node_modules/livekit-client/dist/livekit-client.esm.mjs","../src/classes/livekit-analytics.ts","../src/classes/livekit-audio-manager.ts","../src/classes/livekit-connection.ts","../src/classes/livekit-tool-registry.ts","../src/classes/livekit-manager.ts","../src/classes/screen-wake-lock.ts","../src/main.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n ? R.apply\n : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target)\n .concat(Object.getOwnPropertySymbols(target));\n };\n} else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n}\n\nfunction ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n}\n\nfunction EventEmitter() {\n EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function() {\n return defaultMaxListeners;\n },\n set: function(arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n});\n\nEventEmitter.init = function() {\n\n if (this._events === undefined ||\n this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n\n this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n};\n\nfunction _getMaxListeners(that) {\n if (that._maxListeners === undefined)\n return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = (type === 'error');\n\n var events = this._events;\n if (events !== undefined)\n doError = (doError && events.error === undefined);\n else if (!doError)\n return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0)\n er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n\n var handler = events[type];\n\n if (handler === undefined)\n return false;\n\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i)\n ReflectApply(listeners[i], this, args);\n }\n\n return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n\n checkListener(listener);\n\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type,\n listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] =\n prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' +\n existing.length + ' ' + String(type) + ' listeners ' +\n 'added. Use emitter.setMaxListeners() to ' +\n 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n\n return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n\nfunction onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0)\n return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n}\n\nfunction _onceWrap(target, type, listener) {\n var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n\n checkListener(listener);\n\n events = this._events;\n if (events === undefined)\n return this;\n\n list = events[type];\n if (list === undefined)\n return this;\n\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else {\n delete events[type];\n if (events.removeListener)\n this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n\n if (position < 0)\n return this;\n\n if (position === 0)\n list.shift();\n else {\n spliceOne(list, position);\n }\n\n if (list.length === 1)\n events[type] = list[0];\n\n if (events.removeListener !== undefined)\n this.emit('removeListener', type, originalListener || listener);\n }\n\n return this;\n };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n function removeAllListeners(type) {\n var listeners, events, i;\n\n events = this._events;\n if (events === undefined)\n return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0)\n this._events = Object.create(null);\n else\n delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n\n listeners = events[type];\n\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n\n return this;\n };\n\nfunction _listeners(target, type, unwrap) {\n var events = target._events;\n\n if (events === undefined)\n return [];\n\n var evlistener = events[type];\n if (evlistener === undefined)\n return [];\n\n if (typeof evlistener === 'function')\n return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n return unwrap ?\n unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n var events = this._events;\n\n if (events !== undefined) {\n var evlistener = events[type];\n\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n\n return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i)\n copy[i] = arr[i];\n return copy;\n}\n\nfunction spliceOne(list, index) {\n for (; index + 1 < list.length; index++)\n list[index] = list[index + 1];\n list.pop();\n}\n\nfunction unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n}\n\nfunction once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n };\n\n eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n }\n });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n}\n","function _mergeNamespaces(n, m) {\n m.forEach(function (e) {\n e && typeof e !== 'string' && !Array.isArray(e) && Object.keys(e).forEach(function (k) {\n if (k !== 'default' && !(k in n)) {\n var d = Object.getOwnPropertyDescriptor(e, k);\n Object.defineProperty(n, k, d.get ? d : {\n enumerable: true,\n get: function () { return e[k]; }\n });\n }\n });\n });\n return Object.freeze(n);\n}\n\nvar e = Object.defineProperty;\nvar h = (i, s, t) => s in i ? e(i, s, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: t\n}) : i[s] = t;\nvar o = (i, s, t) => h(i, typeof s != \"symbol\" ? s + \"\" : s, t);\nclass _ {\n constructor() {\n o(this, \"_locking\");\n o(this, \"_locks\");\n this._locking = Promise.resolve(), this._locks = 0;\n }\n isLocked() {\n return this._locks > 0;\n }\n lock() {\n this._locks += 1;\n let s;\n const t = new Promise(l => s = () => {\n this._locks -= 1, l();\n }),\n c = this._locking.then(() => s);\n return this._locking = this._locking.then(() => t), c;\n }\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Assert that condition is truthy or throw error (with message)\n */\nfunction assert(condition, msg) {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions -- we want the implicit conversion to boolean\n if (!condition) {\n throw new Error(msg);\n }\n}\nconst FLOAT32_MAX = 3.4028234663852886e38,\n FLOAT32_MIN = -34028234663852886e22,\n UINT32_MAX = 0xffffffff,\n INT32_MAX = 0x7fffffff,\n INT32_MIN = -2147483648;\n/**\n * Assert a valid signed protobuf 32-bit integer.\n */\nfunction assertInt32(arg) {\n if (typeof arg !== \"number\") throw new Error(\"invalid int 32: \" + typeof arg);\n if (!Number.isInteger(arg) || arg > INT32_MAX || arg < INT32_MIN) throw new Error(\"invalid int 32: \" + arg); // eslint-disable-line @typescript-eslint/restrict-plus-operands -- we want the implicit conversion to string\n}\n/**\n * Assert a valid unsigned protobuf 32-bit integer.\n */\nfunction assertUInt32(arg) {\n if (typeof arg !== \"number\") throw new Error(\"invalid uint 32: \" + typeof arg);\n if (!Number.isInteger(arg) || arg > UINT32_MAX || arg < 0) throw new Error(\"invalid uint 32: \" + arg); // eslint-disable-line @typescript-eslint/restrict-plus-operands -- we want the implicit conversion to string\n}\n/**\n * Assert a valid protobuf float value.\n */\nfunction assertFloat32(arg) {\n if (typeof arg !== \"number\") throw new Error(\"invalid float 32: \" + typeof arg);\n if (!Number.isFinite(arg)) return;\n if (arg > FLOAT32_MAX || arg < FLOAT32_MIN) throw new Error(\"invalid float 32: \" + arg); // eslint-disable-line @typescript-eslint/restrict-plus-operands -- we want the implicit conversion to string\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nconst enumTypeSymbol = Symbol(\"@bufbuild/protobuf/enum-type\");\n/**\n * Get reflection information from a generated enum.\n * If this function is called on something other than a generated\n * enum, it raises an error.\n */\nfunction getEnumType(enumObject) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-explicit-any\n const t = enumObject[enumTypeSymbol];\n assert(t, \"missing enum type on enum object\");\n return t; // eslint-disable-line @typescript-eslint/no-unsafe-return\n}\n/**\n * Sets reflection information on a generated enum.\n */\nfunction setEnumType(enumObject, typeName, values, opt) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n enumObject[enumTypeSymbol] = makeEnumType(typeName, values.map(v => ({\n no: v.no,\n name: v.name,\n localName: enumObject[v.no]\n })));\n}\n/**\n * Create a new EnumType with the given values.\n */\nfunction makeEnumType(typeName, values,\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\n_opt) {\n const names = Object.create(null);\n const numbers = Object.create(null);\n const normalValues = [];\n for (const value of values) {\n // We do not surface options at this time\n // const value: EnumValueInfo = {...v, options: v.options ?? emptyReadonlyObject};\n const n = normalizeEnumValue(value);\n normalValues.push(n);\n names[value.name] = n;\n numbers[value.no] = n;\n }\n return {\n typeName,\n values: normalValues,\n // We do not surface options at this time\n // options: opt?.options ?? Object.create(null),\n findName(name) {\n return names[name];\n },\n findNumber(no) {\n return numbers[no];\n }\n };\n}\n/**\n * Create a new enum object with the given values.\n * Sets reflection information.\n */\nfunction makeEnum(typeName, values, opt) {\n const enumObject = {};\n for (const value of values) {\n const n = normalizeEnumValue(value);\n enumObject[n.localName] = n.no;\n enumObject[n.no] = n.localName;\n }\n setEnumType(enumObject, typeName, values);\n return enumObject;\n}\nfunction normalizeEnumValue(value) {\n if (\"localName\" in value) {\n return value;\n }\n return Object.assign(Object.assign({}, value), {\n localName: value.name\n });\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Message is the base class of every message, generated, or created at\n * runtime.\n *\n * It is _not_ safe to extend this class. If you want to create a message at\n * run time, use proto3.makeMessageType().\n */\nclass Message {\n /**\n * Compare with a message of the same type.\n * Note that this function disregards extensions and unknown fields.\n */\n equals(other) {\n return this.getType().runtime.util.equals(this.getType(), this, other);\n }\n /**\n * Create a deep copy.\n */\n clone() {\n return this.getType().runtime.util.clone(this);\n }\n /**\n * Parse from binary data, merging fields.\n *\n * Repeated fields are appended. Map entries are added, overwriting\n * existing keys.\n *\n * If a message field is already present, it will be merged with the\n * new data.\n */\n fromBinary(bytes, options) {\n const type = this.getType(),\n format = type.runtime.bin,\n opt = format.makeReadOptions(options);\n format.readMessage(this, opt.readerFactory(bytes), bytes.byteLength, opt);\n return this;\n }\n /**\n * Parse a message from a JSON value.\n */\n fromJson(jsonValue, options) {\n const type = this.getType(),\n format = type.runtime.json,\n opt = format.makeReadOptions(options);\n format.readMessage(type, jsonValue, opt, this);\n return this;\n }\n /**\n * Parse a message from a JSON string.\n */\n fromJsonString(jsonString, options) {\n let json;\n try {\n json = JSON.parse(jsonString);\n } catch (e) {\n throw new Error(\"cannot decode \".concat(this.getType().typeName, \" from JSON: \").concat(e instanceof Error ? e.message : String(e)));\n }\n return this.fromJson(json, options);\n }\n /**\n * Serialize the message to binary data.\n */\n toBinary(options) {\n const type = this.getType(),\n bin = type.runtime.bin,\n opt = bin.makeWriteOptions(options),\n writer = opt.writerFactory();\n bin.writeMessage(this, writer, opt);\n return writer.finish();\n }\n /**\n * Serialize the message to a JSON value, a JavaScript value that can be\n * passed to JSON.stringify().\n */\n toJson(options) {\n const type = this.getType(),\n json = type.runtime.json,\n opt = json.makeWriteOptions(options);\n return json.writeMessage(this, opt);\n }\n /**\n * Serialize the message to a JSON string.\n */\n toJsonString(options) {\n var _a;\n const value = this.toJson(options);\n return JSON.stringify(value, null, (_a = options === null || options === void 0 ? void 0 : options.prettySpaces) !== null && _a !== void 0 ? _a : 0);\n }\n /**\n * Override for serialization behavior. This will be invoked when calling\n * JSON.stringify on this message (i.e. JSON.stringify(msg)).\n *\n * Note that this will not serialize google.protobuf.Any with a packed\n * message because the protobuf JSON format specifies that it needs to be\n * unpacked, and this is only possible with a type registry to look up the\n * message type. As a result, attempting to serialize a message with this\n * type will throw an Error.\n *\n * This method is protected because you should not need to invoke it\n * directly -- instead use JSON.stringify or toJsonString for\n * stringified JSON. Alternatively, if actual JSON is desired, you should\n * use toJson.\n */\n toJSON() {\n return this.toJson({\n emitDefaultValues: true\n });\n }\n /**\n * Retrieve the MessageType of this message - a singleton that represents\n * the protobuf message declaration and provides metadata for reflection-\n * based operations.\n */\n getType() {\n // Any class that extends Message _must_ provide a complete static\n // implementation of MessageType.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return\n return Object.getPrototypeOf(this).constructor;\n }\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Create a new message type using the given runtime.\n */\nfunction makeMessageType(runtime, typeName, fields, opt) {\n var _a;\n const localName = (_a = opt === null || opt === void 0 ? void 0 : opt.localName) !== null && _a !== void 0 ? _a : typeName.substring(typeName.lastIndexOf(\".\") + 1);\n const type = {\n [localName]: function (data) {\n runtime.util.initFields(this);\n runtime.util.initPartial(data, this);\n }\n }[localName];\n Object.setPrototypeOf(type.prototype, new Message());\n Object.assign(type, {\n runtime,\n typeName,\n fields: runtime.util.newFieldList(fields),\n fromBinary(bytes, options) {\n return new type().fromBinary(bytes, options);\n },\n fromJson(jsonValue, options) {\n return new type().fromJson(jsonValue, options);\n },\n fromJsonString(jsonString, options) {\n return new type().fromJsonString(jsonString, options);\n },\n equals(a, b) {\n return runtime.util.equals(type, a, b);\n }\n });\n return type;\n}\n\n// Copyright 2008 Google Inc. All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are\n// met:\n//\n// * Redistributions of source code must retain the above copyright\n// notice, this list of conditions and the following disclaimer.\n// * Redistributions in binary form must reproduce the above\n// copyright notice, this list of conditions and the following disclaimer\n// in the documentation and/or other materials provided with the\n// distribution.\n// * Neither the name of Google Inc. nor the names of its\n// contributors may be used to endorse or promote products derived from\n// this software without specific prior written permission.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n//\n// Code generated by the Protocol Buffer compiler is owned by the owner\n// of the input file used when generating it. This code is not\n// standalone and requires a support library to be linked with it. This\n// support library is itself covered by the above license.\n/* eslint-disable prefer-const,@typescript-eslint/restrict-plus-operands */\n/**\n * Read a 64 bit varint as two JS numbers.\n *\n * Returns tuple:\n * [0]: low bits\n * [1]: high bits\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L175\n */\nfunction varint64read() {\n let lowBits = 0;\n let highBits = 0;\n for (let shift = 0; shift < 28; shift += 7) {\n let b = this.buf[this.pos++];\n lowBits |= (b & 0x7f) << shift;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n }\n let middleByte = this.buf[this.pos++];\n // last four bits of the first 32 bit number\n lowBits |= (middleByte & 0x0f) << 28;\n // 3 upper bits are part of the next 32 bit number\n highBits = (middleByte & 0x70) >> 4;\n if ((middleByte & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n for (let shift = 3; shift <= 31; shift += 7) {\n let b = this.buf[this.pos++];\n highBits |= (b & 0x7f) << shift;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return [lowBits, highBits];\n }\n }\n throw new Error(\"invalid varint\");\n}\n/**\n * Write a 64 bit varint, given as two JS numbers, to the given bytes array.\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/writer.js#L344\n */\nfunction varint64write(lo, hi, bytes) {\n for (let i = 0; i < 28; i = i + 7) {\n const shift = lo >>> i;\n const hasNext = !(shift >>> 7 == 0 && hi == 0);\n const byte = (hasNext ? shift | 0x80 : shift) & 0xff;\n bytes.push(byte);\n if (!hasNext) {\n return;\n }\n }\n const splitBits = lo >>> 28 & 0x0f | (hi & 0x07) << 4;\n const hasMoreBits = !(hi >> 3 == 0);\n bytes.push((hasMoreBits ? splitBits | 0x80 : splitBits) & 0xff);\n if (!hasMoreBits) {\n return;\n }\n for (let i = 3; i < 31; i = i + 7) {\n const shift = hi >>> i;\n const hasNext = !(shift >>> 7 == 0);\n const byte = (hasNext ? shift | 0x80 : shift) & 0xff;\n bytes.push(byte);\n if (!hasNext) {\n return;\n }\n }\n bytes.push(hi >>> 31 & 0x01);\n}\n// constants for binary math\nconst TWO_PWR_32_DBL = 0x100000000;\n/**\n * Parse decimal string of 64 bit integer value as two JS numbers.\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf-javascript/blob/a428c58273abad07c66071d9753bc4d1289de426/experimental/runtime/int64.js#L10\n */\nfunction int64FromString(dec) {\n // Check for minus sign.\n const minus = dec[0] === \"-\";\n if (minus) {\n dec = dec.slice(1);\n }\n // Work 6 decimal digits at a time, acting like we're converting base 1e6\n // digits to binary. This is safe to do with floating point math because\n // Number.isSafeInteger(ALL_32_BITS * 1e6) == true.\n const base = 1e6;\n let lowBits = 0;\n let highBits = 0;\n function add1e6digit(begin, end) {\n // Note: Number('') is 0.\n const digit1e6 = Number(dec.slice(begin, end));\n highBits *= base;\n lowBits = lowBits * base + digit1e6;\n // Carry bits from lowBits to\n if (lowBits >= TWO_PWR_32_DBL) {\n highBits = highBits + (lowBits / TWO_PWR_32_DBL | 0);\n lowBits = lowBits % TWO_PWR_32_DBL;\n }\n }\n add1e6digit(-24, -18);\n add1e6digit(-18, -12);\n add1e6digit(-12, -6);\n add1e6digit(-6);\n return minus ? negate(lowBits, highBits) : newBits(lowBits, highBits);\n}\n/**\n * Losslessly converts a 64-bit signed integer in 32:32 split representation\n * into a decimal string.\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf-javascript/blob/a428c58273abad07c66071d9753bc4d1289de426/experimental/runtime/int64.js#L10\n */\nfunction int64ToString(lo, hi) {\n let bits = newBits(lo, hi);\n // If we're treating the input as a signed value and the high bit is set, do\n // a manual two's complement conversion before the decimal conversion.\n const negative = bits.hi & 0x80000000;\n if (negative) {\n bits = negate(bits.lo, bits.hi);\n }\n const result = uInt64ToString(bits.lo, bits.hi);\n return negative ? \"-\" + result : result;\n}\n/**\n * Losslessly converts a 64-bit unsigned integer in 32:32 split representation\n * into a decimal string.\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf-javascript/blob/a428c58273abad07c66071d9753bc4d1289de426/experimental/runtime/int64.js#L10\n */\nfunction uInt64ToString(lo, hi) {\n ({\n lo,\n hi\n } = toUnsigned(lo, hi));\n // Skip the expensive conversion if the number is small enough to use the\n // built-in conversions.\n // Number.MAX_SAFE_INTEGER = 0x001FFFFF FFFFFFFF, thus any number with\n // highBits <= 0x1FFFFF can be safely expressed with a double and retain\n // integer precision.\n // Proven by: Number.isSafeInteger(0x1FFFFF * 2**32 + 0xFFFFFFFF) == true.\n if (hi <= 0x1FFFFF) {\n return String(TWO_PWR_32_DBL * hi + lo);\n }\n // What this code is doing is essentially converting the input number from\n // base-2 to base-1e7, which allows us to represent the 64-bit range with\n // only 3 (very large) digits. Those digits are then trivial to convert to\n // a base-10 string.\n // The magic numbers used here are -\n // 2^24 = 16777216 = (1,6777216) in base-1e7.\n // 2^48 = 281474976710656 = (2,8147497,6710656) in base-1e7.\n // Split 32:32 representation into 16:24:24 representation so our\n // intermediate digits don't overflow.\n const low = lo & 0xFFFFFF;\n const mid = (lo >>> 24 | hi << 8) & 0xFFFFFF;\n const high = hi >> 16 & 0xFFFF;\n // Assemble our three base-1e7 digits, ignoring carries. The maximum\n // value in a digit at this step is representable as a 48-bit integer, which\n // can be stored in a 64-bit floating point number.\n let digitA = low + mid * 6777216 + high * 6710656;\n let digitB = mid + high * 8147497;\n let digitC = high * 2;\n // Apply carries from A to B and from B to C.\n const base = 10000000;\n if (digitA >= base) {\n digitB += Math.floor(digitA / base);\n digitA %= base;\n }\n if (digitB >= base) {\n digitC += Math.floor(digitB / base);\n digitB %= base;\n }\n // If digitC is 0, then we should have returned in the trivial code path\n // at the top for non-safe integers. Given this, we can assume both digitB\n // and digitA need leading zeros.\n return digitC.toString() + decimalFrom1e7WithLeadingZeros(digitB) + decimalFrom1e7WithLeadingZeros(digitA);\n}\nfunction toUnsigned(lo, hi) {\n return {\n lo: lo >>> 0,\n hi: hi >>> 0\n };\n}\nfunction newBits(lo, hi) {\n return {\n lo: lo | 0,\n hi: hi | 0\n };\n}\n/**\n * Returns two's compliment negation of input.\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators#Signed_32-bit_integers\n */\nfunction negate(lowBits, highBits) {\n highBits = ~highBits;\n if (lowBits) {\n lowBits = ~lowBits + 1;\n } else {\n // If lowBits is 0, then bitwise-not is 0xFFFFFFFF,\n // adding 1 to that, results in 0x100000000, which leaves\n // the low bits 0x0 and simply adds one to the high bits.\n highBits += 1;\n }\n return newBits(lowBits, highBits);\n}\n/**\n * Returns decimal representation of digit1e7 with leading zeros.\n */\nconst decimalFrom1e7WithLeadingZeros = digit1e7 => {\n const partial = String(digit1e7);\n return \"0000000\".slice(partial.length) + partial;\n};\n/**\n * Write a 32 bit varint, signed or unsigned. Same as `varint64write(0, value, bytes)`\n *\n * Copyright 2008 Google Inc. All rights reserved.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/1b18833f4f2a2f681f4e4a25cdf3b0a43115ec26/js/binary/encoder.js#L144\n */\nfunction varint32write(value, bytes) {\n if (value >= 0) {\n // write value as varint 32\n while (value > 0x7f) {\n bytes.push(value & 0x7f | 0x80);\n value = value >>> 7;\n }\n bytes.push(value);\n } else {\n for (let i = 0; i < 9; i++) {\n bytes.push(value & 127 | 128);\n value = value >> 7;\n }\n bytes.push(1);\n }\n}\n/**\n * Read an unsigned 32 bit varint.\n *\n * See https://github.com/protocolbuffers/protobuf/blob/8a71927d74a4ce34efe2d8769fda198f52d20d12/js/experimental/runtime/kernel/buffer_decoder.js#L220\n */\nfunction varint32read() {\n let b = this.buf[this.pos++];\n let result = b & 0x7f;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7f) << 7;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7f) << 14;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n b = this.buf[this.pos++];\n result |= (b & 0x7f) << 21;\n if ((b & 0x80) == 0) {\n this.assertBounds();\n return result;\n }\n // Extract only last 4 bits\n b = this.buf[this.pos++];\n result |= (b & 0x0f) << 28;\n for (let readBytes = 5; (b & 0x80) !== 0 && readBytes < 10; readBytes++) b = this.buf[this.pos++];\n if ((b & 0x80) != 0) throw new Error(\"invalid varint\");\n this.assertBounds();\n // Result can have 32 bits, convert it to unsigned\n return result >>> 0;\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nfunction makeInt64Support() {\n const dv = new DataView(new ArrayBuffer(8));\n // note that Safari 14 implements BigInt, but not the DataView methods\n const ok = typeof BigInt === \"function\" && typeof dv.getBigInt64 === \"function\" && typeof dv.getBigUint64 === \"function\" && typeof dv.setBigInt64 === \"function\" && typeof dv.setBigUint64 === \"function\" && (typeof process != \"object\" || typeof process.env != \"object\" || process.env.BUF_BIGINT_DISABLE !== \"1\");\n if (ok) {\n const MIN = BigInt(\"-9223372036854775808\"),\n MAX = BigInt(\"9223372036854775807\"),\n UMIN = BigInt(\"0\"),\n UMAX = BigInt(\"18446744073709551615\");\n return {\n zero: BigInt(0),\n supported: true,\n parse(value) {\n const bi = typeof value == \"bigint\" ? value : BigInt(value);\n if (bi > MAX || bi < MIN) {\n throw new Error(\"int64 invalid: \".concat(value));\n }\n return bi;\n },\n uParse(value) {\n const bi = typeof value == \"bigint\" ? value : BigInt(value);\n if (bi > UMAX || bi < UMIN) {\n throw new Error(\"uint64 invalid: \".concat(value));\n }\n return bi;\n },\n enc(value) {\n dv.setBigInt64(0, this.parse(value), true);\n return {\n lo: dv.getInt32(0, true),\n hi: dv.getInt32(4, true)\n };\n },\n uEnc(value) {\n dv.setBigInt64(0, this.uParse(value), true);\n return {\n lo: dv.getInt32(0, true),\n hi: dv.getInt32(4, true)\n };\n },\n dec(lo, hi) {\n dv.setInt32(0, lo, true);\n dv.setInt32(4, hi, true);\n return dv.getBigInt64(0, true);\n },\n uDec(lo, hi) {\n dv.setInt32(0, lo, true);\n dv.setInt32(4, hi, true);\n return dv.getBigUint64(0, true);\n }\n };\n }\n const assertInt64String = value => assert(/^-?[0-9]+$/.test(value), \"int64 invalid: \".concat(value));\n const assertUInt64String = value => assert(/^[0-9]+$/.test(value), \"uint64 invalid: \".concat(value));\n return {\n zero: \"0\",\n supported: false,\n parse(value) {\n if (typeof value != \"string\") {\n value = value.toString();\n }\n assertInt64String(value);\n return value;\n },\n uParse(value) {\n if (typeof value != \"string\") {\n value = value.toString();\n }\n assertUInt64String(value);\n return value;\n },\n enc(value) {\n if (typeof value != \"string\") {\n value = value.toString();\n }\n assertInt64String(value);\n return int64FromString(value);\n },\n uEnc(value) {\n if (typeof value != \"string\") {\n value = value.toString();\n }\n assertUInt64String(value);\n return int64FromString(value);\n },\n dec(lo, hi) {\n return int64ToString(lo, hi);\n },\n uDec(lo, hi) {\n return uInt64ToString(lo, hi);\n }\n };\n}\nconst protoInt64 = makeInt64Support();\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Scalar value types. This is a subset of field types declared by protobuf\n * enum google.protobuf.FieldDescriptorProto.Type The types GROUP and MESSAGE\n * are omitted, but the numerical values are identical.\n */\nvar ScalarType;\n(function (ScalarType) {\n // 0 is reserved for errors.\n // Order is weird for historical reasons.\n ScalarType[ScalarType[\"DOUBLE\"] = 1] = \"DOUBLE\";\n ScalarType[ScalarType[\"FLOAT\"] = 2] = \"FLOAT\";\n // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT64 if\n // negative values are likely.\n ScalarType[ScalarType[\"INT64\"] = 3] = \"INT64\";\n ScalarType[ScalarType[\"UINT64\"] = 4] = \"UINT64\";\n // Not ZigZag encoded. Negative numbers take 10 bytes. Use TYPE_SINT32 if\n // negative values are likely.\n ScalarType[ScalarType[\"INT32\"] = 5] = \"INT32\";\n ScalarType[ScalarType[\"FIXED64\"] = 6] = \"FIXED64\";\n ScalarType[ScalarType[\"FIXED32\"] = 7] = \"FIXED32\";\n ScalarType[ScalarType[\"BOOL\"] = 8] = \"BOOL\";\n ScalarType[ScalarType[\"STRING\"] = 9] = \"STRING\";\n // Tag-delimited aggregate.\n // Group type is deprecated and not supported in proto3. However, Proto3\n // implementations should still be able to parse the group wire format and\n // treat group fields as unknown fields.\n // TYPE_GROUP = 10,\n // TYPE_MESSAGE = 11, // Length-delimited aggregate.\n // New in version 2.\n ScalarType[ScalarType[\"BYTES\"] = 12] = \"BYTES\";\n ScalarType[ScalarType[\"UINT32\"] = 13] = \"UINT32\";\n // TYPE_ENUM = 14,\n ScalarType[ScalarType[\"SFIXED32\"] = 15] = \"SFIXED32\";\n ScalarType[ScalarType[\"SFIXED64\"] = 16] = \"SFIXED64\";\n ScalarType[ScalarType[\"SINT32\"] = 17] = \"SINT32\";\n ScalarType[ScalarType[\"SINT64\"] = 18] = \"SINT64\";\n})(ScalarType || (ScalarType = {}));\n/**\n * JavaScript representation of fields with 64 bit integral types (int64, uint64,\n * sint64, fixed64, sfixed64).\n *\n * This is a subset of google.protobuf.FieldOptions.JSType, which defines JS_NORMAL,\n * JS_STRING, and JS_NUMBER. Protobuf-ES uses BigInt by default, but will use\n * String if `[jstype = JS_STRING]` is specified.\n *\n * ```protobuf\n * uint64 field_a = 1; // BigInt\n * uint64 field_b = 2 [jstype = JS_NORMAL]; // BigInt\n * uint64 field_b = 2 [jstype = JS_NUMBER]; // BigInt\n * uint64 field_b = 2 [jstype = JS_STRING]; // String\n * ```\n */\nvar LongType;\n(function (LongType) {\n /**\n * Use JavaScript BigInt.\n */\n LongType[LongType[\"BIGINT\"] = 0] = \"BIGINT\";\n /**\n * Use JavaScript String.\n *\n * Field option `[jstype = JS_STRING]`.\n */\n LongType[LongType[\"STRING\"] = 1] = \"STRING\";\n})(LongType || (LongType = {}));\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Returns true if both scalar values are equal.\n */\nfunction scalarEquals(type, a, b) {\n if (a === b) {\n // This correctly matches equal values except BYTES and (possibly) 64-bit integers.\n return true;\n }\n // Special case BYTES - we need to compare each byte individually\n if (type == ScalarType.BYTES) {\n if (!(a instanceof Uint8Array) || !(b instanceof Uint8Array)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n }\n // Special case 64-bit integers - we support number, string and bigint representation.\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (type) {\n case ScalarType.UINT64:\n case ScalarType.FIXED64:\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n // Loose comparison will match between 0n, 0 and \"0\".\n return a == b;\n }\n // Anything that hasn't been caught by strict comparison or special cased\n // BYTES and 64-bit integers is not equal.\n return false;\n}\n/**\n * Returns the zero value for the given scalar type.\n */\nfunction scalarZeroValue(type, longType) {\n switch (type) {\n case ScalarType.BOOL:\n return false;\n case ScalarType.UINT64:\n case ScalarType.FIXED64:\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison -- acceptable since it's covered by tests\n return longType == 0 ? protoInt64.zero : \"0\";\n case ScalarType.DOUBLE:\n case ScalarType.FLOAT:\n return 0.0;\n case ScalarType.BYTES:\n return new Uint8Array(0);\n case ScalarType.STRING:\n return \"\";\n default:\n // Handles INT32, UINT32, SINT32, FIXED32, SFIXED32.\n // We do not use individual cases to save a few bytes code size.\n return 0;\n }\n}\n/**\n * Returns true for a zero-value. For example, an integer has the zero-value `0`,\n * a boolean is `false`, a string is `\"\"`, and bytes is an empty Uint8Array.\n *\n * In proto3, zero-values are not written to the wire, unless the field is\n * optional or repeated.\n */\nfunction isScalarZeroValue(type, value) {\n switch (type) {\n case ScalarType.BOOL:\n return value === false;\n case ScalarType.STRING:\n return value === \"\";\n case ScalarType.BYTES:\n return value instanceof Uint8Array && !value.byteLength;\n default:\n return value == 0;\n // Loose comparison matches 0n, 0 and \"0\"\n }\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/* eslint-disable prefer-const,no-case-declarations,@typescript-eslint/restrict-plus-operands */\n/**\n * Protobuf binary format wire types.\n *\n * A wire type provides just enough information to find the length of the\n * following value.\n *\n * See https://developers.google.com/protocol-buffers/docs/encoding#structure\n */\nvar WireType;\n(function (WireType) {\n /**\n * Used for int32, int64, uint32, uint64, sint32, sint64, bool, enum\n */\n WireType[WireType[\"Varint\"] = 0] = \"Varint\";\n /**\n * Used for fixed64, sfixed64, double.\n * Always 8 bytes with little-endian byte order.\n */\n WireType[WireType[\"Bit64\"] = 1] = \"Bit64\";\n /**\n * Used for string, bytes, embedded messages, packed repeated fields\n *\n * Only repeated numeric types (types which use the varint, 32-bit,\n * or 64-bit wire types) can be packed. In proto3, such fields are\n * packed by default.\n */\n WireType[WireType[\"LengthDelimited\"] = 2] = \"LengthDelimited\";\n /**\n * Start of a tag-delimited aggregate, such as a proto2 group, or a message\n * in editions with message_encoding = DELIMITED.\n */\n WireType[WireType[\"StartGroup\"] = 3] = \"StartGroup\";\n /**\n * End of a tag-delimited aggregate.\n */\n WireType[WireType[\"EndGroup\"] = 4] = \"EndGroup\";\n /**\n * Used for fixed32, sfixed32, float.\n * Always 4 bytes with little-endian byte order.\n */\n WireType[WireType[\"Bit32\"] = 5] = \"Bit32\";\n})(WireType || (WireType = {}));\nclass BinaryWriter {\n constructor(textEncoder) {\n /**\n * Previous fork states.\n */\n this.stack = [];\n this.textEncoder = textEncoder !== null && textEncoder !== void 0 ? textEncoder : new TextEncoder();\n this.chunks = [];\n this.buf = [];\n }\n /**\n * Return all bytes written and reset this writer.\n */\n finish() {\n this.chunks.push(new Uint8Array(this.buf)); // flush the buffer\n let len = 0;\n for (let i = 0; i < this.chunks.length; i++) len += this.chunks[i].length;\n let bytes = new Uint8Array(len);\n let offset = 0;\n for (let i = 0; i < this.chunks.length; i++) {\n bytes.set(this.chunks[i], offset);\n offset += this.chunks[i].length;\n }\n this.chunks = [];\n return bytes;\n }\n /**\n * Start a new fork for length-delimited data like a message\n * or a packed repeated field.\n *\n * Must be joined later with `join()`.\n */\n fork() {\n this.stack.push({\n chunks: this.chunks,\n buf: this.buf\n });\n this.chunks = [];\n this.buf = [];\n return this;\n }\n /**\n * Join the last fork. Write its length and bytes, then\n * return to the previous state.\n */\n join() {\n // get chunk of fork\n let chunk = this.finish();\n // restore previous state\n let prev = this.stack.pop();\n if (!prev) throw new Error(\"invalid state, fork stack empty\");\n this.chunks = prev.chunks;\n this.buf = prev.buf;\n // write length of chunk as varint\n this.uint32(chunk.byteLength);\n return this.raw(chunk);\n }\n /**\n * Writes a tag (field number and wire type).\n *\n * Equivalent to `uint32( (fieldNo << 3 | type) >>> 0 )`.\n *\n * Generated code should compute the tag ahead of time and call `uint32()`.\n */\n tag(fieldNo, type) {\n return this.uint32((fieldNo << 3 | type) >>> 0);\n }\n /**\n * Write a chunk of raw bytes.\n */\n raw(chunk) {\n if (this.buf.length) {\n this.chunks.push(new Uint8Array(this.buf));\n this.buf = [];\n }\n this.chunks.push(chunk);\n return this;\n }\n /**\n * Write a `uint32` value, an unsigned 32 bit varint.\n */\n uint32(value) {\n assertUInt32(value);\n // write value as varint 32, inlined for speed\n while (value > 0x7f) {\n this.buf.push(value & 0x7f | 0x80);\n value = value >>> 7;\n }\n this.buf.push(value);\n return this;\n }\n /**\n * Write a `int32` value, a signed 32 bit varint.\n */\n int32(value) {\n assertInt32(value);\n varint32write(value, this.buf);\n return this;\n }\n /**\n * Write a `bool` value, a variant.\n */\n bool(value) {\n this.buf.push(value ? 1 : 0);\n return this;\n }\n /**\n * Write a `bytes` value, length-delimited arbitrary data.\n */\n bytes(value) {\n this.uint32(value.byteLength); // write length of chunk as varint\n return this.raw(value);\n }\n /**\n * Write a `string` value, length-delimited data converted to UTF-8 text.\n */\n string(value) {\n let chunk = this.textEncoder.encode(value);\n this.uint32(chunk.byteLength); // write length of chunk as varint\n return this.raw(chunk);\n }\n /**\n * Write a `float` value, 32-bit floating point number.\n */\n float(value) {\n assertFloat32(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setFloat32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `double` value, a 64-bit floating point number.\n */\n double(value) {\n let chunk = new Uint8Array(8);\n new DataView(chunk.buffer).setFloat64(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `fixed32` value, an unsigned, fixed-length 32-bit integer.\n */\n fixed32(value) {\n assertUInt32(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setUint32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `sfixed32` value, a signed, fixed-length 32-bit integer.\n */\n sfixed32(value) {\n assertInt32(value);\n let chunk = new Uint8Array(4);\n new DataView(chunk.buffer).setInt32(0, value, true);\n return this.raw(chunk);\n }\n /**\n * Write a `sint32` value, a signed, zigzag-encoded 32-bit varint.\n */\n sint32(value) {\n assertInt32(value);\n // zigzag encode\n value = (value << 1 ^ value >> 31) >>> 0;\n varint32write(value, this.buf);\n return this;\n }\n /**\n * Write a `fixed64` value, a signed, fixed-length 64-bit integer.\n */\n sfixed64(value) {\n let chunk = new Uint8Array(8),\n view = new DataView(chunk.buffer),\n tc = protoInt64.enc(value);\n view.setInt32(0, tc.lo, true);\n view.setInt32(4, tc.hi, true);\n return this.raw(chunk);\n }\n /**\n * Write a `fixed64` value, an unsigned, fixed-length 64 bit integer.\n */\n fixed64(value) {\n let chunk = new Uint8Array(8),\n view = new DataView(chunk.buffer),\n tc = protoInt64.uEnc(value);\n view.setInt32(0, tc.lo, true);\n view.setInt32(4, tc.hi, true);\n return this.raw(chunk);\n }\n /**\n * Write a `int64` value, a signed 64-bit varint.\n */\n int64(value) {\n let tc = protoInt64.enc(value);\n varint64write(tc.lo, tc.hi, this.buf);\n return this;\n }\n /**\n * Write a `sint64` value, a signed, zig-zag-encoded 64-bit varint.\n */\n sint64(value) {\n let tc = protoInt64.enc(value),\n // zigzag encode\n sign = tc.hi >> 31,\n lo = tc.lo << 1 ^ sign,\n hi = (tc.hi << 1 | tc.lo >>> 31) ^ sign;\n varint64write(lo, hi, this.buf);\n return this;\n }\n /**\n * Write a `uint64` value, an unsigned 64-bit varint.\n */\n uint64(value) {\n let tc = protoInt64.uEnc(value);\n varint64write(tc.lo, tc.hi, this.buf);\n return this;\n }\n}\nclass BinaryReader {\n constructor(buf, textDecoder) {\n this.varint64 = varint64read; // dirty cast for `this`\n /**\n * Read a `uint32` field, an unsigned 32 bit varint.\n */\n this.uint32 = varint32read; // dirty cast for `this` and access to protected `buf`\n this.buf = buf;\n this.len = buf.length;\n this.pos = 0;\n this.view = new DataView(buf.buffer, buf.byteOffset, buf.byteLength);\n this.textDecoder = textDecoder !== null && textDecoder !== void 0 ? textDecoder : new TextDecoder();\n }\n /**\n * Reads a tag - field number and wire type.\n */\n tag() {\n let tag = this.uint32(),\n fieldNo = tag >>> 3,\n wireType = tag & 7;\n if (fieldNo <= 0 || wireType < 0 || wireType > 5) throw new Error(\"illegal tag: field no \" + fieldNo + \" wire type \" + wireType);\n return [fieldNo, wireType];\n }\n /**\n * Skip one element and return the skipped data.\n *\n * When skipping StartGroup, provide the tags field number to check for\n * matching field number in the EndGroup tag.\n */\n skip(wireType, fieldNo) {\n let start = this.pos;\n switch (wireType) {\n case WireType.Varint:\n while (this.buf[this.pos++] & 0x80) {\n // ignore\n }\n break;\n // eslint-disable-next-line\n // @ts-ignore TS7029: Fallthrough case in switch\n case WireType.Bit64:\n this.pos += 4;\n // eslint-disable-next-line\n // @ts-ignore TS7029: Fallthrough case in switch\n case WireType.Bit32:\n this.pos += 4;\n break;\n case WireType.LengthDelimited:\n let len = this.uint32();\n this.pos += len;\n break;\n case WireType.StartGroup:\n for (;;) {\n const [fn, wt] = this.tag();\n if (wt === WireType.EndGroup) {\n if (fieldNo !== undefined && fn !== fieldNo) {\n throw new Error(\"invalid end group tag\");\n }\n break;\n }\n this.skip(wt, fn);\n }\n break;\n default:\n throw new Error(\"cant skip wire type \" + wireType);\n }\n this.assertBounds();\n return this.buf.subarray(start, this.pos);\n }\n /**\n * Throws error if position in byte array is out of range.\n */\n assertBounds() {\n if (this.pos > this.len) throw new RangeError(\"premature EOF\");\n }\n /**\n * Read a `int32` field, a signed 32 bit varint.\n */\n int32() {\n return this.uint32() | 0;\n }\n /**\n * Read a `sint32` field, a signed, zigzag-encoded 32-bit varint.\n */\n sint32() {\n let zze = this.uint32();\n // decode zigzag\n return zze >>> 1 ^ -(zze & 1);\n }\n /**\n * Read a `int64` field, a signed 64-bit varint.\n */\n int64() {\n return protoInt64.dec(...this.varint64());\n }\n /**\n * Read a `uint64` field, an unsigned 64-bit varint.\n */\n uint64() {\n return protoInt64.uDec(...this.varint64());\n }\n /**\n * Read a `sint64` field, a signed, zig-zag-encoded 64-bit varint.\n */\n sint64() {\n let [lo, hi] = this.varint64();\n // decode zig zag\n let s = -(lo & 1);\n lo = (lo >>> 1 | (hi & 1) << 31) ^ s;\n hi = hi >>> 1 ^ s;\n return protoInt64.dec(lo, hi);\n }\n /**\n * Read a `bool` field, a variant.\n */\n bool() {\n let [lo, hi] = this.varint64();\n return lo !== 0 || hi !== 0;\n }\n /**\n * Read a `fixed32` field, an unsigned, fixed-length 32-bit integer.\n */\n fixed32() {\n return this.view.getUint32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `sfixed32` field, a signed, fixed-length 32-bit integer.\n */\n sfixed32() {\n return this.view.getInt32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `fixed64` field, an unsigned, fixed-length 64 bit integer.\n */\n fixed64() {\n return protoInt64.uDec(this.sfixed32(), this.sfixed32());\n }\n /**\n * Read a `fixed64` field, a signed, fixed-length 64-bit integer.\n */\n sfixed64() {\n return protoInt64.dec(this.sfixed32(), this.sfixed32());\n }\n /**\n * Read a `float` field, 32-bit floating point number.\n */\n float() {\n return this.view.getFloat32((this.pos += 4) - 4, true);\n }\n /**\n * Read a `double` field, a 64-bit floating point number.\n */\n double() {\n return this.view.getFloat64((this.pos += 8) - 8, true);\n }\n /**\n * Read a `bytes` field, length-delimited arbitrary data.\n */\n bytes() {\n let len = this.uint32(),\n start = this.pos;\n this.pos += len;\n this.assertBounds();\n return this.buf.subarray(start, start + len);\n }\n /**\n * Read a `string` field, length-delimited data converted to UTF-8 text.\n */\n string() {\n return this.textDecoder.decode(this.bytes());\n }\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Create a new extension using the given runtime.\n */\nfunction makeExtension(runtime, typeName, extendee, field) {\n let fi;\n return {\n typeName,\n extendee,\n get field() {\n if (!fi) {\n const i = typeof field == \"function\" ? field() : field;\n i.name = typeName.split(\".\").pop();\n i.jsonName = \"[\".concat(typeName, \"]\");\n fi = runtime.util.newFieldList([i]).list()[0];\n }\n return fi;\n },\n runtime\n };\n}\n/**\n * Create a container that allows us to read extension fields into it with the\n * same logic as regular fields.\n */\nfunction createExtensionContainer(extension) {\n const localName = extension.field.localName;\n const container = Object.create(null);\n container[localName] = initExtensionField(extension);\n return [container, () => container[localName]];\n}\nfunction initExtensionField(ext) {\n const field = ext.field;\n if (field.repeated) {\n return [];\n }\n if (field.default !== undefined) {\n return field.default;\n }\n switch (field.kind) {\n case \"enum\":\n return field.T.values[0].no;\n case \"scalar\":\n return scalarZeroValue(field.T, field.L);\n case \"message\":\n // eslint-disable-next-line no-case-declarations\n const T = field.T,\n value = new T();\n return T.fieldWrapper ? T.fieldWrapper.unwrapField(value) : value;\n case \"map\":\n throw \"map fields are not allowed to be extensions\";\n }\n}\n/**\n * Helper to filter unknown fields, optimized based on field type.\n */\nfunction filterUnknownFields(unknownFields, field) {\n if (!field.repeated && (field.kind == \"enum\" || field.kind == \"scalar\")) {\n // singular scalar fields do not merge, we pick the last\n for (let i = unknownFields.length - 1; i >= 0; --i) {\n if (unknownFields[i].no == field.no) {\n return [unknownFields[i]];\n }\n }\n return [];\n }\n return unknownFields.filter(uf => uf.no === field.no);\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/* eslint-disable @typescript-eslint/ban-ts-comment, @typescript-eslint/no-unnecessary-condition, prefer-const */\n// lookup table from base64 character to byte\nlet encTable = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\".split(\"\");\n// lookup table from base64 character *code* to byte because lookup by number is fast\nlet decTable = [];\nfor (let i = 0; i < encTable.length; i++) decTable[encTable[i].charCodeAt(0)] = i;\n// support base64url variants\ndecTable[\"-\".charCodeAt(0)] = encTable.indexOf(\"+\");\ndecTable[\"_\".charCodeAt(0)] = encTable.indexOf(\"/\");\nconst protoBase64 = {\n /**\n * Decodes a base64 string to a byte array.\n *\n * - ignores white-space, including line breaks and tabs\n * - allows inner padding (can decode concatenated base64 strings)\n * - does not require padding\n * - understands base64url encoding:\n * \"-\" instead of \"+\",\n * \"_\" instead of \"/\",\n * no padding\n */\n dec(base64Str) {\n // estimate byte size, not accounting for inner padding and whitespace\n let es = base64Str.length * 3 / 4;\n if (base64Str[base64Str.length - 2] == \"=\") es -= 2;else if (base64Str[base64Str.length - 1] == \"=\") es -= 1;\n let bytes = new Uint8Array(es),\n bytePos = 0,\n // position in byte array\n groupPos = 0,\n // position in base64 group\n b,\n // current byte\n p = 0; // previous byte\n for (let i = 0; i < base64Str.length; i++) {\n b = decTable[base64Str.charCodeAt(i)];\n if (b === undefined) {\n switch (base64Str[i]) {\n // @ts-ignore TS7029: Fallthrough case in switch\n case \"=\":\n groupPos = 0;\n // reset state when padding found\n // @ts-ignore TS7029: Fallthrough case in switch\n case \"\\n\":\n case \"\\r\":\n case \"\\t\":\n case \" \":\n continue;\n // skip white-space, and padding\n default:\n throw Error(\"invalid base64 string.\");\n }\n }\n switch (groupPos) {\n case 0:\n p = b;\n groupPos = 1;\n break;\n case 1:\n bytes[bytePos++] = p << 2 | (b & 48) >> 4;\n p = b;\n groupPos = 2;\n break;\n case 2:\n bytes[bytePos++] = (p & 15) << 4 | (b & 60) >> 2;\n p = b;\n groupPos = 3;\n break;\n case 3:\n bytes[bytePos++] = (p & 3) << 6 | b;\n groupPos = 0;\n break;\n }\n }\n if (groupPos == 1) throw Error(\"invalid base64 string.\");\n return bytes.subarray(0, bytePos);\n },\n /**\n * Encode a byte array to a base64 string.\n */\n enc(bytes) {\n let base64 = \"\",\n groupPos = 0,\n // position in base64 group\n b,\n // current byte\n p = 0; // carry over from previous byte\n for (let i = 0; i < bytes.length; i++) {\n b = bytes[i];\n switch (groupPos) {\n case 0:\n base64 += encTable[b >> 2];\n p = (b & 3) << 4;\n groupPos = 1;\n break;\n case 1:\n base64 += encTable[p | b >> 4];\n p = (b & 15) << 2;\n groupPos = 2;\n break;\n case 2:\n base64 += encTable[p | b >> 6];\n base64 += encTable[b & 63];\n groupPos = 0;\n break;\n }\n }\n // add output padding\n if (groupPos) {\n base64 += encTable[p];\n base64 += \"=\";\n if (groupPos == 1) base64 += \"=\";\n }\n return base64;\n }\n};\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Retrieve an extension value from a message.\n *\n * The function never returns undefined. Use hasExtension() to check whether an\n * extension is set. If the extension is not set, this function returns the\n * default value (if one was specified in the protobuf source), or the zero value\n * (for example `0` for numeric types, `[]` for repeated extension fields, and\n * an empty message instance for message fields).\n *\n * Extensions are stored as unknown fields on a message. To mutate an extension\n * value, make sure to store the new value with setExtension() after mutating.\n *\n * If the extension does not extend the given message, an error is raised.\n */\nfunction getExtension(message, extension, options) {\n assertExtendee(extension, message);\n const opt = extension.runtime.bin.makeReadOptions(options);\n const ufs = filterUnknownFields(message.getType().runtime.bin.listUnknownFields(message), extension.field);\n const [container, get] = createExtensionContainer(extension);\n for (const uf of ufs) {\n extension.runtime.bin.readField(container, opt.readerFactory(uf.data), extension.field, uf.wireType, opt);\n }\n return get();\n}\n/**\n * Set an extension value on a message. If the message already has a value for\n * this extension, the value is replaced.\n *\n * If the extension does not extend the given message, an error is raised.\n */\nfunction setExtension(message, extension, value, options) {\n assertExtendee(extension, message);\n const readOpt = extension.runtime.bin.makeReadOptions(options);\n const writeOpt = extension.runtime.bin.makeWriteOptions(options);\n if (hasExtension(message, extension)) {\n const ufs = message.getType().runtime.bin.listUnknownFields(message).filter(uf => uf.no != extension.field.no);\n message.getType().runtime.bin.discardUnknownFields(message);\n for (const uf of ufs) {\n message.getType().runtime.bin.onUnknownField(message, uf.no, uf.wireType, uf.data);\n }\n }\n const writer = writeOpt.writerFactory();\n let f = extension.field;\n // Implicit presence does not apply to extensions, see https://github.com/protocolbuffers/protobuf/issues/8234\n // We patch the field info to use explicit presence:\n if (!f.opt && !f.repeated && (f.kind == \"enum\" || f.kind == \"scalar\")) {\n f = Object.assign(Object.assign({}, extension.field), {\n opt: true\n });\n }\n extension.runtime.bin.writeField(f, value, writer, writeOpt);\n const reader = readOpt.readerFactory(writer.finish());\n while (reader.pos < reader.len) {\n const [no, wireType] = reader.tag();\n const data = reader.skip(wireType, no);\n message.getType().runtime.bin.onUnknownField(message, no, wireType, data);\n }\n}\n/**\n * Check whether an extension is set on a message.\n */\nfunction hasExtension(message, extension) {\n const messageType = message.getType();\n return extension.extendee.typeName === messageType.typeName && !!messageType.runtime.bin.listUnknownFields(message).find(uf => uf.no == extension.field.no);\n}\nfunction assertExtendee(extension, message) {\n assert(extension.extendee.typeName == message.getType().typeName, \"extension \".concat(extension.typeName, \" can only be applied to message \").concat(extension.extendee.typeName));\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Returns true if the field is set.\n */\nfunction isFieldSet(field, target) {\n const localName = field.localName;\n if (field.repeated) {\n return target[localName].length > 0;\n }\n if (field.oneof) {\n return target[field.oneof.localName].case === localName; // eslint-disable-line @typescript-eslint/no-unsafe-member-access\n }\n switch (field.kind) {\n case \"enum\":\n case \"scalar\":\n if (field.opt || field.req) {\n // explicit presence\n return target[localName] !== undefined;\n }\n // implicit presence\n if (field.kind == \"enum\") {\n return target[localName] !== field.T.values[0].no;\n }\n return !isScalarZeroValue(field.T, target[localName]);\n case \"message\":\n return target[localName] !== undefined;\n case \"map\":\n return Object.keys(target[localName]).length > 0;\n // eslint-disable-line @typescript-eslint/no-unsafe-argument\n }\n}\n/**\n * Resets the field, so that isFieldSet() will return false.\n */\nfunction clearField(field, target) {\n const localName = field.localName;\n const implicitPresence = !field.opt && !field.req;\n if (field.repeated) {\n target[localName] = [];\n } else if (field.oneof) {\n target[field.oneof.localName] = {\n case: undefined\n };\n } else {\n switch (field.kind) {\n case \"map\":\n target[localName] = {};\n break;\n case \"enum\":\n target[localName] = implicitPresence ? field.T.values[0].no : undefined;\n break;\n case \"scalar\":\n target[localName] = implicitPresence ? scalarZeroValue(field.T, field.L) : undefined;\n break;\n case \"message\":\n target[localName] = undefined;\n break;\n }\n }\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Check whether the given object is any subtype of Message or is a specific\n * Message by passing the type.\n *\n * Just like `instanceof`, `isMessage` narrows the type. The advantage of\n * `isMessage` is that it compares identity by the message type name, not by\n * class identity. This makes it robust against the dual package hazard and\n * similar situations, where the same message is duplicated.\n *\n * This function is _mostly_ equivalent to the `instanceof` operator. For\n * example, `isMessage(foo, MyMessage)` is the same as `foo instanceof MyMessage`,\n * and `isMessage(foo)` is the same as `foo instanceof Message`. In most cases,\n * `isMessage` should be preferred over `instanceof`.\n *\n * However, due to the fact that `isMessage` does not use class identity, there\n * are subtle differences between this function and `instanceof`. Notably,\n * calling `isMessage` on an explicit type of Message will return false.\n */\nfunction isMessage(arg, type) {\n if (arg === null || typeof arg != \"object\") {\n return false;\n }\n if (!Object.getOwnPropertyNames(Message.prototype).every(m => m in arg && typeof arg[m] == \"function\")) {\n return false;\n }\n const actualType = arg.getType();\n if (actualType === null || typeof actualType != \"function\" || !(\"typeName\" in actualType) || typeof actualType.typeName != \"string\") {\n return false;\n }\n return type === undefined ? true : actualType.typeName == type.typeName;\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Wrap a primitive message field value in its corresponding wrapper\n * message. This function is idempotent.\n */\nfunction wrapField(type, value) {\n if (isMessage(value) || !type.fieldWrapper) {\n return value;\n }\n return type.fieldWrapper.wrapField(value);\n}\n({\n \"google.protobuf.DoubleValue\": ScalarType.DOUBLE,\n \"google.protobuf.FloatValue\": ScalarType.FLOAT,\n \"google.protobuf.Int64Value\": ScalarType.INT64,\n \"google.protobuf.UInt64Value\": ScalarType.UINT64,\n \"google.protobuf.Int32Value\": ScalarType.INT32,\n \"google.protobuf.UInt32Value\": ScalarType.UINT32,\n \"google.protobuf.BoolValue\": ScalarType.BOOL,\n \"google.protobuf.StringValue\": ScalarType.STRING,\n \"google.protobuf.BytesValue\": ScalarType.BYTES\n});\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/* eslint-disable no-case-declarations,@typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-call */\n// Default options for parsing JSON.\nconst jsonReadDefaults = {\n ignoreUnknownFields: false\n};\n// Default options for serializing to JSON.\nconst jsonWriteDefaults = {\n emitDefaultValues: false,\n enumAsInteger: false,\n useProtoFieldName: false,\n prettySpaces: 0\n};\nfunction makeReadOptions$1(options) {\n return options ? Object.assign(Object.assign({}, jsonReadDefaults), options) : jsonReadDefaults;\n}\nfunction makeWriteOptions$1(options) {\n return options ? Object.assign(Object.assign({}, jsonWriteDefaults), options) : jsonWriteDefaults;\n}\nconst tokenNull = Symbol();\nconst tokenIgnoredUnknownEnum = Symbol();\nfunction makeJsonFormat() {\n return {\n makeReadOptions: makeReadOptions$1,\n makeWriteOptions: makeWriteOptions$1,\n readMessage(type, json, options, message) {\n if (json == null || Array.isArray(json) || typeof json != \"object\") {\n throw new Error(\"cannot decode message \".concat(type.typeName, \" from JSON: \").concat(debugJsonValue(json)));\n }\n message = message !== null && message !== void 0 ? message : new type();\n const oneofSeen = new Map();\n const registry = options.typeRegistry;\n for (const [jsonKey, jsonValue] of Object.entries(json)) {\n const field = type.fields.findJsonName(jsonKey);\n if (field) {\n if (field.oneof) {\n if (jsonValue === null && field.kind == \"scalar\") {\n // see conformance test Required.Proto3.JsonInput.OneofFieldNull{First,Second}\n continue;\n }\n const seen = oneofSeen.get(field.oneof);\n if (seen !== undefined) {\n throw new Error(\"cannot decode message \".concat(type.typeName, \" from JSON: multiple keys for oneof \\\"\").concat(field.oneof.name, \"\\\" present: \\\"\").concat(seen, \"\\\", \\\"\").concat(jsonKey, \"\\\"\"));\n }\n oneofSeen.set(field.oneof, jsonKey);\n }\n readField$1(message, jsonValue, field, options, type);\n } else {\n let found = false;\n if ((registry === null || registry === void 0 ? void 0 : registry.findExtension) && jsonKey.startsWith(\"[\") && jsonKey.endsWith(\"]\")) {\n const ext = registry.findExtension(jsonKey.substring(1, jsonKey.length - 1));\n if (ext && ext.extendee.typeName == type.typeName) {\n found = true;\n const [container, get] = createExtensionContainer(ext);\n readField$1(container, jsonValue, ext.field, options, ext);\n // We pass on the options as BinaryReadOptions/BinaryWriteOptions,\n // so that users can bring their own binary reader and writer factories\n // if necessary.\n setExtension(message, ext, get(), options);\n }\n }\n if (!found && !options.ignoreUnknownFields) {\n throw new Error(\"cannot decode message \".concat(type.typeName, \" from JSON: key \\\"\").concat(jsonKey, \"\\\" is unknown\"));\n }\n }\n }\n return message;\n },\n writeMessage(message, options) {\n const type = message.getType();\n const json = {};\n let field;\n try {\n for (field of type.fields.byNumber()) {\n if (!isFieldSet(field, message)) {\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (field.req) {\n throw \"required field not set\";\n }\n if (!options.emitDefaultValues) {\n continue;\n }\n if (!canEmitFieldDefaultValue(field)) {\n continue;\n }\n }\n const value = field.oneof ? message[field.oneof.localName].value : message[field.localName];\n const jsonValue = writeField$1(field, value, options);\n if (jsonValue !== undefined) {\n json[options.useProtoFieldName ? field.name : field.jsonName] = jsonValue;\n }\n }\n const registry = options.typeRegistry;\n if (registry === null || registry === void 0 ? void 0 : registry.findExtensionFor) {\n for (const uf of type.runtime.bin.listUnknownFields(message)) {\n const ext = registry.findExtensionFor(type.typeName, uf.no);\n if (ext && hasExtension(message, ext)) {\n // We pass on the options as BinaryReadOptions, so that users can bring their own\n // binary reader factory if necessary.\n const value = getExtension(message, ext, options);\n const jsonValue = writeField$1(ext.field, value, options);\n if (jsonValue !== undefined) {\n json[ext.field.jsonName] = jsonValue;\n }\n }\n }\n }\n } catch (e) {\n const m = field ? \"cannot encode field \".concat(type.typeName, \".\").concat(field.name, \" to JSON\") : \"cannot encode message \".concat(type.typeName, \" to JSON\");\n const r = e instanceof Error ? e.message : String(e);\n throw new Error(m + (r.length > 0 ? \": \".concat(r) : \"\"));\n }\n return json;\n },\n readScalar(type, json, longType) {\n // The signature of our internal function has changed. For backwards-\n // compatibility, we support the old form that is part of the public API\n // through the interface JsonFormat.\n return readScalar$1(type, json, longType !== null && longType !== void 0 ? longType : LongType.BIGINT, true);\n },\n writeScalar(type, value, emitDefaultValues) {\n // The signature of our internal function has changed. For backwards-\n // compatibility, we support the old form that is part of the public API\n // through the interface JsonFormat.\n if (value === undefined) {\n return undefined;\n }\n if (emitDefaultValues || isScalarZeroValue(type, value)) {\n return writeScalar$1(type, value);\n }\n return undefined;\n },\n debug: debugJsonValue\n };\n}\nfunction debugJsonValue(json) {\n if (json === null) {\n return \"null\";\n }\n switch (typeof json) {\n case \"object\":\n return Array.isArray(json) ? \"array\" : \"object\";\n case \"string\":\n return json.length > 100 ? \"string\" : \"\\\"\".concat(json.split('\"').join('\\\\\"'), \"\\\"\");\n default:\n return String(json);\n }\n}\n// Read a JSON value for a field.\n// The \"parentType\" argument is only used to provide context in errors.\nfunction readField$1(target, jsonValue, field, options, parentType) {\n let localName = field.localName;\n if (field.repeated) {\n assert(field.kind != \"map\");\n if (jsonValue === null) {\n return;\n }\n if (!Array.isArray(jsonValue)) {\n throw new Error(\"cannot decode field \".concat(parentType.typeName, \".\").concat(field.name, \" from JSON: \").concat(debugJsonValue(jsonValue)));\n }\n const targetArray = target[localName];\n for (const jsonItem of jsonValue) {\n if (jsonItem === null) {\n throw new Error(\"cannot decode field \".concat(parentType.typeName, \".\").concat(field.name, \" from JSON: \").concat(debugJsonValue(jsonItem)));\n }\n switch (field.kind) {\n case \"message\":\n targetArray.push(field.T.fromJson(jsonItem, options));\n break;\n case \"enum\":\n const enumValue = readEnum(field.T, jsonItem, options.ignoreUnknownFields, true);\n if (enumValue !== tokenIgnoredUnknownEnum) {\n targetArray.push(enumValue);\n }\n break;\n case \"scalar\":\n try {\n targetArray.push(readScalar$1(field.T, jsonItem, field.L, true));\n } catch (e) {\n let m = \"cannot decode field \".concat(parentType.typeName, \".\").concat(field.name, \" from JSON: \").concat(debugJsonValue(jsonItem));\n if (e instanceof Error && e.message.length > 0) {\n m += \": \".concat(e.message);\n }\n throw new Error(m);\n }\n break;\n }\n }\n } else if (field.kind == \"map\") {\n if (jsonValue === null) {\n return;\n }\n if (typeof jsonValue != \"object\" || Array.isArray(jsonValue)) {\n throw new Error(\"cannot decode field \".concat(parentType.typeName, \".\").concat(field.name, \" from JSON: \").concat(debugJsonValue(jsonValue)));\n }\n const targetMap = target[localName];\n for (const [jsonMapKey, jsonMapValue] of Object.entries(jsonValue)) {\n if (jsonMapValue === null) {\n throw new Error(\"cannot decode field \".concat(parentType.typeName, \".\").concat(field.name, \" from JSON: map value null\"));\n }\n let key;\n try {\n key = readMapKey(field.K, jsonMapKey);\n } catch (e) {\n let m = \"cannot decode map key for field \".concat(parentType.typeName, \".\").concat(field.name, \" from JSON: \").concat(debugJsonValue(jsonValue));\n if (e instanceof Error && e.message.length > 0) {\n m += \": \".concat(e.message);\n }\n throw new Error(m);\n }\n switch (field.V.kind) {\n case \"message\":\n targetMap[key] = field.V.T.fromJson(jsonMapValue, options);\n break;\n case \"enum\":\n const enumValue = readEnum(field.V.T, jsonMapValue, options.ignoreUnknownFields, true);\n if (enumValue !== tokenIgnoredUnknownEnum) {\n targetMap[key] = enumValue;\n }\n break;\n case \"scalar\":\n try {\n targetMap[key] = readScalar$1(field.V.T, jsonMapValue, LongType.BIGINT, true);\n } catch (e) {\n let m = \"cannot decode map value for field \".concat(parentType.typeName, \".\").concat(field.name, \" from JSON: \").concat(debugJsonValue(jsonValue));\n if (e instanceof Error && e.message.length > 0) {\n m += \": \".concat(e.message);\n }\n throw new Error(m);\n }\n break;\n }\n }\n } else {\n if (field.oneof) {\n target = target[field.oneof.localName] = {\n case: localName\n };\n localName = \"value\";\n }\n switch (field.kind) {\n case \"message\":\n const messageType = field.T;\n if (jsonValue === null && messageType.typeName != \"google.protobuf.Value\") {\n return;\n }\n let currentValue = target[localName];\n if (isMessage(currentValue)) {\n currentValue.fromJson(jsonValue, options);\n } else {\n target[localName] = currentValue = messageType.fromJson(jsonValue, options);\n if (messageType.fieldWrapper && !field.oneof) {\n target[localName] = messageType.fieldWrapper.unwrapField(currentValue);\n }\n }\n break;\n case \"enum\":\n const enumValue = readEnum(field.T, jsonValue, options.ignoreUnknownFields, false);\n switch (enumValue) {\n case tokenNull:\n clearField(field, target);\n break;\n case tokenIgnoredUnknownEnum:\n break;\n default:\n target[localName] = enumValue;\n break;\n }\n break;\n case \"scalar\":\n try {\n const scalarValue = readScalar$1(field.T, jsonValue, field.L, false);\n switch (scalarValue) {\n case tokenNull:\n clearField(field, target);\n break;\n default:\n target[localName] = scalarValue;\n break;\n }\n } catch (e) {\n let m = \"cannot decode field \".concat(parentType.typeName, \".\").concat(field.name, \" from JSON: \").concat(debugJsonValue(jsonValue));\n if (e instanceof Error && e.message.length > 0) {\n m += \": \".concat(e.message);\n }\n throw new Error(m);\n }\n break;\n }\n }\n}\nfunction readMapKey(type, json) {\n if (type === ScalarType.BOOL) {\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (json) {\n case \"true\":\n json = true;\n break;\n case \"false\":\n json = false;\n break;\n }\n }\n return readScalar$1(type, json, LongType.BIGINT, true).toString();\n}\nfunction readScalar$1(type, json, longType, nullAsZeroValue) {\n if (json === null) {\n if (nullAsZeroValue) {\n return scalarZeroValue(type, longType);\n }\n return tokenNull;\n }\n // every valid case in the switch below returns, and every fall\n // through is regarded as a failure.\n switch (type) {\n // float, double: JSON value will be a number or one of the special string values \"NaN\", \"Infinity\", and \"-Infinity\".\n // Either numbers or strings are accepted. Exponent notation is also accepted.\n case ScalarType.DOUBLE:\n case ScalarType.FLOAT:\n if (json === \"NaN\") return Number.NaN;\n if (json === \"Infinity\") return Number.POSITIVE_INFINITY;\n if (json === \"-Infinity\") return Number.NEGATIVE_INFINITY;\n if (json === \"\") {\n // empty string is not a number\n break;\n }\n if (typeof json == \"string\" && json.trim().length !== json.length) {\n // extra whitespace\n break;\n }\n if (typeof json != \"string\" && typeof json != \"number\") {\n break;\n }\n const float = Number(json);\n if (Number.isNaN(float)) {\n // not a number\n break;\n }\n if (!Number.isFinite(float)) {\n // infinity and -infinity are handled by string representation above, so this is an error\n break;\n }\n if (type == ScalarType.FLOAT) assertFloat32(float);\n return float;\n // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.\n case ScalarType.INT32:\n case ScalarType.FIXED32:\n case ScalarType.SFIXED32:\n case ScalarType.SINT32:\n case ScalarType.UINT32:\n let int32;\n if (typeof json == \"number\") int32 = json;else if (typeof json == \"string\" && json.length > 0) {\n if (json.trim().length === json.length) int32 = Number(json);\n }\n if (int32 === undefined) break;\n if (type == ScalarType.UINT32 || type == ScalarType.FIXED32) assertUInt32(int32);else assertInt32(int32);\n return int32;\n // int64, fixed64, uint64: JSON value will be a decimal string. Either numbers or strings are accepted.\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n if (typeof json != \"number\" && typeof json != \"string\") break;\n const long = protoInt64.parse(json);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n return longType ? long.toString() : long;\n case ScalarType.FIXED64:\n case ScalarType.UINT64:\n if (typeof json != \"number\" && typeof json != \"string\") break;\n const uLong = protoInt64.uParse(json);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n return longType ? uLong.toString() : uLong;\n // bool:\n case ScalarType.BOOL:\n if (typeof json !== \"boolean\") break;\n return json;\n // string:\n case ScalarType.STRING:\n if (typeof json !== \"string\") {\n break;\n }\n // A string must always contain UTF-8 encoded or 7-bit ASCII.\n // We validate with encodeURIComponent, which appears to be the fastest widely available option.\n try {\n encodeURIComponent(json);\n } catch (e) {\n throw new Error(\"invalid UTF8\");\n }\n return json;\n // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.\n // Either standard or URL-safe base64 encoding with/without paddings are accepted.\n case ScalarType.BYTES:\n if (json === \"\") return new Uint8Array(0);\n if (typeof json !== \"string\") break;\n return protoBase64.dec(json);\n }\n throw new Error();\n}\nfunction readEnum(type, json, ignoreUnknownFields, nullAsZeroValue) {\n if (json === null) {\n if (type.typeName == \"google.protobuf.NullValue\") {\n return 0; // google.protobuf.NullValue.NULL_VALUE = 0\n }\n return nullAsZeroValue ? type.values[0].no : tokenNull;\n }\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check\n switch (typeof json) {\n case \"number\":\n if (Number.isInteger(json)) {\n return json;\n }\n break;\n case \"string\":\n const value = type.findName(json);\n if (value !== undefined) {\n return value.no;\n }\n if (ignoreUnknownFields) {\n return tokenIgnoredUnknownEnum;\n }\n break;\n }\n throw new Error(\"cannot decode enum \".concat(type.typeName, \" from JSON: \").concat(debugJsonValue(json)));\n}\n// Decide whether an unset field should be emitted with JSON write option `emitDefaultValues`\nfunction canEmitFieldDefaultValue(field) {\n if (field.repeated || field.kind == \"map\") {\n // maps are {}, repeated fields are []\n return true;\n }\n if (field.oneof) {\n // oneof fields are never emitted\n return false;\n }\n if (field.kind == \"message\") {\n // singular message field are allowed to emit JSON null, but we do not\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (field.opt || field.req) {\n // the field uses explicit presence, so we cannot emit a zero value\n return false;\n }\n return true;\n}\nfunction writeField$1(field, value, options) {\n if (field.kind == \"map\") {\n assert(typeof value == \"object\" && value != null);\n const jsonObj = {};\n const entries = Object.entries(value);\n switch (field.V.kind) {\n case \"scalar\":\n for (const [entryKey, entryValue] of entries) {\n jsonObj[entryKey.toString()] = writeScalar$1(field.V.T, entryValue); // JSON standard allows only (double quoted) string as property key\n }\n break;\n case \"message\":\n for (const [entryKey, entryValue] of entries) {\n // JSON standard allows only (double quoted) string as property key\n jsonObj[entryKey.toString()] = entryValue.toJson(options);\n }\n break;\n case \"enum\":\n const enumType = field.V.T;\n for (const [entryKey, entryValue] of entries) {\n // JSON standard allows only (double quoted) string as property key\n jsonObj[entryKey.toString()] = writeEnum(enumType, entryValue, options.enumAsInteger);\n }\n break;\n }\n return options.emitDefaultValues || entries.length > 0 ? jsonObj : undefined;\n }\n if (field.repeated) {\n assert(Array.isArray(value));\n const jsonArr = [];\n switch (field.kind) {\n case \"scalar\":\n for (let i = 0; i < value.length; i++) {\n jsonArr.push(writeScalar$1(field.T, value[i]));\n }\n break;\n case \"enum\":\n for (let i = 0; i < value.length; i++) {\n jsonArr.push(writeEnum(field.T, value[i], options.enumAsInteger));\n }\n break;\n case \"message\":\n for (let i = 0; i < value.length; i++) {\n jsonArr.push(value[i].toJson(options));\n }\n break;\n }\n return options.emitDefaultValues || jsonArr.length > 0 ? jsonArr : undefined;\n }\n switch (field.kind) {\n case \"scalar\":\n return writeScalar$1(field.T, value);\n case \"enum\":\n return writeEnum(field.T, value, options.enumAsInteger);\n case \"message\":\n return wrapField(field.T, value).toJson(options);\n }\n}\nfunction writeEnum(type, value, enumAsInteger) {\n var _a;\n assert(typeof value == \"number\");\n if (type.typeName == \"google.protobuf.NullValue\") {\n return null;\n }\n if (enumAsInteger) {\n return value;\n }\n const val = type.findNumber(value);\n return (_a = val === null || val === void 0 ? void 0 : val.name) !== null && _a !== void 0 ? _a : value; // if we don't know the enum value, just return the number\n}\nfunction writeScalar$1(type, value) {\n switch (type) {\n // int32, fixed32, uint32: JSON value will be a decimal number. Either numbers or strings are accepted.\n case ScalarType.INT32:\n case ScalarType.SFIXED32:\n case ScalarType.SINT32:\n case ScalarType.FIXED32:\n case ScalarType.UINT32:\n assert(typeof value == \"number\");\n return value;\n // float, double: JSON value will be a number or one of the special string values \"NaN\", \"Infinity\", and \"-Infinity\".\n // Either numbers or strings are accepted. Exponent notation is also accepted.\n case ScalarType.FLOAT:\n // assertFloat32(value);\n case ScalarType.DOUBLE:\n // eslint-disable-line no-fallthrough\n assert(typeof value == \"number\");\n if (Number.isNaN(value)) return \"NaN\";\n if (value === Number.POSITIVE_INFINITY) return \"Infinity\";\n if (value === Number.NEGATIVE_INFINITY) return \"-Infinity\";\n return value;\n // string:\n case ScalarType.STRING:\n assert(typeof value == \"string\");\n return value;\n // bool:\n case ScalarType.BOOL:\n assert(typeof value == \"boolean\");\n return value;\n // JSON value will be a decimal string. Either numbers or strings are accepted.\n case ScalarType.UINT64:\n case ScalarType.FIXED64:\n case ScalarType.INT64:\n case ScalarType.SFIXED64:\n case ScalarType.SINT64:\n assert(typeof value == \"bigint\" || typeof value == \"string\" || typeof value == \"number\");\n return value.toString();\n // bytes: JSON value will be the data encoded as a string using standard base64 encoding with paddings.\n // Either standard or URL-safe base64 encoding with/without paddings are accepted.\n case ScalarType.BYTES:\n assert(value instanceof Uint8Array);\n return protoBase64.enc(value);\n }\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/* eslint-disable prefer-const,no-case-declarations,@typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-argument,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-return */\nconst unknownFieldsSymbol = Symbol(\"@bufbuild/protobuf/unknown-fields\");\n// Default options for parsing binary data.\nconst readDefaults = {\n readUnknownFields: true,\n readerFactory: bytes => new BinaryReader(bytes)\n};\n// Default options for serializing binary data.\nconst writeDefaults = {\n writeUnknownFields: true,\n writerFactory: () => new BinaryWriter()\n};\nfunction makeReadOptions(options) {\n return options ? Object.assign(Object.assign({}, readDefaults), options) : readDefaults;\n}\nfunction makeWriteOptions(options) {\n return options ? Object.assign(Object.assign({}, writeDefaults), options) : writeDefaults;\n}\nfunction makeBinaryFormat() {\n return {\n makeReadOptions,\n makeWriteOptions,\n listUnknownFields(message) {\n var _a;\n return (_a = message[unknownFieldsSymbol]) !== null && _a !== void 0 ? _a : [];\n },\n discardUnknownFields(message) {\n delete message[unknownFieldsSymbol];\n },\n writeUnknownFields(message, writer) {\n const m = message;\n const c = m[unknownFieldsSymbol];\n if (c) {\n for (const f of c) {\n writer.tag(f.no, f.wireType).raw(f.data);\n }\n }\n },\n onUnknownField(message, no, wireType, data) {\n const m = message;\n if (!Array.isArray(m[unknownFieldsSymbol])) {\n m[unknownFieldsSymbol] = [];\n }\n m[unknownFieldsSymbol].push({\n no,\n wireType,\n data\n });\n },\n readMessage(message, reader, lengthOrEndTagFieldNo, options, delimitedMessageEncoding) {\n const type = message.getType();\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n const end = delimitedMessageEncoding ? reader.len : reader.pos + lengthOrEndTagFieldNo;\n let fieldNo, wireType;\n while (reader.pos < end) {\n [fieldNo, wireType] = reader.tag();\n if (delimitedMessageEncoding === true && wireType == WireType.EndGroup) {\n break;\n }\n const field = type.fields.find(fieldNo);\n if (!field) {\n const data = reader.skip(wireType, fieldNo);\n if (options.readUnknownFields) {\n this.onUnknownField(message, fieldNo, wireType, data);\n }\n continue;\n }\n readField(message, reader, field, wireType, options);\n }\n if (delimitedMessageEncoding && (\n // eslint-disable-line @typescript-eslint/strict-boolean-expressions\n wireType != WireType.EndGroup || fieldNo !== lengthOrEndTagFieldNo)) {\n throw new Error(\"invalid end group tag\");\n }\n },\n readField,\n writeMessage(message, writer, options) {\n const type = message.getType();\n for (const field of type.fields.byNumber()) {\n if (!isFieldSet(field, message)) {\n if (field.req) {\n throw new Error(\"cannot encode field \".concat(type.typeName, \".\").concat(field.name, \" to binary: required field not set\"));\n }\n continue;\n }\n const value = field.oneof ? message[field.oneof.localName].value : message[field.localName];\n writeField(field, value, writer, options);\n }\n if (options.writeUnknownFields) {\n this.writeUnknownFields(message, writer);\n }\n return writer;\n },\n writeField(field, value, writer, options) {\n // The behavior of our internal function has changed, it does no longer\n // accept `undefined` values for singular scalar and map.\n // For backwards-compatibility, we support the old form that is part of\n // the public API through the interface BinaryFormat.\n if (value === undefined) {\n return undefined;\n }\n writeField(field, value, writer, options);\n }\n };\n}\nfunction readField(target,\n// eslint-disable-line @typescript-eslint/no-explicit-any -- `any` is the best choice for dynamic access\nreader, field, wireType, options) {\n let {\n repeated,\n localName\n } = field;\n if (field.oneof) {\n target = target[field.oneof.localName];\n if (target.case != localName) {\n delete target.value;\n }\n target.case = localName;\n localName = \"value\";\n }\n switch (field.kind) {\n case \"scalar\":\n case \"enum\":\n const scalarType = field.kind == \"enum\" ? ScalarType.INT32 : field.T;\n let read = readScalar;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-enum-comparison -- acceptable since it's covered by tests\n if (field.kind == \"scalar\" && field.L > 0) {\n read = readScalarLTString;\n }\n if (repeated) {\n let arr = target[localName]; // safe to assume presence of array, oneof cannot contain repeated values\n const isPacked = wireType == WireType.LengthDelimited && scalarType != ScalarType.STRING && scalarType != ScalarType.BYTES;\n if (isPacked) {\n let e = reader.uint32() + reader.pos;\n while (reader.pos < e) {\n arr.push(read(reader, scalarType));\n }\n } else {\n arr.push(read(reader, scalarType));\n }\n } else {\n target[localName] = read(reader, scalarType);\n }\n break;\n case \"message\":\n const messageType = field.T;\n if (repeated) {\n // safe to assume presence of array, oneof cannot contain repeated values\n target[localName].push(readMessageField(reader, new messageType(), options, field));\n } else {\n if (isMessage(target[localName])) {\n readMessageField(reader, target[localName], options, field);\n } else {\n target[localName] = readMessageField(reader, new messageType(), options, field);\n if (messageType.fieldWrapper && !field.oneof && !field.repeated) {\n target[localName] = messageType.fieldWrapper.unwrapField(target[localName]);\n }\n }\n }\n break;\n case \"map\":\n let [mapKey, mapVal] = readMapEntry(field, reader, options);\n // safe to assume presence of map object, oneof cannot contain repeated values\n target[localName][mapKey] = mapVal;\n break;\n }\n}\n// Read a message, avoiding MessageType.fromBinary() to re-use the\n// BinaryReadOptions and the IBinaryReader.\nfunction readMessageField(reader, message, options, field) {\n const format = message.getType().runtime.bin;\n const delimited = field === null || field === void 0 ? void 0 : field.delimited;\n format.readMessage(message, reader, delimited ? field.no : reader.uint32(),\n // eslint-disable-line @typescript-eslint/strict-boolean-expressions\n options, delimited);\n return message;\n}\n// Read a map field, expecting key field = 1, value field = 2\nfunction readMapEntry(field, reader, options) {\n const length = reader.uint32(),\n end = reader.pos + length;\n let key, val;\n while (reader.pos < end) {\n const [fieldNo] = reader.tag();\n switch (fieldNo) {\n case 1:\n key = readScalar(reader, field.K);\n break;\n case 2:\n switch (field.V.kind) {\n case \"scalar\":\n val = readScalar(reader, field.V.T);\n break;\n case \"enum\":\n val = reader.int32();\n break;\n case \"message\":\n val = readMessageField(reader, new field.V.T(), options, undefined);\n break;\n }\n break;\n }\n }\n if (key === undefined) {\n key = scalarZeroValue(field.K, LongType.BIGINT);\n }\n if (typeof key != \"string\" && typeof key != \"number\") {\n key = key.toString();\n }\n if (val === undefined) {\n switch (field.V.kind) {\n case \"scalar\":\n val = scalarZeroValue(field.V.T, LongType.BIGINT);\n break;\n case \"enum\":\n val = field.V.T.values[0].no;\n break;\n case \"message\":\n val = new field.V.T();\n break;\n }\n }\n return [key, val];\n}\n// Read a scalar value, but return 64 bit integral types (int64, uint64,\n// sint64, fixed64, sfixed64) as string instead of bigint.\nfunction readScalarLTString(reader, type) {\n const v = readScalar(reader, type);\n return typeof v == \"bigint\" ? v.toString() : v;\n}\n// Does not use scalarTypeInfo() for better performance.\nfunction readScalar(reader, type) {\n switch (type) {\n case ScalarType.STRING:\n return reader.string();\n case ScalarType.BOOL:\n return reader.bool();\n case ScalarType.DOUBLE:\n return reader.double();\n case ScalarType.FLOAT:\n return reader.float();\n case ScalarType.INT32:\n return reader.int32();\n case ScalarType.INT64:\n return reader.int64();\n case ScalarType.UINT64:\n return reader.uint64();\n case ScalarType.FIXED64:\n return reader.fixed64();\n case ScalarType.BYTES:\n return reader.bytes();\n case ScalarType.FIXED32:\n return reader.fixed32();\n case ScalarType.SFIXED32:\n return reader.sfixed32();\n case ScalarType.SFIXED64:\n return reader.sfixed64();\n case ScalarType.SINT64:\n return reader.sint64();\n case ScalarType.UINT32:\n return reader.uint32();\n case ScalarType.SINT32:\n return reader.sint32();\n }\n}\nfunction writeField(field, value, writer, options) {\n assert(value !== undefined);\n const repeated = field.repeated;\n switch (field.kind) {\n case \"scalar\":\n case \"enum\":\n let scalarType = field.kind == \"enum\" ? ScalarType.INT32 : field.T;\n if (repeated) {\n assert(Array.isArray(value));\n if (field.packed) {\n writePacked(writer, scalarType, field.no, value);\n } else {\n for (const item of value) {\n writeScalar(writer, scalarType, field.no, item);\n }\n }\n } else {\n writeScalar(writer, scalarType, field.no, value);\n }\n break;\n case \"message\":\n if (repeated) {\n assert(Array.isArray(value));\n for (const item of value) {\n writeMessageField(writer, options, field, item);\n }\n } else {\n writeMessageField(writer, options, field, value);\n }\n break;\n case \"map\":\n assert(typeof value == \"object\" && value != null);\n for (const [key, val] of Object.entries(value)) {\n writeMapEntry(writer, options, field, key, val);\n }\n break;\n }\n}\nfunction writeMapEntry(writer, options, field, key, value) {\n writer.tag(field.no, WireType.LengthDelimited);\n writer.fork();\n // javascript only allows number or string for object properties\n // we convert from our representation to the protobuf type\n let keyValue = key;\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- we deliberately handle just the special cases for map keys\n switch (field.K) {\n case ScalarType.INT32:\n case ScalarType.FIXED32:\n case ScalarType.UINT32:\n case ScalarType.SFIXED32:\n case ScalarType.SINT32:\n keyValue = Number.parseInt(key);\n break;\n case ScalarType.BOOL:\n assert(key == \"true\" || key == \"false\");\n keyValue = key == \"true\";\n break;\n }\n // write key, expecting key field number = 1\n writeScalar(writer, field.K, 1, keyValue);\n // write value, expecting value field number = 2\n switch (field.V.kind) {\n case \"scalar\":\n writeScalar(writer, field.V.T, 2, value);\n break;\n case \"enum\":\n writeScalar(writer, ScalarType.INT32, 2, value);\n break;\n case \"message\":\n assert(value !== undefined);\n writer.tag(2, WireType.LengthDelimited).bytes(value.toBinary(options));\n break;\n }\n writer.join();\n}\n// Value must not be undefined\nfunction writeMessageField(writer, options, field, value) {\n const message = wrapField(field.T, value);\n // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions\n if (field.delimited) writer.tag(field.no, WireType.StartGroup).raw(message.toBinary(options)).tag(field.no, WireType.EndGroup);else writer.tag(field.no, WireType.LengthDelimited).bytes(message.toBinary(options));\n}\nfunction writeScalar(writer, type, fieldNo, value) {\n assert(value !== undefined);\n let [wireType, method] = scalarTypeInfo(type);\n writer.tag(fieldNo, wireType)[method](value);\n}\nfunction writePacked(writer, type, fieldNo, value) {\n if (!value.length) {\n return;\n }\n writer.tag(fieldNo, WireType.LengthDelimited).fork();\n let [, method] = scalarTypeInfo(type);\n for (let i = 0; i < value.length; i++) {\n writer[method](value[i]);\n }\n writer.join();\n}\n/**\n * Get information for writing a scalar value.\n *\n * Returns tuple:\n * [0]: appropriate WireType\n * [1]: name of the appropriate method of IBinaryWriter\n * [2]: whether the given value is a default value for proto3 semantics\n *\n * If argument `value` is omitted, [2] is always false.\n */\n// TODO replace call-sites writeScalar() and writePacked(), then remove\nfunction scalarTypeInfo(type) {\n let wireType = WireType.Varint;\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- INT32, UINT32, SINT32 are covered by the defaults\n switch (type) {\n case ScalarType.BYTES:\n case ScalarType.STRING:\n wireType = WireType.LengthDelimited;\n break;\n case ScalarType.DOUBLE:\n case ScalarType.FIXED64:\n case ScalarType.SFIXED64:\n wireType = WireType.Bit64;\n break;\n case ScalarType.FIXED32:\n case ScalarType.SFIXED32:\n case ScalarType.FLOAT:\n wireType = WireType.Bit32;\n break;\n }\n const method = ScalarType[type].toLowerCase();\n return [wireType, method];\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-argument,no-case-declarations */\nfunction makeUtilCommon() {\n return {\n setEnumType,\n initPartial(source, target) {\n if (source === undefined) {\n return;\n }\n const type = target.getType();\n for (const member of type.fields.byMember()) {\n const localName = member.localName,\n t = target,\n s = source;\n if (s[localName] == null) {\n // TODO if source is a Message instance, we should use isFieldSet() here to support future field presence\n continue;\n }\n switch (member.kind) {\n case \"oneof\":\n const sk = s[localName].case;\n if (sk === undefined) {\n continue;\n }\n const sourceField = member.findField(sk);\n let val = s[localName].value;\n if (sourceField && sourceField.kind == \"message\" && !isMessage(val, sourceField.T)) {\n val = new sourceField.T(val);\n } else if (sourceField && sourceField.kind === \"scalar\" && sourceField.T === ScalarType.BYTES) {\n val = toU8Arr(val);\n }\n t[localName] = {\n case: sk,\n value: val\n };\n break;\n case \"scalar\":\n case \"enum\":\n let copy = s[localName];\n if (member.T === ScalarType.BYTES) {\n copy = member.repeated ? copy.map(toU8Arr) : toU8Arr(copy);\n }\n t[localName] = copy;\n break;\n case \"map\":\n switch (member.V.kind) {\n case \"scalar\":\n case \"enum\":\n if (member.V.T === ScalarType.BYTES) {\n for (const [k, v] of Object.entries(s[localName])) {\n t[localName][k] = toU8Arr(v);\n }\n } else {\n Object.assign(t[localName], s[localName]);\n }\n break;\n case \"message\":\n const messageType = member.V.T;\n for (const k of Object.keys(s[localName])) {\n let val = s[localName][k];\n if (!messageType.fieldWrapper) {\n // We only take partial input for messages that are not a wrapper type.\n // For those messages, we recursively normalize the partial input.\n val = new messageType(val);\n }\n t[localName][k] = val;\n }\n break;\n }\n break;\n case \"message\":\n const mt = member.T;\n if (member.repeated) {\n t[localName] = s[localName].map(val => isMessage(val, mt) ? val : new mt(val));\n } else {\n const val = s[localName];\n if (mt.fieldWrapper) {\n if (\n // We can't use BytesValue.typeName as that will create a circular import\n mt.typeName === \"google.protobuf.BytesValue\") {\n t[localName] = toU8Arr(val);\n } else {\n t[localName] = val;\n }\n } else {\n t[localName] = isMessage(val, mt) ? val : new mt(val);\n }\n }\n break;\n }\n }\n },\n // TODO use isFieldSet() here to support future field presence\n equals(type, a, b) {\n if (a === b) {\n return true;\n }\n if (!a || !b) {\n return false;\n }\n return type.fields.byMember().every(m => {\n const va = a[m.localName];\n const vb = b[m.localName];\n if (m.repeated) {\n if (va.length !== vb.length) {\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- repeated fields are never \"map\"\n switch (m.kind) {\n case \"message\":\n return va.every((a, i) => m.T.equals(a, vb[i]));\n case \"scalar\":\n return va.every((a, i) => scalarEquals(m.T, a, vb[i]));\n case \"enum\":\n return va.every((a, i) => scalarEquals(ScalarType.INT32, a, vb[i]));\n }\n throw new Error(\"repeated cannot contain \".concat(m.kind));\n }\n switch (m.kind) {\n case \"message\":\n let a = va;\n let b = vb;\n if (m.T.fieldWrapper) {\n if (a !== undefined && !isMessage(a)) {\n a = m.T.fieldWrapper.wrapField(a);\n }\n if (b !== undefined && !isMessage(b)) {\n b = m.T.fieldWrapper.wrapField(b);\n }\n }\n return m.T.equals(a, b);\n case \"enum\":\n return scalarEquals(ScalarType.INT32, va, vb);\n case \"scalar\":\n return scalarEquals(m.T, va, vb);\n case \"oneof\":\n if (va.case !== vb.case) {\n return false;\n }\n const s = m.findField(va.case);\n if (s === undefined) {\n return true;\n }\n // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check -- oneof fields are never \"map\"\n switch (s.kind) {\n case \"message\":\n return s.T.equals(va.value, vb.value);\n case \"enum\":\n return scalarEquals(ScalarType.INT32, va.value, vb.value);\n case \"scalar\":\n return scalarEquals(s.T, va.value, vb.value);\n }\n throw new Error(\"oneof cannot contain \".concat(s.kind));\n case \"map\":\n const keys = Object.keys(va).concat(Object.keys(vb));\n switch (m.V.kind) {\n case \"message\":\n const messageType = m.V.T;\n return keys.every(k => messageType.equals(va[k], vb[k]));\n case \"enum\":\n return keys.every(k => scalarEquals(ScalarType.INT32, va[k], vb[k]));\n case \"scalar\":\n const scalarType = m.V.T;\n return keys.every(k => scalarEquals(scalarType, va[k], vb[k]));\n }\n break;\n }\n });\n },\n // TODO use isFieldSet() here to support future field presence\n clone(message) {\n const type = message.getType(),\n target = new type(),\n any = target;\n for (const member of type.fields.byMember()) {\n const source = message[member.localName];\n let copy;\n if (member.repeated) {\n copy = source.map(cloneSingularField);\n } else if (member.kind == \"map\") {\n copy = any[member.localName];\n for (const [key, v] of Object.entries(source)) {\n copy[key] = cloneSingularField(v);\n }\n } else if (member.kind == \"oneof\") {\n const f = member.findField(source.case);\n copy = f ? {\n case: source.case,\n value: cloneSingularField(source.value)\n } : {\n case: undefined\n };\n } else {\n copy = cloneSingularField(source);\n }\n any[member.localName] = copy;\n }\n for (const uf of type.runtime.bin.listUnknownFields(message)) {\n type.runtime.bin.onUnknownField(any, uf.no, uf.wireType, uf.data);\n }\n return target;\n }\n };\n}\n// clone a single field value - i.e. the element type of repeated fields, the value type of maps\nfunction cloneSingularField(value) {\n if (value === undefined) {\n return value;\n }\n if (isMessage(value)) {\n return value.clone();\n }\n if (value instanceof Uint8Array) {\n const c = new Uint8Array(value.byteLength);\n c.set(value);\n return c;\n }\n return value;\n}\n// converts any ArrayLike<number> to Uint8Array if necessary.\nfunction toU8Arr(input) {\n return input instanceof Uint8Array ? input : new Uint8Array(input);\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nfunction makeProtoRuntime(syntax, newFieldList, initFields) {\n return {\n syntax,\n json: makeJsonFormat(),\n bin: makeBinaryFormat(),\n util: Object.assign(Object.assign({}, makeUtilCommon()), {\n newFieldList,\n initFields\n }),\n makeMessageType(typeName, fields, opt) {\n return makeMessageType(this, typeName, fields, opt);\n },\n makeEnum,\n makeEnumType,\n getEnumType,\n makeExtension(typeName, extendee, field) {\n return makeExtension(this, typeName, extendee, field);\n }\n };\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nclass InternalFieldList {\n constructor(fields, normalizer) {\n this._fields = fields;\n this._normalizer = normalizer;\n }\n findJsonName(jsonName) {\n if (!this.jsonNames) {\n const t = {};\n for (const f of this.list()) {\n t[f.jsonName] = t[f.name] = f;\n }\n this.jsonNames = t;\n }\n return this.jsonNames[jsonName];\n }\n find(fieldNo) {\n if (!this.numbers) {\n const t = {};\n for (const f of this.list()) {\n t[f.no] = f;\n }\n this.numbers = t;\n }\n return this.numbers[fieldNo];\n }\n list() {\n if (!this.all) {\n this.all = this._normalizer(this._fields);\n }\n return this.all;\n }\n byNumber() {\n if (!this.numbersAsc) {\n this.numbersAsc = this.list().concat().sort((a, b) => a.no - b.no);\n }\n return this.numbersAsc;\n }\n byMember() {\n if (!this.members) {\n this.members = [];\n const a = this.members;\n let o;\n for (const f of this.list()) {\n if (f.oneof) {\n if (f.oneof !== o) {\n o = f.oneof;\n a.push(o);\n }\n } else {\n a.push(f);\n }\n }\n }\n return this.members;\n }\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Returns the name of a protobuf element in generated code.\n *\n * Field names - including oneofs - are converted to lowerCamelCase. For\n * messages, enumerations and services, the package name is stripped from\n * the type name. For nested messages and enumerations, the names are joined\n * with an underscore. For methods, the first character is made lowercase.\n */\n/**\n * Returns the name of a field in generated code.\n */\nfunction localFieldName(protoName, inOneof) {\n const name = protoCamelCase(protoName);\n if (inOneof) {\n // oneof member names are not properties, but values of the `case` property.\n return name;\n }\n return safeObjectProperty(safeMessageProperty(name));\n}\n/**\n * Returns the name of a oneof group in generated code.\n */\nfunction localOneofName(protoName) {\n return localFieldName(protoName, false);\n}\n/**\n * Returns the JSON name for a protobuf field, exactly like protoc does.\n */\nconst fieldJsonName = protoCamelCase;\n/**\n * Converts snake_case to protoCamelCase according to the convention\n * used by protoc to convert a field name to a JSON name.\n */\nfunction protoCamelCase(snakeCase) {\n let capNext = false;\n const b = [];\n for (let i = 0; i < snakeCase.length; i++) {\n let c = snakeCase.charAt(i);\n switch (c) {\n case \"_\":\n capNext = true;\n break;\n case \"0\":\n case \"1\":\n case \"2\":\n case \"3\":\n case \"4\":\n case \"5\":\n case \"6\":\n case \"7\":\n case \"8\":\n case \"9\":\n b.push(c);\n capNext = false;\n break;\n default:\n if (capNext) {\n capNext = false;\n c = c.toUpperCase();\n }\n b.push(c);\n break;\n }\n }\n return b.join(\"\");\n}\n/**\n * Names that cannot be used for object properties because they are reserved\n * by built-in JavaScript properties.\n */\nconst reservedObjectProperties = new Set([\n// names reserved by JavaScript\n\"constructor\", \"toString\", \"toJSON\", \"valueOf\"]);\n/**\n * Names that cannot be used for object properties because they are reserved\n * by the runtime.\n */\nconst reservedMessageProperties = new Set([\n// names reserved by the runtime\n\"getType\", \"clone\", \"equals\", \"fromBinary\", \"fromJson\", \"fromJsonString\", \"toBinary\", \"toJson\", \"toJsonString\",\n// names reserved by the runtime for the future\n\"toObject\"]);\nconst fallback = name => \"\".concat(name, \"$\");\n/**\n * Will wrap names that are Object prototype properties or names reserved\n * for `Message`s.\n */\nconst safeMessageProperty = name => {\n if (reservedMessageProperties.has(name)) {\n return fallback(name);\n }\n return name;\n};\n/**\n * Names that cannot be used for object properties because they are reserved\n * by built-in JavaScript properties.\n */\nconst safeObjectProperty = name => {\n if (reservedObjectProperties.has(name)) {\n return fallback(name);\n }\n return name;\n};\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\nclass InternalOneofInfo {\n constructor(name) {\n this.kind = \"oneof\";\n this.repeated = false;\n this.packed = false;\n this.opt = false;\n this.req = false;\n this.default = undefined;\n this.fields = [];\n this.name = name;\n this.localName = localOneofName(name);\n }\n addField(field) {\n assert(field.oneof === this, \"field \".concat(field.name, \" not one of \").concat(this.name));\n this.fields.push(field);\n }\n findField(localName) {\n if (!this._lookup) {\n this._lookup = Object.create(null);\n for (let i = 0; i < this.fields.length; i++) {\n this._lookup[this.fields[i].localName] = this.fields[i];\n }\n }\n return this._lookup[localName];\n }\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Convert a collection of field info to an array of normalized FieldInfo.\n *\n * The argument `packedByDefault` specifies whether fields that do not specify\n * `packed` should be packed (proto3) or unpacked (proto2).\n */\nfunction normalizeFieldInfos(fieldInfos, packedByDefault) {\n var _a, _b, _c, _d, _e, _f;\n const r = [];\n let o;\n for (const field of typeof fieldInfos == \"function\" ? fieldInfos() : fieldInfos) {\n const f = field;\n f.localName = localFieldName(field.name, field.oneof !== undefined);\n f.jsonName = (_a = field.jsonName) !== null && _a !== void 0 ? _a : fieldJsonName(field.name);\n f.repeated = (_b = field.repeated) !== null && _b !== void 0 ? _b : false;\n if (field.kind == \"scalar\") {\n f.L = (_c = field.L) !== null && _c !== void 0 ? _c : LongType.BIGINT;\n }\n f.delimited = (_d = field.delimited) !== null && _d !== void 0 ? _d : false;\n f.req = (_e = field.req) !== null && _e !== void 0 ? _e : false;\n f.opt = (_f = field.opt) !== null && _f !== void 0 ? _f : false;\n if (field.packed === undefined) {\n {\n f.packed = field.kind == \"enum\" || field.kind == \"scalar\" && field.T != ScalarType.BYTES && field.T != ScalarType.STRING;\n }\n }\n // We do not surface options at this time\n // f.options = field.options ?? emptyReadonlyObject;\n if (field.oneof !== undefined) {\n const ooname = typeof field.oneof == \"string\" ? field.oneof : field.oneof.name;\n if (!o || o.name != ooname) {\n o = new InternalOneofInfo(ooname);\n }\n f.oneof = o;\n o.addField(f);\n }\n r.push(f);\n }\n return r;\n}\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * Provides functionality for messages defined with the proto3 syntax.\n */\nconst proto3 = makeProtoRuntime(\"proto3\", fields => {\n return new InternalFieldList(fields, source => normalizeFieldInfos(source));\n},\n// TODO merge with proto2 and initExtensionField, also see initPartial, equals, clone\ntarget => {\n for (const member of target.getType().fields.byMember()) {\n if (member.opt) {\n continue;\n }\n const name = member.localName,\n t = target;\n if (member.repeated) {\n t[name] = [];\n continue;\n }\n switch (member.kind) {\n case \"oneof\":\n t[name] = {\n case: undefined\n };\n break;\n case \"enum\":\n t[name] = 0;\n break;\n case \"map\":\n t[name] = {};\n break;\n case \"scalar\":\n t[name] = scalarZeroValue(member.T, member.L);\n break;\n }\n }\n});\n\n// Copyright 2021-2024 Buf Technologies, Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n// http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n/**\n * A Timestamp represents a point in time independent of any time zone or local\n * calendar, encoded as a count of seconds and fractions of seconds at\n * nanosecond resolution. The count is relative to an epoch at UTC midnight on\n * January 1, 1970, in the proleptic Gregorian calendar which extends the\n * Gregorian calendar backwards to year one.\n *\n * All minutes are 60 seconds long. Leap seconds are \"smeared\" so that no leap\n * second table is needed for interpretation, using a [24-hour linear\n * smear](https://developers.google.com/time/smear).\n *\n * The range is from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. By\n * restricting to that range, we ensure that we can convert to and from [RFC\n * 3339](https://www.ietf.org/rfc/rfc3339.txt) date strings.\n *\n * # Examples\n *\n * Example 1: Compute Timestamp from POSIX `time()`.\n *\n * Timestamp timestamp;\n * timestamp.set_seconds(time(NULL));\n * timestamp.set_nanos(0);\n *\n * Example 2: Compute Timestamp from POSIX `gettimeofday()`.\n *\n * struct timeval tv;\n * gettimeofday(&tv, NULL);\n *\n * Timestamp timestamp;\n * timestamp.set_seconds(tv.tv_sec);\n * timestamp.set_nanos(tv.tv_usec * 1000);\n *\n * Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`.\n *\n * FILETIME ft;\n * GetSystemTimeAsFileTime(&ft);\n * UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime;\n *\n * // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z\n * // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z.\n * Timestamp timestamp;\n * timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL));\n * timestamp.set_nanos((INT32) ((ticks % 10000000) * 100));\n *\n * Example 4: Compute Timestamp from Java `System.currentTimeMillis()`.\n *\n * long millis = System.currentTimeMillis();\n *\n * Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000)\n * .setNanos((int) ((millis % 1000) * 1000000)).build();\n *\n * Example 5: Compute Timestamp from Java `Instant.now()`.\n *\n * Instant now = Instant.now();\n *\n * Timestamp timestamp =\n * Timestamp.newBuilder().setSeconds(now.getEpochSecond())\n * .setNanos(now.getNano()).build();\n *\n * Example 6: Compute Timestamp from current time in Python.\n *\n * timestamp = Timestamp()\n * timestamp.GetCurrentTime()\n *\n * # JSON Mapping\n *\n * In JSON format, the Timestamp type is encoded as a string in the\n * [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the\n * format is \"{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z\"\n * where {year} is always expressed using four digits while {month}, {day},\n * {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional\n * seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution),\n * are optional. The \"Z\" suffix indicates the timezone (\"UTC\"); the timezone\n * is required. A proto3 JSON serializer should always use UTC (as indicated by\n * \"Z\") when printing the Timestamp type and a proto3 JSON parser should be\n * able to accept both UTC and other timezones (as indicated by an offset).\n *\n * For example, \"2017-01-15T01:30:15.01Z\" encodes 15.01 seconds past\n * 01:30 UTC on January 15, 2017.\n *\n * In JavaScript, one can convert a Date object to this format using the\n * standard\n * [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)\n * method. In Python, a standard `datetime.datetime` object can be converted\n * to this format using\n * [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) with\n * the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one can use\n * the Joda Time's [`ISODateTimeFormat.dateTime()`](\n * http://joda-time.sourceforge.net/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime()\n * ) to obtain a formatter capable of generating timestamps in this format.\n *\n *\n * @generated from message google.protobuf.Timestamp\n */\nclass Timestamp extends Message {\n constructor(data) {\n super();\n /**\n * Represents seconds of UTC time since Unix epoch\n * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n * 9999-12-31T23:59:59Z inclusive.\n *\n * @generated from field: int64 seconds = 1;\n */\n this.seconds = protoInt64.zero;\n /**\n * Non-negative fractions of a second at nanosecond resolution. Negative\n * second values with fractions must still have non-negative nanos values\n * that count forward in time. Must be from 0 to 999,999,999\n * inclusive.\n *\n * @generated from field: int32 nanos = 2;\n */\n this.nanos = 0;\n proto3.util.initPartial(data, this);\n }\n fromJson(json, options) {\n if (typeof json !== \"string\") {\n throw new Error(\"cannot decode google.protobuf.Timestamp from JSON: \".concat(proto3.json.debug(json)));\n }\n const matches = json.match(/^([0-9]{4})-([0-9]{2})-([0-9]{2})T([0-9]{2}):([0-9]{2}):([0-9]{2})(?:Z|\\.([0-9]{3,9})Z|([+-][0-9][0-9]:[0-9][0-9]))$/);\n if (!matches) {\n throw new Error(\"cannot decode google.protobuf.Timestamp from JSON: invalid RFC 3339 string\");\n }\n const ms = Date.parse(matches[1] + \"-\" + matches[2] + \"-\" + matches[3] + \"T\" + matches[4] + \":\" + matches[5] + \":\" + matches[6] + (matches[8] ? matches[8] : \"Z\"));\n if (Number.isNaN(ms)) {\n throw new Error(\"cannot decode google.protobuf.Timestamp from JSON: invalid RFC 3339 string\");\n }\n if (ms < Date.parse(\"0001-01-01T00:00:00Z\") || ms > Date.parse(\"9999-12-31T23:59:59Z\")) {\n throw new Error(\"cannot decode message google.protobuf.Timestamp from JSON: must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive\");\n }\n this.seconds = protoInt64.parse(ms / 1000);\n this.nanos = 0;\n if (matches[7]) {\n this.nanos = parseInt(\"1\" + matches[7] + \"0\".repeat(9 - matches[7].length)) - 1000000000;\n }\n return this;\n }\n toJson(options) {\n const ms = Number(this.seconds) * 1000;\n if (ms < Date.parse(\"0001-01-01T00:00:00Z\") || ms > Date.parse(\"9999-12-31T23:59:59Z\")) {\n throw new Error(\"cannot encode google.protobuf.Timestamp to JSON: must be from 0001-01-01T00:00:00Z to 9999-12-31T23:59:59Z inclusive\");\n }\n if (this.nanos < 0) {\n throw new Error(\"cannot encode google.protobuf.Timestamp to JSON: nanos must not be negative\");\n }\n let z = \"Z\";\n if (this.nanos > 0) {\n const nanosStr = (this.nanos + 1000000000).toString().substring(1);\n if (nanosStr.substring(3) === \"000000\") {\n z = \".\" + nanosStr.substring(0, 3) + \"Z\";\n } else if (nanosStr.substring(6) === \"000\") {\n z = \".\" + nanosStr.substring(0, 6) + \"Z\";\n } else {\n z = \".\" + nanosStr + \"Z\";\n }\n }\n return new Date(ms).toISOString().replace(\".000Z\", z);\n }\n toDate() {\n return new Date(Number(this.seconds) * 1000 + Math.ceil(this.nanos / 1000000));\n }\n static now() {\n return Timestamp.fromDate(new Date());\n }\n static fromDate(date) {\n const ms = date.getTime();\n return new Timestamp({\n seconds: protoInt64.parse(Math.floor(ms / 1000)),\n nanos: ms % 1000 * 1000000\n });\n }\n static fromBinary(bytes, options) {\n return new Timestamp().fromBinary(bytes, options);\n }\n static fromJson(jsonValue, options) {\n return new Timestamp().fromJson(jsonValue, options);\n }\n static fromJsonString(jsonString, options) {\n return new Timestamp().fromJsonString(jsonString, options);\n }\n static equals(a, b) {\n return proto3.util.equals(Timestamp, a, b);\n }\n}\nTimestamp.runtime = proto3;\nTimestamp.typeName = \"google.protobuf.Timestamp\";\nTimestamp.fields = proto3.util.newFieldList(() => [{\n no: 1,\n name: \"seconds\",\n kind: \"scalar\",\n T: 3 /* ScalarType.INT64 */\n}, {\n no: 2,\n name: \"nanos\",\n kind: \"scalar\",\n T: 5 /* ScalarType.INT32 */\n}]);\n\nconst MetricsBatch = /* @__PURE__ */proto3.makeMessageType(\"livekit.MetricsBatch\", () => [{\n no: 1,\n name: \"timestamp_ms\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 2,\n name: \"normalized_timestamp\",\n kind: \"message\",\n T: Timestamp\n}, {\n no: 3,\n name: \"str_data\",\n kind: \"scalar\",\n T: 9,\n repeated: true\n}, {\n no: 4,\n name: \"time_series\",\n kind: \"message\",\n T: TimeSeriesMetric,\n repeated: true\n}, {\n no: 5,\n name: \"events\",\n kind: \"message\",\n T: EventMetric,\n repeated: true\n}]);\nconst TimeSeriesMetric = /* @__PURE__ */proto3.makeMessageType(\"livekit.TimeSeriesMetric\", () => [{\n no: 1,\n name: \"label\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 2,\n name: \"participant_identity\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 3,\n name: \"track_sid\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 4,\n name: \"samples\",\n kind: \"message\",\n T: MetricSample,\n repeated: true\n}, {\n no: 5,\n name: \"rid\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}]);\nconst MetricSample = /* @__PURE__ */proto3.makeMessageType(\"livekit.MetricSample\", () => [{\n no: 1,\n name: \"timestamp_ms\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 2,\n name: \"normalized_timestamp\",\n kind: \"message\",\n T: Timestamp\n}, {\n no: 3,\n name: \"value\",\n kind: \"scalar\",\n T: 2\n /* ScalarType.FLOAT */\n}]);\nconst EventMetric = /* @__PURE__ */proto3.makeMessageType(\"livekit.EventMetric\", () => [{\n no: 1,\n name: \"label\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 2,\n name: \"participant_identity\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 3,\n name: \"track_sid\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 4,\n name: \"start_timestamp_ms\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 5,\n name: \"end_timestamp_ms\",\n kind: \"scalar\",\n T: 3,\n opt: true\n}, {\n no: 6,\n name: \"normalized_start_timestamp\",\n kind: \"message\",\n T: Timestamp\n}, {\n no: 7,\n name: \"normalized_end_timestamp\",\n kind: \"message\",\n T: Timestamp,\n opt: true\n}, {\n no: 8,\n name: \"metadata\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 9,\n name: \"rid\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}]);\nconst BackupCodecPolicy$1 = /* @__PURE__ */proto3.makeEnum(\"livekit.BackupCodecPolicy\", [{\n no: 0,\n name: \"PREFER_REGRESSION\"\n}, {\n no: 1,\n name: \"SIMULCAST\"\n}, {\n no: 2,\n name: \"REGRESSION\"\n}]);\nconst TrackType = /* @__PURE__ */proto3.makeEnum(\"livekit.TrackType\", [{\n no: 0,\n name: \"AUDIO\"\n}, {\n no: 1,\n name: \"VIDEO\"\n}, {\n no: 2,\n name: \"DATA\"\n}]);\nconst TrackSource = /* @__PURE__ */proto3.makeEnum(\"livekit.TrackSource\", [{\n no: 0,\n name: \"UNKNOWN\"\n}, {\n no: 1,\n name: \"CAMERA\"\n}, {\n no: 2,\n name: \"MICROPHONE\"\n}, {\n no: 3,\n name: \"SCREEN_SHARE\"\n}, {\n no: 4,\n name: \"SCREEN_SHARE_AUDIO\"\n}]);\nconst VideoQuality$1 = /* @__PURE__ */proto3.makeEnum(\"livekit.VideoQuality\", [{\n no: 0,\n name: \"LOW\"\n}, {\n no: 1,\n name: \"MEDIUM\"\n}, {\n no: 2,\n name: \"HIGH\"\n}, {\n no: 3,\n name: \"OFF\"\n}]);\nconst ConnectionQuality$1 = /* @__PURE__ */proto3.makeEnum(\"livekit.ConnectionQuality\", [{\n no: 0,\n name: \"POOR\"\n}, {\n no: 1,\n name: \"GOOD\"\n}, {\n no: 2,\n name: \"EXCELLENT\"\n}, {\n no: 3,\n name: \"LOST\"\n}]);\nconst ClientConfigSetting = /* @__PURE__ */proto3.makeEnum(\"livekit.ClientConfigSetting\", [{\n no: 0,\n name: \"UNSET\"\n}, {\n no: 1,\n name: \"DISABLED\"\n}, {\n no: 2,\n name: \"ENABLED\"\n}]);\nconst DisconnectReason = /* @__PURE__ */proto3.makeEnum(\"livekit.DisconnectReason\", [{\n no: 0,\n name: \"UNKNOWN_REASON\"\n}, {\n no: 1,\n name: \"CLIENT_INITIATED\"\n}, {\n no: 2,\n name: \"DUPLICATE_IDENTITY\"\n}, {\n no: 3,\n name: \"SERVER_SHUTDOWN\"\n}, {\n no: 4,\n name: \"PARTICIPANT_REMOVED\"\n}, {\n no: 5,\n name: \"ROOM_DELETED\"\n}, {\n no: 6,\n name: \"STATE_MISMATCH\"\n}, {\n no: 7,\n name: \"JOIN_FAILURE\"\n}, {\n no: 8,\n name: \"MIGRATION\"\n}, {\n no: 9,\n name: \"SIGNAL_CLOSE\"\n}, {\n no: 10,\n name: \"ROOM_CLOSED\"\n}, {\n no: 11,\n name: \"USER_UNAVAILABLE\"\n}, {\n no: 12,\n name: \"USER_REJECTED\"\n}, {\n no: 13,\n name: \"SIP_TRUNK_FAILURE\"\n}, {\n no: 14,\n name: \"CONNECTION_TIMEOUT\"\n}, {\n no: 15,\n name: \"MEDIA_FAILURE\"\n}]);\nconst ReconnectReason = /* @__PURE__ */proto3.makeEnum(\"livekit.ReconnectReason\", [{\n no: 0,\n name: \"RR_UNKNOWN\"\n}, {\n no: 1,\n name: \"RR_SIGNAL_DISCONNECTED\"\n}, {\n no: 2,\n name: \"RR_PUBLISHER_FAILED\"\n}, {\n no: 3,\n name: \"RR_SUBSCRIBER_FAILED\"\n}, {\n no: 4,\n name: \"RR_SWITCH_CANDIDATE\"\n}]);\nconst SubscriptionError = /* @__PURE__ */proto3.makeEnum(\"livekit.SubscriptionError\", [{\n no: 0,\n name: \"SE_UNKNOWN\"\n}, {\n no: 1,\n name: \"SE_CODEC_UNSUPPORTED\"\n}, {\n no: 2,\n name: \"SE_TRACK_NOTFOUND\"\n}]);\nconst AudioTrackFeature = /* @__PURE__ */proto3.makeEnum(\"livekit.AudioTrackFeature\", [{\n no: 0,\n name: \"TF_STEREO\"\n}, {\n no: 1,\n name: \"TF_NO_DTX\"\n}, {\n no: 2,\n name: \"TF_AUTO_GAIN_CONTROL\"\n}, {\n no: 3,\n name: \"TF_ECHO_CANCELLATION\"\n}, {\n no: 4,\n name: \"TF_NOISE_SUPPRESSION\"\n}, {\n no: 5,\n name: \"TF_ENHANCED_NOISE_CANCELLATION\"\n}, {\n no: 6,\n name: \"TF_PRECONNECT_BUFFER\"\n}]);\nconst Room$1 = /* @__PURE__ */proto3.makeMessageType(\"livekit.Room\", () => [{\n no: 1,\n name: \"sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"name\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"empty_timeout\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 14,\n name: \"departure_timeout\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 4,\n name: \"max_participants\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 5,\n name: \"creation_time\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 15,\n name: \"creation_time_ms\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 6,\n name: \"turn_password\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 7,\n name: \"enabled_codecs\",\n kind: \"message\",\n T: Codec,\n repeated: true\n}, {\n no: 8,\n name: \"metadata\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 9,\n name: \"num_participants\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 11,\n name: \"num_publishers\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 10,\n name: \"active_recording\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 13,\n name: \"version\",\n kind: \"message\",\n T: TimedVersion\n}]);\nconst Codec = /* @__PURE__ */proto3.makeMessageType(\"livekit.Codec\", () => [{\n no: 1,\n name: \"mime\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"fmtp_line\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst ParticipantPermission = /* @__PURE__ */proto3.makeMessageType(\"livekit.ParticipantPermission\", () => [{\n no: 1,\n name: \"can_subscribe\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 2,\n name: \"can_publish\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 3,\n name: \"can_publish_data\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 9,\n name: \"can_publish_sources\",\n kind: \"enum\",\n T: proto3.getEnumType(TrackSource),\n repeated: true\n}, {\n no: 7,\n name: \"hidden\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 8,\n name: \"recorder\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 10,\n name: \"can_update_metadata\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 11,\n name: \"agent\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 12,\n name: \"can_subscribe_metrics\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}]);\nconst ParticipantInfo = /* @__PURE__ */proto3.makeMessageType(\"livekit.ParticipantInfo\", () => [{\n no: 1,\n name: \"sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"identity\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"state\",\n kind: \"enum\",\n T: proto3.getEnumType(ParticipantInfo_State)\n}, {\n no: 4,\n name: \"tracks\",\n kind: \"message\",\n T: TrackInfo,\n repeated: true\n}, {\n no: 5,\n name: \"metadata\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 6,\n name: \"joined_at\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 17,\n name: \"joined_at_ms\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 9,\n name: \"name\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 10,\n name: \"version\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 11,\n name: \"permission\",\n kind: \"message\",\n T: ParticipantPermission\n}, {\n no: 12,\n name: \"region\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 13,\n name: \"is_publisher\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 14,\n name: \"kind\",\n kind: \"enum\",\n T: proto3.getEnumType(ParticipantInfo_Kind)\n}, {\n no: 15,\n name: \"attributes\",\n kind: \"map\",\n K: 9,\n V: {\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n }\n}, {\n no: 16,\n name: \"disconnect_reason\",\n kind: \"enum\",\n T: proto3.getEnumType(DisconnectReason)\n}, {\n no: 18,\n name: \"kind_details\",\n kind: \"enum\",\n T: proto3.getEnumType(ParticipantInfo_KindDetail),\n repeated: true\n}]);\nconst ParticipantInfo_State = /* @__PURE__ */proto3.makeEnum(\"livekit.ParticipantInfo.State\", [{\n no: 0,\n name: \"JOINING\"\n}, {\n no: 1,\n name: \"JOINED\"\n}, {\n no: 2,\n name: \"ACTIVE\"\n}, {\n no: 3,\n name: \"DISCONNECTED\"\n}]);\nconst ParticipantInfo_Kind = /* @__PURE__ */proto3.makeEnum(\"livekit.ParticipantInfo.Kind\", [{\n no: 0,\n name: \"STANDARD\"\n}, {\n no: 1,\n name: \"INGRESS\"\n}, {\n no: 2,\n name: \"EGRESS\"\n}, {\n no: 3,\n name: \"SIP\"\n}, {\n no: 4,\n name: \"AGENT\"\n}]);\nconst ParticipantInfo_KindDetail = /* @__PURE__ */proto3.makeEnum(\"livekit.ParticipantInfo.KindDetail\", [{\n no: 0,\n name: \"CLOUD_AGENT\"\n}, {\n no: 1,\n name: \"FORWARDED\"\n}]);\nconst Encryption_Type = /* @__PURE__ */proto3.makeEnum(\"livekit.Encryption.Type\", [{\n no: 0,\n name: \"NONE\"\n}, {\n no: 1,\n name: \"GCM\"\n}, {\n no: 2,\n name: \"CUSTOM\"\n}]);\nconst SimulcastCodecInfo = /* @__PURE__ */proto3.makeMessageType(\"livekit.SimulcastCodecInfo\", () => [{\n no: 1,\n name: \"mime_type\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"mid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"cid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 4,\n name: \"layers\",\n kind: \"message\",\n T: VideoLayer,\n repeated: true\n}]);\nconst TrackInfo = /* @__PURE__ */proto3.makeMessageType(\"livekit.TrackInfo\", () => [{\n no: 1,\n name: \"sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"type\",\n kind: \"enum\",\n T: proto3.getEnumType(TrackType)\n}, {\n no: 3,\n name: \"name\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 4,\n name: \"muted\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 5,\n name: \"width\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 6,\n name: \"height\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 7,\n name: \"simulcast\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 8,\n name: \"disable_dtx\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 9,\n name: \"source\",\n kind: \"enum\",\n T: proto3.getEnumType(TrackSource)\n}, {\n no: 10,\n name: \"layers\",\n kind: \"message\",\n T: VideoLayer,\n repeated: true\n}, {\n no: 11,\n name: \"mime_type\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 12,\n name: \"mid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 13,\n name: \"codecs\",\n kind: \"message\",\n T: SimulcastCodecInfo,\n repeated: true\n}, {\n no: 14,\n name: \"stereo\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 15,\n name: \"disable_red\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 16,\n name: \"encryption\",\n kind: \"enum\",\n T: proto3.getEnumType(Encryption_Type)\n}, {\n no: 17,\n name: \"stream\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 18,\n name: \"version\",\n kind: \"message\",\n T: TimedVersion\n}, {\n no: 19,\n name: \"audio_features\",\n kind: \"enum\",\n T: proto3.getEnumType(AudioTrackFeature),\n repeated: true\n}, {\n no: 20,\n name: \"backup_codec_policy\",\n kind: \"enum\",\n T: proto3.getEnumType(BackupCodecPolicy$1)\n}]);\nconst VideoLayer = /* @__PURE__ */proto3.makeMessageType(\"livekit.VideoLayer\", () => [{\n no: 1,\n name: \"quality\",\n kind: \"enum\",\n T: proto3.getEnumType(VideoQuality$1)\n}, {\n no: 2,\n name: \"width\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 3,\n name: \"height\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 4,\n name: \"bitrate\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 5,\n name: \"ssrc\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 6,\n name: \"spatial_layer\",\n kind: \"scalar\",\n T: 5\n /* ScalarType.INT32 */\n}, {\n no: 7,\n name: \"rid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst DataPacket = /* @__PURE__ */proto3.makeMessageType(\"livekit.DataPacket\", () => [{\n no: 1,\n name: \"kind\",\n kind: \"enum\",\n T: proto3.getEnumType(DataPacket_Kind)\n}, {\n no: 4,\n name: \"participant_identity\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 5,\n name: \"destination_identities\",\n kind: \"scalar\",\n T: 9,\n repeated: true\n}, {\n no: 2,\n name: \"user\",\n kind: \"message\",\n T: UserPacket,\n oneof: \"value\"\n}, {\n no: 3,\n name: \"speaker\",\n kind: \"message\",\n T: ActiveSpeakerUpdate,\n oneof: \"value\"\n}, {\n no: 6,\n name: \"sip_dtmf\",\n kind: \"message\",\n T: SipDTMF,\n oneof: \"value\"\n}, {\n no: 7,\n name: \"transcription\",\n kind: \"message\",\n T: Transcription,\n oneof: \"value\"\n}, {\n no: 8,\n name: \"metrics\",\n kind: \"message\",\n T: MetricsBatch,\n oneof: \"value\"\n}, {\n no: 9,\n name: \"chat_message\",\n kind: \"message\",\n T: ChatMessage,\n oneof: \"value\"\n}, {\n no: 10,\n name: \"rpc_request\",\n kind: \"message\",\n T: RpcRequest,\n oneof: \"value\"\n}, {\n no: 11,\n name: \"rpc_ack\",\n kind: \"message\",\n T: RpcAck,\n oneof: \"value\"\n}, {\n no: 12,\n name: \"rpc_response\",\n kind: \"message\",\n T: RpcResponse,\n oneof: \"value\"\n}, {\n no: 13,\n name: \"stream_header\",\n kind: \"message\",\n T: DataStream_Header,\n oneof: \"value\"\n}, {\n no: 14,\n name: \"stream_chunk\",\n kind: \"message\",\n T: DataStream_Chunk,\n oneof: \"value\"\n}, {\n no: 15,\n name: \"stream_trailer\",\n kind: \"message\",\n T: DataStream_Trailer,\n oneof: \"value\"\n}, {\n no: 16,\n name: \"sequence\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 17,\n name: \"participant_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst DataPacket_Kind = /* @__PURE__ */proto3.makeEnum(\"livekit.DataPacket.Kind\", [{\n no: 0,\n name: \"RELIABLE\"\n}, {\n no: 1,\n name: \"LOSSY\"\n}]);\nconst ActiveSpeakerUpdate = /* @__PURE__ */proto3.makeMessageType(\"livekit.ActiveSpeakerUpdate\", () => [{\n no: 1,\n name: \"speakers\",\n kind: \"message\",\n T: SpeakerInfo,\n repeated: true\n}]);\nconst SpeakerInfo = /* @__PURE__ */proto3.makeMessageType(\"livekit.SpeakerInfo\", () => [{\n no: 1,\n name: \"sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"level\",\n kind: \"scalar\",\n T: 2\n /* ScalarType.FLOAT */\n}, {\n no: 3,\n name: \"active\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}]);\nconst UserPacket = /* @__PURE__ */proto3.makeMessageType(\"livekit.UserPacket\", () => [{\n no: 1,\n name: \"participant_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 5,\n name: \"participant_identity\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"payload\",\n kind: \"scalar\",\n T: 12\n /* ScalarType.BYTES */\n}, {\n no: 3,\n name: \"destination_sids\",\n kind: \"scalar\",\n T: 9,\n repeated: true\n}, {\n no: 6,\n name: \"destination_identities\",\n kind: \"scalar\",\n T: 9,\n repeated: true\n}, {\n no: 4,\n name: \"topic\",\n kind: \"scalar\",\n T: 9,\n opt: true\n}, {\n no: 8,\n name: \"id\",\n kind: \"scalar\",\n T: 9,\n opt: true\n}, {\n no: 9,\n name: \"start_time\",\n kind: \"scalar\",\n T: 4,\n opt: true\n}, {\n no: 10,\n name: \"end_time\",\n kind: \"scalar\",\n T: 4,\n opt: true\n}, {\n no: 11,\n name: \"nonce\",\n kind: \"scalar\",\n T: 12\n /* ScalarType.BYTES */\n}]);\nconst SipDTMF = /* @__PURE__ */proto3.makeMessageType(\"livekit.SipDTMF\", () => [{\n no: 3,\n name: \"code\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 4,\n name: \"digit\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst Transcription = /* @__PURE__ */proto3.makeMessageType(\"livekit.Transcription\", () => [{\n no: 2,\n name: \"transcribed_participant_identity\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"track_id\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 4,\n name: \"segments\",\n kind: \"message\",\n T: TranscriptionSegment,\n repeated: true\n}]);\nconst TranscriptionSegment = /* @__PURE__ */proto3.makeMessageType(\"livekit.TranscriptionSegment\", () => [{\n no: 1,\n name: \"id\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"text\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"start_time\",\n kind: \"scalar\",\n T: 4\n /* ScalarType.UINT64 */\n}, {\n no: 4,\n name: \"end_time\",\n kind: \"scalar\",\n T: 4\n /* ScalarType.UINT64 */\n}, {\n no: 5,\n name: \"final\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 6,\n name: \"language\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst ChatMessage = /* @__PURE__ */proto3.makeMessageType(\"livekit.ChatMessage\", () => [{\n no: 1,\n name: \"id\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"timestamp\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 3,\n name: \"edit_timestamp\",\n kind: \"scalar\",\n T: 3,\n opt: true\n}, {\n no: 4,\n name: \"message\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 5,\n name: \"deleted\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 6,\n name: \"generated\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}]);\nconst RpcRequest = /* @__PURE__ */proto3.makeMessageType(\"livekit.RpcRequest\", () => [{\n no: 1,\n name: \"id\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"method\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"payload\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 4,\n name: \"response_timeout_ms\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 5,\n name: \"version\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}]);\nconst RpcAck = /* @__PURE__ */proto3.makeMessageType(\"livekit.RpcAck\", () => [{\n no: 1,\n name: \"request_id\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst RpcResponse = /* @__PURE__ */proto3.makeMessageType(\"livekit.RpcResponse\", () => [{\n no: 1,\n name: \"request_id\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"payload\",\n kind: \"scalar\",\n T: 9,\n oneof: \"value\"\n}, {\n no: 3,\n name: \"error\",\n kind: \"message\",\n T: RpcError$1,\n oneof: \"value\"\n}]);\nconst RpcError$1 = /* @__PURE__ */proto3.makeMessageType(\"livekit.RpcError\", () => [{\n no: 1,\n name: \"code\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 2,\n name: \"message\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"data\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst ParticipantTracks = /* @__PURE__ */proto3.makeMessageType(\"livekit.ParticipantTracks\", () => [{\n no: 1,\n name: \"participant_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"track_sids\",\n kind: \"scalar\",\n T: 9,\n repeated: true\n}]);\nconst ServerInfo = /* @__PURE__ */proto3.makeMessageType(\"livekit.ServerInfo\", () => [{\n no: 1,\n name: \"edition\",\n kind: \"enum\",\n T: proto3.getEnumType(ServerInfo_Edition)\n}, {\n no: 2,\n name: \"version\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"protocol\",\n kind: \"scalar\",\n T: 5\n /* ScalarType.INT32 */\n}, {\n no: 4,\n name: \"region\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 5,\n name: \"node_id\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 6,\n name: \"debug_info\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 7,\n name: \"agent_protocol\",\n kind: \"scalar\",\n T: 5\n /* ScalarType.INT32 */\n}]);\nconst ServerInfo_Edition = /* @__PURE__ */proto3.makeEnum(\"livekit.ServerInfo.Edition\", [{\n no: 0,\n name: \"Standard\"\n}, {\n no: 1,\n name: \"Cloud\"\n}]);\nconst ClientInfo = /* @__PURE__ */proto3.makeMessageType(\"livekit.ClientInfo\", () => [{\n no: 1,\n name: \"sdk\",\n kind: \"enum\",\n T: proto3.getEnumType(ClientInfo_SDK)\n}, {\n no: 2,\n name: \"version\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"protocol\",\n kind: \"scalar\",\n T: 5\n /* ScalarType.INT32 */\n}, {\n no: 4,\n name: \"os\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 5,\n name: \"os_version\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 6,\n name: \"device_model\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 7,\n name: \"browser\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 8,\n name: \"browser_version\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 9,\n name: \"address\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 10,\n name: \"network\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 11,\n name: \"other_sdks\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst ClientInfo_SDK = /* @__PURE__ */proto3.makeEnum(\"livekit.ClientInfo.SDK\", [{\n no: 0,\n name: \"UNKNOWN\"\n}, {\n no: 1,\n name: \"JS\"\n}, {\n no: 2,\n name: \"SWIFT\"\n}, {\n no: 3,\n name: \"ANDROID\"\n}, {\n no: 4,\n name: \"FLUTTER\"\n}, {\n no: 5,\n name: \"GO\"\n}, {\n no: 6,\n name: \"UNITY\"\n}, {\n no: 7,\n name: \"REACT_NATIVE\"\n}, {\n no: 8,\n name: \"RUST\"\n}, {\n no: 9,\n name: \"PYTHON\"\n}, {\n no: 10,\n name: \"CPP\"\n}, {\n no: 11,\n name: \"UNITY_WEB\"\n}, {\n no: 12,\n name: \"NODE\"\n}, {\n no: 13,\n name: \"UNREAL\"\n}, {\n no: 14,\n name: \"ESP32\"\n}]);\nconst ClientConfiguration = /* @__PURE__ */proto3.makeMessageType(\"livekit.ClientConfiguration\", () => [{\n no: 1,\n name: \"video\",\n kind: \"message\",\n T: VideoConfiguration\n}, {\n no: 2,\n name: \"screen\",\n kind: \"message\",\n T: VideoConfiguration\n}, {\n no: 3,\n name: \"resume_connection\",\n kind: \"enum\",\n T: proto3.getEnumType(ClientConfigSetting)\n}, {\n no: 4,\n name: \"disabled_codecs\",\n kind: \"message\",\n T: DisabledCodecs\n}, {\n no: 5,\n name: \"force_relay\",\n kind: \"enum\",\n T: proto3.getEnumType(ClientConfigSetting)\n}]);\nconst VideoConfiguration = /* @__PURE__ */proto3.makeMessageType(\"livekit.VideoConfiguration\", () => [{\n no: 1,\n name: \"hardware_encoder\",\n kind: \"enum\",\n T: proto3.getEnumType(ClientConfigSetting)\n}]);\nconst DisabledCodecs = /* @__PURE__ */proto3.makeMessageType(\"livekit.DisabledCodecs\", () => [{\n no: 1,\n name: \"codecs\",\n kind: \"message\",\n T: Codec,\n repeated: true\n}, {\n no: 2,\n name: \"publish\",\n kind: \"message\",\n T: Codec,\n repeated: true\n}]);\nconst TimedVersion = /* @__PURE__ */proto3.makeMessageType(\"livekit.TimedVersion\", () => [{\n no: 1,\n name: \"unix_micro\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 2,\n name: \"ticks\",\n kind: \"scalar\",\n T: 5\n /* ScalarType.INT32 */\n}]);\nconst DataStream_OperationType = /* @__PURE__ */proto3.makeEnum(\"livekit.DataStream.OperationType\", [{\n no: 0,\n name: \"CREATE\"\n}, {\n no: 1,\n name: \"UPDATE\"\n}, {\n no: 2,\n name: \"DELETE\"\n}, {\n no: 3,\n name: \"REACTION\"\n}]);\nconst DataStream_TextHeader = /* @__PURE__ */proto3.makeMessageType(\"livekit.DataStream.TextHeader\", () => [{\n no: 1,\n name: \"operation_type\",\n kind: \"enum\",\n T: proto3.getEnumType(DataStream_OperationType)\n}, {\n no: 2,\n name: \"version\",\n kind: \"scalar\",\n T: 5\n /* ScalarType.INT32 */\n}, {\n no: 3,\n name: \"reply_to_stream_id\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 4,\n name: \"attached_stream_ids\",\n kind: \"scalar\",\n T: 9,\n repeated: true\n}, {\n no: 5,\n name: \"generated\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}], {\n localName: \"DataStream_TextHeader\"\n});\nconst DataStream_ByteHeader = /* @__PURE__ */proto3.makeMessageType(\"livekit.DataStream.ByteHeader\", () => [{\n no: 1,\n name: \"name\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}], {\n localName: \"DataStream_ByteHeader\"\n});\nconst DataStream_Header = /* @__PURE__ */proto3.makeMessageType(\"livekit.DataStream.Header\", () => [{\n no: 1,\n name: \"stream_id\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"timestamp\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 3,\n name: \"topic\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 4,\n name: \"mime_type\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 5,\n name: \"total_length\",\n kind: \"scalar\",\n T: 4,\n opt: true\n}, {\n no: 7,\n name: \"encryption_type\",\n kind: \"enum\",\n T: proto3.getEnumType(Encryption_Type)\n}, {\n no: 8,\n name: \"attributes\",\n kind: \"map\",\n K: 9,\n V: {\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n }\n}, {\n no: 9,\n name: \"text_header\",\n kind: \"message\",\n T: DataStream_TextHeader,\n oneof: \"content_header\"\n}, {\n no: 10,\n name: \"byte_header\",\n kind: \"message\",\n T: DataStream_ByteHeader,\n oneof: \"content_header\"\n}], {\n localName: \"DataStream_Header\"\n});\nconst DataStream_Chunk = /* @__PURE__ */proto3.makeMessageType(\"livekit.DataStream.Chunk\", () => [{\n no: 1,\n name: \"stream_id\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"chunk_index\",\n kind: \"scalar\",\n T: 4\n /* ScalarType.UINT64 */\n}, {\n no: 3,\n name: \"content\",\n kind: \"scalar\",\n T: 12\n /* ScalarType.BYTES */\n}, {\n no: 4,\n name: \"version\",\n kind: \"scalar\",\n T: 5\n /* ScalarType.INT32 */\n}, {\n no: 5,\n name: \"iv\",\n kind: \"scalar\",\n T: 12,\n opt: true\n}], {\n localName: \"DataStream_Chunk\"\n});\nconst DataStream_Trailer = /* @__PURE__ */proto3.makeMessageType(\"livekit.DataStream.Trailer\", () => [{\n no: 1,\n name: \"stream_id\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"reason\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"attributes\",\n kind: \"map\",\n K: 9,\n V: {\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n }\n}], {\n localName: \"DataStream_Trailer\"\n});\nconst SignalTarget = /* @__PURE__ */proto3.makeEnum(\"livekit.SignalTarget\", [{\n no: 0,\n name: \"PUBLISHER\"\n}, {\n no: 1,\n name: \"SUBSCRIBER\"\n}]);\nconst StreamState = /* @__PURE__ */proto3.makeEnum(\"livekit.StreamState\", [{\n no: 0,\n name: \"ACTIVE\"\n}, {\n no: 1,\n name: \"PAUSED\"\n}]);\nconst CandidateProtocol = /* @__PURE__ */proto3.makeEnum(\"livekit.CandidateProtocol\", [{\n no: 0,\n name: \"UDP\"\n}, {\n no: 1,\n name: \"TCP\"\n}, {\n no: 2,\n name: \"TLS\"\n}]);\nconst SignalRequest = /* @__PURE__ */proto3.makeMessageType(\"livekit.SignalRequest\", () => [{\n no: 1,\n name: \"offer\",\n kind: \"message\",\n T: SessionDescription,\n oneof: \"message\"\n}, {\n no: 2,\n name: \"answer\",\n kind: \"message\",\n T: SessionDescription,\n oneof: \"message\"\n}, {\n no: 3,\n name: \"trickle\",\n kind: \"message\",\n T: TrickleRequest,\n oneof: \"message\"\n}, {\n no: 4,\n name: \"add_track\",\n kind: \"message\",\n T: AddTrackRequest,\n oneof: \"message\"\n}, {\n no: 5,\n name: \"mute\",\n kind: \"message\",\n T: MuteTrackRequest,\n oneof: \"message\"\n}, {\n no: 6,\n name: \"subscription\",\n kind: \"message\",\n T: UpdateSubscription,\n oneof: \"message\"\n}, {\n no: 7,\n name: \"track_setting\",\n kind: \"message\",\n T: UpdateTrackSettings,\n oneof: \"message\"\n}, {\n no: 8,\n name: \"leave\",\n kind: \"message\",\n T: LeaveRequest,\n oneof: \"message\"\n}, {\n no: 10,\n name: \"update_layers\",\n kind: \"message\",\n T: UpdateVideoLayers,\n oneof: \"message\"\n}, {\n no: 11,\n name: \"subscription_permission\",\n kind: \"message\",\n T: SubscriptionPermission,\n oneof: \"message\"\n}, {\n no: 12,\n name: \"sync_state\",\n kind: \"message\",\n T: SyncState,\n oneof: \"message\"\n}, {\n no: 13,\n name: \"simulate\",\n kind: \"message\",\n T: SimulateScenario,\n oneof: \"message\"\n}, {\n no: 14,\n name: \"ping\",\n kind: \"scalar\",\n T: 3,\n oneof: \"message\"\n}, {\n no: 15,\n name: \"update_metadata\",\n kind: \"message\",\n T: UpdateParticipantMetadata,\n oneof: \"message\"\n}, {\n no: 16,\n name: \"ping_req\",\n kind: \"message\",\n T: Ping,\n oneof: \"message\"\n}, {\n no: 17,\n name: \"update_audio_track\",\n kind: \"message\",\n T: UpdateLocalAudioTrack,\n oneof: \"message\"\n}, {\n no: 18,\n name: \"update_video_track\",\n kind: \"message\",\n T: UpdateLocalVideoTrack,\n oneof: \"message\"\n}]);\nconst SignalResponse = /* @__PURE__ */proto3.makeMessageType(\"livekit.SignalResponse\", () => [{\n no: 1,\n name: \"join\",\n kind: \"message\",\n T: JoinResponse,\n oneof: \"message\"\n}, {\n no: 2,\n name: \"answer\",\n kind: \"message\",\n T: SessionDescription,\n oneof: \"message\"\n}, {\n no: 3,\n name: \"offer\",\n kind: \"message\",\n T: SessionDescription,\n oneof: \"message\"\n}, {\n no: 4,\n name: \"trickle\",\n kind: \"message\",\n T: TrickleRequest,\n oneof: \"message\"\n}, {\n no: 5,\n name: \"update\",\n kind: \"message\",\n T: ParticipantUpdate,\n oneof: \"message\"\n}, {\n no: 6,\n name: \"track_published\",\n kind: \"message\",\n T: TrackPublishedResponse,\n oneof: \"message\"\n}, {\n no: 8,\n name: \"leave\",\n kind: \"message\",\n T: LeaveRequest,\n oneof: \"message\"\n}, {\n no: 9,\n name: \"mute\",\n kind: \"message\",\n T: MuteTrackRequest,\n oneof: \"message\"\n}, {\n no: 10,\n name: \"speakers_changed\",\n kind: \"message\",\n T: SpeakersChanged,\n oneof: \"message\"\n}, {\n no: 11,\n name: \"room_update\",\n kind: \"message\",\n T: RoomUpdate,\n oneof: \"message\"\n}, {\n no: 12,\n name: \"connection_quality\",\n kind: \"message\",\n T: ConnectionQualityUpdate,\n oneof: \"message\"\n}, {\n no: 13,\n name: \"stream_state_update\",\n kind: \"message\",\n T: StreamStateUpdate,\n oneof: \"message\"\n}, {\n no: 14,\n name: \"subscribed_quality_update\",\n kind: \"message\",\n T: SubscribedQualityUpdate,\n oneof: \"message\"\n}, {\n no: 15,\n name: \"subscription_permission_update\",\n kind: \"message\",\n T: SubscriptionPermissionUpdate,\n oneof: \"message\"\n}, {\n no: 16,\n name: \"refresh_token\",\n kind: \"scalar\",\n T: 9,\n oneof: \"message\"\n}, {\n no: 17,\n name: \"track_unpublished\",\n kind: \"message\",\n T: TrackUnpublishedResponse,\n oneof: \"message\"\n}, {\n no: 18,\n name: \"pong\",\n kind: \"scalar\",\n T: 3,\n oneof: \"message\"\n}, {\n no: 19,\n name: \"reconnect\",\n kind: \"message\",\n T: ReconnectResponse,\n oneof: \"message\"\n}, {\n no: 20,\n name: \"pong_resp\",\n kind: \"message\",\n T: Pong,\n oneof: \"message\"\n}, {\n no: 21,\n name: \"subscription_response\",\n kind: \"message\",\n T: SubscriptionResponse,\n oneof: \"message\"\n}, {\n no: 22,\n name: \"request_response\",\n kind: \"message\",\n T: RequestResponse,\n oneof: \"message\"\n}, {\n no: 23,\n name: \"track_subscribed\",\n kind: \"message\",\n T: TrackSubscribed,\n oneof: \"message\"\n}, {\n no: 24,\n name: \"room_moved\",\n kind: \"message\",\n T: RoomMovedResponse,\n oneof: \"message\"\n}]);\nconst SimulcastCodec = /* @__PURE__ */proto3.makeMessageType(\"livekit.SimulcastCodec\", () => [{\n no: 1,\n name: \"codec\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"cid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst AddTrackRequest = /* @__PURE__ */proto3.makeMessageType(\"livekit.AddTrackRequest\", () => [{\n no: 1,\n name: \"cid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"name\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"type\",\n kind: \"enum\",\n T: proto3.getEnumType(TrackType)\n}, {\n no: 4,\n name: \"width\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 5,\n name: \"height\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 6,\n name: \"muted\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 7,\n name: \"disable_dtx\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 8,\n name: \"source\",\n kind: \"enum\",\n T: proto3.getEnumType(TrackSource)\n}, {\n no: 9,\n name: \"layers\",\n kind: \"message\",\n T: VideoLayer,\n repeated: true\n}, {\n no: 10,\n name: \"simulcast_codecs\",\n kind: \"message\",\n T: SimulcastCodec,\n repeated: true\n}, {\n no: 11,\n name: \"sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 12,\n name: \"stereo\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 13,\n name: \"disable_red\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 14,\n name: \"encryption\",\n kind: \"enum\",\n T: proto3.getEnumType(Encryption_Type)\n}, {\n no: 15,\n name: \"stream\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 16,\n name: \"backup_codec_policy\",\n kind: \"enum\",\n T: proto3.getEnumType(BackupCodecPolicy$1)\n}, {\n no: 17,\n name: \"audio_features\",\n kind: \"enum\",\n T: proto3.getEnumType(AudioTrackFeature),\n repeated: true\n}]);\nconst TrickleRequest = /* @__PURE__ */proto3.makeMessageType(\"livekit.TrickleRequest\", () => [{\n no: 1,\n name: \"candidateInit\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"target\",\n kind: \"enum\",\n T: proto3.getEnumType(SignalTarget)\n}, {\n no: 3,\n name: \"final\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}]);\nconst MuteTrackRequest = /* @__PURE__ */proto3.makeMessageType(\"livekit.MuteTrackRequest\", () => [{\n no: 1,\n name: \"sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"muted\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}]);\nconst JoinResponse = /* @__PURE__ */proto3.makeMessageType(\"livekit.JoinResponse\", () => [{\n no: 1,\n name: \"room\",\n kind: \"message\",\n T: Room$1\n}, {\n no: 2,\n name: \"participant\",\n kind: \"message\",\n T: ParticipantInfo\n}, {\n no: 3,\n name: \"other_participants\",\n kind: \"message\",\n T: ParticipantInfo,\n repeated: true\n}, {\n no: 4,\n name: \"server_version\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 5,\n name: \"ice_servers\",\n kind: \"message\",\n T: ICEServer,\n repeated: true\n}, {\n no: 6,\n name: \"subscriber_primary\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 7,\n name: \"alternative_url\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 8,\n name: \"client_configuration\",\n kind: \"message\",\n T: ClientConfiguration\n}, {\n no: 9,\n name: \"server_region\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 10,\n name: \"ping_timeout\",\n kind: \"scalar\",\n T: 5\n /* ScalarType.INT32 */\n}, {\n no: 11,\n name: \"ping_interval\",\n kind: \"scalar\",\n T: 5\n /* ScalarType.INT32 */\n}, {\n no: 12,\n name: \"server_info\",\n kind: \"message\",\n T: ServerInfo\n}, {\n no: 13,\n name: \"sif_trailer\",\n kind: \"scalar\",\n T: 12\n /* ScalarType.BYTES */\n}, {\n no: 14,\n name: \"enabled_publish_codecs\",\n kind: \"message\",\n T: Codec,\n repeated: true\n}, {\n no: 15,\n name: \"fast_publish\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}]);\nconst ReconnectResponse = /* @__PURE__ */proto3.makeMessageType(\"livekit.ReconnectResponse\", () => [{\n no: 1,\n name: \"ice_servers\",\n kind: \"message\",\n T: ICEServer,\n repeated: true\n}, {\n no: 2,\n name: \"client_configuration\",\n kind: \"message\",\n T: ClientConfiguration\n}, {\n no: 3,\n name: \"server_info\",\n kind: \"message\",\n T: ServerInfo\n}, {\n no: 4,\n name: \"last_message_seq\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}]);\nconst TrackPublishedResponse = /* @__PURE__ */proto3.makeMessageType(\"livekit.TrackPublishedResponse\", () => [{\n no: 1,\n name: \"cid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"track\",\n kind: \"message\",\n T: TrackInfo\n}]);\nconst TrackUnpublishedResponse = /* @__PURE__ */proto3.makeMessageType(\"livekit.TrackUnpublishedResponse\", () => [{\n no: 1,\n name: \"track_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst SessionDescription = /* @__PURE__ */proto3.makeMessageType(\"livekit.SessionDescription\", () => [{\n no: 1,\n name: \"type\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"sdp\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"id\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}]);\nconst ParticipantUpdate = /* @__PURE__ */proto3.makeMessageType(\"livekit.ParticipantUpdate\", () => [{\n no: 1,\n name: \"participants\",\n kind: \"message\",\n T: ParticipantInfo,\n repeated: true\n}]);\nconst UpdateSubscription = /* @__PURE__ */proto3.makeMessageType(\"livekit.UpdateSubscription\", () => [{\n no: 1,\n name: \"track_sids\",\n kind: \"scalar\",\n T: 9,\n repeated: true\n}, {\n no: 2,\n name: \"subscribe\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 3,\n name: \"participant_tracks\",\n kind: \"message\",\n T: ParticipantTracks,\n repeated: true\n}]);\nconst UpdateTrackSettings = /* @__PURE__ */proto3.makeMessageType(\"livekit.UpdateTrackSettings\", () => [{\n no: 1,\n name: \"track_sids\",\n kind: \"scalar\",\n T: 9,\n repeated: true\n}, {\n no: 3,\n name: \"disabled\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 4,\n name: \"quality\",\n kind: \"enum\",\n T: proto3.getEnumType(VideoQuality$1)\n}, {\n no: 5,\n name: \"width\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 6,\n name: \"height\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 7,\n name: \"fps\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 8,\n name: \"priority\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}]);\nconst UpdateLocalAudioTrack = /* @__PURE__ */proto3.makeMessageType(\"livekit.UpdateLocalAudioTrack\", () => [{\n no: 1,\n name: \"track_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"features\",\n kind: \"enum\",\n T: proto3.getEnumType(AudioTrackFeature),\n repeated: true\n}]);\nconst UpdateLocalVideoTrack = /* @__PURE__ */proto3.makeMessageType(\"livekit.UpdateLocalVideoTrack\", () => [{\n no: 1,\n name: \"track_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"width\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 3,\n name: \"height\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}]);\nconst LeaveRequest = /* @__PURE__ */proto3.makeMessageType(\"livekit.LeaveRequest\", () => [{\n no: 1,\n name: \"can_reconnect\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 2,\n name: \"reason\",\n kind: \"enum\",\n T: proto3.getEnumType(DisconnectReason)\n}, {\n no: 3,\n name: \"action\",\n kind: \"enum\",\n T: proto3.getEnumType(LeaveRequest_Action)\n}, {\n no: 4,\n name: \"regions\",\n kind: \"message\",\n T: RegionSettings\n}]);\nconst LeaveRequest_Action = /* @__PURE__ */proto3.makeEnum(\"livekit.LeaveRequest.Action\", [{\n no: 0,\n name: \"DISCONNECT\"\n}, {\n no: 1,\n name: \"RESUME\"\n}, {\n no: 2,\n name: \"RECONNECT\"\n}]);\nconst UpdateVideoLayers = /* @__PURE__ */proto3.makeMessageType(\"livekit.UpdateVideoLayers\", () => [{\n no: 1,\n name: \"track_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"layers\",\n kind: \"message\",\n T: VideoLayer,\n repeated: true\n}]);\nconst UpdateParticipantMetadata = /* @__PURE__ */proto3.makeMessageType(\"livekit.UpdateParticipantMetadata\", () => [{\n no: 1,\n name: \"metadata\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"name\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"attributes\",\n kind: \"map\",\n K: 9,\n V: {\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n }\n}, {\n no: 4,\n name: \"request_id\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}]);\nconst ICEServer = /* @__PURE__ */proto3.makeMessageType(\"livekit.ICEServer\", () => [{\n no: 1,\n name: \"urls\",\n kind: \"scalar\",\n T: 9,\n repeated: true\n}, {\n no: 2,\n name: \"username\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"credential\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst SpeakersChanged = /* @__PURE__ */proto3.makeMessageType(\"livekit.SpeakersChanged\", () => [{\n no: 1,\n name: \"speakers\",\n kind: \"message\",\n T: SpeakerInfo,\n repeated: true\n}]);\nconst RoomUpdate = /* @__PURE__ */proto3.makeMessageType(\"livekit.RoomUpdate\", () => [{\n no: 1,\n name: \"room\",\n kind: \"message\",\n T: Room$1\n}]);\nconst ConnectionQualityInfo = /* @__PURE__ */proto3.makeMessageType(\"livekit.ConnectionQualityInfo\", () => [{\n no: 1,\n name: \"participant_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"quality\",\n kind: \"enum\",\n T: proto3.getEnumType(ConnectionQuality$1)\n}, {\n no: 3,\n name: \"score\",\n kind: \"scalar\",\n T: 2\n /* ScalarType.FLOAT */\n}]);\nconst ConnectionQualityUpdate = /* @__PURE__ */proto3.makeMessageType(\"livekit.ConnectionQualityUpdate\", () => [{\n no: 1,\n name: \"updates\",\n kind: \"message\",\n T: ConnectionQualityInfo,\n repeated: true\n}]);\nconst StreamStateInfo = /* @__PURE__ */proto3.makeMessageType(\"livekit.StreamStateInfo\", () => [{\n no: 1,\n name: \"participant_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"track_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"state\",\n kind: \"enum\",\n T: proto3.getEnumType(StreamState)\n}]);\nconst StreamStateUpdate = /* @__PURE__ */proto3.makeMessageType(\"livekit.StreamStateUpdate\", () => [{\n no: 1,\n name: \"stream_states\",\n kind: \"message\",\n T: StreamStateInfo,\n repeated: true\n}]);\nconst SubscribedQuality = /* @__PURE__ */proto3.makeMessageType(\"livekit.SubscribedQuality\", () => [{\n no: 1,\n name: \"quality\",\n kind: \"enum\",\n T: proto3.getEnumType(VideoQuality$1)\n}, {\n no: 2,\n name: \"enabled\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}]);\nconst SubscribedCodec = /* @__PURE__ */proto3.makeMessageType(\"livekit.SubscribedCodec\", () => [{\n no: 1,\n name: \"codec\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"qualities\",\n kind: \"message\",\n T: SubscribedQuality,\n repeated: true\n}]);\nconst SubscribedQualityUpdate = /* @__PURE__ */proto3.makeMessageType(\"livekit.SubscribedQualityUpdate\", () => [{\n no: 1,\n name: \"track_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"subscribed_qualities\",\n kind: \"message\",\n T: SubscribedQuality,\n repeated: true\n}, {\n no: 3,\n name: \"subscribed_codecs\",\n kind: \"message\",\n T: SubscribedCodec,\n repeated: true\n}]);\nconst TrackPermission = /* @__PURE__ */proto3.makeMessageType(\"livekit.TrackPermission\", () => [{\n no: 1,\n name: \"participant_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"all_tracks\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 3,\n name: \"track_sids\",\n kind: \"scalar\",\n T: 9,\n repeated: true\n}, {\n no: 4,\n name: \"participant_identity\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst SubscriptionPermission = /* @__PURE__ */proto3.makeMessageType(\"livekit.SubscriptionPermission\", () => [{\n no: 1,\n name: \"all_participants\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}, {\n no: 2,\n name: \"track_permissions\",\n kind: \"message\",\n T: TrackPermission,\n repeated: true\n}]);\nconst SubscriptionPermissionUpdate = /* @__PURE__ */proto3.makeMessageType(\"livekit.SubscriptionPermissionUpdate\", () => [{\n no: 1,\n name: \"participant_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"track_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"allowed\",\n kind: \"scalar\",\n T: 8\n /* ScalarType.BOOL */\n}]);\nconst RoomMovedResponse = /* @__PURE__ */proto3.makeMessageType(\"livekit.RoomMovedResponse\", () => [{\n no: 1,\n name: \"room\",\n kind: \"message\",\n T: Room$1\n}, {\n no: 2,\n name: \"token\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"participant\",\n kind: \"message\",\n T: ParticipantInfo\n}, {\n no: 4,\n name: \"other_participants\",\n kind: \"message\",\n T: ParticipantInfo,\n repeated: true\n}]);\nconst SyncState = /* @__PURE__ */proto3.makeMessageType(\"livekit.SyncState\", () => [{\n no: 1,\n name: \"answer\",\n kind: \"message\",\n T: SessionDescription\n}, {\n no: 2,\n name: \"subscription\",\n kind: \"message\",\n T: UpdateSubscription\n}, {\n no: 3,\n name: \"publish_tracks\",\n kind: \"message\",\n T: TrackPublishedResponse,\n repeated: true\n}, {\n no: 4,\n name: \"data_channels\",\n kind: \"message\",\n T: DataChannelInfo,\n repeated: true\n}, {\n no: 5,\n name: \"offer\",\n kind: \"message\",\n T: SessionDescription\n}, {\n no: 6,\n name: \"track_sids_disabled\",\n kind: \"scalar\",\n T: 9,\n repeated: true\n}, {\n no: 7,\n name: \"datachannel_receive_states\",\n kind: \"message\",\n T: DataChannelReceiveState,\n repeated: true\n}]);\nconst DataChannelReceiveState = /* @__PURE__ */proto3.makeMessageType(\"livekit.DataChannelReceiveState\", () => [{\n no: 1,\n name: \"publisher_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"last_seq\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}]);\nconst DataChannelInfo = /* @__PURE__ */proto3.makeMessageType(\"livekit.DataChannelInfo\", () => [{\n no: 1,\n name: \"label\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"id\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 3,\n name: \"target\",\n kind: \"enum\",\n T: proto3.getEnumType(SignalTarget)\n}]);\nconst SimulateScenario = /* @__PURE__ */proto3.makeMessageType(\"livekit.SimulateScenario\", () => [{\n no: 1,\n name: \"speaker_update\",\n kind: \"scalar\",\n T: 5,\n oneof: \"scenario\"\n}, {\n no: 2,\n name: \"node_failure\",\n kind: \"scalar\",\n T: 8,\n oneof: \"scenario\"\n}, {\n no: 3,\n name: \"migration\",\n kind: \"scalar\",\n T: 8,\n oneof: \"scenario\"\n}, {\n no: 4,\n name: \"server_leave\",\n kind: \"scalar\",\n T: 8,\n oneof: \"scenario\"\n}, {\n no: 5,\n name: \"switch_candidate_protocol\",\n kind: \"enum\",\n T: proto3.getEnumType(CandidateProtocol),\n oneof: \"scenario\"\n}, {\n no: 6,\n name: \"subscriber_bandwidth\",\n kind: \"scalar\",\n T: 3,\n oneof: \"scenario\"\n}, {\n no: 7,\n name: \"disconnect_signal_on_resume\",\n kind: \"scalar\",\n T: 8,\n oneof: \"scenario\"\n}, {\n no: 8,\n name: \"disconnect_signal_on_resume_no_messages\",\n kind: \"scalar\",\n T: 8,\n oneof: \"scenario\"\n}, {\n no: 9,\n name: \"leave_request_full_reconnect\",\n kind: \"scalar\",\n T: 8,\n oneof: \"scenario\"\n}]);\nconst Ping = /* @__PURE__ */proto3.makeMessageType(\"livekit.Ping\", () => [{\n no: 1,\n name: \"timestamp\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 2,\n name: \"rtt\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}]);\nconst Pong = /* @__PURE__ */proto3.makeMessageType(\"livekit.Pong\", () => [{\n no: 1,\n name: \"last_ping_timestamp\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}, {\n no: 2,\n name: \"timestamp\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}]);\nconst RegionSettings = /* @__PURE__ */proto3.makeMessageType(\"livekit.RegionSettings\", () => [{\n no: 1,\n name: \"regions\",\n kind: \"message\",\n T: RegionInfo,\n repeated: true\n}]);\nconst RegionInfo = /* @__PURE__ */proto3.makeMessageType(\"livekit.RegionInfo\", () => [{\n no: 1,\n name: \"region\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"url\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 3,\n name: \"distance\",\n kind: \"scalar\",\n T: 3\n /* ScalarType.INT64 */\n}]);\nconst SubscriptionResponse = /* @__PURE__ */proto3.makeMessageType(\"livekit.SubscriptionResponse\", () => [{\n no: 1,\n name: \"track_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}, {\n no: 2,\n name: \"err\",\n kind: \"enum\",\n T: proto3.getEnumType(SubscriptionError)\n}]);\nconst RequestResponse = /* @__PURE__ */proto3.makeMessageType(\"livekit.RequestResponse\", () => [{\n no: 1,\n name: \"request_id\",\n kind: \"scalar\",\n T: 13\n /* ScalarType.UINT32 */\n}, {\n no: 2,\n name: \"reason\",\n kind: \"enum\",\n T: proto3.getEnumType(RequestResponse_Reason)\n}, {\n no: 3,\n name: \"message\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\nconst RequestResponse_Reason = /* @__PURE__ */proto3.makeEnum(\"livekit.RequestResponse.Reason\", [{\n no: 0,\n name: \"OK\"\n}, {\n no: 1,\n name: \"NOT_FOUND\"\n}, {\n no: 2,\n name: \"NOT_ALLOWED\"\n}, {\n no: 3,\n name: \"LIMIT_EXCEEDED\"\n}]);\nconst TrackSubscribed = /* @__PURE__ */proto3.makeMessageType(\"livekit.TrackSubscribed\", () => [{\n no: 1,\n name: \"track_sid\",\n kind: \"scalar\",\n T: 9\n /* ScalarType.STRING */\n}]);\n\nfunction getDefaultExportFromCjs (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nvar loglevel$1 = {exports: {}};\n\n/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\nvar loglevel = loglevel$1.exports;\nvar hasRequiredLoglevel;\nfunction requireLoglevel() {\n if (hasRequiredLoglevel) return loglevel$1.exports;\n hasRequiredLoglevel = 1;\n (function (module) {\n (function (root, definition) {\n\n if (module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n })(loglevel, function () {\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function () {};\n var undefinedType = \"undefined\";\n var isIE = typeof window !== undefinedType && typeof window.navigator !== undefinedType && /Trident\\/|MSIE /.test(window.navigator.userAgent);\n var logMethods = [\"trace\", \"debug\", \"info\", \"warn\", \"error\"];\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function () {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = i < level ? noop : this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) || enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie = encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n function getPersistedLevel() {\n var storedLevel;\n if (typeof window === undefinedType || !storageKey) return;\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location + cookieName.length + 1))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n return storedLevel;\n }\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie = encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n self.levels = {\n \"TRACE\": 0,\n \"DEBUG\": 1,\n \"INFO\": 2,\n \"WARN\": 3,\n \"ERROR\": 4,\n \"SILENT\": 5\n };\n self.methodFactory = factory || defaultMethodFactory;\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) {\n // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n self.enableAll = function (persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n self.disableAll = function (persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(defaultLogger ? defaultLogger.getLevel() : \"WARN\");\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== \"symbol\" && typeof name !== \"string\" || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(name, defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = typeof window !== undefinedType ? window.log : undefined;\n defaultLogger.noConflict = function () {\n if (typeof window !== undefinedType && window.log === defaultLogger) {\n window.log = _log;\n }\n return defaultLogger;\n };\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n return defaultLogger;\n });\n })(loglevel$1);\n return loglevel$1.exports;\n}\n\nvar loglevelExports = requireLoglevel();\n\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"trace\"] = 0] = \"trace\";\n LogLevel[LogLevel[\"debug\"] = 1] = \"debug\";\n LogLevel[LogLevel[\"info\"] = 2] = \"info\";\n LogLevel[LogLevel[\"warn\"] = 3] = \"warn\";\n LogLevel[LogLevel[\"error\"] = 4] = \"error\";\n LogLevel[LogLevel[\"silent\"] = 5] = \"silent\";\n})(LogLevel || (LogLevel = {}));\nvar LoggerNames;\n(function (LoggerNames) {\n LoggerNames[\"Default\"] = \"livekit\";\n LoggerNames[\"Room\"] = \"livekit-room\";\n LoggerNames[\"Participant\"] = \"livekit-participant\";\n LoggerNames[\"Track\"] = \"livekit-track\";\n LoggerNames[\"Publication\"] = \"livekit-track-publication\";\n LoggerNames[\"Engine\"] = \"livekit-engine\";\n LoggerNames[\"Signal\"] = \"livekit-signal\";\n LoggerNames[\"PCManager\"] = \"livekit-pc-manager\";\n LoggerNames[\"PCTransport\"] = \"livekit-pc-transport\";\n LoggerNames[\"E2EE\"] = \"lk-e2ee\";\n})(LoggerNames || (LoggerNames = {}));\nlet livekitLogger = loglevelExports.getLogger('livekit');\nconst livekitLoggers = Object.values(LoggerNames).map(name => loglevelExports.getLogger(name));\nlivekitLogger.setDefaultLevel(LogLevel.info);\n/**\n * @internal\n */\nfunction getLogger(name) {\n const logger = loglevelExports.getLogger(name);\n logger.setDefaultLevel(livekitLogger.getLevel());\n return logger;\n}\nfunction setLogLevel(level, loggerName) {\n if (loggerName) {\n loglevelExports.getLogger(loggerName).setLevel(level);\n } else {\n for (const logger of livekitLoggers) {\n logger.setLevel(level);\n }\n }\n}\n/**\n * use this to hook into the logging function to allow sending internal livekit logs to third party services\n * if set, the browser logs will lose their stacktrace information (see https://github.com/pimterry/loglevel#writing-plugins)\n */\nfunction setLogExtension(extension, logger) {\n const loggers = logger ? [logger] : livekitLoggers;\n loggers.forEach(logR => {\n const originalFactory = logR.methodFactory;\n logR.methodFactory = (methodName, configLevel, loggerName) => {\n const rawMethod = originalFactory(methodName, configLevel, loggerName);\n const logLevel = LogLevel[methodName];\n const needLog = logLevel >= configLevel && logLevel < LogLevel.silent;\n return (msg, context) => {\n if (context) rawMethod(msg, context);else rawMethod(msg);\n if (needLog) {\n extension(logLevel, msg, context);\n }\n };\n };\n logR.setLevel(logR.getLevel());\n });\n}\nconst workerLogger = loglevelExports.getLogger('lk-e2ee');\n\nconst maxRetryDelay = 7000;\nconst DEFAULT_RETRY_DELAYS_IN_MS = [0, 300, 2 * 2 * 300, 3 * 3 * 300, 4 * 4 * 300, maxRetryDelay, maxRetryDelay, maxRetryDelay, maxRetryDelay, maxRetryDelay];\nclass DefaultReconnectPolicy {\n constructor(retryDelays) {\n this._retryDelays = retryDelays !== undefined ? [...retryDelays] : DEFAULT_RETRY_DELAYS_IN_MS;\n }\n nextRetryDelayInMs(context) {\n if (context.retryCount >= this._retryDelays.length) return null;\n const retryDelay = this._retryDelays[context.retryCount];\n if (context.retryCount <= 1) return retryDelay;\n return retryDelay + Math.random() * 1000;\n }\n}\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nfunction __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nfunction __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar events = {exports: {}};\n\nvar hasRequiredEvents;\nfunction requireEvents() {\n if (hasRequiredEvents) return events.exports;\n hasRequiredEvents = 1;\n var R = typeof Reflect === 'object' ? Reflect : null;\n var ReflectApply = R && typeof R.apply === 'function' ? R.apply : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n };\n var ReflectOwnKeys;\n if (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys;\n } else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));\n };\n } else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n }\n function ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n }\n var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n };\n function EventEmitter() {\n EventEmitter.init.call(this);\n }\n events.exports = EventEmitter;\n events.exports.once = once;\n\n // Backwards-compat with node 0.10.x\n EventEmitter.EventEmitter = EventEmitter;\n EventEmitter.prototype._events = undefined;\n EventEmitter.prototype._eventsCount = 0;\n EventEmitter.prototype._maxListeners = undefined;\n\n // By default EventEmitters will print a warning if more than 10 listeners are\n // added to it. This is a useful default which helps finding memory leaks.\n var defaultMaxListeners = 10;\n function checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n }\n Object.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function () {\n return defaultMaxListeners;\n },\n set: function (arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n });\n EventEmitter.init = function () {\n if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n this._maxListeners = this._maxListeners || undefined;\n };\n\n // Obviously not all Emitters should be limited to 10. This function allows\n // that to be increased. Set to zero for unlimited.\n EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n };\n function _getMaxListeners(that) {\n if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n }\n EventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n };\n EventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = type === 'error';\n var events = this._events;\n if (events !== undefined) doError = doError && events.error === undefined;else if (!doError) return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0) er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n var handler = events[type];\n if (handler === undefined) return false;\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args);\n }\n return true;\n };\n function _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n checkListener(listener);\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type, listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' ' + String(type) + ' listeners ' + 'added. Use emitter.setMaxListeners() to ' + 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n return target;\n }\n EventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n };\n EventEmitter.prototype.on = EventEmitter.prototype.addListener;\n EventEmitter.prototype.prependListener = function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n function onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0) return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n }\n function _onceWrap(target, type, listener) {\n var state = {\n fired: false,\n wrapFn: undefined,\n target: target,\n type: type,\n listener: listener\n };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n }\n EventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n };\n EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n // Emits a 'removeListener' event if and only if the listener was removed.\n EventEmitter.prototype.removeListener = function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n checkListener(listener);\n events = this._events;\n if (events === undefined) return this;\n list = events[type];\n if (list === undefined) return this;\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0) this._events = Object.create(null);else {\n delete events[type];\n if (events.removeListener) this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n if (position < 0) return this;\n if (position === 0) list.shift();else {\n spliceOne(list, position);\n }\n if (list.length === 1) events[type] = list[0];\n if (events.removeListener !== undefined) this.emit('removeListener', type, originalListener || listener);\n }\n return this;\n };\n EventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {\n var listeners, events, i;\n events = this._events;\n if (events === undefined) return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0) this._events = Object.create(null);else delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n listeners = events[type];\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n return this;\n };\n function _listeners(target, type, unwrap) {\n var events = target._events;\n if (events === undefined) return [];\n var evlistener = events[type];\n if (evlistener === undefined) return [];\n if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n }\n EventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n };\n EventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n };\n EventEmitter.listenerCount = function (emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n };\n EventEmitter.prototype.listenerCount = listenerCount;\n function listenerCount(type) {\n var events = this._events;\n if (events !== undefined) {\n var evlistener = events[type];\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n return 0;\n }\n EventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n };\n function arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i) copy[i] = arr[i];\n return copy;\n }\n function spliceOne(list, index) {\n for (; index + 1 < list.length; index++) list[index] = list[index + 1];\n list.pop();\n }\n function unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n }\n function once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n }\n eventTargetAgnosticAddListener(emitter, name, resolver, {\n once: true\n });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, {\n once: true\n });\n }\n });\n }\n function addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n }\n function eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n }\n return events.exports;\n}\n\nvar eventsExports = requireEvents();\n\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nfunction extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseFloat(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nfunction wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function (nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = e => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName, wrappedCallback]);\n };\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function (nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName, unwrappedCb]);\n };\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap, this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap, this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\nfunction disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool + '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return bool ? 'adapter.js logging disabled' : 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nfunction disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool + '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\nfunction log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nfunction deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod + ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nfunction detectBrowser(window) {\n // Returned result object.\n const result = {\n browser: null,\n version: null\n };\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator || !window.navigator.userAgent) {\n result.browser = 'Not a browser.';\n return result;\n }\n const {\n navigator\n } = window;\n\n // Prefer navigator.userAgentData.\n if (navigator.userAgentData && navigator.userAgentData.brands) {\n const chromium = navigator.userAgentData.brands.find(brand => {\n return brand.brand === 'Chromium';\n });\n if (chromium) {\n return {\n browser: 'chrome',\n version: parseInt(chromium.version, 10)\n };\n }\n }\n if (navigator.mozGetUserMedia) {\n // Firefox.\n result.browser = 'firefox';\n result.version = parseInt(extractVersion(navigator.userAgent, /Firefox\\/(\\d+)\\./, 1));\n } else if (navigator.webkitGetUserMedia || window.isSecureContext === false && window.webkitRTCPeerConnection) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = parseInt(extractVersion(navigator.userAgent, /Chrom(e|ium)\\/(\\d+)\\./, 2));\n } else if (window.RTCPeerConnection && navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) {\n // Safari.\n result.browser = 'safari';\n result.version = parseInt(extractVersion(navigator.userAgent, /AppleWebKit\\/(\\d+)\\./, 1));\n result.supportsUnifiedPlan = window.RTCRtpTransceiver && 'currentDirection' in window.RTCRtpTransceiver.prototype;\n // Only for internal usage.\n result._safariVersion = extractVersion(navigator.userAgent, /Version\\/(\\d+(\\.?\\d+))/, 1);\n } else {\n // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nfunction compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n return Object.keys(data).reduce(function (accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {\n [key]: value\n });\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nfunction walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nfunction filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' && value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\nconst logging = log;\nfunction shimGetUserMedia$2(window, browserDetails) {\n const navigator = window && window.navigator;\n if (!navigator.mediaDevices) {\n return;\n }\n const constraintsToChrome_ = function (c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const r = typeof c[key] === 'object' ? c[key] : {\n ideal: c[key]\n };\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n const oldname_ = function (prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return name === 'deviceId' ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n let oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(mix => {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n const shimConstraints_ = function (constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function (obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && (typeof face === 'object' ? face : {\n ideal: face\n });\n const getSupportedFacingModeLies = browserDetails.version < 66;\n if (face && (face.exact === 'user' || face.exact === 'environment' || face.ideal === 'user' || face.ideal === 'environment') && !(navigator.mediaDevices.getSupportedConstraints && navigator.mediaDevices.getSupportedConstraints().facingMode && !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices().then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match => d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact ? {\n exact: dev.deviceId\n } : {\n ideal: dev.deviceId\n };\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n const shimError_ = function (e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n const getUserMedia_ = function (constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function (cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length || c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\nfunction shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\nfunction shimOnTrack$1(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = e => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers().find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {\n track: te.track\n };\n }\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {\n receiver\n };\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers().find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {\n track\n };\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {\n receiver\n };\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver', {\n value: {\n receiver: e.receiver\n }\n });\n }\n return e;\n });\n }\n}\nfunction shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection && !('getSenders' in window.RTCPeerConnection.prototype) && 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function (pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) {\n // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection && 'getSenders' in window.RTCPeerConnection.prototype && 'createDTMFSender' in window.RTCPeerConnection.prototype && window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\nfunction shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result => filterStats(result, receiver.track, false));\n };\n }\n if (!('getStats' in window.RTCRtpSender.prototype && 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 && arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || sender && receiver) {\n return Promise.reject(new DOMException('There are more than one sender or receiver for the track.', 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException('There is no sender or receiver for the track.', 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\nfunction shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams).map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.', 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders().filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\nfunction shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack && browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype.getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.', 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n origRemoveStream.apply(this, [this._streams[stream.id] || stream]);\n delete this._reverseStreams[this._streams[stream.id] ? this._streams[stream.id].id : stream.id];\n delete this._streams[stream.id];\n };\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException('The RTCPeerConnection\\'s signalingState is \\'closed\\'.', 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 || !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException('The adapter.js addTrack polyfill only supports a single ' + ' stream which is associated with the specified track.', 'NotSupportedError');\n }\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.', 'InvalidAccessError');\n }\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'), externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'), internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function (method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {\n [method]() {\n const args = arguments;\n const isLegacyCall = arguments.length && typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [description => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n }, err => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]]);\n }\n return nativeMethod.apply(this, arguments).then(description => replaceInternalStreamId(this, description));\n }\n };\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n const origSetLocalDescription = window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype, 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException('The RTCPeerConnection\\'s signalingState is \\'closed\\'.', 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' + 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.', 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks().find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\nfunction shimPeerConnection$1(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'].forEach(function (method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {\n [method]() {\n arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }\n };\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nfunction fixNegotiationNeeded(window, browserDetails) {\n wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || pc.getConfiguration && pc.getConfiguration().sdpSemantics === 'plan-b') {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n\nvar chromeShim = /*#__PURE__*/Object.freeze({\n __proto__: null,\n fixNegotiationNeeded: fixNegotiationNeeded,\n shimAddTrackRemoveTrack: shimAddTrackRemoveTrack,\n shimAddTrackRemoveTrackWithNative: shimAddTrackRemoveTrackWithNative,\n shimGetSendersWithDtmf: shimGetSendersWithDtmf,\n shimGetUserMedia: shimGetUserMedia$2,\n shimMediaStream: shimMediaStream,\n shimOnTrack: shimOnTrack$1,\n shimPeerConnection: shimPeerConnection$1,\n shimSenderReceiverGetStats: shimSenderReceiverGetStats\n});\n\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\nfunction shimGetUserMedia$1(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n navigator.getUserMedia = function (constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n deprecated('navigator.getUserMedia', 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n if (!(browserDetails.version > 55 && 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function (obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function (c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function () {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function (c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n\n/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n\nfunction shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!window.navigator.mediaDevices) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' + 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {\n mediaSource: preferredMediaSource\n };\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\nfunction shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {\n receiver: this.receiver\n };\n }\n });\n }\n}\nfunction shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' || !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'].forEach(function (method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {\n [method]() {\n arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }\n };\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null]).then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n }).then(onSucc, onErr);\n };\n}\nfunction shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) : Promise.resolve(new Map());\n };\n}\nfunction shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\nfunction shimRemoveStream(window) {\n if (!window.RTCPeerConnection || 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\nfunction shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\nfunction shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver = function addTransceiver() {\n this.setParametersPromises = [];\n // WebIDL input coercion and validation\n let sendEncodings = arguments[1] && arguments[1].sendEncodings;\n if (sendEncodings === undefined) {\n sendEncodings = [];\n }\n sendEncodings = [...sendEncodings];\n const shouldPerformCheck = sendEncodings.length > 0;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n sendEncodings.forEach(encodingParam => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {\n sender\n } = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n params.encodings.length === 1 && Object.keys(params.encodings[0]).length === 0) {\n params.encodings = sendEncodings;\n sender.sendEncodings = sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params).then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n }));\n }\n }\n return transceiver;\n };\n }\n}\nfunction shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters = function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\nfunction shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises).then(() => {\n return origCreateOffer.apply(this, arguments);\n }).finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\nfunction shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises).then(() => {\n return origCreateAnswer.apply(this, arguments);\n }).finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n\nvar firefoxShim = /*#__PURE__*/Object.freeze({\n __proto__: null,\n shimAddTransceiver: shimAddTransceiver,\n shimCreateAnswer: shimCreateAnswer,\n shimCreateOffer: shimCreateOffer,\n shimGetDisplayMedia: shimGetDisplayMedia,\n shimGetParameters: shimGetParameters,\n shimGetUserMedia: shimGetUserMedia$1,\n shimOnTrack: shimOnTrack,\n shimPeerConnection: shimPeerConnection,\n shimRTCDataChannel: shimRTCDataChannel,\n shimReceiverGetStats: shimReceiverGetStats,\n shimRemoveStream: shimRemoveStream,\n shimSenderGetStats: shimSenderGetStats\n});\n\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\nfunction shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track, stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track, stream));\n };\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track) {\n for (var _len = arguments.length, streams = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n streams[_key - 1] = arguments[_key];\n }\n if (streams) {\n streams.forEach(stream => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\nfunction shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams = function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = e => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function (e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\nfunction shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n prototype.createOffer = function createOffer(successCallback, failureCallback) {\n const options = arguments.length >= 2 ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.createAnswer = function createAnswer(successCallback, failureCallback) {\n const options = arguments.length >= 2 ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n let withCallback = function (description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n withCallback = function (description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n withCallback = function (candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\nfunction shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = constraints => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n if (!navigator.getUserMedia && navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints).then(cb, errcb);\n }.bind(navigator);\n }\n}\nfunction shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({}, constraints, {\n video: compactObject(constraints.video)\n });\n }\n return constraints;\n}\nfunction shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection = function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (server.urls === undefined && server.url) {\n deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\nfunction shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {\n receiver: this.receiver\n };\n }\n });\n }\n}\nfunction shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver => transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true && !audioTransceiver) {\n this.addTransceiver('audio', {\n direction: 'recvonly'\n });\n }\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver => transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true && !videoTransceiver) {\n this.addTransceiver('video', {\n direction: 'recvonly'\n });\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\nfunction shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n\nvar safariShim = /*#__PURE__*/Object.freeze({\n __proto__: null,\n shimAudioContext: shimAudioContext,\n shimCallbacksAPI: shimCallbacksAPI,\n shimConstraints: shimConstraints,\n shimCreateOfferLegacy: shimCreateOfferLegacy,\n shimGetUserMedia: shimGetUserMedia,\n shimLocalStreamsAPI: shimLocalStreamsAPI,\n shimRTCIceServerUrls: shimRTCIceServerUrls,\n shimRemoteStreamsAPI: shimRemoteStreamsAPI,\n shimTrackEventTransceiver: shimTrackEventTransceiver\n});\n\nvar sdp$1 = {exports: {}};\n\n/* eslint-env node */\nvar hasRequiredSdp;\nfunction requireSdp() {\n if (hasRequiredSdp) return sdp$1.exports;\n hasRequiredSdp = 1;\n (function (module) {\n\n // SDP helpers.\n const SDPUtils = {};\n\n // Generate an alphanumeric identifier for cname or mids.\n // TODO: use UUIDs instead? https://gist.github.com/jed/982883\n SDPUtils.generateIdentifier = function () {\n return Math.random().toString(36).substring(2, 12);\n };\n\n // The RTCP CNAME used by all peerconnections from the same JS.\n SDPUtils.localCName = SDPUtils.generateIdentifier();\n\n // Splits SDP into lines, dealing with both CRLF and LF.\n SDPUtils.splitLines = function (blob) {\n return blob.trim().split('\\n').map(line => line.trim());\n };\n // Splits SDP into sessionpart and mediasections. Ensures CRLF.\n SDPUtils.splitSections = function (blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ? 'm=' + part : part).trim() + '\\r\\n');\n };\n\n // Returns the session description.\n SDPUtils.getDescription = function (blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n };\n\n // Returns the individual media sections.\n SDPUtils.getMediaSections = function (blob) {\n const sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n };\n\n // Returns lines that start with a certain prefix.\n SDPUtils.matchPrefix = function (blob, prefix) {\n return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0);\n };\n\n // Parses an ICE candidate line. Sample input:\n // candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n // rport 55996\"\n // Input can be prefixed with a=.\n SDPUtils.parseCandidate = function (line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n const candidate = {\n foundation: parts[0],\n component: {\n 1: 'rtp',\n 2: 'rtcp'\n }[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4],\n // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7]\n };\n for (let i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default:\n // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n };\n\n // Translates a candidate object into SDP candidate attribute.\n // This does not include the a= prefix!\n SDPUtils.writeCandidate = function (candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress && candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n };\n\n // Parses an ice-options line, returns an array of option tags.\n // Sample input:\n // a=ice-options:foo bar\n SDPUtils.parseIceOptions = function (line) {\n return line.substring(14).split(' ');\n };\n\n // Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n // a=rtpmap:111 opus/48000/2\n SDPUtils.parseRtpMap = function (line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10) // was: id\n };\n parts = parts[0].split('/');\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n };\n\n // Generates a rtpmap line from RTCRtpCodecCapability or\n // RTCRtpCodecParameters.\n SDPUtils.writeRtpMap = function (codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate + (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n };\n\n // Parses a extmap line (headerextension from RFC 5285). Sample input:\n // a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n // a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\n SDPUtils.parseExtmap = function (line) {\n const parts = line.substring(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1],\n attributes: parts.slice(2).join(' ')\n };\n };\n\n // Generates an extmap line from RTCRtpHeaderExtensionParameters or\n // RTCRtpHeaderExtension.\n SDPUtils.writeExtmap = function (headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) + (headerExtension.direction && headerExtension.direction !== 'sendrecv' ? '/' + headerExtension.direction : '') + ' ' + headerExtension.uri + (headerExtension.attributes ? ' ' + headerExtension.attributes : '') + '\\r\\n';\n };\n\n // Parses a fmtp line, returns dictionary. Sample input:\n // a=fmtp:96 vbr=on;cng=on\n // Also deals with vbr=on; cng=on\n SDPUtils.parseFmtp = function (line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n };\n\n // Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\n SDPUtils.writeFmtp = function (codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n };\n\n // Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n // a=rtcp-fb:98 nack rpsi\n SDPUtils.parseRtcpFb = function (line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' ')\n };\n };\n\n // Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\n SDPUtils.writeRtcpFb = function (codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(fb => {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type + (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') + '\\r\\n';\n });\n }\n return lines;\n };\n\n // Parses a RFC 5576 ssrc media attribute. Sample input:\n // a=ssrc:3735928559 cname:something\n SDPUtils.parseSsrcMedia = function (line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10)\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n };\n\n // Parse a ssrc-group line (see RFC 5576). Sample input:\n // a=ssrc-group:semantics 12 34\n SDPUtils.parseSsrcGroup = function (line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10))\n };\n };\n\n // Extracts the MID (RFC 5888) from a media section.\n // Returns the MID or undefined if no mid line was found.\n SDPUtils.getMid = function (mediaSection) {\n const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n };\n\n // Parses a fingerprint line for DTLS-SRTP.\n SDPUtils.parseFingerprint = function (line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(),\n // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase() // the definition is upper-case in RFC 4572.\n };\n };\n\n // Extracts DTLS parameters from SDP media section or sessionpart.\n // FIXME: for consistency with other functions this should only\n // get the fingerprint line as input. See also getIceParameters.\n SDPUtils.getDtlsParameters = function (mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint)\n };\n };\n\n // Serializes DTLS parameters to SDP.\n SDPUtils.writeDtlsParameters = function (params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(fp => {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n };\n\n // Parses a=crypto lines into\n // https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\n SDPUtils.parseCryptoLine = function (line) {\n const parts = line.substring(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3)\n };\n };\n SDPUtils.writeCryptoLine = function (parameters) {\n return 'a=crypto:' + parameters.tag + ' ' + parameters.cryptoSuite + ' ' + (typeof parameters.keyParams === 'object' ? SDPUtils.writeCryptoKeyParams(parameters.keyParams) : parameters.keyParams) + (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') + '\\r\\n';\n };\n\n // Parses the crypto key parameters into\n // https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\n SDPUtils.parseCryptoKeyParams = function (keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n const parts = keyParams.substring(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined\n };\n };\n SDPUtils.writeCryptoKeyParams = function (keyParams) {\n return keyParams.keyMethod + ':' + keyParams.keySalt + (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') + (keyParams.mkiValue && keyParams.mkiLength ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength : '');\n };\n\n // Extracts all SDES parameters.\n SDPUtils.getCryptoParameters = function (mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n };\n\n // Parses ICE information from SDP media section or sessionpart.\n // FIXME: for consistency with other functions this should only\n // get the ice-ufrag and ice-pwd lines as input.\n SDPUtils.getIceParameters = function (mediaSection, sessionpart) {\n const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10)\n };\n };\n\n // Serializes ICE parameters to SDP.\n SDPUtils.writeIceParameters = function (params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' + 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n };\n\n // Parses the SDP media section and returns RTCRtpParameters.\n SDPUtils.parseRtpParameters = function (mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: []\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) {\n // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:' + pt + ' ').map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ').map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb => {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type && existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\n });\n // FIXME: parse rtcp.\n return description;\n };\n\n // Generates parts of the SDP media section describing the capabilities /\n // parameters.\n SDPUtils.writeRtpDescription = function (kind, caps) {\n let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(codec => {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(codec => {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(extension => {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n };\n\n // Parses the SDP media section and returns an array of\n // RTCRtpEncodingParameters.\n SDPUtils.parseRtpEncodingParameters = function (mediaSection) {\n const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map(line => SDPUtils.parseSsrcMedia(line)).filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID').map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n description.codecs.forEach(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10)\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {\n ssrc: secondarySsrc\n };\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95 - 50 * 40 * 8;\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n };\n\n // parses http://draft.ortc.org/#rtcrtcpparameters*\n SDPUtils.parseRtcpParameters = function (mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map(line => SDPUtils.parseSsrcMedia(line)).filter(obj => obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n return rtcpParameters;\n };\n SDPUtils.writeRtcpParameters = function (rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc + ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n };\n\n // parses either a=msid: or a=ssrc:... msid lines and returns\n // the id of the MediaStream and MediaStreamTrack.\n SDPUtils.parseMsid = function (mediaSection) {\n let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {\n stream: parts[0],\n track: parts[1]\n };\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map(line => SDPUtils.parseSsrcMedia(line)).filter(msidParts => msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {\n stream: parts[0],\n track: parts[1]\n };\n }\n };\n\n // SCTP\n // parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n // to draft-ietf-mmusic-sctp-sdp-05\n SDPUtils.parseSctpDescription = function (mediaSection) {\n const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0].substring(10).split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize\n };\n }\n };\n\n // SCTP\n // outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n // support by now receiving in this format, unless we originally parsed\n // as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n // protocol of DTLS/SCTP -- without UDP/ or TCP/)\n SDPUtils.writeSctpDescription = function (media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = ['m=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n', 'c=IN IP4 0.0.0.0\\r\\n', 'a=sctp-port:' + sctp.port + '\\r\\n'];\n } else {\n output = ['m=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n', 'c=IN IP4 0.0.0.0\\r\\n', 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n'];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n };\n\n // Generate a session ID for SDP.\n // https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n // recommends using a cryptographically random +ve 64-bit value\n // but right now this should be acceptable and within the right range\n SDPUtils.generateSessionId = function () {\n return Math.random().toString().substr(2, 22);\n };\n\n // Write boiler plate for start of SDP\n // sessId argument is optional - if not supplied it will\n // be generated randomly\n // sessVersion is optional and defaults to 2\n // sessUser is optional and defaults to 'thisisadapterortc'\n SDPUtils.writeSessionBoilerplate = function (sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' + 'o=' + user + ' ' + sessionId + ' ' + version + ' IN IP4 127.0.0.1\\r\\n' + 's=-\\r\\n' + 't=0 0\\r\\n';\n };\n\n // Gets the direction from the mediaSection or the sessionpart.\n SDPUtils.getDirection = function (mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = SDPUtils.splitLines(mediaSection);\n for (let i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n };\n SDPUtils.getKind = function (mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n };\n SDPUtils.isRejected = function (mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n };\n SDPUtils.parseMLine = function (mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' ')\n };\n };\n SDPUtils.parseOLine = function (mediaSection) {\n const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5]\n };\n };\n\n // a very naive interpretation of a valid SDP.\n SDPUtils.isValidSDP = function (blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n const lines = SDPUtils.splitLines(blob);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n };\n\n // Expose public methods.\n {\n module.exports = SDPUtils;\n }\n })(sdp$1);\n return sdp$1.exports;\n}\n\nvar sdpExports = requireSdp();\nvar SDPUtils = /*@__PURE__*/getDefaultExportFromCjs(sdpExports);\n\nvar sdp = /*#__PURE__*/_mergeNamespaces({\n __proto__: null,\n default: SDPUtils\n}, [sdpExports]);\n\n/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\nfunction shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || window.RTCIceCandidate && 'foundation' in window.RTCIceCandidate.prototype) {\n return;\n }\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate && args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substring(2);\n }\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n for (const key in parsedCandidate) {\n if (!(key in nativeCandidate)) {\n Object.defineProperty(nativeCandidate, key, {\n value: parsedCandidate[key]\n });\n }\n }\n\n // Override serializer to not serialize the extra attributes.\n nativeCandidate.toJSON = function toJSON() {\n return {\n candidate: nativeCandidate.candidate,\n sdpMid: nativeCandidate.sdpMid,\n sdpMLineIndex: nativeCandidate.sdpMLineIndex,\n usernameFragment: nativeCandidate.usernameFragment\n };\n };\n return nativeCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\nfunction shimRTCIceCandidateRelayProtocol(window) {\n if (!window.RTCIceCandidate || window.RTCIceCandidate && 'relayProtocol' in window.RTCIceCandidate.prototype) {\n return;\n }\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n const parsedCandidate = SDPUtils.parseCandidate(e.candidate.candidate);\n if (parsedCandidate.type === 'relay') {\n // This is a libwebrtc-specific mapping of local type preference\n // to relayProtocol.\n e.candidate.relayProtocol = {\n 0: 'tls',\n 1: 'tcp',\n 2: 'udp'\n }[parsedCandidate.priority >> 24];\n }\n }\n return e;\n });\n}\nfunction shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n const sctpInDescription = function (description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application' && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n const getRemoteFirefoxVersion = function (description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n const getCanSendMaxMessageSize = function (remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize = browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n const getMaxMessageSize = function (description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox' && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n const match = SDPUtils.matchPrefix(description.sdp, 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substring(19), 10);\n } else if (browserDetails.browser === 'firefox' && remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n const origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {\n sdpSemantics\n } = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true\n });\n }\n }\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\nfunction shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection && 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' && pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' + pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel = window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel = function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nfunction shimConnectionState(window) {\n if (!window.RTCPeerConnection || 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange', this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange', this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n ['setLocalDescription', 'setRemoteDescription'].forEach(method => {\n const origMethod = proto[method];\n proto[method] = function () {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange', this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\nfunction removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' && browserDetails._safariVersion >= 13.1) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter(line => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription && desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\nfunction shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate = window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate = function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if ((browserDetails.browser === 'chrome' && browserDetails.version < 78 || browserDetails.browser === 'firefox' && browserDetails.version < 68 || browserDetails.browser === 'safari') && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n\n// Note: Make sure to call this ahead of APIs that modify\n// setLocalDescription.length\nfunction shimParameterlessSetLocalDescription(window, browserDetails) {\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeSetLocalDescription = window.RTCPeerConnection.prototype.setLocalDescription;\n if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() {\n let desc = arguments[0] || {};\n if (typeof desc !== 'object' || desc.type && desc.sdp) {\n return nativeSetLocalDescription.apply(this, arguments);\n }\n // The remaining steps should technically happen when SLD comes off the\n // RTCPeerConnection's operations chain (not ahead of going on it), but\n // this is too difficult to shim. Instead, this shim only covers the\n // common case where the operations chain is empty. This is imperfect, but\n // should cover many cases. Rationale: Even if we can't reduce the glare\n // window to zero on imperfect implementations, there's value in tapping\n // into the perfect negotiation pattern that several browsers support.\n desc = {\n type: desc.type,\n sdp: desc.sdp\n };\n if (!desc.type) {\n switch (this.signalingState) {\n case 'stable':\n case 'have-local-offer':\n case 'have-remote-pranswer':\n desc.type = 'offer';\n break;\n default:\n desc.type = 'answer';\n break;\n }\n }\n if (desc.sdp || desc.type !== 'offer' && desc.type !== 'answer') {\n return nativeSetLocalDescription.apply(this, [desc]);\n }\n const func = desc.type === 'offer' ? this.createOffer : this.createAnswer;\n return func.apply(this).then(d => nativeSetLocalDescription.apply(this, [d]));\n };\n}\n\nvar commonShim = /*#__PURE__*/Object.freeze({\n __proto__: null,\n removeExtmapAllowMixed: removeExtmapAllowMixed,\n shimAddIceCandidateNullOrEmpty: shimAddIceCandidateNullOrEmpty,\n shimConnectionState: shimConnectionState,\n shimMaxMessageSize: shimMaxMessageSize,\n shimParameterlessSetLocalDescription: shimParameterlessSetLocalDescription,\n shimRTCIceCandidate: shimRTCIceCandidate,\n shimRTCIceCandidateRelayProtocol: shimRTCIceCandidateRelayProtocol,\n shimSendThrowTypeError: shimSendThrowTypeError\n});\n\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n\n// Shimming starts here.\nfunction adapterFactory() {\n let {\n window\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n shimChrome: true,\n shimFirefox: true,\n shimSafari: true\n };\n // Utils.\n const logging = log;\n const browserDetails = detectBrowser(window);\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: extractVersion,\n disableLog: disableLog,\n disableWarnings: disableWarnings,\n // Expose sdp as a convenience. For production apps include directly.\n sdp\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !shimPeerConnection$1 || !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n shimAddIceCandidateNullOrEmpty(window, browserDetails);\n shimParameterlessSetLocalDescription(window);\n shimGetUserMedia$2(window, browserDetails);\n shimMediaStream(window);\n shimPeerConnection$1(window, browserDetails);\n shimOnTrack$1(window);\n shimAddTrackRemoveTrack(window, browserDetails);\n shimGetSendersWithDtmf(window);\n shimSenderReceiverGetStats(window);\n fixNegotiationNeeded(window, browserDetails);\n shimRTCIceCandidate(window);\n shimRTCIceCandidateRelayProtocol(window);\n shimConnectionState(window);\n shimMaxMessageSize(window, browserDetails);\n shimSendThrowTypeError(window);\n removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !shimPeerConnection || !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n shimAddIceCandidateNullOrEmpty(window, browserDetails);\n shimParameterlessSetLocalDescription(window);\n shimGetUserMedia$1(window, browserDetails);\n shimPeerConnection(window, browserDetails);\n shimOnTrack(window);\n shimRemoveStream(window);\n shimSenderGetStats(window);\n shimReceiverGetStats(window);\n shimRTCDataChannel(window);\n shimAddTransceiver(window);\n shimGetParameters(window);\n shimCreateOffer(window);\n shimCreateAnswer(window);\n shimRTCIceCandidate(window);\n shimConnectionState(window);\n shimMaxMessageSize(window, browserDetails);\n shimSendThrowTypeError(window);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n shimAddIceCandidateNullOrEmpty(window, browserDetails);\n shimParameterlessSetLocalDescription(window);\n shimRTCIceServerUrls(window);\n shimCreateOfferLegacy(window);\n shimCallbacksAPI(window);\n shimLocalStreamsAPI(window);\n shimRemoteStreamsAPI(window);\n shimTrackEventTransceiver(window);\n shimGetUserMedia(window);\n shimAudioContext(window);\n shimRTCIceCandidate(window);\n shimRTCIceCandidateRelayProtocol(window);\n shimMaxMessageSize(window, browserDetails);\n shimSendThrowTypeError(window);\n removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n return adapter;\n}\n\n/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n\nadapterFactory({\n window: typeof window === 'undefined' ? undefined : window\n});\n\nconst ENCRYPTION_ALGORITHM = 'AES-GCM';\n// How many consecutive frames can fail decrypting before a particular key gets marked as invalid\nconst DECRYPTION_FAILURE_TOLERANCE = 10;\n// flag set to indicate that e2ee has been setup for sender/receiver;\nconst E2EE_FLAG = 'lk_e2ee';\nconst SALT = 'LKFrameEncryptionKey';\nconst KEY_PROVIDER_DEFAULTS = {\n sharedKey: false,\n ratchetSalt: SALT,\n ratchetWindowSize: 8,\n failureTolerance: DECRYPTION_FAILURE_TOLERANCE,\n keyringSize: 16\n};\n\nvar KeyProviderEvent;\n(function (KeyProviderEvent) {\n KeyProviderEvent[\"SetKey\"] = \"setKey\";\n /** Event for requesting to ratchet the key used to encrypt the stream */\n KeyProviderEvent[\"RatchetRequest\"] = \"ratchetRequest\";\n /** Emitted when a key is ratcheted. Could be after auto-ratcheting on decryption failure or\n * following a `RatchetRequest`, will contain the ratcheted key material */\n KeyProviderEvent[\"KeyRatcheted\"] = \"keyRatcheted\";\n})(KeyProviderEvent || (KeyProviderEvent = {}));\nvar KeyHandlerEvent;\n(function (KeyHandlerEvent) {\n /** Emitted when a key has been ratcheted. Is emitted when any key has been ratcheted\n * i.e. when the FrameCryptor tried to ratchet when decryption is failing */\n KeyHandlerEvent[\"KeyRatcheted\"] = \"keyRatcheted\";\n})(KeyHandlerEvent || (KeyHandlerEvent = {}));\nvar EncryptionEvent;\n(function (EncryptionEvent) {\n EncryptionEvent[\"ParticipantEncryptionStatusChanged\"] = \"participantEncryptionStatusChanged\";\n EncryptionEvent[\"EncryptionError\"] = \"encryptionError\";\n})(EncryptionEvent || (EncryptionEvent = {}));\nvar CryptorEvent;\n(function (CryptorEvent) {\n CryptorEvent[\"Error\"] = \"cryptorError\";\n})(CryptorEvent || (CryptorEvent = {}));\n\nfunction isE2EESupported() {\n return isInsertableStreamSupported() || isScriptTransformSupported();\n}\nfunction isScriptTransformSupported() {\n // @ts-ignore\n return typeof window.RTCRtpScriptTransform !== 'undefined';\n}\nfunction isInsertableStreamSupported() {\n return typeof window.RTCRtpSender !== 'undefined' &&\n // @ts-ignore\n typeof window.RTCRtpSender.prototype.createEncodedStreams !== 'undefined';\n}\nfunction isVideoFrame(frame) {\n return 'type' in frame;\n}\nfunction importKey(keyBytes_1) {\n return __awaiter(this, arguments, void 0, function (keyBytes) {\n let algorithm = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n name: ENCRYPTION_ALGORITHM\n };\n let usage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'encrypt';\n return function* () {\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey\n return crypto.subtle.importKey('raw', keyBytes, algorithm, false, usage === 'derive' ? ['deriveBits', 'deriveKey'] : ['encrypt', 'decrypt']);\n }();\n });\n}\nfunction createKeyMaterialFromString(password) {\n return __awaiter(this, void 0, void 0, function* () {\n let enc = new TextEncoder();\n const keyMaterial = yield crypto.subtle.importKey('raw', enc.encode(password), {\n name: 'PBKDF2'\n }, false, ['deriveBits', 'deriveKey']);\n return keyMaterial;\n });\n}\nfunction createKeyMaterialFromBuffer(cryptoBuffer) {\n return __awaiter(this, void 0, void 0, function* () {\n const keyMaterial = yield crypto.subtle.importKey('raw', cryptoBuffer, 'HKDF', false, ['deriveBits', 'deriveKey']);\n return keyMaterial;\n });\n}\nfunction getAlgoOptions(algorithmName, salt) {\n const textEncoder = new TextEncoder();\n const encodedSalt = textEncoder.encode(salt);\n switch (algorithmName) {\n case 'HKDF':\n return {\n name: 'HKDF',\n salt: encodedSalt,\n hash: 'SHA-256',\n info: new ArrayBuffer(128)\n };\n case 'PBKDF2':\n {\n return {\n name: 'PBKDF2',\n salt: encodedSalt,\n hash: 'SHA-256',\n iterations: 100000\n };\n }\n default:\n throw new Error(\"algorithm \".concat(algorithmName, \" is currently unsupported\"));\n }\n}\n/**\n * Derives a set of keys from the master key.\n * See https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.1\n */\nfunction deriveKeys(material, salt) {\n return __awaiter(this, void 0, void 0, function* () {\n const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey#HKDF\n // https://developer.mozilla.org/en-US/docs/Web/API/HkdfParams\n const encryptionKey = yield crypto.subtle.deriveKey(algorithmOptions, material, {\n name: ENCRYPTION_ALGORITHM,\n length: 128\n }, false, ['encrypt', 'decrypt']);\n return {\n material,\n encryptionKey\n };\n });\n}\nfunction createE2EEKey() {\n return window.crypto.getRandomValues(new Uint8Array(32));\n}\n/**\n * Ratchets a key. See\n * https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.5.1\n */\nfunction ratchet(material, salt) {\n return __awaiter(this, void 0, void 0, function* () {\n const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveBits\n return crypto.subtle.deriveBits(algorithmOptions, material, 256);\n });\n}\nfunction needsRbspUnescaping(frameData) {\n for (var i = 0; i < frameData.length - 3; i++) {\n if (frameData[i] == 0 && frameData[i + 1] == 0 && frameData[i + 2] == 3) return true;\n }\n return false;\n}\nfunction parseRbsp(stream) {\n const dataOut = [];\n var length = stream.length;\n for (var i = 0; i < stream.length;) {\n // Be careful about over/underflow here. byte_length_ - 3 can underflow, and\n // i + 3 can overflow, but byte_length_ - i can't, because i < byte_length_\n // above, and that expression will produce the number of bytes left in\n // the stream including the byte at i.\n if (length - i >= 3 && !stream[i] && !stream[i + 1] && stream[i + 2] == 3) {\n // Two rbsp bytes.\n dataOut.push(stream[i++]);\n dataOut.push(stream[i++]);\n // Skip the emulation byte.\n i++;\n } else {\n // Single rbsp byte.\n dataOut.push(stream[i++]);\n }\n }\n return new Uint8Array(dataOut);\n}\nconst kZerosInStartSequence = 2;\nconst kEmulationByte = 3;\nfunction writeRbsp(data_in) {\n const dataOut = [];\n var numConsecutiveZeros = 0;\n for (var i = 0; i < data_in.length; ++i) {\n var byte = data_in[i];\n if (byte <= kEmulationByte && numConsecutiveZeros >= kZerosInStartSequence) {\n // Need to escape.\n dataOut.push(kEmulationByte);\n numConsecutiveZeros = 0;\n }\n dataOut.push(byte);\n if (byte == 0) {\n ++numConsecutiveZeros;\n } else {\n numConsecutiveZeros = 0;\n }\n }\n return new Uint8Array(dataOut);\n}\n\n/**\n * @experimental\n */\nclass BaseKeyProvider extends eventsExports.EventEmitter {\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n super();\n /**\n * Callback being invoked after a key has been ratcheted.\n * Can happen when:\n * - A decryption failure occurs and the key is auto-ratcheted\n * - A ratchet request is sent (see {@link ratchetKey()})\n * @param ratchetResult Contains the ratcheted chain key (exportable to other participants) and the derived new key material.\n * @param participantId\n * @param keyIndex\n */\n this.onKeyRatcheted = (ratchetResult, participantId, keyIndex) => {\n livekitLogger.debug('key ratcheted event received', {\n ratchetResult,\n participantId,\n keyIndex\n });\n };\n this.keyInfoMap = new Map();\n this.options = Object.assign(Object.assign({}, KEY_PROVIDER_DEFAULTS), options);\n this.on(KeyProviderEvent.KeyRatcheted, this.onKeyRatcheted);\n }\n /**\n * callback to invoke once a key has been set for a participant\n * @param key\n * @param participantIdentity\n * @param keyIndex\n */\n onSetEncryptionKey(key, participantIdentity, keyIndex) {\n const keyInfo = {\n key,\n participantIdentity,\n keyIndex\n };\n if (!this.options.sharedKey && !participantIdentity) {\n throw new Error('participant identity needs to be passed for encryption key if sharedKey option is false');\n }\n this.keyInfoMap.set(\"\".concat(participantIdentity !== null && participantIdentity !== void 0 ? participantIdentity : 'shared', \"-\").concat(keyIndex !== null && keyIndex !== void 0 ? keyIndex : 0), keyInfo);\n this.emit(KeyProviderEvent.SetKey, keyInfo);\n }\n getKeys() {\n return Array.from(this.keyInfoMap.values());\n }\n getOptions() {\n return this.options;\n }\n ratchetKey(participantIdentity, keyIndex) {\n this.emit(KeyProviderEvent.RatchetRequest, participantIdentity, keyIndex);\n }\n}\n/**\n * A basic KeyProvider implementation intended for a single shared\n * passphrase between all participants\n * @experimental\n */\nclass ExternalE2EEKeyProvider extends BaseKeyProvider {\n constructor() {\n let options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n const opts = Object.assign(Object.assign({}, options), {\n sharedKey: true,\n // for a shared key provider failing to decrypt for a specific participant\n // should not mark the key as invalid, so we accept wrong keys forever\n // and won't try to auto-ratchet\n ratchetWindowSize: 0,\n failureTolerance: -1\n });\n super(opts);\n }\n /**\n * Accepts a passphrase that's used to create the crypto keys.\n * When passing in a string, PBKDF2 is used.\n * When passing in an Array buffer of cryptographically random numbers, HKDF is being used. (recommended)\n * @param key\n */\n setKey(key) {\n return __awaiter(this, void 0, void 0, function* () {\n const derivedKey = typeof key === 'string' ? yield createKeyMaterialFromString(key) : yield createKeyMaterialFromBuffer(key);\n this.onSetEncryptionKey(derivedKey);\n });\n }\n}\n\nclass LivekitError extends Error {\n constructor(code, message) {\n super(message || 'an error has occured');\n this.name = 'LiveKitError';\n this.code = code;\n }\n}\nvar ConnectionErrorReason;\n(function (ConnectionErrorReason) {\n ConnectionErrorReason[ConnectionErrorReason[\"NotAllowed\"] = 0] = \"NotAllowed\";\n ConnectionErrorReason[ConnectionErrorReason[\"ServerUnreachable\"] = 1] = \"ServerUnreachable\";\n ConnectionErrorReason[ConnectionErrorReason[\"InternalError\"] = 2] = \"InternalError\";\n ConnectionErrorReason[ConnectionErrorReason[\"Cancelled\"] = 3] = \"Cancelled\";\n ConnectionErrorReason[ConnectionErrorReason[\"LeaveRequest\"] = 4] = \"LeaveRequest\";\n ConnectionErrorReason[ConnectionErrorReason[\"Timeout\"] = 5] = \"Timeout\";\n})(ConnectionErrorReason || (ConnectionErrorReason = {}));\nclass ConnectionError extends LivekitError {\n constructor(message, reason, status, context) {\n super(1, message);\n this.name = 'ConnectionError';\n this.status = status;\n this.reason = reason;\n this.context = context;\n this.reasonName = ConnectionErrorReason[reason];\n }\n}\nclass DeviceUnsupportedError extends LivekitError {\n constructor(message) {\n super(21, message !== null && message !== void 0 ? message : 'device is unsupported');\n this.name = 'DeviceUnsupportedError';\n }\n}\nclass TrackInvalidError extends LivekitError {\n constructor(message) {\n super(20, message !== null && message !== void 0 ? message : 'track is invalid');\n this.name = 'TrackInvalidError';\n }\n}\nclass UnsupportedServer extends LivekitError {\n constructor(message) {\n super(10, message !== null && message !== void 0 ? message : 'unsupported server');\n this.name = 'UnsupportedServer';\n }\n}\nclass UnexpectedConnectionState extends LivekitError {\n constructor(message) {\n super(12, message !== null && message !== void 0 ? message : 'unexpected connection state');\n this.name = 'UnexpectedConnectionState';\n }\n}\nclass NegotiationError extends LivekitError {\n constructor(message) {\n super(13, message !== null && message !== void 0 ? message : 'unable to negotiate');\n this.name = 'NegotiationError';\n }\n}\nclass PublishDataError extends LivekitError {\n constructor(message) {\n super(14, message !== null && message !== void 0 ? message : 'unable to publish data');\n this.name = 'PublishDataError';\n }\n}\nclass PublishTrackError extends LivekitError {\n constructor(message, status) {\n super(15, message);\n this.name = 'PublishTrackError';\n this.status = status;\n }\n}\nclass SignalRequestError extends LivekitError {\n constructor(message, reason) {\n super(15, message);\n this.reason = reason;\n this.reasonName = typeof reason === 'string' ? reason : RequestResponse_Reason[reason];\n }\n}\nvar MediaDeviceFailure;\n(function (MediaDeviceFailure) {\n // user rejected permissions\n MediaDeviceFailure[\"PermissionDenied\"] = \"PermissionDenied\";\n // device is not available\n MediaDeviceFailure[\"NotFound\"] = \"NotFound\";\n // device is in use. On Windows, only a single tab may get access to a device at a time.\n MediaDeviceFailure[\"DeviceInUse\"] = \"DeviceInUse\";\n MediaDeviceFailure[\"Other\"] = \"Other\";\n})(MediaDeviceFailure || (MediaDeviceFailure = {}));\n(function (MediaDeviceFailure) {\n function getFailure(error) {\n if (error && 'name' in error) {\n if (error.name === 'NotFoundError' || error.name === 'DevicesNotFoundError') {\n return MediaDeviceFailure.NotFound;\n }\n if (error.name === 'NotAllowedError' || error.name === 'PermissionDeniedError') {\n return MediaDeviceFailure.PermissionDenied;\n }\n if (error.name === 'NotReadableError' || error.name === 'TrackStartError') {\n return MediaDeviceFailure.DeviceInUse;\n }\n return MediaDeviceFailure.Other;\n }\n }\n MediaDeviceFailure.getFailure = getFailure;\n})(MediaDeviceFailure || (MediaDeviceFailure = {}));\n\nvar CryptorErrorReason;\n(function (CryptorErrorReason) {\n CryptorErrorReason[CryptorErrorReason[\"InvalidKey\"] = 0] = \"InvalidKey\";\n CryptorErrorReason[CryptorErrorReason[\"MissingKey\"] = 1] = \"MissingKey\";\n CryptorErrorReason[CryptorErrorReason[\"InternalError\"] = 2] = \"InternalError\";\n})(CryptorErrorReason || (CryptorErrorReason = {}));\nclass CryptorError extends LivekitError {\n constructor(message) {\n let reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : CryptorErrorReason.InternalError;\n let participantIdentity = arguments.length > 2 ? arguments[2] : undefined;\n super(40, message);\n this.reason = reason;\n this.participantIdentity = participantIdentity;\n }\n}\n\n/**\n * Events are the primary way LiveKit notifies your application of changes.\n *\n * The following are events emitted by [[Room]], listen to room events like\n *\n * ```typescript\n * room.on(RoomEvent.TrackPublished, (track, publication, participant) => {})\n * ```\n */\nvar RoomEvent;\n(function (RoomEvent) {\n /**\n * When the connection to the server has been established\n */\n RoomEvent[\"Connected\"] = \"connected\";\n /**\n * When the connection to the server has been interrupted and it's attempting\n * to reconnect.\n */\n RoomEvent[\"Reconnecting\"] = \"reconnecting\";\n /**\n * When the signal connection to the server has been interrupted. This isn't noticeable to users most of the time.\n * It will resolve with a `RoomEvent.Reconnected` once the signal connection has been re-established.\n * If media fails additionally it an additional `RoomEvent.Reconnecting` will be emitted.\n */\n RoomEvent[\"SignalReconnecting\"] = \"signalReconnecting\";\n /**\n * Fires when a reconnection has been successful.\n */\n RoomEvent[\"Reconnected\"] = \"reconnected\";\n /**\n * When disconnected from room. This fires when room.disconnect() is called or\n * when an unrecoverable connection issue had occured.\n *\n * DisconnectReason can be used to determine why the participant was disconnected. Notable reasons are\n * - DUPLICATE_IDENTITY: another client with the same identity has joined the room\n * - PARTICIPANT_REMOVED: participant was removed by RemoveParticipant API\n * - ROOM_DELETED: the room has ended via DeleteRoom API\n *\n * args: ([[DisconnectReason]])\n */\n RoomEvent[\"Disconnected\"] = \"disconnected\";\n /**\n * Whenever the connection state of the room changes\n *\n * args: ([[ConnectionState]])\n */\n RoomEvent[\"ConnectionStateChanged\"] = \"connectionStateChanged\";\n /**\n * When participant has been moved to a different room by the service request.\n * The behavior looks like the participant has been disconnected and reconnected to a different room\n * seamlessly without connection state transition.\n * A new token will be provided for reconnecting to the new room if needed.\n *\n * args: ([[room: string, token: string]])\n */\n RoomEvent[\"Moved\"] = \"moved\";\n /**\n * When input or output devices on the machine have changed.\n */\n RoomEvent[\"MediaDevicesChanged\"] = \"mediaDevicesChanged\";\n /**\n * When a [[RemoteParticipant]] joins *after* the local\n * participant. It will not emit events for participants that are already\n * in the room\n *\n * args: ([[RemoteParticipant]])\n */\n RoomEvent[\"ParticipantConnected\"] = \"participantConnected\";\n /**\n * When a [[RemoteParticipant]] leaves *after* the local\n * participant has joined.\n *\n * args: ([[RemoteParticipant]])\n */\n RoomEvent[\"ParticipantDisconnected\"] = \"participantDisconnected\";\n /**\n * When a new track is published to room *after* the local\n * participant has joined. It will not fire for tracks that are already published.\n *\n * A track published doesn't mean the participant has subscribed to it. It's\n * simply reflecting the state of the room.\n *\n * args: ([[RemoteTrackPublication]], [[RemoteParticipant]])\n */\n RoomEvent[\"TrackPublished\"] = \"trackPublished\";\n /**\n * The [[LocalParticipant]] has subscribed to a new track. This event will **always**\n * fire as long as new tracks are ready for use.\n *\n * args: ([[RemoteTrack]], [[RemoteTrackPublication]], [[RemoteParticipant]])\n */\n RoomEvent[\"TrackSubscribed\"] = \"trackSubscribed\";\n /**\n * Could not subscribe to a track\n *\n * args: (track sid, [[RemoteParticipant]])\n */\n RoomEvent[\"TrackSubscriptionFailed\"] = \"trackSubscriptionFailed\";\n /**\n * A [[RemoteParticipant]] has unpublished a track\n *\n * args: ([[RemoteTrackPublication]], [[RemoteParticipant]])\n */\n RoomEvent[\"TrackUnpublished\"] = \"trackUnpublished\";\n /**\n * A subscribed track is no longer available. Clients should listen to this\n * event and ensure they detach tracks.\n *\n * args: ([[Track]], [[RemoteTrackPublication]], [[RemoteParticipant]])\n */\n RoomEvent[\"TrackUnsubscribed\"] = \"trackUnsubscribed\";\n /**\n * A track that was muted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]]\n *\n * args: ([[TrackPublication]], [[Participant]])\n */\n RoomEvent[\"TrackMuted\"] = \"trackMuted\";\n /**\n * A track that was unmuted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]]\n *\n * args: ([[TrackPublication]], [[Participant]])\n */\n RoomEvent[\"TrackUnmuted\"] = \"trackUnmuted\";\n /**\n * A local track was published successfully. This event is helpful to know\n * when to update your local UI with the newly published track.\n *\n * args: ([[LocalTrackPublication]], [[LocalParticipant]])\n */\n RoomEvent[\"LocalTrackPublished\"] = \"localTrackPublished\";\n /**\n * A local track was unpublished. This event is helpful to know when to remove\n * the local track from your UI.\n *\n * When a user stops sharing their screen by pressing \"End\" on the browser UI,\n * this event will also fire.\n *\n * args: ([[LocalTrackPublication]], [[LocalParticipant]])\n */\n RoomEvent[\"LocalTrackUnpublished\"] = \"localTrackUnpublished\";\n /**\n * When a local audio track is published the SDK checks whether there is complete silence\n * on that track and emits the LocalAudioSilenceDetected event in that case.\n * This allows for applications to show UI informing users that they might have to\n * reset their audio hardware or check for proper device connectivity.\n */\n RoomEvent[\"LocalAudioSilenceDetected\"] = \"localAudioSilenceDetected\";\n /**\n * Active speakers changed. List of speakers are ordered by their audio level.\n * loudest speakers first. This will include the LocalParticipant too.\n *\n * Speaker updates are sent only to the publishing participant and their subscribers.\n *\n * args: (Array<[[Participant]]>)\n */\n RoomEvent[\"ActiveSpeakersChanged\"] = \"activeSpeakersChanged\";\n /**\n * Participant metadata is a simple way for app-specific state to be pushed to\n * all users.\n * When RoomService.UpdateParticipantMetadata is called to change a participant's\n * state, *all* participants in the room will fire this event.\n *\n * args: (prevMetadata: string, [[Participant]])\n *\n */\n RoomEvent[\"ParticipantMetadataChanged\"] = \"participantMetadataChanged\";\n /**\n * Participant's display name changed\n *\n * args: (name: string, [[Participant]])\n *\n */\n RoomEvent[\"ParticipantNameChanged\"] = \"participantNameChanged\";\n /**\n * Participant attributes is an app-specific key value state to be pushed to\n * all users.\n * When a participant's attributes changed, this event will be emitted with the changed attributes and the participant\n * args: (changedAttributes: [[Record<string, string]], participant: [[Participant]])\n */\n RoomEvent[\"ParticipantAttributesChanged\"] = \"participantAttributesChanged\";\n /**\n * Emitted when the participant's state changes to ACTIVE and is ready to send/receive data messages\n *\n * args: (participant: [[Participant]])\n */\n RoomEvent[\"ParticipantActive\"] = \"participantActive\";\n /**\n * Room metadata is a simple way for app-specific state to be pushed to\n * all users.\n * When RoomService.UpdateRoomMetadata is called to change a room's state,\n * *all* participants in the room will fire this event.\n *\n * args: (string)\n */\n RoomEvent[\"RoomMetadataChanged\"] = \"roomMetadataChanged\";\n /**\n * Data received from another participant.\n * Data packets provides the ability to use LiveKit to send/receive arbitrary payloads.\n * All participants in the room will receive the messages sent to the room.\n *\n * args: (payload: Uint8Array, participant: [[Participant]], kind: [[DataPacket_Kind]], topic?: string)\n */\n RoomEvent[\"DataReceived\"] = \"dataReceived\";\n /**\n * SIP DTMF tones received from another participant.\n *\n * args: (participant: [[Participant]], dtmf: [[DataPacket_Kind]])\n */\n RoomEvent[\"SipDTMFReceived\"] = \"sipDTMFReceived\";\n /**\n * Transcription received from a participant's track.\n * @beta\n */\n RoomEvent[\"TranscriptionReceived\"] = \"transcriptionReceived\";\n /**\n * Connection quality was changed for a Participant. It'll receive updates\n * from the local participant, as well as any [[RemoteParticipant]]s that we are\n * subscribed to.\n *\n * args: (connectionQuality: [[ConnectionQuality]], participant: [[Participant]])\n */\n RoomEvent[\"ConnectionQualityChanged\"] = \"connectionQualityChanged\";\n /**\n * StreamState indicates if a subscribed (remote) track has been paused by the SFU\n * (typically this happens because of subscriber's bandwidth constraints)\n *\n * When bandwidth conditions allow, the track will be resumed automatically.\n * TrackStreamStateChanged will also be emitted when that happens.\n *\n * args: (pub: [[RemoteTrackPublication]], streamState: [[Track.StreamState]],\n * participant: [[RemoteParticipant]])\n */\n RoomEvent[\"TrackStreamStateChanged\"] = \"trackStreamStateChanged\";\n /**\n * One of subscribed tracks have changed its permissions for the current\n * participant. If permission was revoked, then the track will no longer\n * be subscribed. If permission was granted, a TrackSubscribed event will\n * be emitted.\n *\n * args: (pub: [[RemoteTrackPublication]],\n * status: [[TrackPublication.PermissionStatus]],\n * participant: [[RemoteParticipant]])\n */\n RoomEvent[\"TrackSubscriptionPermissionChanged\"] = \"trackSubscriptionPermissionChanged\";\n /**\n * One of subscribed tracks have changed its status for the current\n * participant.\n *\n * args: (pub: [[RemoteTrackPublication]],\n * status: [[TrackPublication.SubscriptionStatus]],\n * participant: [[RemoteParticipant]])\n */\n RoomEvent[\"TrackSubscriptionStatusChanged\"] = \"trackSubscriptionStatusChanged\";\n /**\n * LiveKit will attempt to autoplay all audio tracks when you attach them to\n * audio elements. However, if that fails, we'll notify you via AudioPlaybackStatusChanged.\n * `Room.canPlaybackAudio` will indicate if audio playback is permitted.\n */\n RoomEvent[\"AudioPlaybackStatusChanged\"] = \"audioPlaybackChanged\";\n /**\n * LiveKit will attempt to autoplay all video tracks when you attach them to\n * a video element. However, if that fails, we'll notify you via VideoPlaybackStatusChanged.\n * Calling `room.startVideo()` in a user gesture event handler will resume the video playback.\n */\n RoomEvent[\"VideoPlaybackStatusChanged\"] = \"videoPlaybackChanged\";\n /**\n * When we have encountered an error while attempting to create a track.\n * The errors take place in getUserMedia().\n * Use MediaDeviceFailure.getFailure(error) to get the reason of failure.\n * [[LocalParticipant.lastCameraError]] and [[LocalParticipant.lastMicrophoneError]]\n * will indicate if it had an error while creating the audio or video track respectively.\n *\n * args: (error: Error)\n */\n RoomEvent[\"MediaDevicesError\"] = \"mediaDevicesError\";\n /**\n * A participant's permission has changed.\n * args: (prevPermissions: [[ParticipantPermission]], participant: [[Participant]])\n */\n RoomEvent[\"ParticipantPermissionsChanged\"] = \"participantPermissionsChanged\";\n /**\n * Signal connected, can publish tracks.\n */\n RoomEvent[\"SignalConnected\"] = \"signalConnected\";\n /**\n * Recording of a room has started/stopped. Room.isRecording will be updated too.\n * args: (isRecording: boolean)\n */\n RoomEvent[\"RecordingStatusChanged\"] = \"recordingStatusChanged\";\n RoomEvent[\"ParticipantEncryptionStatusChanged\"] = \"participantEncryptionStatusChanged\";\n RoomEvent[\"EncryptionError\"] = \"encryptionError\";\n /**\n * Emits whenever the current buffer status of a data channel changes\n * args: (isLow: boolean, kind: [[DataPacket_Kind]])\n */\n RoomEvent[\"DCBufferStatusChanged\"] = \"dcBufferStatusChanged\";\n /**\n * Triggered by a call to room.switchActiveDevice\n * args: (kind: MediaDeviceKind, deviceId: string)\n */\n RoomEvent[\"ActiveDeviceChanged\"] = \"activeDeviceChanged\";\n RoomEvent[\"ChatMessage\"] = \"chatMessage\";\n /**\n * fired when the first remote participant has subscribed to the localParticipant's track\n */\n RoomEvent[\"LocalTrackSubscribed\"] = \"localTrackSubscribed\";\n /**\n * fired when the client receives connection metrics from other participants\n */\n RoomEvent[\"MetricsReceived\"] = \"metricsReceived\";\n})(RoomEvent || (RoomEvent = {}));\nvar ParticipantEvent;\n(function (ParticipantEvent) {\n /**\n * When a new track is published to room *after* the local\n * participant has joined. It will not fire for tracks that are already published.\n *\n * A track published doesn't mean the participant has subscribed to it. It's\n * simply reflecting the state of the room.\n *\n * args: ([[RemoteTrackPublication]])\n */\n ParticipantEvent[\"TrackPublished\"] = \"trackPublished\";\n /**\n * Successfully subscribed to the [[RemoteParticipant]]'s track.\n * This event will **always** fire as long as new tracks are ready for use.\n *\n * args: ([[RemoteTrack]], [[RemoteTrackPublication]])\n */\n ParticipantEvent[\"TrackSubscribed\"] = \"trackSubscribed\";\n /**\n * Could not subscribe to a track\n *\n * args: (track sid)\n */\n ParticipantEvent[\"TrackSubscriptionFailed\"] = \"trackSubscriptionFailed\";\n /**\n * A [[RemoteParticipant]] has unpublished a track\n *\n * args: ([[RemoteTrackPublication]])\n */\n ParticipantEvent[\"TrackUnpublished\"] = \"trackUnpublished\";\n /**\n * A subscribed track is no longer available. Clients should listen to this\n * event and ensure they detach tracks.\n *\n * args: ([[RemoteTrack]], [[RemoteTrackPublication]])\n */\n ParticipantEvent[\"TrackUnsubscribed\"] = \"trackUnsubscribed\";\n /**\n * A track that was muted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]]\n *\n * args: ([[TrackPublication]])\n */\n ParticipantEvent[\"TrackMuted\"] = \"trackMuted\";\n /**\n * A track that was unmuted, fires on both [[RemoteParticipant]]s and [[LocalParticipant]]\n *\n * args: ([[TrackPublication]])\n */\n ParticipantEvent[\"TrackUnmuted\"] = \"trackUnmuted\";\n /**\n * A local track was published successfully. This event is helpful to know\n * when to update your local UI with the newly published track.\n *\n * args: ([[LocalTrackPublication]])\n */\n ParticipantEvent[\"LocalTrackPublished\"] = \"localTrackPublished\";\n /**\n * A local track was unpublished. This event is helpful to know when to remove\n * the local track from your UI.\n *\n * When a user stops sharing their screen by pressing \"End\" on the browser UI,\n * this event will also fire.\n *\n * args: ([[LocalTrackPublication]])\n */\n ParticipantEvent[\"LocalTrackUnpublished\"] = \"localTrackUnpublished\";\n /**\n * A local track has been constrained by cpu.\n * This event is useful to know when to reduce the capture resolution of the track.\n *\n * This event is emitted on the local participant.\n *\n * args: ([[LocalVideoTrack]], [[LocalTrackPublication]])\n */\n ParticipantEvent[\"LocalTrackCpuConstrained\"] = \"localTrackCpuConstrained\";\n /**\n * @internal\n */\n ParticipantEvent[\"LocalSenderCreated\"] = \"localSenderCreated\";\n /**\n * Participant metadata is a simple way for app-specific state to be pushed to\n * all users.\n * When RoomService.UpdateParticipantMetadata is called to change a participant's\n * state, *all* participants in the room will fire this event.\n * To access the current metadata, see [[Participant.metadata]].\n *\n * args: (prevMetadata: string)\n *\n */\n ParticipantEvent[\"ParticipantMetadataChanged\"] = \"participantMetadataChanged\";\n /**\n * Participant's display name changed\n *\n * args: (name: string, [[Participant]])\n *\n */\n ParticipantEvent[\"ParticipantNameChanged\"] = \"participantNameChanged\";\n /**\n * Data received from this participant as sender.\n * Data packets provides the ability to use LiveKit to send/receive arbitrary payloads.\n * All participants in the room will receive the messages sent to the room.\n *\n * args: (payload: Uint8Array, kind: [[DataPacket_Kind]])\n */\n ParticipantEvent[\"DataReceived\"] = \"dataReceived\";\n /**\n * SIP DTMF tones received from this participant as sender.\n *\n * args: (dtmf: [[DataPacket_Kind]])\n */\n ParticipantEvent[\"SipDTMFReceived\"] = \"sipDTMFReceived\";\n /**\n * Transcription received from this participant as data source.\n * @beta\n */\n ParticipantEvent[\"TranscriptionReceived\"] = \"transcriptionReceived\";\n /**\n * Has speaking status changed for the current participant\n *\n * args: (speaking: boolean)\n */\n ParticipantEvent[\"IsSpeakingChanged\"] = \"isSpeakingChanged\";\n /**\n * Connection quality was changed for a Participant. It'll receive updates\n * from the local participant, as well as any [[RemoteParticipant]]s that we are\n * subscribed to.\n *\n * args: (connectionQuality: [[ConnectionQuality]])\n */\n ParticipantEvent[\"ConnectionQualityChanged\"] = \"connectionQualityChanged\";\n /**\n * StreamState indicates if a subscribed track has been paused by the SFU\n * (typically this happens because of subscriber's bandwidth constraints)\n *\n * When bandwidth conditions allow, the track will be resumed automatically.\n * TrackStreamStateChanged will also be emitted when that happens.\n *\n * args: (pub: [[RemoteTrackPublication]], streamState: [[Track.StreamState]])\n */\n ParticipantEvent[\"TrackStreamStateChanged\"] = \"trackStreamStateChanged\";\n /**\n * One of subscribed tracks have changed its permissions for the current\n * participant. If permission was revoked, then the track will no longer\n * be subscribed. If permission was granted, a TrackSubscribed event will\n * be emitted.\n *\n * args: (pub: [[RemoteTrackPublication]],\n * status: [[TrackPublication.SubscriptionStatus]])\n */\n ParticipantEvent[\"TrackSubscriptionPermissionChanged\"] = \"trackSubscriptionPermissionChanged\";\n /**\n * One of the remote participants publications has changed its subscription status.\n *\n */\n ParticipantEvent[\"TrackSubscriptionStatusChanged\"] = \"trackSubscriptionStatusChanged\";\n /**\n * a local track has been constrained by cpu\n */\n ParticipantEvent[\"TrackCpuConstrained\"] = \"trackCpuConstrained\";\n // fired only on LocalParticipant\n /** @internal */\n ParticipantEvent[\"MediaDevicesError\"] = \"mediaDevicesError\";\n // fired only on LocalParticipant\n /** @internal */\n ParticipantEvent[\"AudioStreamAcquired\"] = \"audioStreamAcquired\";\n /**\n * A participant's permission has changed.\n * args: (prevPermissions: [[ParticipantPermission]])\n */\n ParticipantEvent[\"ParticipantPermissionsChanged\"] = \"participantPermissionsChanged\";\n /** @internal */\n ParticipantEvent[\"PCTrackAdded\"] = \"pcTrackAdded\";\n /**\n * Participant attributes is an app-specific key value state to be pushed to\n * all users.\n * When a participant's attributes changed, this event will be emitted with the changed attributes\n * args: (changedAttributes: [[Record<string, string]])\n */\n ParticipantEvent[\"AttributesChanged\"] = \"attributesChanged\";\n /**\n * fired on local participant only, when the first remote participant has subscribed to the track specified in the payload\n */\n ParticipantEvent[\"LocalTrackSubscribed\"] = \"localTrackSubscribed\";\n /** only emitted on local participant */\n ParticipantEvent[\"ChatMessage\"] = \"chatMessage\";\n /**\n * Emitted when the participant's state changes to ACTIVE and is ready to send/receive data messages\n */\n ParticipantEvent[\"Active\"] = \"active\";\n})(ParticipantEvent || (ParticipantEvent = {}));\n/** @internal */\nvar EngineEvent;\n(function (EngineEvent) {\n EngineEvent[\"TransportsCreated\"] = \"transportsCreated\";\n EngineEvent[\"Connected\"] = \"connected\";\n EngineEvent[\"Disconnected\"] = \"disconnected\";\n EngineEvent[\"Resuming\"] = \"resuming\";\n EngineEvent[\"Resumed\"] = \"resumed\";\n EngineEvent[\"Restarting\"] = \"restarting\";\n EngineEvent[\"Restarted\"] = \"restarted\";\n EngineEvent[\"SignalResumed\"] = \"signalResumed\";\n EngineEvent[\"SignalRestarted\"] = \"signalRestarted\";\n EngineEvent[\"Closing\"] = \"closing\";\n EngineEvent[\"MediaTrackAdded\"] = \"mediaTrackAdded\";\n EngineEvent[\"ActiveSpeakersUpdate\"] = \"activeSpeakersUpdate\";\n EngineEvent[\"DataPacketReceived\"] = \"dataPacketReceived\";\n EngineEvent[\"RTPVideoMapUpdate\"] = \"rtpVideoMapUpdate\";\n EngineEvent[\"DCBufferStatusChanged\"] = \"dcBufferStatusChanged\";\n EngineEvent[\"ParticipantUpdate\"] = \"participantUpdate\";\n EngineEvent[\"RoomUpdate\"] = \"roomUpdate\";\n EngineEvent[\"SpeakersChanged\"] = \"speakersChanged\";\n EngineEvent[\"StreamStateChanged\"] = \"streamStateChanged\";\n EngineEvent[\"ConnectionQualityUpdate\"] = \"connectionQualityUpdate\";\n EngineEvent[\"SubscriptionError\"] = \"subscriptionError\";\n EngineEvent[\"SubscriptionPermissionUpdate\"] = \"subscriptionPermissionUpdate\";\n EngineEvent[\"RemoteMute\"] = \"remoteMute\";\n EngineEvent[\"SubscribedQualityUpdate\"] = \"subscribedQualityUpdate\";\n EngineEvent[\"LocalTrackUnpublished\"] = \"localTrackUnpublished\";\n EngineEvent[\"LocalTrackSubscribed\"] = \"localTrackSubscribed\";\n EngineEvent[\"Offline\"] = \"offline\";\n EngineEvent[\"SignalRequestResponse\"] = \"signalRequestResponse\";\n EngineEvent[\"SignalConnected\"] = \"signalConnected\";\n EngineEvent[\"RoomMoved\"] = \"roomMoved\";\n})(EngineEvent || (EngineEvent = {}));\nvar TrackEvent;\n(function (TrackEvent) {\n TrackEvent[\"Message\"] = \"message\";\n TrackEvent[\"Muted\"] = \"muted\";\n TrackEvent[\"Unmuted\"] = \"unmuted\";\n /**\n * Only fires on LocalTracks\n */\n TrackEvent[\"Restarted\"] = \"restarted\";\n TrackEvent[\"Ended\"] = \"ended\";\n TrackEvent[\"Subscribed\"] = \"subscribed\";\n TrackEvent[\"Unsubscribed\"] = \"unsubscribed\";\n TrackEvent[\"CpuConstrained\"] = \"cpuConstrained\";\n /** @internal */\n TrackEvent[\"UpdateSettings\"] = \"updateSettings\";\n /** @internal */\n TrackEvent[\"UpdateSubscription\"] = \"updateSubscription\";\n /** @internal */\n TrackEvent[\"AudioPlaybackStarted\"] = \"audioPlaybackStarted\";\n /** @internal */\n TrackEvent[\"AudioPlaybackFailed\"] = \"audioPlaybackFailed\";\n /**\n * @internal\n * Only fires on LocalAudioTrack instances\n */\n TrackEvent[\"AudioSilenceDetected\"] = \"audioSilenceDetected\";\n /** @internal */\n TrackEvent[\"VisibilityChanged\"] = \"visibilityChanged\";\n /** @internal */\n TrackEvent[\"VideoDimensionsChanged\"] = \"videoDimensionsChanged\";\n /** @internal */\n TrackEvent[\"VideoPlaybackStarted\"] = \"videoPlaybackStarted\";\n /** @internal */\n TrackEvent[\"VideoPlaybackFailed\"] = \"videoPlaybackFailed\";\n /** @internal */\n TrackEvent[\"ElementAttached\"] = \"elementAttached\";\n /** @internal */\n TrackEvent[\"ElementDetached\"] = \"elementDetached\";\n /**\n * @internal\n * Only fires on LocalTracks\n */\n TrackEvent[\"UpstreamPaused\"] = \"upstreamPaused\";\n /**\n * @internal\n * Only fires on LocalTracks\n */\n TrackEvent[\"UpstreamResumed\"] = \"upstreamResumed\";\n /**\n * @internal\n * Fires on RemoteTrackPublication\n */\n TrackEvent[\"SubscriptionPermissionChanged\"] = \"subscriptionPermissionChanged\";\n /**\n * Fires on RemoteTrackPublication\n */\n TrackEvent[\"SubscriptionStatusChanged\"] = \"subscriptionStatusChanged\";\n /**\n * Fires on RemoteTrackPublication\n */\n TrackEvent[\"SubscriptionFailed\"] = \"subscriptionFailed\";\n /**\n * @internal\n */\n TrackEvent[\"TrackProcessorUpdate\"] = \"trackProcessorUpdate\";\n /**\n * @internal\n */\n TrackEvent[\"AudioTrackFeatureUpdate\"] = \"audioTrackFeatureUpdate\";\n /**\n * @beta\n */\n TrackEvent[\"TranscriptionReceived\"] = \"transcriptionReceived\";\n /**\n * @experimental\n */\n TrackEvent[\"TimeSyncUpdate\"] = \"timeSyncUpdate\";\n /**\n * @internal\n */\n TrackEvent[\"PreConnectBufferFlushed\"] = \"preConnectBufferFlushed\";\n})(TrackEvent || (TrackEvent = {}));\n\nfunction cloneDeep(value) {\n if (typeof value === 'undefined') {\n return value;\n }\n if (typeof structuredClone === 'function') {\n if (typeof value === 'object' && value !== null) {\n // ensure that the value is not a proxy by spreading it\n return structuredClone(Object.assign({}, value));\n }\n return structuredClone(value);\n } else {\n return JSON.parse(JSON.stringify(value));\n }\n}\n\n// tiny, simplified version of https://github.com/lancedikson/bowser/blob/master/src/parser-browsers.js\n// reduced to only differentiate Chrome(ium) based browsers / Firefox / Safari\nconst commonVersionIdentifier = /version\\/(\\d+(\\.?_?\\d+)+)/i;\nlet browserDetails;\n/**\n * @internal\n */\nfunction getBrowser(userAgent) {\n let force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n if (typeof userAgent === 'undefined' && typeof navigator === 'undefined') {\n return;\n }\n const ua = (userAgent !== null && userAgent !== void 0 ? userAgent : navigator.userAgent).toLowerCase();\n if (browserDetails === undefined || force) {\n const browser = browsersList.find(_ref => {\n let {\n test\n } = _ref;\n return test.test(ua);\n });\n browserDetails = browser === null || browser === void 0 ? void 0 : browser.describe(ua);\n }\n return browserDetails;\n}\nconst browsersList = [{\n test: /firefox|iceweasel|fxios/i,\n describe(ua) {\n const browser = {\n name: 'Firefox',\n version: getMatch(/(?:firefox|iceweasel|fxios)[\\s/](\\d+(\\.?_?\\d+)+)/i, ua),\n os: ua.toLowerCase().includes('fxios') ? 'iOS' : undefined,\n osVersion: getOSVersion(ua)\n };\n return browser;\n }\n}, {\n test: /chrom|crios|crmo/i,\n describe(ua) {\n const browser = {\n name: 'Chrome',\n version: getMatch(/(?:chrome|chromium|crios|crmo)\\/(\\d+(\\.?_?\\d+)+)/i, ua),\n os: ua.toLowerCase().includes('crios') ? 'iOS' : undefined,\n osVersion: getOSVersion(ua)\n };\n return browser;\n }\n}, /* Safari */\n{\n test: /safari|applewebkit/i,\n describe(ua) {\n const browser = {\n name: 'Safari',\n version: getMatch(commonVersionIdentifier, ua),\n os: ua.includes('mobile/') ? 'iOS' : 'macOS',\n osVersion: getOSVersion(ua)\n };\n return browser;\n }\n}];\nfunction getMatch(exp, ua) {\n let id = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;\n const match = ua.match(exp);\n return match && match.length >= id && match[id] || '';\n}\nfunction getOSVersion(ua) {\n return ua.includes('mac os') ? getMatch(/\\(.+?(\\d+_\\d+(:?_\\d+)?)/, ua, 1).replace(/_/g, '.') : undefined;\n}\n\nvar version$1 = \"2.15.4\";\n\nconst version = version$1;\nconst protocolVersion = 16;\n\n/**\n * Timers that can be overridden with platform specific implementations\n * that ensure that they are fired. These should be used when it is critical\n * that the timer fires on time.\n */\nclass CriticalTimers {}\nCriticalTimers.setTimeout = function () {\n return setTimeout(...arguments);\n};\nCriticalTimers.setInterval =\n// eslint-disable-next-line @typescript-eslint/no-implied-eval\nfunction () {\n return setInterval(...arguments);\n};\nCriticalTimers.clearTimeout = function () {\n return clearTimeout(...arguments);\n};\nCriticalTimers.clearInterval = function () {\n return clearInterval(...arguments);\n};\n\nconst BACKGROUND_REACTION_DELAY = 5000;\n// keep old audio elements when detached, we would re-use them since on iOS\n// Safari tracks which audio elements have been \"blessed\" by the user.\nconst recycledElements = [];\nvar VideoQuality;\n(function (VideoQuality) {\n VideoQuality[VideoQuality[\"LOW\"] = 0] = \"LOW\";\n VideoQuality[VideoQuality[\"MEDIUM\"] = 1] = \"MEDIUM\";\n VideoQuality[VideoQuality[\"HIGH\"] = 2] = \"HIGH\";\n})(VideoQuality || (VideoQuality = {}));\nclass Track extends eventsExports.EventEmitter {\n constructor(mediaTrack, kind) {\n let loggerOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var _a;\n super();\n this.attachedElements = [];\n this.isMuted = false;\n /**\n * indicates current state of stream, it'll indicate `paused` if the track\n * has been paused by congestion controller\n */\n this.streamState = Track.StreamState.Active;\n this.isInBackground = false;\n this._currentBitrate = 0;\n this.log = livekitLogger;\n this.appVisibilityChangedListener = () => {\n if (this.backgroundTimeout) {\n clearTimeout(this.backgroundTimeout);\n }\n // delay app visibility update if it goes to hidden\n // update immediately if it comes back to focus\n if (document.visibilityState === 'hidden') {\n this.backgroundTimeout = setTimeout(() => this.handleAppVisibilityChanged(), BACKGROUND_REACTION_DELAY);\n } else {\n this.handleAppVisibilityChanged();\n }\n };\n this.log = getLogger((_a = loggerOptions.loggerName) !== null && _a !== void 0 ? _a : LoggerNames.Track);\n this.loggerContextCb = loggerOptions.loggerContextCb;\n this.setMaxListeners(100);\n this.kind = kind;\n this._mediaStreamTrack = mediaTrack;\n this._mediaStreamID = mediaTrack.id;\n this.source = Track.Source.Unknown;\n }\n get logContext() {\n var _a;\n return Object.assign(Object.assign({}, (_a = this.loggerContextCb) === null || _a === void 0 ? void 0 : _a.call(this)), getLogContextFromTrack(this));\n }\n /** current receive bits per second */\n get currentBitrate() {\n return this._currentBitrate;\n }\n get mediaStreamTrack() {\n return this._mediaStreamTrack;\n }\n /**\n * @internal\n * used for keep mediaStream's first id, since it's id might change\n * if we disable/enable a track\n */\n get mediaStreamID() {\n return this._mediaStreamID;\n }\n attach(element) {\n let elementType = 'audio';\n if (this.kind === Track.Kind.Video) {\n elementType = 'video';\n }\n if (this.attachedElements.length === 0 && this.kind === Track.Kind.Video) {\n this.addAppVisibilityListener();\n }\n if (!element) {\n if (elementType === 'audio') {\n recycledElements.forEach(e => {\n if (e.parentElement === null && !element) {\n element = e;\n }\n });\n if (element) {\n // remove it from pool\n recycledElements.splice(recycledElements.indexOf(element), 1);\n }\n }\n if (!element) {\n element = document.createElement(elementType);\n }\n }\n if (!this.attachedElements.includes(element)) {\n this.attachedElements.push(element);\n }\n // even if we believe it's already attached to the element, it's possible\n // the element's srcObject was set to something else out of band.\n // we'll want to re-attach it in that case\n attachToElement(this.mediaStreamTrack, element);\n // handle auto playback failures\n const allMediaStreamTracks = element.srcObject.getTracks();\n const hasAudio = allMediaStreamTracks.some(tr => tr.kind === 'audio');\n // manually play media to detect auto playback status\n element.play().then(() => {\n this.emit(hasAudio ? TrackEvent.AudioPlaybackStarted : TrackEvent.VideoPlaybackStarted);\n }).catch(e => {\n if (e.name === 'NotAllowedError') {\n this.emit(hasAudio ? TrackEvent.AudioPlaybackFailed : TrackEvent.VideoPlaybackFailed, e);\n } else if (e.name === 'AbortError') {\n // commonly triggered by another `play` request, only log for debugging purposes\n livekitLogger.debug(\"\".concat(hasAudio ? 'audio' : 'video', \" playback aborted, likely due to new play request\"));\n } else {\n livekitLogger.warn(\"could not playback \".concat(hasAudio ? 'audio' : 'video'), e);\n }\n // If audio playback isn't allowed make sure we still play back the video\n if (hasAudio && element && allMediaStreamTracks.some(tr => tr.kind === 'video') && e.name === 'NotAllowedError') {\n element.muted = true;\n element.play().catch(() => {\n // catch for Safari, exceeded options at this point to automatically play the media element\n });\n }\n });\n this.emit(TrackEvent.ElementAttached, element);\n return element;\n }\n detach(element) {\n try {\n // detach from a single element\n if (element) {\n detachTrack(this.mediaStreamTrack, element);\n const idx = this.attachedElements.indexOf(element);\n if (idx >= 0) {\n this.attachedElements.splice(idx, 1);\n this.recycleElement(element);\n this.emit(TrackEvent.ElementDetached, element);\n }\n return element;\n }\n const detached = [];\n this.attachedElements.forEach(elm => {\n detachTrack(this.mediaStreamTrack, elm);\n detached.push(elm);\n this.recycleElement(elm);\n this.emit(TrackEvent.ElementDetached, elm);\n });\n // remove all tracks\n this.attachedElements = [];\n return detached;\n } finally {\n if (this.attachedElements.length === 0) {\n this.removeAppVisibilityListener();\n }\n }\n }\n stop() {\n this.stopMonitor();\n this._mediaStreamTrack.stop();\n }\n enable() {\n this._mediaStreamTrack.enabled = true;\n }\n disable() {\n this._mediaStreamTrack.enabled = false;\n }\n /* @internal */\n stopMonitor() {\n if (this.monitorInterval) {\n clearInterval(this.monitorInterval);\n }\n if (this.timeSyncHandle) {\n cancelAnimationFrame(this.timeSyncHandle);\n }\n }\n /** @internal */\n updateLoggerOptions(loggerOptions) {\n if (loggerOptions.loggerName) {\n this.log = getLogger(loggerOptions.loggerName);\n }\n if (loggerOptions.loggerContextCb) {\n this.loggerContextCb = loggerOptions.loggerContextCb;\n }\n }\n recycleElement(element) {\n if (element instanceof HTMLAudioElement) {\n // we only need to re-use a single element\n let shouldCache = true;\n element.pause();\n recycledElements.forEach(e => {\n if (!e.parentElement) {\n shouldCache = false;\n }\n });\n if (shouldCache) {\n recycledElements.push(element);\n }\n }\n }\n handleAppVisibilityChanged() {\n return __awaiter(this, void 0, void 0, function* () {\n this.isInBackground = document.visibilityState === 'hidden';\n if (!this.isInBackground && this.kind === Track.Kind.Video) {\n setTimeout(() => this.attachedElements.forEach(el => el.play().catch(() => {\n /** catch clause necessary for Safari */\n })), 0);\n }\n });\n }\n addAppVisibilityListener() {\n if (isWeb()) {\n this.isInBackground = document.visibilityState === 'hidden';\n document.addEventListener('visibilitychange', this.appVisibilityChangedListener);\n } else {\n this.isInBackground = false;\n }\n }\n removeAppVisibilityListener() {\n if (isWeb()) {\n document.removeEventListener('visibilitychange', this.appVisibilityChangedListener);\n }\n }\n}\nfunction attachToElement(track, element) {\n let mediaStream;\n if (element.srcObject instanceof MediaStream) {\n mediaStream = element.srcObject;\n } else {\n mediaStream = new MediaStream();\n }\n // check if track matches existing track\n let existingTracks;\n if (track.kind === 'audio') {\n existingTracks = mediaStream.getAudioTracks();\n } else {\n existingTracks = mediaStream.getVideoTracks();\n }\n if (!existingTracks.includes(track)) {\n existingTracks.forEach(et => {\n mediaStream.removeTrack(et);\n });\n mediaStream.addTrack(track);\n }\n if (!isSafari() || !(element instanceof HTMLVideoElement)) {\n // when in low power mode (applies to both macOS and iOS), Safari will show a play/pause overlay\n // when a video starts that has the `autoplay` attribute is set.\n // we work around this by _not_ setting the autoplay attribute on safari and instead call `setTimeout(() => el.play(),0)` further down\n element.autoplay = true;\n }\n // In case there are no audio tracks present on the mediastream, we set the element as muted to ensure autoplay works\n element.muted = mediaStream.getAudioTracks().length === 0;\n if (element instanceof HTMLVideoElement) {\n element.playsInline = true;\n }\n // avoid flicker\n if (element.srcObject !== mediaStream) {\n element.srcObject = mediaStream;\n if ((isSafari() || isFireFox()) && element instanceof HTMLVideoElement) {\n // Firefox also has a timing issue where video doesn't actually get attached unless\n // performed out-of-band\n // Safari 15 has a bug where in certain layouts, video element renders\n // black until the page is resized or other changes take place.\n // Resetting the src triggers it to render.\n // https://developer.apple.com/forums/thread/690523\n setTimeout(() => {\n element.srcObject = mediaStream;\n // Safari 15 sometimes fails to start a video\n // when the window is backgrounded before the first frame is drawn\n // manually calling play here seems to fix that\n element.play().catch(() => {\n /** do nothing */\n });\n }, 0);\n }\n }\n}\n/** @internal */\nfunction detachTrack(track, element) {\n if (element.srcObject instanceof MediaStream) {\n const mediaStream = element.srcObject;\n mediaStream.removeTrack(track);\n if (mediaStream.getTracks().length > 0) {\n element.srcObject = mediaStream;\n } else {\n element.srcObject = null;\n }\n }\n}\n(function (Track) {\n let Kind;\n (function (Kind) {\n Kind[\"Audio\"] = \"audio\";\n Kind[\"Video\"] = \"video\";\n Kind[\"Unknown\"] = \"unknown\";\n })(Kind = Track.Kind || (Track.Kind = {}));\n let Source;\n (function (Source) {\n Source[\"Camera\"] = \"camera\";\n Source[\"Microphone\"] = \"microphone\";\n Source[\"ScreenShare\"] = \"screen_share\";\n Source[\"ScreenShareAudio\"] = \"screen_share_audio\";\n Source[\"Unknown\"] = \"unknown\";\n })(Source = Track.Source || (Track.Source = {}));\n let StreamState$1;\n (function (StreamState) {\n StreamState[\"Active\"] = \"active\";\n StreamState[\"Paused\"] = \"paused\";\n StreamState[\"Unknown\"] = \"unknown\";\n })(StreamState$1 = Track.StreamState || (Track.StreamState = {}));\n /** @internal */\n function kindToProto(k) {\n switch (k) {\n case Kind.Audio:\n return TrackType.AUDIO;\n case Kind.Video:\n return TrackType.VIDEO;\n default:\n // FIXME this was UNRECOGNIZED before\n return TrackType.DATA;\n }\n }\n Track.kindToProto = kindToProto;\n /** @internal */\n function kindFromProto(t) {\n switch (t) {\n case TrackType.AUDIO:\n return Kind.Audio;\n case TrackType.VIDEO:\n return Kind.Video;\n default:\n return Kind.Unknown;\n }\n }\n Track.kindFromProto = kindFromProto;\n /** @internal */\n function sourceToProto(s) {\n switch (s) {\n case Source.Camera:\n return TrackSource.CAMERA;\n case Source.Microphone:\n return TrackSource.MICROPHONE;\n case Source.ScreenShare:\n return TrackSource.SCREEN_SHARE;\n case Source.ScreenShareAudio:\n return TrackSource.SCREEN_SHARE_AUDIO;\n default:\n return TrackSource.UNKNOWN;\n }\n }\n Track.sourceToProto = sourceToProto;\n /** @internal */\n function sourceFromProto(s) {\n switch (s) {\n case TrackSource.CAMERA:\n return Source.Camera;\n case TrackSource.MICROPHONE:\n return Source.Microphone;\n case TrackSource.SCREEN_SHARE:\n return Source.ScreenShare;\n case TrackSource.SCREEN_SHARE_AUDIO:\n return Source.ScreenShareAudio;\n default:\n return Source.Unknown;\n }\n }\n Track.sourceFromProto = sourceFromProto;\n /** @internal */\n function streamStateFromProto(s) {\n switch (s) {\n case StreamState.ACTIVE:\n return StreamState$1.Active;\n case StreamState.PAUSED:\n return StreamState$1.Paused;\n default:\n return StreamState$1.Unknown;\n }\n }\n Track.streamStateFromProto = streamStateFromProto;\n})(Track || (Track = {}));\n\nclass VideoPreset {\n constructor(widthOrOptions, height, maxBitrate, maxFramerate, priority) {\n if (typeof widthOrOptions === 'object') {\n this.width = widthOrOptions.width;\n this.height = widthOrOptions.height;\n this.aspectRatio = widthOrOptions.aspectRatio;\n this.encoding = {\n maxBitrate: widthOrOptions.maxBitrate,\n maxFramerate: widthOrOptions.maxFramerate,\n priority: widthOrOptions.priority\n };\n } else if (height !== undefined && maxBitrate !== undefined) {\n this.width = widthOrOptions;\n this.height = height;\n this.aspectRatio = widthOrOptions / height;\n this.encoding = {\n maxBitrate,\n maxFramerate,\n priority\n };\n } else {\n throw new TypeError('Unsupported options: provide at least width, height and maxBitrate');\n }\n }\n get resolution() {\n return {\n width: this.width,\n height: this.height,\n frameRate: this.encoding.maxFramerate,\n aspectRatio: this.aspectRatio\n };\n }\n}\nconst backupCodecs = ['vp8', 'h264'];\nconst videoCodecs = ['vp8', 'h264', 'vp9', 'av1', 'h265'];\nfunction isBackupCodec(codec) {\n return !!backupCodecs.find(backup => backup === codec);\n}\nvar BackupCodecPolicy;\n(function (BackupCodecPolicy) {\n // codec regression is preferred, the sfu will try to regress codec if possible but not guaranteed\n BackupCodecPolicy[BackupCodecPolicy[\"PREFER_REGRESSION\"] = 0] = \"PREFER_REGRESSION\";\n // multi-codec simulcast, publish both primary and backup codec at the same time\n BackupCodecPolicy[BackupCodecPolicy[\"SIMULCAST\"] = 1] = \"SIMULCAST\";\n // always use backup codec only\n BackupCodecPolicy[BackupCodecPolicy[\"REGRESSION\"] = 2] = \"REGRESSION\";\n})(BackupCodecPolicy || (BackupCodecPolicy = {}));\nvar AudioPresets;\n(function (AudioPresets) {\n AudioPresets.telephone = {\n maxBitrate: 12000\n };\n AudioPresets.speech = {\n maxBitrate: 24000\n };\n AudioPresets.music = {\n maxBitrate: 48000\n };\n AudioPresets.musicStereo = {\n maxBitrate: 64000\n };\n AudioPresets.musicHighQuality = {\n maxBitrate: 96000\n };\n AudioPresets.musicHighQualityStereo = {\n maxBitrate: 128000\n };\n})(AudioPresets || (AudioPresets = {}));\n/**\n * Sane presets for video resolution/encoding\n */\nconst VideoPresets = {\n h90: new VideoPreset(160, 90, 90000, 20),\n h180: new VideoPreset(320, 180, 160000, 20),\n h216: new VideoPreset(384, 216, 180000, 20),\n h360: new VideoPreset(640, 360, 450000, 20),\n h540: new VideoPreset(960, 540, 800000, 25),\n h720: new VideoPreset(1280, 720, 1700000, 30),\n h1080: new VideoPreset(1920, 1080, 3000000, 30),\n h1440: new VideoPreset(2560, 1440, 5000000, 30),\n h2160: new VideoPreset(3840, 2160, 8000000, 30)\n};\n/**\n * Four by three presets\n */\nconst VideoPresets43 = {\n h120: new VideoPreset(160, 120, 70000, 20),\n h180: new VideoPreset(240, 180, 125000, 20),\n h240: new VideoPreset(320, 240, 140000, 20),\n h360: new VideoPreset(480, 360, 330000, 20),\n h480: new VideoPreset(640, 480, 500000, 20),\n h540: new VideoPreset(720, 540, 600000, 25),\n h720: new VideoPreset(960, 720, 1300000, 30),\n h1080: new VideoPreset(1440, 1080, 2300000, 30),\n h1440: new VideoPreset(1920, 1440, 3800000, 30)\n};\nconst ScreenSharePresets = {\n h360fps3: new VideoPreset(640, 360, 200000, 3, 'medium'),\n h360fps15: new VideoPreset(640, 360, 400000, 15, 'medium'),\n h720fps5: new VideoPreset(1280, 720, 800000, 5, 'medium'),\n h720fps15: new VideoPreset(1280, 720, 1500000, 15, 'medium'),\n h720fps30: new VideoPreset(1280, 720, 2000000, 30, 'medium'),\n h1080fps15: new VideoPreset(1920, 1080, 2500000, 15, 'medium'),\n h1080fps30: new VideoPreset(1920, 1080, 5000000, 30, 'medium'),\n // original resolution, without resizing\n original: new VideoPreset(0, 0, 7000000, 30, 'medium')\n};\n\nconst separator = '|';\nconst ddExtensionURI = 'https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension';\nfunction unpackStreamId(packed) {\n const parts = packed.split(separator);\n if (parts.length > 1) {\n return [parts[0], packed.substr(parts[0].length + 1)];\n }\n return [packed, ''];\n}\nfunction sleep(duration) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise(resolve => CriticalTimers.setTimeout(resolve, duration));\n });\n}\n/** @internal */\nfunction supportsTransceiver() {\n return 'addTransceiver' in RTCPeerConnection.prototype;\n}\n/** @internal */\nfunction supportsAddTrack() {\n return 'addTrack' in RTCPeerConnection.prototype;\n}\nfunction supportsAdaptiveStream() {\n return typeof ResizeObserver !== undefined && typeof IntersectionObserver !== undefined;\n}\nfunction supportsDynacast() {\n return supportsTransceiver();\n}\nfunction supportsAV1() {\n if (!('getCapabilities' in RTCRtpSender)) {\n return false;\n }\n if (isSafari()) {\n // Safari 17 on iPhone14 reports AV1 capability, but does not actually support it\n return false;\n }\n const capabilities = RTCRtpSender.getCapabilities('video');\n let hasAV1 = false;\n if (capabilities) {\n for (const codec of capabilities.codecs) {\n if (codec.mimeType === 'video/AV1') {\n hasAV1 = true;\n break;\n }\n }\n }\n return hasAV1;\n}\nfunction supportsVP9() {\n if (!('getCapabilities' in RTCRtpSender)) {\n return false;\n }\n if (isFireFox()) {\n // technically speaking FireFox supports VP9, but SVC publishing is broken\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1633876\n return false;\n }\n if (isSafari()) {\n const browser = getBrowser();\n if ((browser === null || browser === void 0 ? void 0 : browser.version) && compareVersions(browser.version, '16') < 0) {\n // Safari 16 and below does not support VP9\n return false;\n }\n if ((browser === null || browser === void 0 ? void 0 : browser.os) === 'iOS' && (browser === null || browser === void 0 ? void 0 : browser.osVersion) && compareVersions(browser.osVersion, '16') < 0) {\n // Safari 16 and below on iOS does not support VP9 we need the iOS check to account for other browsers running webkit under the hood\n return false;\n }\n }\n const capabilities = RTCRtpSender.getCapabilities('video');\n let hasVP9 = false;\n if (capabilities) {\n for (const codec of capabilities.codecs) {\n if (codec.mimeType === 'video/VP9') {\n hasVP9 = true;\n break;\n }\n }\n }\n return hasVP9;\n}\nfunction isSVCCodec(codec) {\n return codec === 'av1' || codec === 'vp9';\n}\nfunction supportsSetSinkId(elm) {\n if (!document || isSafariBased()) {\n return false;\n }\n if (!elm) {\n elm = document.createElement('audio');\n }\n return 'setSinkId' in elm;\n}\nfunction isBrowserSupported() {\n if (typeof RTCPeerConnection === 'undefined') {\n return false;\n }\n return supportsTransceiver() || supportsAddTrack();\n}\nfunction isFireFox() {\n var _a;\n return ((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.name) === 'Firefox';\n}\nfunction isSafari() {\n var _a;\n return ((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.name) === 'Safari';\n}\nfunction isSafariBased() {\n const b = getBrowser();\n return (b === null || b === void 0 ? void 0 : b.name) === 'Safari' || (b === null || b === void 0 ? void 0 : b.os) === 'iOS';\n}\nfunction isSafari17Based() {\n const b = getBrowser();\n return (b === null || b === void 0 ? void 0 : b.name) === 'Safari' && b.version.startsWith('17.') || (b === null || b === void 0 ? void 0 : b.os) === 'iOS' && !!(b === null || b === void 0 ? void 0 : b.osVersion) && compareVersions(b.osVersion, '17') >= 0;\n}\nfunction isSafariSvcApi(browser) {\n if (!browser) {\n browser = getBrowser();\n }\n // Safari 18.4 requires legacy svc api and scaleResolutionDown to be set\n return (browser === null || browser === void 0 ? void 0 : browser.name) === 'Safari' && compareVersions(browser.version, '18.3') > 0 || (browser === null || browser === void 0 ? void 0 : browser.os) === 'iOS' && !!(browser === null || browser === void 0 ? void 0 : browser.osVersion) && compareVersions(browser.osVersion, '18.3') > 0;\n}\nfunction isMobile() {\n var _a, _b;\n if (!isWeb()) return false;\n return (\n // @ts-expect-error `userAgentData` is not yet part of typescript\n (_b = (_a = navigator.userAgentData) === null || _a === void 0 ? void 0 : _a.mobile) !== null && _b !== void 0 ? _b : /Tablet|iPad|Mobile|Android|BlackBerry/.test(navigator.userAgent)\n );\n}\nfunction isE2EESimulcastSupported() {\n const browser = getBrowser();\n const supportedSafariVersion = '17.2'; // see https://bugs.webkit.org/show_bug.cgi?id=257803\n if (browser) {\n if (browser.name !== 'Safari' && browser.os !== 'iOS') {\n return true;\n } else if (browser.os === 'iOS' && browser.osVersion && compareVersions(supportedSafariVersion, browser.osVersion) >= 0) {\n return true;\n } else if (browser.name === 'Safari' && compareVersions(supportedSafariVersion, browser.version) >= 0) {\n return true;\n } else {\n return false;\n }\n }\n}\nfunction isWeb() {\n return typeof document !== 'undefined';\n}\nfunction isReactNative() {\n // navigator.product is deprecated on browsers, but will be set appropriately for react-native.\n return navigator.product == 'ReactNative';\n}\nfunction isCloud(serverUrl) {\n return serverUrl.hostname.endsWith('.livekit.cloud') || serverUrl.hostname.endsWith('.livekit.run');\n}\nfunction getLKReactNativeInfo() {\n // global defined only for ReactNative.\n // @ts-ignore\n if (global && global.LiveKitReactNativeGlobal) {\n // @ts-ignore\n return global.LiveKitReactNativeGlobal;\n }\n return undefined;\n}\nfunction getReactNativeOs() {\n if (!isReactNative()) {\n return undefined;\n }\n let info = getLKReactNativeInfo();\n if (info) {\n return info.platform;\n }\n return undefined;\n}\nfunction getDevicePixelRatio() {\n if (isWeb()) {\n return window.devicePixelRatio;\n }\n if (isReactNative()) {\n let info = getLKReactNativeInfo();\n if (info) {\n return info.devicePixelRatio;\n }\n }\n return 1;\n}\nfunction compareVersions(v1, v2) {\n const parts1 = v1.split('.');\n const parts2 = v2.split('.');\n const k = Math.min(parts1.length, parts2.length);\n for (let i = 0; i < k; ++i) {\n const p1 = parseInt(parts1[i], 10);\n const p2 = parseInt(parts2[i], 10);\n if (p1 > p2) return 1;\n if (p1 < p2) return -1;\n if (i === k - 1 && p1 === p2) return 0;\n }\n if (v1 === '' && v2 !== '') {\n return -1;\n } else if (v2 === '') {\n return 1;\n }\n return parts1.length == parts2.length ? 0 : parts1.length < parts2.length ? -1 : 1;\n}\nfunction roDispatchCallback(entries) {\n for (const entry of entries) {\n entry.target.handleResize(entry);\n }\n}\nfunction ioDispatchCallback(entries) {\n for (const entry of entries) {\n entry.target.handleVisibilityChanged(entry);\n }\n}\nlet resizeObserver = null;\nconst getResizeObserver = () => {\n if (!resizeObserver) resizeObserver = new ResizeObserver(roDispatchCallback);\n return resizeObserver;\n};\nlet intersectionObserver = null;\nconst getIntersectionObserver = () => {\n if (!intersectionObserver) {\n intersectionObserver = new IntersectionObserver(ioDispatchCallback, {\n root: null,\n rootMargin: '0px'\n });\n }\n return intersectionObserver;\n};\nfunction getClientInfo() {\n var _a;\n const info = new ClientInfo({\n sdk: ClientInfo_SDK.JS,\n protocol: protocolVersion,\n version\n });\n if (isReactNative()) {\n info.os = (_a = getReactNativeOs()) !== null && _a !== void 0 ? _a : '';\n }\n return info;\n}\nlet emptyVideoStreamTrack;\nfunction getEmptyVideoStreamTrack() {\n if (!emptyVideoStreamTrack) {\n emptyVideoStreamTrack = createDummyVideoStreamTrack();\n }\n return emptyVideoStreamTrack.clone();\n}\nfunction createDummyVideoStreamTrack() {\n let width = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 16;\n let height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 16;\n let enabled = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n let paintContent = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n const canvas = document.createElement('canvas');\n // the canvas size is set to 16 by default, because electron apps seem to fail with smaller values\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n ctx === null || ctx === void 0 ? void 0 : ctx.fillRect(0, 0, canvas.width, canvas.height);\n if (paintContent && ctx) {\n ctx.beginPath();\n ctx.arc(width / 2, height / 2, 50, 0, Math.PI * 2, true);\n ctx.closePath();\n ctx.fillStyle = 'grey';\n ctx.fill();\n }\n // @ts-ignore\n const dummyStream = canvas.captureStream();\n const [dummyTrack] = dummyStream.getTracks();\n if (!dummyTrack) {\n throw Error('Could not get empty media stream video track');\n }\n dummyTrack.enabled = enabled;\n return dummyTrack;\n}\nlet emptyAudioStreamTrack;\nfunction getEmptyAudioStreamTrack() {\n if (!emptyAudioStreamTrack) {\n // implementation adapted from https://blog.mozilla.org/webrtc/warm-up-with-replacetrack/\n const ctx = new AudioContext();\n const oscillator = ctx.createOscillator();\n const gain = ctx.createGain();\n gain.gain.setValueAtTime(0, 0);\n const dst = ctx.createMediaStreamDestination();\n oscillator.connect(gain);\n gain.connect(dst);\n oscillator.start();\n [emptyAudioStreamTrack] = dst.stream.getAudioTracks();\n if (!emptyAudioStreamTrack) {\n throw Error('Could not get empty media stream audio track');\n }\n emptyAudioStreamTrack.enabled = false;\n }\n return emptyAudioStreamTrack.clone();\n}\nclass Future {\n get isResolved() {\n return this._isResolved;\n }\n constructor(futureBase, onFinally) {\n this._isResolved = false;\n this.onFinally = onFinally;\n this.promise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n this.resolve = resolve;\n this.reject = reject;\n if (futureBase) {\n yield futureBase(resolve, reject);\n }\n })).finally(() => {\n var _a;\n this._isResolved = true;\n (_a = this.onFinally) === null || _a === void 0 ? void 0 : _a.call(this);\n });\n }\n}\n/**\n * Creates and returns an analyser web audio node that is attached to the provided track.\n * Additionally returns a convenience method `calculateVolume` to perform instant volume readings on that track.\n * Call the returned `cleanup` function to close the audioContext that has been created for the instance of this helper\n */\nfunction createAudioAnalyser(track, options) {\n const opts = Object.assign({\n cloneTrack: false,\n fftSize: 2048,\n smoothingTimeConstant: 0.8,\n minDecibels: -100,\n maxDecibels: -80\n }, options);\n const audioContext = getNewAudioContext();\n if (!audioContext) {\n throw new Error('Audio Context not supported on this browser');\n }\n const streamTrack = opts.cloneTrack ? track.mediaStreamTrack.clone() : track.mediaStreamTrack;\n const mediaStreamSource = audioContext.createMediaStreamSource(new MediaStream([streamTrack]));\n const analyser = audioContext.createAnalyser();\n analyser.minDecibels = opts.minDecibels;\n analyser.maxDecibels = opts.maxDecibels;\n analyser.fftSize = opts.fftSize;\n analyser.smoothingTimeConstant = opts.smoothingTimeConstant;\n mediaStreamSource.connect(analyser);\n const dataArray = new Uint8Array(analyser.frequencyBinCount);\n /**\n * Calculates the current volume of the track in the range from 0 to 1\n */\n const calculateVolume = () => {\n analyser.getByteFrequencyData(dataArray);\n let sum = 0;\n for (const amplitude of dataArray) {\n sum += Math.pow(amplitude / 255, 2);\n }\n const volume = Math.sqrt(sum / dataArray.length);\n return volume;\n };\n const cleanup = () => __awaiter(this, void 0, void 0, function* () {\n yield audioContext.close();\n if (opts.cloneTrack) {\n streamTrack.stop();\n }\n });\n return {\n calculateVolume,\n analyser,\n cleanup\n };\n}\nfunction isVideoCodec(maybeCodec) {\n return videoCodecs.includes(maybeCodec);\n}\nfunction unwrapConstraint(constraint) {\n if (typeof constraint === 'string' || typeof constraint === 'number') {\n return constraint;\n }\n if (Array.isArray(constraint)) {\n return constraint[0];\n }\n if (constraint.exact) {\n if (Array.isArray(constraint.exact)) {\n return constraint.exact[0];\n }\n return constraint.exact;\n }\n if (constraint.ideal) {\n if (Array.isArray(constraint.ideal)) {\n return constraint.ideal[0];\n }\n return constraint.ideal;\n }\n throw Error('could not unwrap constraint');\n}\nfunction toWebsocketUrl(url) {\n if (url.startsWith('http')) {\n return url.replace(/^(http)/, 'ws');\n }\n return url;\n}\nfunction toHttpUrl(url) {\n if (url.startsWith('ws')) {\n return url.replace(/^(ws)/, 'http');\n }\n return url;\n}\nfunction extractTranscriptionSegments(transcription, firstReceivedTimesMap) {\n return transcription.segments.map(_ref => {\n let {\n id,\n text,\n language,\n startTime,\n endTime,\n final\n } = _ref;\n var _a;\n const firstReceivedTime = (_a = firstReceivedTimesMap.get(id)) !== null && _a !== void 0 ? _a : Date.now();\n const lastReceivedTime = Date.now();\n if (final) {\n firstReceivedTimesMap.delete(id);\n } else {\n firstReceivedTimesMap.set(id, firstReceivedTime);\n }\n return {\n id,\n text,\n startTime: Number.parseInt(startTime.toString()),\n endTime: Number.parseInt(endTime.toString()),\n final,\n language,\n firstReceivedTime,\n lastReceivedTime\n };\n });\n}\nfunction extractChatMessage(msg) {\n const {\n id,\n timestamp,\n message,\n editTimestamp\n } = msg;\n return {\n id,\n timestamp: Number.parseInt(timestamp.toString()),\n editTimestamp: editTimestamp ? Number.parseInt(editTimestamp.toString()) : undefined,\n message\n };\n}\nfunction getDisconnectReasonFromConnectionError(e) {\n switch (e.reason) {\n case ConnectionErrorReason.LeaveRequest:\n return e.context;\n case ConnectionErrorReason.Cancelled:\n return DisconnectReason.CLIENT_INITIATED;\n case ConnectionErrorReason.NotAllowed:\n return DisconnectReason.USER_REJECTED;\n case ConnectionErrorReason.ServerUnreachable:\n return DisconnectReason.JOIN_FAILURE;\n default:\n return DisconnectReason.UNKNOWN_REASON;\n }\n}\n/** convert bigints to numbers preserving undefined values */\nfunction bigIntToNumber(value) {\n return value !== undefined ? Number(value) : undefined;\n}\n/** convert numbers to bigints preserving undefined values */\nfunction numberToBigInt(value) {\n return value !== undefined ? BigInt(value) : undefined;\n}\nfunction isLocalTrack(track) {\n return !!track && !(track instanceof MediaStreamTrack) && track.isLocal;\n}\nfunction isAudioTrack(track) {\n return !!track && track.kind == Track.Kind.Audio;\n}\nfunction isVideoTrack(track) {\n return !!track && track.kind == Track.Kind.Video;\n}\nfunction isLocalVideoTrack(track) {\n return isLocalTrack(track) && isVideoTrack(track);\n}\nfunction isLocalAudioTrack(track) {\n return isLocalTrack(track) && isAudioTrack(track);\n}\nfunction isRemoteTrack(track) {\n return !!track && !track.isLocal;\n}\nfunction isRemotePub(pub) {\n return !!pub && !pub.isLocal;\n}\nfunction isRemoteVideoTrack(track) {\n return isRemoteTrack(track) && isVideoTrack(track);\n}\nfunction isLocalParticipant(p) {\n return p.isLocal;\n}\nfunction isRemoteParticipant(p) {\n return !p.isLocal;\n}\nfunction splitUtf8(s, n) {\n // adapted from https://stackoverflow.com/a/6043797\n const result = [];\n let encoded = new TextEncoder().encode(s);\n while (encoded.length > n) {\n let k = n;\n while (k > 0) {\n const byte = encoded[k];\n if (byte !== undefined && (byte & 0xc0) !== 0x80) {\n break;\n }\n k--;\n }\n result.push(encoded.slice(0, k));\n encoded = encoded.slice(k);\n }\n if (encoded.length > 0) {\n result.push(encoded);\n }\n return result;\n}\n\nfunction mergeDefaultOptions(options, audioDefaults, videoDefaults) {\n var _a, _b;\n var _c, _d;\n const {\n optionsWithoutProcessor,\n audioProcessor,\n videoProcessor\n } = extractProcessorsFromOptions(options !== null && options !== void 0 ? options : {});\n const defaultAudioProcessor = audioDefaults === null || audioDefaults === void 0 ? void 0 : audioDefaults.processor;\n const defaultVideoProcessor = videoDefaults === null || videoDefaults === void 0 ? void 0 : videoDefaults.processor;\n const clonedOptions = optionsWithoutProcessor !== null && optionsWithoutProcessor !== void 0 ? optionsWithoutProcessor : {};\n if (clonedOptions.audio === true) clonedOptions.audio = {};\n if (clonedOptions.video === true) clonedOptions.video = {};\n // use defaults\n if (clonedOptions.audio) {\n mergeObjectWithoutOverwriting(clonedOptions.audio, audioDefaults);\n (_a = (_c = clonedOptions.audio).deviceId) !== null && _a !== void 0 ? _a : _c.deviceId = {\n ideal: 'default'\n };\n if (audioProcessor || defaultAudioProcessor) {\n clonedOptions.audio.processor = audioProcessor !== null && audioProcessor !== void 0 ? audioProcessor : defaultAudioProcessor;\n }\n }\n if (clonedOptions.video) {\n mergeObjectWithoutOverwriting(clonedOptions.video, videoDefaults);\n (_b = (_d = clonedOptions.video).deviceId) !== null && _b !== void 0 ? _b : _d.deviceId = {\n ideal: 'default'\n };\n if (videoProcessor || defaultVideoProcessor) {\n clonedOptions.video.processor = videoProcessor !== null && videoProcessor !== void 0 ? videoProcessor : defaultVideoProcessor;\n }\n }\n return clonedOptions;\n}\nfunction mergeObjectWithoutOverwriting(mainObject, objectToMerge) {\n Object.keys(objectToMerge).forEach(key => {\n if (mainObject[key] === undefined) mainObject[key] = objectToMerge[key];\n });\n return mainObject;\n}\nfunction constraintsForOptions(options) {\n var _a, _b;\n var _c, _d;\n const constraints = {};\n if (options.video) {\n // default video options\n if (typeof options.video === 'object') {\n const videoOptions = {};\n const target = videoOptions;\n const source = options.video;\n Object.keys(source).forEach(key => {\n switch (key) {\n case 'resolution':\n // flatten VideoResolution fields\n mergeObjectWithoutOverwriting(target, source.resolution);\n break;\n default:\n target[key] = source[key];\n }\n });\n constraints.video = videoOptions;\n (_a = (_c = constraints.video).deviceId) !== null && _a !== void 0 ? _a : _c.deviceId = {\n ideal: 'default'\n };\n } else {\n constraints.video = options.video ? {\n deviceId: {\n ideal: 'default'\n }\n } : false;\n }\n } else {\n constraints.video = false;\n }\n if (options.audio) {\n if (typeof options.audio === 'object') {\n constraints.audio = options.audio;\n (_b = (_d = constraints.audio).deviceId) !== null && _b !== void 0 ? _b : _d.deviceId = {\n ideal: 'default'\n };\n } else {\n constraints.audio = {\n deviceId: {\n ideal: 'default'\n }\n };\n }\n } else {\n constraints.audio = false;\n }\n return constraints;\n}\n/**\n * This function detects silence on a given [[Track]] instance.\n * Returns true if the track seems to be entirely silent.\n */\nfunction detectSilence(track_1) {\n return __awaiter(this, arguments, void 0, function (track) {\n let timeOffset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 200;\n return function* () {\n const ctx = getNewAudioContext();\n if (ctx) {\n const analyser = ctx.createAnalyser();\n analyser.fftSize = 2048;\n const bufferLength = analyser.frequencyBinCount;\n const dataArray = new Uint8Array(bufferLength);\n const source = ctx.createMediaStreamSource(new MediaStream([track.mediaStreamTrack]));\n source.connect(analyser);\n yield sleep(timeOffset);\n analyser.getByteTimeDomainData(dataArray);\n const someNoise = dataArray.some(sample => sample !== 128 && sample !== 0);\n ctx.close();\n return !someNoise;\n }\n return false;\n }();\n });\n}\n/**\n * @internal\n */\nfunction getNewAudioContext() {\n var _a;\n const AudioContext =\n // @ts-ignore\n typeof window !== 'undefined' && (window.AudioContext || window.webkitAudioContext);\n if (AudioContext) {\n const audioContext = new AudioContext({\n latencyHint: 'interactive'\n });\n // If the audio context is suspended, we need to resume it when the user clicks on the page\n if (audioContext.state === 'suspended' && typeof window !== 'undefined' && ((_a = window.document) === null || _a === void 0 ? void 0 : _a.body)) {\n const handleResume = () => __awaiter(this, void 0, void 0, function* () {\n var _a;\n try {\n if (audioContext.state === 'suspended') {\n yield audioContext.resume();\n }\n } catch (e) {\n console.warn('Error trying to auto-resume audio context', e);\n }\n (_a = window.document.body) === null || _a === void 0 ? void 0 : _a.removeEventListener('click', handleResume);\n });\n window.document.body.addEventListener('click', handleResume);\n }\n return audioContext;\n }\n}\n/**\n * @internal\n */\nfunction kindToSource(kind) {\n if (kind === 'audioinput') {\n return Track.Source.Microphone;\n } else if (kind === 'videoinput') {\n return Track.Source.Camera;\n } else {\n return Track.Source.Unknown;\n }\n}\n/**\n * @internal\n */\nfunction sourceToKind(source) {\n if (source === Track.Source.Microphone) {\n return 'audioinput';\n } else if (source === Track.Source.Camera) {\n return 'videoinput';\n } else {\n return undefined;\n }\n}\n/**\n * @internal\n */\nfunction screenCaptureToDisplayMediaStreamOptions(options) {\n var _a, _b;\n let videoConstraints = (_a = options.video) !== null && _a !== void 0 ? _a : true;\n // treat 0 as uncapped\n if (options.resolution && options.resolution.width > 0 && options.resolution.height > 0) {\n videoConstraints = typeof videoConstraints === 'boolean' ? {} : videoConstraints;\n if (isSafari()) {\n videoConstraints = Object.assign(Object.assign({}, videoConstraints), {\n width: {\n max: options.resolution.width\n },\n height: {\n max: options.resolution.height\n },\n frameRate: options.resolution.frameRate\n });\n } else {\n videoConstraints = Object.assign(Object.assign({}, videoConstraints), {\n width: {\n ideal: options.resolution.width\n },\n height: {\n ideal: options.resolution.height\n },\n frameRate: options.resolution.frameRate\n });\n }\n }\n return {\n audio: (_b = options.audio) !== null && _b !== void 0 ? _b : false,\n video: videoConstraints,\n // @ts-expect-error support for experimental display media features\n controller: options.controller,\n selfBrowserSurface: options.selfBrowserSurface,\n surfaceSwitching: options.surfaceSwitching,\n systemAudio: options.systemAudio,\n preferCurrentTab: options.preferCurrentTab\n };\n}\nfunction mimeTypeToVideoCodecString(mimeType) {\n return mimeType.split('/')[1].toLowerCase();\n}\nfunction getTrackPublicationInfo(tracks) {\n const infos = [];\n tracks.forEach(track => {\n if (track.track !== undefined) {\n infos.push(new TrackPublishedResponse({\n cid: track.track.mediaStreamID,\n track: track.trackInfo\n }));\n }\n });\n return infos;\n}\nfunction getLogContextFromTrack(track) {\n if ('mediaStreamTrack' in track) {\n return {\n trackID: track.sid,\n source: track.source,\n muted: track.isMuted,\n enabled: track.mediaStreamTrack.enabled,\n kind: track.kind,\n streamID: track.mediaStreamID,\n streamTrackID: track.mediaStreamTrack.id\n };\n } else {\n return {\n trackID: track.trackSid,\n enabled: track.isEnabled,\n muted: track.isMuted,\n trackInfo: Object.assign({\n mimeType: track.mimeType,\n name: track.trackName,\n encrypted: track.isEncrypted,\n kind: track.kind,\n source: track.source\n }, track.track ? getLogContextFromTrack(track.track) : {})\n };\n }\n}\nfunction supportsSynchronizationSources() {\n return typeof RTCRtpReceiver !== 'undefined' && 'getSynchronizationSources' in RTCRtpReceiver;\n}\nfunction diffAttributes(oldValues, newValues) {\n var _a;\n if (oldValues === undefined) {\n oldValues = {};\n }\n if (newValues === undefined) {\n newValues = {};\n }\n const allKeys = [...Object.keys(newValues), ...Object.keys(oldValues)];\n const diff = {};\n for (const key of allKeys) {\n if (oldValues[key] !== newValues[key]) {\n diff[key] = (_a = newValues[key]) !== null && _a !== void 0 ? _a : '';\n }\n }\n return diff;\n}\n/** @internal */\nfunction extractProcessorsFromOptions(options) {\n const newOptions = Object.assign({}, options);\n let audioProcessor;\n let videoProcessor;\n if (typeof newOptions.audio === 'object' && newOptions.audio.processor) {\n audioProcessor = newOptions.audio.processor;\n newOptions.audio = Object.assign(Object.assign({}, newOptions.audio), {\n processor: undefined\n });\n }\n if (typeof newOptions.video === 'object' && newOptions.video.processor) {\n videoProcessor = newOptions.video.processor;\n newOptions.video = Object.assign(Object.assign({}, newOptions.video), {\n processor: undefined\n });\n }\n return {\n audioProcessor,\n videoProcessor,\n optionsWithoutProcessor: cloneDeep(newOptions)\n };\n}\nfunction getTrackSourceFromProto(source) {\n switch (source) {\n case TrackSource.CAMERA:\n return Track.Source.Camera;\n case TrackSource.MICROPHONE:\n return Track.Source.Microphone;\n case TrackSource.SCREEN_SHARE:\n return Track.Source.ScreenShare;\n case TrackSource.SCREEN_SHARE_AUDIO:\n return Track.Source.ScreenShareAudio;\n default:\n return Track.Source.Unknown;\n }\n}\nfunction areDimensionsSmaller(a, b) {\n return a.width * a.height < b.width * b.height;\n}\nfunction layerDimensionsFor(trackInfo, quality) {\n var _a;\n return (_a = trackInfo.layers) === null || _a === void 0 ? void 0 : _a.find(l => l.quality === quality);\n}\n\n/**\n * @experimental\n */\nclass E2EEManager extends eventsExports.EventEmitter {\n constructor(options) {\n super();\n this.onWorkerMessage = ev => {\n var _a, _b;\n const {\n kind,\n data\n } = ev.data;\n switch (kind) {\n case 'error':\n livekitLogger.error(data.error.message);\n this.emit(EncryptionEvent.EncryptionError, data.error);\n break;\n case 'initAck':\n if (data.enabled) {\n this.keyProvider.getKeys().forEach(keyInfo => {\n this.postKey(keyInfo);\n });\n }\n break;\n case 'enable':\n if (data.enabled) {\n this.keyProvider.getKeys().forEach(keyInfo => {\n this.postKey(keyInfo);\n });\n }\n if (this.encryptionEnabled !== data.enabled && data.participantIdentity === ((_a = this.room) === null || _a === void 0 ? void 0 : _a.localParticipant.identity)) {\n this.emit(EncryptionEvent.ParticipantEncryptionStatusChanged, data.enabled, this.room.localParticipant);\n this.encryptionEnabled = data.enabled;\n } else if (data.participantIdentity) {\n const participant = (_b = this.room) === null || _b === void 0 ? void 0 : _b.getParticipantByIdentity(data.participantIdentity);\n if (!participant) {\n throw TypeError(\"couldn't set encryption status, participant not found\".concat(data.participantIdentity));\n }\n this.emit(EncryptionEvent.ParticipantEncryptionStatusChanged, data.enabled, participant);\n }\n break;\n case 'ratchetKey':\n this.keyProvider.emit(KeyProviderEvent.KeyRatcheted, data.ratchetResult, data.participantIdentity, data.keyIndex);\n break;\n }\n };\n this.onWorkerError = ev => {\n livekitLogger.error('e2ee worker encountered an error:', {\n error: ev.error\n });\n this.emit(EncryptionEvent.EncryptionError, ev.error);\n };\n this.keyProvider = options.keyProvider;\n this.worker = options.worker;\n this.encryptionEnabled = false;\n }\n /**\n * @internal\n */\n setup(room) {\n if (!isE2EESupported()) {\n throw new DeviceUnsupportedError('tried to setup end-to-end encryption on an unsupported browser');\n }\n livekitLogger.info('setting up e2ee');\n if (room !== this.room) {\n this.room = room;\n this.setupEventListeners(room, this.keyProvider);\n // this.worker = new Worker('');\n const msg = {\n kind: 'init',\n data: {\n keyProviderOptions: this.keyProvider.getOptions(),\n loglevel: workerLogger.getLevel()\n }\n };\n if (this.worker) {\n livekitLogger.info(\"initializing worker\", {\n worker: this.worker\n });\n this.worker.onmessage = this.onWorkerMessage;\n this.worker.onerror = this.onWorkerError;\n this.worker.postMessage(msg);\n }\n }\n }\n /**\n * @internal\n */\n setParticipantCryptorEnabled(enabled, participantIdentity) {\n livekitLogger.debug(\"set e2ee to \".concat(enabled, \" for participant \").concat(participantIdentity));\n this.postEnable(enabled, participantIdentity);\n }\n /**\n * @internal\n */\n setSifTrailer(trailer) {\n if (!trailer || trailer.length === 0) {\n livekitLogger.warn(\"ignoring server sent trailer as it's empty\");\n } else {\n this.postSifTrailer(trailer);\n }\n }\n setupEngine(engine) {\n engine.on(EngineEvent.RTPVideoMapUpdate, rtpMap => {\n this.postRTPMap(rtpMap);\n });\n }\n setupEventListeners(room, keyProvider) {\n room.on(RoomEvent.TrackPublished, (pub, participant) => this.setParticipantCryptorEnabled(pub.trackInfo.encryption !== Encryption_Type.NONE, participant.identity));\n room.on(RoomEvent.ConnectionStateChanged, state => {\n if (state === ConnectionState.Connected) {\n room.remoteParticipants.forEach(participant => {\n participant.trackPublications.forEach(pub => {\n this.setParticipantCryptorEnabled(pub.trackInfo.encryption !== Encryption_Type.NONE, participant.identity);\n });\n });\n }\n }).on(RoomEvent.TrackUnsubscribed, (track, _, participant) => {\n var _a;\n const msg = {\n kind: 'removeTransform',\n data: {\n participantIdentity: participant.identity,\n trackId: track.mediaStreamID\n }\n };\n (_a = this.worker) === null || _a === void 0 ? void 0 : _a.postMessage(msg);\n }).on(RoomEvent.TrackSubscribed, (track, pub, participant) => {\n this.setupE2EEReceiver(track, participant.identity, pub.trackInfo);\n }).on(RoomEvent.SignalConnected, () => {\n if (!this.room) {\n throw new TypeError(\"expected room to be present on signal connect\");\n }\n keyProvider.getKeys().forEach(keyInfo => {\n this.postKey(keyInfo);\n });\n this.setParticipantCryptorEnabled(this.room.localParticipant.isE2EEEnabled, this.room.localParticipant.identity);\n });\n room.localParticipant.on(ParticipantEvent.LocalSenderCreated, (sender, track) => __awaiter(this, void 0, void 0, function* () {\n this.setupE2EESender(track, sender);\n }));\n keyProvider.on(KeyProviderEvent.SetKey, keyInfo => this.postKey(keyInfo)).on(KeyProviderEvent.RatchetRequest, (participantId, keyIndex) => this.postRatchetRequest(participantId, keyIndex));\n }\n postRatchetRequest(participantIdentity, keyIndex) {\n if (!this.worker) {\n throw Error('could not ratchet key, worker is missing');\n }\n const msg = {\n kind: 'ratchetRequest',\n data: {\n participantIdentity: participantIdentity,\n keyIndex\n }\n };\n this.worker.postMessage(msg);\n }\n postKey(_ref) {\n let {\n key,\n participantIdentity,\n keyIndex\n } = _ref;\n var _a;\n if (!this.worker) {\n throw Error('could not set key, worker is missing');\n }\n const msg = {\n kind: 'setKey',\n data: {\n participantIdentity: participantIdentity,\n isPublisher: participantIdentity === ((_a = this.room) === null || _a === void 0 ? void 0 : _a.localParticipant.identity),\n key,\n keyIndex\n }\n };\n this.worker.postMessage(msg);\n }\n postEnable(enabled, participantIdentity) {\n if (this.worker) {\n const enableMsg = {\n kind: 'enable',\n data: {\n enabled,\n participantIdentity\n }\n };\n this.worker.postMessage(enableMsg);\n } else {\n throw new ReferenceError('failed to enable e2ee, worker is not ready');\n }\n }\n postRTPMap(map) {\n var _a;\n if (!this.worker) {\n throw TypeError('could not post rtp map, worker is missing');\n }\n if (!((_a = this.room) === null || _a === void 0 ? void 0 : _a.localParticipant.identity)) {\n throw TypeError('could not post rtp map, local participant identity is missing');\n }\n const msg = {\n kind: 'setRTPMap',\n data: {\n map,\n participantIdentity: this.room.localParticipant.identity\n }\n };\n this.worker.postMessage(msg);\n }\n postSifTrailer(trailer) {\n if (!this.worker) {\n throw Error('could not post SIF trailer, worker is missing');\n }\n const msg = {\n kind: 'setSifTrailer',\n data: {\n trailer\n }\n };\n this.worker.postMessage(msg);\n }\n setupE2EEReceiver(track, remoteId, trackInfo) {\n if (!track.receiver) {\n return;\n }\n if (!(trackInfo === null || trackInfo === void 0 ? void 0 : trackInfo.mimeType) || trackInfo.mimeType === '') {\n throw new TypeError('MimeType missing from trackInfo, cannot set up E2EE cryptor');\n }\n this.handleReceiver(track.receiver, track.mediaStreamID, remoteId, track.kind === 'video' ? mimeTypeToVideoCodecString(trackInfo.mimeType) : undefined);\n }\n setupE2EESender(track, sender) {\n if (!isLocalTrack(track) || !sender) {\n if (!sender) livekitLogger.warn('early return because sender is not ready');\n return;\n }\n this.handleSender(sender, track.mediaStreamID, undefined);\n }\n /**\n * Handles the given {@code RTCRtpReceiver} by creating a {@code TransformStream} which will inject\n * a frame decoder.\n *\n */\n handleReceiver(receiver, trackId, participantIdentity, codec) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.worker) {\n return;\n }\n if (isScriptTransformSupported()) {\n const options = {\n kind: 'decode',\n participantIdentity,\n trackId,\n codec\n };\n // @ts-ignore\n receiver.transform = new RTCRtpScriptTransform(this.worker, options);\n } else {\n if (E2EE_FLAG in receiver && codec) {\n // only update codec\n const msg = {\n kind: 'updateCodec',\n data: {\n trackId,\n codec,\n participantIdentity: participantIdentity\n }\n };\n this.worker.postMessage(msg);\n return;\n }\n // @ts-ignore\n let writable = receiver.writableStream;\n // @ts-ignore\n let readable = receiver.readableStream;\n if (!writable || !readable) {\n // @ts-ignore\n const receiverStreams = receiver.createEncodedStreams();\n // @ts-ignore\n receiver.writableStream = receiverStreams.writable;\n writable = receiverStreams.writable;\n // @ts-ignore\n receiver.readableStream = receiverStreams.readable;\n readable = receiverStreams.readable;\n }\n const msg = {\n kind: 'decode',\n data: {\n readableStream: readable,\n writableStream: writable,\n trackId: trackId,\n codec,\n participantIdentity: participantIdentity,\n isReuse: E2EE_FLAG in receiver\n }\n };\n this.worker.postMessage(msg, [readable, writable]);\n }\n // @ts-ignore\n receiver[E2EE_FLAG] = true;\n });\n }\n /**\n * Handles the given {@code RTCRtpSender} by creating a {@code TransformStream} which will inject\n * a frame encoder.\n *\n */\n handleSender(sender, trackId, codec) {\n var _a;\n if (E2EE_FLAG in sender || !this.worker) {\n return;\n }\n if (!((_a = this.room) === null || _a === void 0 ? void 0 : _a.localParticipant.identity) || this.room.localParticipant.identity === '') {\n throw TypeError('local identity needs to be known in order to set up encrypted sender');\n }\n if (isScriptTransformSupported()) {\n livekitLogger.info('initialize script transform');\n const options = {\n kind: 'encode',\n participantIdentity: this.room.localParticipant.identity,\n trackId,\n codec\n };\n // @ts-ignore\n sender.transform = new RTCRtpScriptTransform(this.worker, options);\n } else {\n livekitLogger.info('initialize encoded streams');\n // @ts-ignore\n const senderStreams = sender.createEncodedStreams();\n const msg = {\n kind: 'encode',\n data: {\n readableStream: senderStreams.readable,\n writableStream: senderStreams.writable,\n codec,\n trackId,\n participantIdentity: this.room.localParticipant.identity,\n isReuse: false\n }\n };\n this.worker.postMessage(msg, [senderStreams.readable, senderStreams.writable]);\n }\n // @ts-ignore\n sender[E2EE_FLAG] = true;\n }\n}\n\nconst defaultId = 'default';\nclass DeviceManager {\n constructor() {\n this._previousDevices = [];\n }\n static getInstance() {\n if (this.instance === undefined) {\n this.instance = new DeviceManager();\n }\n return this.instance;\n }\n get previousDevices() {\n return this._previousDevices;\n }\n getDevices(kind_1) {\n return __awaiter(this, arguments, void 0, function (kind) {\n var _this = this;\n let requestPermissions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return function* () {\n var _a;\n if (((_a = DeviceManager.userMediaPromiseMap) === null || _a === void 0 ? void 0 : _a.size) > 0) {\n livekitLogger.debug('awaiting getUserMedia promise');\n try {\n if (kind) {\n yield DeviceManager.userMediaPromiseMap.get(kind);\n } else {\n yield Promise.all(DeviceManager.userMediaPromiseMap.values());\n }\n } catch (e) {\n livekitLogger.warn('error waiting for media permissons');\n }\n }\n let devices = yield navigator.mediaDevices.enumerateDevices();\n if (requestPermissions &&\n // for safari we need to skip this check, as otherwise it will re-acquire user media and fail on iOS https://bugs.webkit.org/show_bug.cgi?id=179363\n !(isSafari() && _this.hasDeviceInUse(kind))) {\n const isDummyDeviceOrEmpty = devices.filter(d => d.kind === kind).length === 0 || devices.some(device => {\n const noLabel = device.label === '';\n const isRelevant = kind ? device.kind === kind : true;\n return noLabel && isRelevant;\n });\n if (isDummyDeviceOrEmpty) {\n const permissionsToAcquire = {\n video: kind !== 'audioinput' && kind !== 'audiooutput',\n audio: kind !== 'videoinput' && {\n deviceId: {\n ideal: 'default'\n }\n }\n };\n const stream = yield navigator.mediaDevices.getUserMedia(permissionsToAcquire);\n devices = yield navigator.mediaDevices.enumerateDevices();\n stream.getTracks().forEach(track => {\n track.stop();\n });\n }\n }\n _this._previousDevices = devices;\n if (kind) {\n devices = devices.filter(device => device.kind === kind);\n }\n return devices;\n }();\n });\n }\n normalizeDeviceId(kind, deviceId, groupId) {\n return __awaiter(this, void 0, void 0, function* () {\n if (deviceId !== defaultId) {\n return deviceId;\n }\n // resolve actual device id if it's 'default': Chrome returns it when no\n // device has been chosen\n const devices = yield this.getDevices(kind);\n const defaultDevice = devices.find(d => d.deviceId === defaultId);\n if (!defaultDevice) {\n livekitLogger.warn('could not reliably determine default device');\n return undefined;\n }\n const device = devices.find(d => d.deviceId !== defaultId && d.groupId === (groupId !== null && groupId !== void 0 ? groupId : defaultDevice.groupId));\n if (!device) {\n livekitLogger.warn('could not reliably determine default device');\n return undefined;\n }\n return device === null || device === void 0 ? void 0 : device.deviceId;\n });\n }\n hasDeviceInUse(kind) {\n return kind ? DeviceManager.userMediaPromiseMap.has(kind) : DeviceManager.userMediaPromiseMap.size > 0;\n }\n}\nDeviceManager.mediaDeviceKinds = ['audioinput', 'audiooutput', 'videoinput'];\nDeviceManager.userMediaPromiseMap = new Map();\n\nvar QueueTaskStatus;\n(function (QueueTaskStatus) {\n QueueTaskStatus[QueueTaskStatus[\"WAITING\"] = 0] = \"WAITING\";\n QueueTaskStatus[QueueTaskStatus[\"RUNNING\"] = 1] = \"RUNNING\";\n QueueTaskStatus[QueueTaskStatus[\"COMPLETED\"] = 2] = \"COMPLETED\";\n})(QueueTaskStatus || (QueueTaskStatus = {}));\nclass AsyncQueue {\n constructor() {\n this.pendingTasks = new Map();\n this.taskMutex = new _();\n this.nextTaskIndex = 0;\n }\n run(task) {\n return __awaiter(this, void 0, void 0, function* () {\n const taskInfo = {\n id: this.nextTaskIndex++,\n enqueuedAt: Date.now(),\n status: QueueTaskStatus.WAITING\n };\n this.pendingTasks.set(taskInfo.id, taskInfo);\n const unlock = yield this.taskMutex.lock();\n try {\n taskInfo.executedAt = Date.now();\n taskInfo.status = QueueTaskStatus.RUNNING;\n return yield task();\n } finally {\n taskInfo.status = QueueTaskStatus.COMPLETED;\n this.pendingTasks.delete(taskInfo.id);\n unlock();\n }\n });\n }\n flush() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.run(() => __awaiter(this, void 0, void 0, function* () {}));\n });\n }\n snapshot() {\n return Array.from(this.pendingTasks.values());\n }\n}\n\nfunction createRtcUrl(url, searchParams) {\n const urlObj = new URL(toWebsocketUrl(url));\n searchParams.forEach((value, key) => {\n urlObj.searchParams.set(key, value);\n });\n return appendUrlPath(urlObj, 'rtc');\n}\nfunction createValidateUrl(rtcWsUrl) {\n const urlObj = new URL(toHttpUrl(rtcWsUrl));\n return appendUrlPath(urlObj, 'validate');\n}\nfunction ensureTrailingSlash(path) {\n return path.endsWith('/') ? path : \"\".concat(path, \"/\");\n}\nfunction appendUrlPath(urlObj, path) {\n urlObj.pathname = \"\".concat(ensureTrailingSlash(urlObj.pathname)).concat(path);\n return urlObj.toString();\n}\n\nconst passThroughQueueSignals = ['syncState', 'trickle', 'offer', 'answer', 'simulate', 'leave'];\nfunction canPassThroughQueue(req) {\n const canPass = passThroughQueueSignals.indexOf(req.case) >= 0;\n livekitLogger.trace('request allowed to bypass queue:', {\n canPass,\n req\n });\n return canPass;\n}\nvar SignalConnectionState;\n(function (SignalConnectionState) {\n SignalConnectionState[SignalConnectionState[\"CONNECTING\"] = 0] = \"CONNECTING\";\n SignalConnectionState[SignalConnectionState[\"CONNECTED\"] = 1] = \"CONNECTED\";\n SignalConnectionState[SignalConnectionState[\"RECONNECTING\"] = 2] = \"RECONNECTING\";\n SignalConnectionState[SignalConnectionState[\"DISCONNECTING\"] = 3] = \"DISCONNECTING\";\n SignalConnectionState[SignalConnectionState[\"DISCONNECTED\"] = 4] = \"DISCONNECTED\";\n})(SignalConnectionState || (SignalConnectionState = {}));\n/** @internal */\nclass SignalClient {\n get currentState() {\n return this.state;\n }\n get isDisconnected() {\n return this.state === SignalConnectionState.DISCONNECTING || this.state === SignalConnectionState.DISCONNECTED;\n }\n get isEstablishingConnection() {\n return this.state === SignalConnectionState.CONNECTING || this.state === SignalConnectionState.RECONNECTING;\n }\n getNextRequestId() {\n this._requestId += 1;\n return this._requestId;\n }\n constructor() {\n let useJSON = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n let loggerOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _a;\n /** signal rtt in milliseconds */\n this.rtt = 0;\n this.state = SignalConnectionState.DISCONNECTED;\n this.log = livekitLogger;\n this._requestId = 0;\n /** @internal */\n this.resetCallbacks = () => {\n this.onAnswer = undefined;\n this.onLeave = undefined;\n this.onLocalTrackPublished = undefined;\n this.onLocalTrackUnpublished = undefined;\n this.onNegotiateRequested = undefined;\n this.onOffer = undefined;\n this.onRemoteMuteChanged = undefined;\n this.onSubscribedQualityUpdate = undefined;\n this.onTokenRefresh = undefined;\n this.onTrickle = undefined;\n this.onClose = undefined;\n };\n this.log = getLogger((_a = loggerOptions.loggerName) !== null && _a !== void 0 ? _a : LoggerNames.Signal);\n this.loggerContextCb = loggerOptions.loggerContextCb;\n this.useJSON = useJSON;\n this.requestQueue = new AsyncQueue();\n this.queuedRequests = [];\n this.closingLock = new _();\n this.connectionLock = new _();\n this.state = SignalConnectionState.DISCONNECTED;\n }\n get logContext() {\n var _a, _b;\n return (_b = (_a = this.loggerContextCb) === null || _a === void 0 ? void 0 : _a.call(this)) !== null && _b !== void 0 ? _b : {};\n }\n join(url, token, opts, abortSignal) {\n return __awaiter(this, void 0, void 0, function* () {\n // during a full reconnect, we'd want to start the sequence even if currently\n // connected\n this.state = SignalConnectionState.CONNECTING;\n this.options = opts;\n const res = yield this.connect(url, token, opts, abortSignal);\n return res;\n });\n }\n reconnect(url, token, sid, reason) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.options) {\n this.log.warn('attempted to reconnect without signal options being set, ignoring', this.logContext);\n return;\n }\n this.state = SignalConnectionState.RECONNECTING;\n // clear ping interval and restart it once reconnected\n this.clearPingInterval();\n const res = yield this.connect(url, token, Object.assign(Object.assign({}, this.options), {\n reconnect: true,\n sid,\n reconnectReason: reason\n }));\n return res;\n });\n }\n connect(url, token, opts, abortSignal) {\n this.connectOptions = opts;\n const clientInfo = getClientInfo();\n const params = createConnectionParams(token, clientInfo, opts);\n const rtcUrl = createRtcUrl(url, params);\n const validateUrl = createValidateUrl(rtcUrl);\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n const unlock = yield this.connectionLock.lock();\n try {\n const abortHandler = () => __awaiter(this, void 0, void 0, function* () {\n this.close();\n clearTimeout(wsTimeout);\n reject(new ConnectionError('room connection has been cancelled (signal)', ConnectionErrorReason.Cancelled));\n });\n const wsTimeout = setTimeout(() => {\n this.close();\n reject(new ConnectionError('room connection has timed out (signal)', ConnectionErrorReason.ServerUnreachable));\n }, opts.websocketTimeout);\n if (abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.aborted) {\n abortHandler();\n }\n abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.addEventListener('abort', abortHandler);\n const redactedUrl = new URL(rtcUrl);\n if (redactedUrl.searchParams.has('access_token')) {\n redactedUrl.searchParams.set('access_token', '<redacted>');\n }\n this.log.debug(\"connecting to \".concat(redactedUrl), Object.assign({\n reconnect: opts.reconnect,\n reconnectReason: opts.reconnectReason\n }, this.logContext));\n if (this.ws) {\n yield this.close(false);\n }\n this.ws = new WebSocket(rtcUrl);\n this.ws.binaryType = 'arraybuffer';\n this.ws.onopen = () => {\n clearTimeout(wsTimeout);\n };\n this.ws.onerror = ev => __awaiter(this, void 0, void 0, function* () {\n if (this.state !== SignalConnectionState.CONNECTED) {\n this.state = SignalConnectionState.DISCONNECTED;\n clearTimeout(wsTimeout);\n try {\n const resp = yield fetch(validateUrl);\n if (resp.status.toFixed(0).startsWith('4')) {\n const msg = yield resp.text();\n reject(new ConnectionError(msg, ConnectionErrorReason.NotAllowed, resp.status));\n } else {\n reject(new ConnectionError(\"Encountered unknown websocket error during connection: \".concat(ev.toString()), ConnectionErrorReason.InternalError, resp.status));\n }\n } catch (e) {\n reject(new ConnectionError(e instanceof Error ? e.message : 'server was not reachable', ConnectionErrorReason.ServerUnreachable));\n }\n return;\n }\n // other errors, handle\n this.handleWSError(ev);\n });\n this.ws.onmessage = ev => __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c;\n // not considered connected until JoinResponse is received\n let resp;\n if (typeof ev.data === 'string') {\n const json = JSON.parse(ev.data);\n resp = SignalResponse.fromJson(json, {\n ignoreUnknownFields: true\n });\n } else if (ev.data instanceof ArrayBuffer) {\n resp = SignalResponse.fromBinary(new Uint8Array(ev.data));\n } else {\n this.log.error(\"could not decode websocket message: \".concat(typeof ev.data), this.logContext);\n return;\n }\n if (this.state !== SignalConnectionState.CONNECTED) {\n let shouldProcessMessage = false;\n // handle join message only\n if (((_a = resp.message) === null || _a === void 0 ? void 0 : _a.case) === 'join') {\n this.state = SignalConnectionState.CONNECTED;\n abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.removeEventListener('abort', abortHandler);\n this.pingTimeoutDuration = resp.message.value.pingTimeout;\n this.pingIntervalDuration = resp.message.value.pingInterval;\n if (this.pingTimeoutDuration && this.pingTimeoutDuration > 0) {\n this.log.debug('ping config', Object.assign(Object.assign({}, this.logContext), {\n timeout: this.pingTimeoutDuration,\n interval: this.pingIntervalDuration\n }));\n this.startPingInterval();\n }\n resolve(resp.message.value);\n } else if (this.state === SignalConnectionState.RECONNECTING && resp.message.case !== 'leave') {\n // in reconnecting, any message received means signal reconnected\n this.state = SignalConnectionState.CONNECTED;\n abortSignal === null || abortSignal === void 0 ? void 0 : abortSignal.removeEventListener('abort', abortHandler);\n this.startPingInterval();\n if (((_b = resp.message) === null || _b === void 0 ? void 0 : _b.case) === 'reconnect') {\n resolve(resp.message.value);\n } else {\n this.log.debug('declaring signal reconnected without reconnect response received', this.logContext);\n resolve(undefined);\n shouldProcessMessage = true;\n }\n } else if (this.isEstablishingConnection && resp.message.case === 'leave') {\n reject(new ConnectionError('Received leave request while trying to (re)connect', ConnectionErrorReason.LeaveRequest, undefined, resp.message.value.reason));\n } else if (!opts.reconnect) {\n // non-reconnect case, should receive join response first\n reject(new ConnectionError(\"did not receive join response, got \".concat((_c = resp.message) === null || _c === void 0 ? void 0 : _c.case, \" instead\"), ConnectionErrorReason.InternalError));\n }\n if (!shouldProcessMessage) {\n return;\n }\n }\n if (this.signalLatency) {\n yield sleep(this.signalLatency);\n }\n this.handleSignalResponse(resp);\n });\n this.ws.onclose = ev => {\n if (this.isEstablishingConnection) {\n reject(new ConnectionError('Websocket got closed during a (re)connection attempt', ConnectionErrorReason.InternalError));\n }\n this.log.warn(\"websocket closed\", Object.assign(Object.assign({}, this.logContext), {\n reason: ev.reason,\n code: ev.code,\n wasClean: ev.wasClean,\n state: this.state\n }));\n this.handleOnClose(ev.reason);\n };\n } finally {\n unlock();\n }\n }));\n }\n close() {\n return __awaiter(this, arguments, void 0, function () {\n var _this = this;\n let updateState = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n return function* () {\n const unlock = yield _this.closingLock.lock();\n try {\n _this.clearPingInterval();\n if (updateState) {\n _this.state = SignalConnectionState.DISCONNECTING;\n }\n if (_this.ws) {\n _this.ws.onmessage = null;\n _this.ws.onopen = null;\n _this.ws.onclose = null;\n // calling `ws.close()` only starts the closing handshake (CLOSING state), prefer to wait until state is actually CLOSED\n const closePromise = new Promise(resolve => {\n if (_this.ws) {\n _this.ws.onclose = () => {\n resolve();\n };\n } else {\n resolve();\n }\n });\n if (_this.ws.readyState < _this.ws.CLOSING) {\n _this.ws.close();\n // 250ms grace period for ws to close gracefully\n yield Promise.race([closePromise, sleep(250)]);\n }\n _this.ws = undefined;\n }\n } finally {\n if (updateState) {\n _this.state = SignalConnectionState.DISCONNECTED;\n }\n unlock();\n }\n }();\n });\n }\n // initial offer after joining\n sendOffer(offer, offerId) {\n this.log.debug('sending offer', Object.assign(Object.assign({}, this.logContext), {\n offerSdp: offer.sdp\n }));\n this.sendRequest({\n case: 'offer',\n value: toProtoSessionDescription(offer, offerId)\n });\n }\n // answer a server-initiated offer\n sendAnswer(answer, offerId) {\n this.log.debug('sending answer', Object.assign(Object.assign({}, this.logContext), {\n answerSdp: answer.sdp\n }));\n return this.sendRequest({\n case: 'answer',\n value: toProtoSessionDescription(answer, offerId)\n });\n }\n sendIceCandidate(candidate, target) {\n this.log.debug('sending ice candidate', Object.assign(Object.assign({}, this.logContext), {\n candidate\n }));\n return this.sendRequest({\n case: 'trickle',\n value: new TrickleRequest({\n candidateInit: JSON.stringify(candidate),\n target\n })\n });\n }\n sendMuteTrack(trackSid, muted) {\n return this.sendRequest({\n case: 'mute',\n value: new MuteTrackRequest({\n sid: trackSid,\n muted\n })\n });\n }\n sendAddTrack(req) {\n return this.sendRequest({\n case: 'addTrack',\n value: req\n });\n }\n sendUpdateLocalMetadata(metadata_1, name_1) {\n return __awaiter(this, arguments, void 0, function (metadata, name) {\n var _this2 = this;\n let attributes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return function* () {\n const requestId = _this2.getNextRequestId();\n yield _this2.sendRequest({\n case: 'updateMetadata',\n value: new UpdateParticipantMetadata({\n requestId,\n metadata,\n name,\n attributes\n })\n });\n return requestId;\n }();\n });\n }\n sendUpdateTrackSettings(settings) {\n this.sendRequest({\n case: 'trackSetting',\n value: settings\n });\n }\n sendUpdateSubscription(sub) {\n return this.sendRequest({\n case: 'subscription',\n value: sub\n });\n }\n sendSyncState(sync) {\n return this.sendRequest({\n case: 'syncState',\n value: sync\n });\n }\n sendUpdateVideoLayers(trackSid, layers) {\n return this.sendRequest({\n case: 'updateLayers',\n value: new UpdateVideoLayers({\n trackSid,\n layers\n })\n });\n }\n sendUpdateSubscriptionPermissions(allParticipants, trackPermissions) {\n return this.sendRequest({\n case: 'subscriptionPermission',\n value: new SubscriptionPermission({\n allParticipants,\n trackPermissions\n })\n });\n }\n sendSimulateScenario(scenario) {\n return this.sendRequest({\n case: 'simulate',\n value: scenario\n });\n }\n sendPing() {\n /** send both of ping and pingReq for compatibility to old and new server */\n return Promise.all([this.sendRequest({\n case: 'ping',\n value: protoInt64.parse(Date.now())\n }), this.sendRequest({\n case: 'pingReq',\n value: new Ping({\n timestamp: protoInt64.parse(Date.now()),\n rtt: protoInt64.parse(this.rtt)\n })\n })]);\n }\n sendUpdateLocalAudioTrack(trackSid, features) {\n return this.sendRequest({\n case: 'updateAudioTrack',\n value: new UpdateLocalAudioTrack({\n trackSid,\n features\n })\n });\n }\n sendLeave() {\n return this.sendRequest({\n case: 'leave',\n value: new LeaveRequest({\n reason: DisconnectReason.CLIENT_INITIATED,\n // server doesn't process this field, keeping it here to indicate the intent of a full disconnect\n action: LeaveRequest_Action.DISCONNECT\n })\n });\n }\n sendRequest(message_1) {\n return __awaiter(this, arguments, void 0, function (message) {\n var _this3 = this;\n let fromQueue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n return function* () {\n // capture all requests while reconnecting and put them in a queue\n // unless the request originates from the queue, then don't enqueue again\n const canQueue = !fromQueue && !canPassThroughQueue(message);\n if (canQueue && _this3.state === SignalConnectionState.RECONNECTING) {\n _this3.queuedRequests.push(() => __awaiter(_this3, void 0, void 0, function* () {\n yield this.sendRequest(message, true);\n }));\n return;\n }\n // make sure previously queued requests are being sent first\n if (!fromQueue) {\n yield _this3.requestQueue.flush();\n }\n if (_this3.signalLatency) {\n yield sleep(_this3.signalLatency);\n }\n if (_this3.isDisconnected) {\n // Skip requests if the signal layer is disconnected\n // This can happen if an event is sent in the mist of room.connect() initializing\n _this3.log.debug(\"skipping signal request (type: \".concat(message.case, \") - SignalClient disconnected\"));\n return;\n }\n if (!_this3.ws || _this3.ws.readyState !== _this3.ws.OPEN) {\n _this3.log.error(\"cannot send signal request before connected, type: \".concat(message === null || message === void 0 ? void 0 : message.case), _this3.logContext);\n return;\n }\n const req = new SignalRequest({\n message\n });\n try {\n if (_this3.useJSON) {\n _this3.ws.send(req.toJsonString());\n } else {\n _this3.ws.send(req.toBinary());\n }\n } catch (e) {\n _this3.log.error('error sending signal message', Object.assign(Object.assign({}, _this3.logContext), {\n error: e\n }));\n }\n }();\n });\n }\n handleSignalResponse(res) {\n var _a, _b;\n const msg = res.message;\n if (msg == undefined) {\n this.log.debug('received unsupported message', this.logContext);\n return;\n }\n let pingHandled = false;\n if (msg.case === 'answer') {\n const sd = fromProtoSessionDescription(msg.value);\n if (this.onAnswer) {\n this.onAnswer(sd, msg.value.id);\n }\n } else if (msg.case === 'offer') {\n const sd = fromProtoSessionDescription(msg.value);\n if (this.onOffer) {\n this.onOffer(sd, msg.value.id);\n }\n } else if (msg.case === 'trickle') {\n const candidate = JSON.parse(msg.value.candidateInit);\n if (this.onTrickle) {\n this.onTrickle(candidate, msg.value.target);\n }\n } else if (msg.case === 'update') {\n if (this.onParticipantUpdate) {\n this.onParticipantUpdate((_a = msg.value.participants) !== null && _a !== void 0 ? _a : []);\n }\n } else if (msg.case === 'trackPublished') {\n if (this.onLocalTrackPublished) {\n this.onLocalTrackPublished(msg.value);\n }\n } else if (msg.case === 'speakersChanged') {\n if (this.onSpeakersChanged) {\n this.onSpeakersChanged((_b = msg.value.speakers) !== null && _b !== void 0 ? _b : []);\n }\n } else if (msg.case === 'leave') {\n if (this.onLeave) {\n this.onLeave(msg.value);\n }\n } else if (msg.case === 'mute') {\n if (this.onRemoteMuteChanged) {\n this.onRemoteMuteChanged(msg.value.sid, msg.value.muted);\n }\n } else if (msg.case === 'roomUpdate') {\n if (this.onRoomUpdate && msg.value.room) {\n this.onRoomUpdate(msg.value.room);\n }\n } else if (msg.case === 'connectionQuality') {\n if (this.onConnectionQuality) {\n this.onConnectionQuality(msg.value);\n }\n } else if (msg.case === 'streamStateUpdate') {\n if (this.onStreamStateUpdate) {\n this.onStreamStateUpdate(msg.value);\n }\n } else if (msg.case === 'subscribedQualityUpdate') {\n if (this.onSubscribedQualityUpdate) {\n this.onSubscribedQualityUpdate(msg.value);\n }\n } else if (msg.case === 'subscriptionPermissionUpdate') {\n if (this.onSubscriptionPermissionUpdate) {\n this.onSubscriptionPermissionUpdate(msg.value);\n }\n } else if (msg.case === 'refreshToken') {\n if (this.onTokenRefresh) {\n this.onTokenRefresh(msg.value);\n }\n } else if (msg.case === 'trackUnpublished') {\n if (this.onLocalTrackUnpublished) {\n this.onLocalTrackUnpublished(msg.value);\n }\n } else if (msg.case === 'subscriptionResponse') {\n if (this.onSubscriptionError) {\n this.onSubscriptionError(msg.value);\n }\n } else if (msg.case === 'pong') ; else if (msg.case === 'pongResp') {\n this.rtt = Date.now() - Number.parseInt(msg.value.lastPingTimestamp.toString());\n this.resetPingTimeout();\n pingHandled = true;\n } else if (msg.case === 'requestResponse') {\n if (this.onRequestResponse) {\n this.onRequestResponse(msg.value);\n }\n } else if (msg.case === 'trackSubscribed') {\n if (this.onLocalTrackSubscribed) {\n this.onLocalTrackSubscribed(msg.value.trackSid);\n }\n } else if (msg.case === 'roomMoved') {\n if (this.onTokenRefresh) {\n this.onTokenRefresh(msg.value.token);\n }\n if (this.onRoomMoved) {\n this.onRoomMoved(msg.value);\n }\n } else {\n this.log.debug('unsupported message', Object.assign(Object.assign({}, this.logContext), {\n msgCase: msg.case\n }));\n }\n if (!pingHandled) {\n this.resetPingTimeout();\n }\n }\n setReconnected() {\n while (this.queuedRequests.length > 0) {\n const req = this.queuedRequests.shift();\n if (req) {\n this.requestQueue.run(req);\n }\n }\n }\n handleOnClose(reason) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.state === SignalConnectionState.DISCONNECTED) return;\n const onCloseCallback = this.onClose;\n yield this.close();\n this.log.debug(\"websocket connection closed: \".concat(reason), Object.assign(Object.assign({}, this.logContext), {\n reason\n }));\n if (onCloseCallback) {\n onCloseCallback(reason);\n }\n });\n }\n handleWSError(ev) {\n this.log.error('websocket error', Object.assign(Object.assign({}, this.logContext), {\n error: ev\n }));\n }\n /**\n * Resets the ping timeout and starts a new timeout.\n * Call this after receiving a pong message\n */\n resetPingTimeout() {\n this.clearPingTimeout();\n if (!this.pingTimeoutDuration) {\n this.log.warn('ping timeout duration not set', this.logContext);\n return;\n }\n this.pingTimeout = CriticalTimers.setTimeout(() => {\n this.log.warn(\"ping timeout triggered. last pong received at: \".concat(new Date(Date.now() - this.pingTimeoutDuration * 1000).toUTCString()), this.logContext);\n this.handleOnClose('ping timeout');\n }, this.pingTimeoutDuration * 1000);\n }\n /**\n * Clears ping timeout (does not start a new timeout)\n */\n clearPingTimeout() {\n if (this.pingTimeout) {\n CriticalTimers.clearTimeout(this.pingTimeout);\n }\n }\n startPingInterval() {\n this.clearPingInterval();\n this.resetPingTimeout();\n if (!this.pingIntervalDuration) {\n this.log.warn('ping interval duration not set', this.logContext);\n return;\n }\n this.log.debug('start ping interval', this.logContext);\n this.pingInterval = CriticalTimers.setInterval(() => {\n this.sendPing();\n }, this.pingIntervalDuration * 1000);\n }\n clearPingInterval() {\n this.log.debug('clearing ping interval', this.logContext);\n this.clearPingTimeout();\n if (this.pingInterval) {\n CriticalTimers.clearInterval(this.pingInterval);\n }\n }\n}\nfunction fromProtoSessionDescription(sd) {\n const rsd = {\n type: 'offer',\n sdp: sd.sdp\n };\n switch (sd.type) {\n case 'answer':\n case 'offer':\n case 'pranswer':\n case 'rollback':\n rsd.type = sd.type;\n break;\n }\n return rsd;\n}\nfunction toProtoSessionDescription(rsd, id) {\n const sd = new SessionDescription({\n sdp: rsd.sdp,\n type: rsd.type,\n id\n });\n return sd;\n}\nfunction createConnectionParams(token, info, opts) {\n var _a;\n const params = new URLSearchParams();\n params.set('access_token', token);\n // opts\n if (opts.reconnect) {\n params.set('reconnect', '1');\n if (opts.sid) {\n params.set('sid', opts.sid);\n }\n }\n params.set('auto_subscribe', opts.autoSubscribe ? '1' : '0');\n // ClientInfo\n params.set('sdk', isReactNative() ? 'reactnative' : 'js');\n params.set('version', info.version);\n params.set('protocol', info.protocol.toString());\n if (info.deviceModel) {\n params.set('device_model', info.deviceModel);\n }\n if (info.os) {\n params.set('os', info.os);\n }\n if (info.osVersion) {\n params.set('os_version', info.osVersion);\n }\n if (info.browser) {\n params.set('browser', info.browser);\n }\n if (info.browserVersion) {\n params.set('browser_version', info.browserVersion);\n }\n if (opts.adaptiveStream) {\n params.set('adaptive_stream', '1');\n }\n if (opts.reconnectReason) {\n params.set('reconnect_reason', opts.reconnectReason.toString());\n }\n // @ts-ignore\n if ((_a = navigator.connection) === null || _a === void 0 ? void 0 : _a.type) {\n // @ts-ignore\n params.set('network', navigator.connection.type);\n }\n return params;\n}\n\nclass DataPacketBuffer {\n constructor() {\n this.buffer = [];\n this._totalSize = 0;\n }\n push(item) {\n this.buffer.push(item);\n this._totalSize += item.data.byteLength;\n }\n pop() {\n const item = this.buffer.shift();\n if (item) {\n this._totalSize -= item.data.byteLength;\n }\n return item;\n }\n getAll() {\n return this.buffer.slice();\n }\n popToSequence(sequence) {\n while (this.buffer.length > 0) {\n const first = this.buffer[0];\n if (first.sequence <= sequence) {\n this.pop();\n } else {\n break;\n }\n }\n }\n alignBufferedAmount(bufferedAmount) {\n while (this.buffer.length > 0) {\n const first = this.buffer[0];\n if (this._totalSize - first.data.byteLength <= bufferedAmount) {\n break;\n }\n this.pop();\n }\n }\n get length() {\n return this.buffer.length;\n }\n}\n\nclass TTLMap {\n /**\n * @param ttl ttl of the key (ms)\n */\n constructor(ttl) {\n this._map = new Map();\n this._lastCleanup = 0;\n this.ttl = ttl;\n }\n set(key, value) {\n const now = Date.now();\n if (now - this._lastCleanup > this.ttl / 2) {\n this.cleanup();\n }\n const expiresAt = now + this.ttl;\n this._map.set(key, {\n value,\n expiresAt\n });\n return this;\n }\n get(key) {\n const entry = this._map.get(key);\n if (!entry) return undefined;\n if (entry.expiresAt < Date.now()) {\n this._map.delete(key);\n return undefined;\n }\n return entry.value;\n }\n has(key) {\n const entry = this._map.get(key);\n if (!entry) return false;\n if (entry.expiresAt < Date.now()) {\n this._map.delete(key);\n return false;\n }\n return true;\n }\n delete(key) {\n return this._map.delete(key);\n }\n clear() {\n this._map.clear();\n }\n cleanup() {\n const now = Date.now();\n for (const [key, entry] of this._map.entries()) {\n if (entry.expiresAt < now) {\n this._map.delete(key);\n }\n }\n this._lastCleanup = now;\n }\n get size() {\n this.cleanup();\n return this._map.size;\n }\n forEach(callback) {\n this.cleanup();\n for (const [key, entry] of this._map.entries()) {\n if (entry.expiresAt >= Date.now()) {\n callback(entry.value, key, this.asValueMap());\n }\n }\n }\n map(callback) {\n this.cleanup();\n const result = [];\n const valueMap = this.asValueMap();\n for (const [key, value] of valueMap.entries()) {\n result.push(callback(value, key, valueMap));\n }\n return result;\n }\n asValueMap() {\n const result = new Map();\n for (const [key, entry] of this._map.entries()) {\n if (entry.expiresAt >= Date.now()) {\n result.set(key, entry.value);\n }\n }\n return result;\n }\n}\n\nvar lib = {};\n\nvar parser = {};\n\nvar grammar = {exports: {}};\n\nvar hasRequiredGrammar;\nfunction requireGrammar() {\n if (hasRequiredGrammar) return grammar.exports;\n hasRequiredGrammar = 1;\n var grammar$1 = grammar.exports = {\n v: [{\n name: 'version',\n reg: /^(\\d*)$/\n }],\n o: [{\n // o=- 20518 0 IN IP4 203.0.113.1\n // NB: sessionId will be a String in most cases because it is huge\n name: 'origin',\n reg: /^(\\S*) (\\d*) (\\d*) (\\S*) IP(\\d) (\\S*)/,\n names: ['username', 'sessionId', 'sessionVersion', 'netType', 'ipVer', 'address'],\n format: '%s %s %d %s IP%d %s'\n }],\n // default parsing of these only (though some of these feel outdated)\n s: [{\n name: 'name'\n }],\n i: [{\n name: 'description'\n }],\n u: [{\n name: 'uri'\n }],\n e: [{\n name: 'email'\n }],\n p: [{\n name: 'phone'\n }],\n z: [{\n name: 'timezones'\n }],\n // TODO: this one can actually be parsed properly...\n r: [{\n name: 'repeats'\n }],\n // TODO: this one can also be parsed properly\n // k: [{}], // outdated thing ignored\n t: [{\n // t=0 0\n name: 'timing',\n reg: /^(\\d*) (\\d*)/,\n names: ['start', 'stop'],\n format: '%d %d'\n }],\n c: [{\n // c=IN IP4 10.47.197.26\n name: 'connection',\n reg: /^IN IP(\\d) (\\S*)/,\n names: ['version', 'ip'],\n format: 'IN IP%d %s'\n }],\n b: [{\n // b=AS:4000\n push: 'bandwidth',\n reg: /^(TIAS|AS|CT|RR|RS):(\\d*)/,\n names: ['type', 'limit'],\n format: '%s:%s'\n }],\n m: [{\n // m=video 51744 RTP/AVP 126 97 98 34 31\n // NB: special - pushes to session\n // TODO: rtp/fmtp should be filtered by the payloads found here?\n reg: /^(\\w*) (\\d*) ([\\w/]*)(?: (.*))?/,\n names: ['type', 'port', 'protocol', 'payloads'],\n format: '%s %d %s %s'\n }],\n a: [{\n // a=rtpmap:110 opus/48000/2\n push: 'rtp',\n reg: /^rtpmap:(\\d*) ([\\w\\-.]*)(?:\\s*\\/(\\d*)(?:\\s*\\/(\\S*))?)?/,\n names: ['payload', 'codec', 'rate', 'encoding'],\n format: function (o) {\n return o.encoding ? 'rtpmap:%d %s/%s/%s' : o.rate ? 'rtpmap:%d %s/%s' : 'rtpmap:%d %s';\n }\n }, {\n // a=fmtp:108 profile-level-id=24;object=23;bitrate=64000\n // a=fmtp:111 minptime=10; useinbandfec=1\n push: 'fmtp',\n reg: /^fmtp:(\\d*) ([\\S| ]*)/,\n names: ['payload', 'config'],\n format: 'fmtp:%d %s'\n }, {\n // a=control:streamid=0\n name: 'control',\n reg: /^control:(.*)/,\n format: 'control:%s'\n }, {\n // a=rtcp:65179 IN IP4 193.84.77.194\n name: 'rtcp',\n reg: /^rtcp:(\\d*)(?: (\\S*) IP(\\d) (\\S*))?/,\n names: ['port', 'netType', 'ipVer', 'address'],\n format: function (o) {\n return o.address != null ? 'rtcp:%d %s IP%d %s' : 'rtcp:%d';\n }\n }, {\n // a=rtcp-fb:98 trr-int 100\n push: 'rtcpFbTrrInt',\n reg: /^rtcp-fb:(\\*|\\d*) trr-int (\\d*)/,\n names: ['payload', 'value'],\n format: 'rtcp-fb:%s trr-int %d'\n }, {\n // a=rtcp-fb:98 nack rpsi\n push: 'rtcpFb',\n reg: /^rtcp-fb:(\\*|\\d*) ([\\w-_]*)(?: ([\\w-_]*))?/,\n names: ['payload', 'type', 'subtype'],\n format: function (o) {\n return o.subtype != null ? 'rtcp-fb:%s %s %s' : 'rtcp-fb:%s %s';\n }\n }, {\n // a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n // a=extmap:1/recvonly URI-gps-string\n // a=extmap:3 urn:ietf:params:rtp-hdrext:encrypt urn:ietf:params:rtp-hdrext:smpte-tc 25@600/24\n push: 'ext',\n reg: /^extmap:(\\d+)(?:\\/(\\w+))?(?: (urn:ietf:params:rtp-hdrext:encrypt))? (\\S*)(?: (\\S*))?/,\n names: ['value', 'direction', 'encrypt-uri', 'uri', 'config'],\n format: function (o) {\n return 'extmap:%d' + (o.direction ? '/%s' : '%v') + (o['encrypt-uri'] ? ' %s' : '%v') + ' %s' + (o.config ? ' %s' : '');\n }\n }, {\n // a=extmap-allow-mixed\n name: 'extmapAllowMixed',\n reg: /^(extmap-allow-mixed)/\n }, {\n // a=crypto:1 AES_CM_128_HMAC_SHA1_80 inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR|2^20|1:32\n push: 'crypto',\n reg: /^crypto:(\\d*) ([\\w_]*) (\\S*)(?: (\\S*))?/,\n names: ['id', 'suite', 'config', 'sessionConfig'],\n format: function (o) {\n return o.sessionConfig != null ? 'crypto:%d %s %s %s' : 'crypto:%d %s %s';\n }\n }, {\n // a=setup:actpass\n name: 'setup',\n reg: /^setup:(\\w*)/,\n format: 'setup:%s'\n }, {\n // a=connection:new\n name: 'connectionType',\n reg: /^connection:(new|existing)/,\n format: 'connection:%s'\n }, {\n // a=mid:1\n name: 'mid',\n reg: /^mid:([^\\s]*)/,\n format: 'mid:%s'\n }, {\n // a=msid:0c8b064d-d807-43b4-b434-f92a889d8587 98178685-d409-46e0-8e16-7ef0db0db64a\n name: 'msid',\n reg: /^msid:(.*)/,\n format: 'msid:%s'\n }, {\n // a=ptime:20\n name: 'ptime',\n reg: /^ptime:(\\d*(?:\\.\\d*)*)/,\n format: 'ptime:%d'\n }, {\n // a=maxptime:60\n name: 'maxptime',\n reg: /^maxptime:(\\d*(?:\\.\\d*)*)/,\n format: 'maxptime:%d'\n }, {\n // a=sendrecv\n name: 'direction',\n reg: /^(sendrecv|recvonly|sendonly|inactive)/\n }, {\n // a=ice-lite\n name: 'icelite',\n reg: /^(ice-lite)/\n }, {\n // a=ice-ufrag:F7gI\n name: 'iceUfrag',\n reg: /^ice-ufrag:(\\S*)/,\n format: 'ice-ufrag:%s'\n }, {\n // a=ice-pwd:x9cml/YzichV2+XlhiMu8g\n name: 'icePwd',\n reg: /^ice-pwd:(\\S*)/,\n format: 'ice-pwd:%s'\n }, {\n // a=fingerprint:SHA-1 00:11:22:33:44:55:66:77:88:99:AA:BB:CC:DD:EE:FF:00:11:22:33\n name: 'fingerprint',\n reg: /^fingerprint:(\\S*) (\\S*)/,\n names: ['type', 'hash'],\n format: 'fingerprint:%s %s'\n }, {\n // a=candidate:0 1 UDP 2113667327 203.0.113.1 54400 typ host\n // a=candidate:1162875081 1 udp 2113937151 192.168.34.75 60017 typ host generation 0 network-id 3 network-cost 10\n // a=candidate:3289912957 2 udp 1845501695 193.84.77.194 60017 typ srflx raddr 192.168.34.75 rport 60017 generation 0 network-id 3 network-cost 10\n // a=candidate:229815620 1 tcp 1518280447 192.168.150.19 60017 typ host tcptype active generation 0 network-id 3 network-cost 10\n // a=candidate:3289912957 2 tcp 1845501695 193.84.77.194 60017 typ srflx raddr 192.168.34.75 rport 60017 tcptype passive generation 0 network-id 3 network-cost 10\n push: 'candidates',\n reg: /^candidate:(\\S*) (\\d*) (\\S*) (\\d*) (\\S*) (\\d*) typ (\\S*)(?: raddr (\\S*) rport (\\d*))?(?: tcptype (\\S*))?(?: generation (\\d*))?(?: network-id (\\d*))?(?: network-cost (\\d*))?/,\n names: ['foundation', 'component', 'transport', 'priority', 'ip', 'port', 'type', 'raddr', 'rport', 'tcptype', 'generation', 'network-id', 'network-cost'],\n format: function (o) {\n var str = 'candidate:%s %d %s %d %s %d typ %s';\n str += o.raddr != null ? ' raddr %s rport %d' : '%v%v';\n\n // NB: candidate has three optional chunks, so %void middles one if it's missing\n str += o.tcptype != null ? ' tcptype %s' : '%v';\n if (o.generation != null) {\n str += ' generation %d';\n }\n str += o['network-id'] != null ? ' network-id %d' : '%v';\n str += o['network-cost'] != null ? ' network-cost %d' : '%v';\n return str;\n }\n }, {\n // a=end-of-candidates (keep after the candidates line for readability)\n name: 'endOfCandidates',\n reg: /^(end-of-candidates)/\n }, {\n // a=remote-candidates:1 203.0.113.1 54400 2 203.0.113.1 54401 ...\n name: 'remoteCandidates',\n reg: /^remote-candidates:(.*)/,\n format: 'remote-candidates:%s'\n }, {\n // a=ice-options:google-ice\n name: 'iceOptions',\n reg: /^ice-options:(\\S*)/,\n format: 'ice-options:%s'\n }, {\n // a=ssrc:2566107569 cname:t9YU8M1UxTF8Y1A1\n push: 'ssrcs',\n reg: /^ssrc:(\\d*) ([\\w_-]*)(?::(.*))?/,\n names: ['id', 'attribute', 'value'],\n format: function (o) {\n var str = 'ssrc:%d';\n if (o.attribute != null) {\n str += ' %s';\n if (o.value != null) {\n str += ':%s';\n }\n }\n return str;\n }\n }, {\n // a=ssrc-group:FEC 1 2\n // a=ssrc-group:FEC-FR 3004364195 1080772241\n push: 'ssrcGroups',\n // token-char = %x21 / %x23-27 / %x2A-2B / %x2D-2E / %x30-39 / %x41-5A / %x5E-7E\n reg: /^ssrc-group:([\\x21\\x23\\x24\\x25\\x26\\x27\\x2A\\x2B\\x2D\\x2E\\w]*) (.*)/,\n names: ['semantics', 'ssrcs'],\n format: 'ssrc-group:%s %s'\n }, {\n // a=msid-semantic: WMS Jvlam5X3SX1OP6pn20zWogvaKJz5Hjf9OnlV\n name: 'msidSemantic',\n reg: /^msid-semantic:\\s?(\\w*) (\\S*)/,\n names: ['semantic', 'token'],\n format: 'msid-semantic: %s %s' // space after ':' is not accidental\n }, {\n // a=group:BUNDLE audio video\n push: 'groups',\n reg: /^group:(\\w*) (.*)/,\n names: ['type', 'mids'],\n format: 'group:%s %s'\n }, {\n // a=rtcp-mux\n name: 'rtcpMux',\n reg: /^(rtcp-mux)/\n }, {\n // a=rtcp-rsize\n name: 'rtcpRsize',\n reg: /^(rtcp-rsize)/\n }, {\n // a=sctpmap:5000 webrtc-datachannel 1024\n name: 'sctpmap',\n reg: /^sctpmap:([\\w_/]*) (\\S*)(?: (\\S*))?/,\n names: ['sctpmapNumber', 'app', 'maxMessageSize'],\n format: function (o) {\n return o.maxMessageSize != null ? 'sctpmap:%s %s %s' : 'sctpmap:%s %s';\n }\n }, {\n // a=x-google-flag:conference\n name: 'xGoogleFlag',\n reg: /^x-google-flag:([^\\s]*)/,\n format: 'x-google-flag:%s'\n }, {\n // a=rid:1 send max-width=1280;max-height=720;max-fps=30;depend=0\n push: 'rids',\n reg: /^rid:([\\d\\w]+) (\\w+)(?: ([\\S| ]*))?/,\n names: ['id', 'direction', 'params'],\n format: function (o) {\n return o.params ? 'rid:%s %s %s' : 'rid:%s %s';\n }\n }, {\n // a=imageattr:97 send [x=800,y=640,sar=1.1,q=0.6] [x=480,y=320] recv [x=330,y=250]\n // a=imageattr:* send [x=800,y=640] recv *\n // a=imageattr:100 recv [x=320,y=240]\n push: 'imageattrs',\n reg: new RegExp(\n // a=imageattr:97\n '^imageattr:(\\\\d+|\\\\*)' +\n // send [x=800,y=640,sar=1.1,q=0.6] [x=480,y=320]\n '[\\\\s\\\\t]+(send|recv)[\\\\s\\\\t]+(\\\\*|\\\\[\\\\S+\\\\](?:[\\\\s\\\\t]+\\\\[\\\\S+\\\\])*)' +\n // recv [x=330,y=250]\n '(?:[\\\\s\\\\t]+(recv|send)[\\\\s\\\\t]+(\\\\*|\\\\[\\\\S+\\\\](?:[\\\\s\\\\t]+\\\\[\\\\S+\\\\])*))?'),\n names: ['pt', 'dir1', 'attrs1', 'dir2', 'attrs2'],\n format: function (o) {\n return 'imageattr:%s %s %s' + (o.dir2 ? ' %s %s' : '');\n }\n }, {\n // a=simulcast:send 1,2,3;~4,~5 recv 6;~7,~8\n // a=simulcast:recv 1;4,5 send 6;7\n name: 'simulcast',\n reg: new RegExp(\n // a=simulcast:\n '^simulcast:' +\n // send 1,2,3;~4,~5\n '(send|recv) ([a-zA-Z0-9\\\\-_~;,]+)' +\n // space + recv 6;~7,~8\n '(?:\\\\s?(send|recv) ([a-zA-Z0-9\\\\-_~;,]+))?' +\n // end\n '$'),\n names: ['dir1', 'list1', 'dir2', 'list2'],\n format: function (o) {\n return 'simulcast:%s %s' + (o.dir2 ? ' %s %s' : '');\n }\n }, {\n // old simulcast draft 03 (implemented by Firefox)\n // https://tools.ietf.org/html/draft-ietf-mmusic-sdp-simulcast-03\n // a=simulcast: recv pt=97;98 send pt=97\n // a=simulcast: send rid=5;6;7 paused=6,7\n name: 'simulcast_03',\n reg: /^simulcast:[\\s\\t]+([\\S+\\s\\t]+)$/,\n names: ['value'],\n format: 'simulcast: %s'\n }, {\n // a=framerate:25\n // a=framerate:29.97\n name: 'framerate',\n reg: /^framerate:(\\d+(?:$|\\.\\d+))/,\n format: 'framerate:%s'\n }, {\n // RFC4570\n // a=source-filter: incl IN IP4 239.5.2.31 10.1.15.5\n name: 'sourceFilter',\n reg: /^source-filter: *(excl|incl) (\\S*) (IP4|IP6|\\*) (\\S*) (.*)/,\n names: ['filterMode', 'netType', 'addressTypes', 'destAddress', 'srcList'],\n format: 'source-filter: %s %s %s %s %s'\n }, {\n // a=bundle-only\n name: 'bundleOnly',\n reg: /^(bundle-only)/\n }, {\n // a=label:1\n name: 'label',\n reg: /^label:(.+)/,\n format: 'label:%s'\n }, {\n // RFC version 26 for SCTP over DTLS\n // https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-26#section-5\n name: 'sctpPort',\n reg: /^sctp-port:(\\d+)$/,\n format: 'sctp-port:%s'\n }, {\n // RFC version 26 for SCTP over DTLS\n // https://tools.ietf.org/html/draft-ietf-mmusic-sctp-sdp-26#section-6\n name: 'maxMessageSize',\n reg: /^max-message-size:(\\d+)$/,\n format: 'max-message-size:%s'\n }, {\n // RFC7273\n // a=ts-refclk:ptp=IEEE1588-2008:39-A7-94-FF-FE-07-CB-D0:37\n push: 'tsRefClocks',\n reg: /^ts-refclk:([^\\s=]*)(?:=(\\S*))?/,\n names: ['clksrc', 'clksrcExt'],\n format: function (o) {\n return 'ts-refclk:%s' + (o.clksrcExt != null ? '=%s' : '');\n }\n }, {\n // RFC7273\n // a=mediaclk:direct=963214424\n name: 'mediaClk',\n reg: /^mediaclk:(?:id=(\\S*))? *([^\\s=]*)(?:=(\\S*))?(?: *rate=(\\d+)\\/(\\d+))?/,\n names: ['id', 'mediaClockName', 'mediaClockValue', 'rateNumerator', 'rateDenominator'],\n format: function (o) {\n var str = 'mediaclk:';\n str += o.id != null ? 'id=%s %s' : '%v%s';\n str += o.mediaClockValue != null ? '=%s' : '';\n str += o.rateNumerator != null ? ' rate=%s' : '';\n str += o.rateDenominator != null ? '/%s' : '';\n return str;\n }\n }, {\n // a=keywds:keywords\n name: 'keywords',\n reg: /^keywds:(.+)$/,\n format: 'keywds:%s'\n }, {\n // a=content:main\n name: 'content',\n reg: /^content:(.+)/,\n format: 'content:%s'\n },\n // BFCP https://tools.ietf.org/html/rfc4583\n {\n // a=floorctrl:c-s\n name: 'bfcpFloorCtrl',\n reg: /^floorctrl:(c-only|s-only|c-s)/,\n format: 'floorctrl:%s'\n }, {\n // a=confid:1\n name: 'bfcpConfId',\n reg: /^confid:(\\d+)/,\n format: 'confid:%s'\n }, {\n // a=userid:1\n name: 'bfcpUserId',\n reg: /^userid:(\\d+)/,\n format: 'userid:%s'\n }, {\n // a=floorid:1\n name: 'bfcpFloorId',\n reg: /^floorid:(.+) (?:m-stream|mstrm):(.+)/,\n names: ['id', 'mStream'],\n format: 'floorid:%s mstrm:%s'\n }, {\n // any a= that we don't understand is kept verbatim on media.invalid\n push: 'invalid',\n names: ['value']\n }]\n };\n\n // set sensible defaults to avoid polluting the grammar with boring details\n Object.keys(grammar$1).forEach(function (key) {\n var objs = grammar$1[key];\n objs.forEach(function (obj) {\n if (!obj.reg) {\n obj.reg = /(.*)/;\n }\n if (!obj.format) {\n obj.format = '%s';\n }\n });\n });\n return grammar.exports;\n}\n\nvar hasRequiredParser;\nfunction requireParser() {\n if (hasRequiredParser) return parser;\n hasRequiredParser = 1;\n (function (exports) {\n var toIntIfInt = function (v) {\n return String(Number(v)) === v ? Number(v) : v;\n };\n var attachProperties = function (match, location, names, rawName) {\n if (rawName && !names) {\n location[rawName] = toIntIfInt(match[1]);\n } else {\n for (var i = 0; i < names.length; i += 1) {\n if (match[i + 1] != null) {\n location[names[i]] = toIntIfInt(match[i + 1]);\n }\n }\n }\n };\n var parseReg = function (obj, location, content) {\n var needsBlank = obj.name && obj.names;\n if (obj.push && !location[obj.push]) {\n location[obj.push] = [];\n } else if (needsBlank && !location[obj.name]) {\n location[obj.name] = {};\n }\n var keyLocation = obj.push ? {} :\n // blank object that will be pushed\n needsBlank ? location[obj.name] : location; // otherwise, named location or root\n\n attachProperties(content.match(obj.reg), keyLocation, obj.names, obj.name);\n if (obj.push) {\n location[obj.push].push(keyLocation);\n }\n };\n var grammar = requireGrammar();\n var validLine = RegExp.prototype.test.bind(/^([a-z])=(.*)/);\n exports.parse = function (sdp) {\n var session = {},\n media = [],\n location = session; // points at where properties go under (one of the above)\n\n // parse lines we understand\n sdp.split(/(\\r\\n|\\r|\\n)/).filter(validLine).forEach(function (l) {\n var type = l[0];\n var content = l.slice(2);\n if (type === 'm') {\n media.push({\n rtp: [],\n fmtp: []\n });\n location = media[media.length - 1]; // point at latest media line\n }\n for (var j = 0; j < (grammar[type] || []).length; j += 1) {\n var obj = grammar[type][j];\n if (obj.reg.test(content)) {\n return parseReg(obj, location, content);\n }\n }\n });\n session.media = media; // link it up\n return session;\n };\n var paramReducer = function (acc, expr) {\n var s = expr.split(/=(.+)/, 2);\n if (s.length === 2) {\n acc[s[0]] = toIntIfInt(s[1]);\n } else if (s.length === 1 && expr.length > 1) {\n acc[s[0]] = undefined;\n }\n return acc;\n };\n exports.parseParams = function (str) {\n return str.split(/;\\s?/).reduce(paramReducer, {});\n };\n\n // For backward compatibility - alias will be removed in 3.0.0\n exports.parseFmtpConfig = exports.parseParams;\n exports.parsePayloads = function (str) {\n return str.toString().split(' ').map(Number);\n };\n exports.parseRemoteCandidates = function (str) {\n var candidates = [];\n var parts = str.split(' ').map(toIntIfInt);\n for (var i = 0; i < parts.length; i += 3) {\n candidates.push({\n component: parts[i],\n ip: parts[i + 1],\n port: parts[i + 2]\n });\n }\n return candidates;\n };\n exports.parseImageAttributes = function (str) {\n return str.split(' ').map(function (item) {\n return item.substring(1, item.length - 1).split(',').reduce(paramReducer, {});\n });\n };\n exports.parseSimulcastStreamList = function (str) {\n return str.split(';').map(function (stream) {\n return stream.split(',').map(function (format) {\n var scid,\n paused = false;\n if (format[0] !== '~') {\n scid = toIntIfInt(format);\n } else {\n scid = toIntIfInt(format.substring(1, format.length));\n paused = true;\n }\n return {\n scid: scid,\n paused: paused\n };\n });\n });\n };\n })(parser);\n return parser;\n}\n\nvar writer;\nvar hasRequiredWriter;\nfunction requireWriter() {\n if (hasRequiredWriter) return writer;\n hasRequiredWriter = 1;\n var grammar = requireGrammar();\n\n // customized util.format - discards excess arguments and can void middle ones\n var formatRegExp = /%[sdv%]/g;\n var format = function (formatStr) {\n var i = 1;\n var args = arguments;\n var len = args.length;\n return formatStr.replace(formatRegExp, function (x) {\n if (i >= len) {\n return x; // missing argument\n }\n var arg = args[i];\n i += 1;\n switch (x) {\n case '%%':\n return '%';\n case '%s':\n return String(arg);\n case '%d':\n return Number(arg);\n case '%v':\n return '';\n }\n });\n // NB: we discard excess arguments - they are typically undefined from makeLine\n };\n var makeLine = function (type, obj, location) {\n var str = obj.format instanceof Function ? obj.format(obj.push ? location : location[obj.name]) : obj.format;\n var args = [type + '=' + str];\n if (obj.names) {\n for (var i = 0; i < obj.names.length; i += 1) {\n var n = obj.names[i];\n if (obj.name) {\n args.push(location[obj.name][n]);\n } else {\n // for mLine and push attributes\n args.push(location[obj.names[i]]);\n }\n }\n } else {\n args.push(location[obj.name]);\n }\n return format.apply(null, args);\n };\n\n // RFC specified order\n // TODO: extend this with all the rest\n var defaultOuterOrder = ['v', 'o', 's', 'i', 'u', 'e', 'p', 'c', 'b', 't', 'r', 'z', 'a'];\n var defaultInnerOrder = ['i', 'c', 'b', 'a'];\n writer = function (session, opts) {\n opts = opts || {};\n // ensure certain properties exist\n if (session.version == null) {\n session.version = 0; // 'v=0' must be there (only defined version atm)\n }\n if (session.name == null) {\n session.name = ' '; // 's= ' must be there if no meaningful name set\n }\n session.media.forEach(function (mLine) {\n if (mLine.payloads == null) {\n mLine.payloads = '';\n }\n });\n var outerOrder = opts.outerOrder || defaultOuterOrder;\n var innerOrder = opts.innerOrder || defaultInnerOrder;\n var sdp = [];\n\n // loop through outerOrder for matching properties on session\n outerOrder.forEach(function (type) {\n grammar[type].forEach(function (obj) {\n if (obj.name in session && session[obj.name] != null) {\n sdp.push(makeLine(type, obj, session));\n } else if (obj.push in session && session[obj.push] != null) {\n session[obj.push].forEach(function (el) {\n sdp.push(makeLine(type, obj, el));\n });\n }\n });\n });\n\n // then for each media line, follow the innerOrder\n session.media.forEach(function (mLine) {\n sdp.push(makeLine('m', grammar.m[0], mLine));\n innerOrder.forEach(function (type) {\n grammar[type].forEach(function (obj) {\n if (obj.name in mLine && mLine[obj.name] != null) {\n sdp.push(makeLine(type, obj, mLine));\n } else if (obj.push in mLine && mLine[obj.push] != null) {\n mLine[obj.push].forEach(function (el) {\n sdp.push(makeLine(type, obj, el));\n });\n }\n });\n });\n });\n return sdp.join('\\r\\n') + '\\r\\n';\n };\n return writer;\n}\n\nvar hasRequiredLib;\nfunction requireLib() {\n if (hasRequiredLib) return lib;\n hasRequiredLib = 1;\n var parser = requireParser();\n var writer = requireWriter();\n var grammar = requireGrammar();\n lib.grammar = grammar;\n lib.write = writer;\n lib.parse = parser.parse;\n lib.parseParams = parser.parseParams;\n lib.parseFmtpConfig = parser.parseFmtpConfig; // Alias of parseParams().\n lib.parsePayloads = parser.parsePayloads;\n lib.parseRemoteCandidates = parser.parseRemoteCandidates;\n lib.parseImageAttributes = parser.parseImageAttributes;\n lib.parseSimulcastStreamList = parser.parseSimulcastStreamList;\n return lib;\n}\n\nvar libExports = requireLib();\n\nfunction r(r, e, n) {\n var i, t, o;\n void 0 === e && (e = 50), void 0 === n && (n = {});\n var a = null != (i = n.isImmediate) && i,\n u = null != (t = n.callback) && t,\n c = n.maxWait,\n v = Date.now(),\n l = [];\n function f() {\n if (void 0 !== c) {\n var r = Date.now() - v;\n if (r + e >= c) return c - r;\n }\n return e;\n }\n var d = function () {\n var e = [].slice.call(arguments),\n n = this;\n return new Promise(function (i, t) {\n var c = a && void 0 === o;\n if (void 0 !== o && clearTimeout(o), o = setTimeout(function () {\n if (o = void 0, v = Date.now(), !a) {\n var i = r.apply(n, e);\n u && u(i), l.forEach(function (r) {\n return (0, r.resolve)(i);\n }), l = [];\n }\n }, f()), c) {\n var d = r.apply(n, e);\n return u && u(d), i(d);\n }\n l.push({\n resolve: i,\n reject: t\n });\n });\n };\n return d.cancel = function (r) {\n void 0 !== o && clearTimeout(o), l.forEach(function (e) {\n return (0, e.reject)(r);\n }), l = [];\n }, d;\n}\n\n/* The svc codec (av1/vp9) would use a very low bitrate at the begining and\nincrease slowly by the bandwidth estimator until it reach the target bitrate. The\nprocess commonly cost more than 10 seconds cause subscriber will get blur video at\nthe first few seconds. So we use a 70% of target bitrate here as the start bitrate to\neliminate this issue.\n*/\nconst startBitrateForSVC = 0.7;\nconst debounceInterval = 20;\nconst PCEvents = {\n NegotiationStarted: 'negotiationStarted',\n NegotiationComplete: 'negotiationComplete',\n RTPVideoPayloadTypes: 'rtpVideoPayloadTypes'\n};\n/** @internal */\nclass PCTransport extends eventsExports.EventEmitter {\n get pc() {\n if (!this._pc) {\n this._pc = this.createPC();\n }\n return this._pc;\n }\n constructor(config) {\n let loggerOptions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _a;\n super();\n this.log = livekitLogger;\n this.ddExtID = 0;\n this.latestOfferId = 0;\n this.pendingCandidates = [];\n this.restartingIce = false;\n this.renegotiate = false;\n this.trackBitrates = [];\n this.remoteStereoMids = [];\n this.remoteNackMids = [];\n // debounced negotiate interface\n this.negotiate = r(onError => __awaiter(this, void 0, void 0, function* () {\n this.emit(PCEvents.NegotiationStarted);\n try {\n yield this.createAndSendOffer();\n } catch (e) {\n if (onError) {\n onError(e);\n } else {\n throw e;\n }\n }\n }), debounceInterval);\n this.close = () => {\n if (!this._pc) {\n return;\n }\n this._pc.close();\n this._pc.onconnectionstatechange = null;\n this._pc.oniceconnectionstatechange = null;\n this._pc.onicegatheringstatechange = null;\n this._pc.ondatachannel = null;\n this._pc.onnegotiationneeded = null;\n this._pc.onsignalingstatechange = null;\n this._pc.onicecandidate = null;\n this._pc.ondatachannel = null;\n this._pc.ontrack = null;\n this._pc.onconnectionstatechange = null;\n this._pc.oniceconnectionstatechange = null;\n this._pc = null;\n };\n this.log = getLogger((_a = loggerOptions.loggerName) !== null && _a !== void 0 ? _a : LoggerNames.PCTransport);\n this.loggerOptions = loggerOptions;\n this.config = config;\n this._pc = this.createPC();\n this.offerLock = new _();\n }\n createPC() {\n const pc = new RTCPeerConnection(this.config);\n pc.onicecandidate = ev => {\n var _a;\n if (!ev.candidate) return;\n (_a = this.onIceCandidate) === null || _a === void 0 ? void 0 : _a.call(this, ev.candidate);\n };\n pc.onicecandidateerror = ev => {\n var _a;\n (_a = this.onIceCandidateError) === null || _a === void 0 ? void 0 : _a.call(this, ev);\n };\n pc.oniceconnectionstatechange = () => {\n var _a;\n (_a = this.onIceConnectionStateChange) === null || _a === void 0 ? void 0 : _a.call(this, pc.iceConnectionState);\n };\n pc.onsignalingstatechange = () => {\n var _a;\n (_a = this.onSignalingStatechange) === null || _a === void 0 ? void 0 : _a.call(this, pc.signalingState);\n };\n pc.onconnectionstatechange = () => {\n var _a;\n (_a = this.onConnectionStateChange) === null || _a === void 0 ? void 0 : _a.call(this, pc.connectionState);\n };\n pc.ondatachannel = ev => {\n var _a;\n (_a = this.onDataChannel) === null || _a === void 0 ? void 0 : _a.call(this, ev);\n };\n pc.ontrack = ev => {\n var _a;\n (_a = this.onTrack) === null || _a === void 0 ? void 0 : _a.call(this, ev);\n };\n return pc;\n }\n get logContext() {\n var _a, _b;\n return Object.assign({}, (_b = (_a = this.loggerOptions).loggerContextCb) === null || _b === void 0 ? void 0 : _b.call(_a));\n }\n get isICEConnected() {\n return this._pc !== null && (this.pc.iceConnectionState === 'connected' || this.pc.iceConnectionState === 'completed');\n }\n addIceCandidate(candidate) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.pc.remoteDescription && !this.restartingIce) {\n return this.pc.addIceCandidate(candidate);\n }\n this.pendingCandidates.push(candidate);\n });\n }\n setRemoteDescription(sd, offerId) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (sd.type === 'answer' && this.latestOfferId > 0 && offerId > 0 && offerId !== this.latestOfferId) {\n this.log.warn('ignoring answer for old offer', Object.assign(Object.assign({}, this.logContext), {\n offerId,\n latestOfferId: this.latestOfferId\n }));\n return false;\n }\n let mungedSDP = undefined;\n if (sd.type === 'offer') {\n let {\n stereoMids,\n nackMids\n } = extractStereoAndNackAudioFromOffer(sd);\n this.remoteStereoMids = stereoMids;\n this.remoteNackMids = nackMids;\n } else if (sd.type === 'answer') {\n const sdpParsed = libExports.parse((_a = sd.sdp) !== null && _a !== void 0 ? _a : '');\n sdpParsed.media.forEach(media => {\n if (media.type === 'audio') {\n // mung sdp for opus bitrate settings\n this.trackBitrates.some(trackbr => {\n if (!trackbr.transceiver || media.mid != trackbr.transceiver.mid) {\n return false;\n }\n let codecPayload = 0;\n media.rtp.some(rtp => {\n if (rtp.codec.toUpperCase() === trackbr.codec.toUpperCase()) {\n codecPayload = rtp.payload;\n return true;\n }\n return false;\n });\n if (codecPayload === 0) {\n return true;\n }\n let fmtpFound = false;\n for (const fmtp of media.fmtp) {\n if (fmtp.payload === codecPayload) {\n fmtp.config = fmtp.config.split(';').filter(attr => !attr.includes('maxaveragebitrate')).join(';');\n if (trackbr.maxbr > 0) {\n fmtp.config += \";maxaveragebitrate=\".concat(trackbr.maxbr * 1000);\n }\n fmtpFound = true;\n break;\n }\n }\n if (!fmtpFound) {\n if (trackbr.maxbr > 0) {\n media.fmtp.push({\n payload: codecPayload,\n config: \"maxaveragebitrate=\".concat(trackbr.maxbr * 1000)\n });\n }\n }\n return true;\n });\n }\n });\n mungedSDP = libExports.write(sdpParsed);\n }\n yield this.setMungedSDP(sd, mungedSDP, true);\n this.pendingCandidates.forEach(candidate => {\n this.pc.addIceCandidate(candidate);\n });\n this.pendingCandidates = [];\n this.restartingIce = false;\n if (this.renegotiate) {\n this.renegotiate = false;\n yield this.createAndSendOffer();\n } else if (sd.type === 'answer') {\n this.emit(PCEvents.NegotiationComplete);\n if (sd.sdp) {\n const sdpParsed = libExports.parse(sd.sdp);\n sdpParsed.media.forEach(media => {\n if (media.type === 'video') {\n this.emit(PCEvents.RTPVideoPayloadTypes, media.rtp);\n }\n });\n }\n }\n return true;\n });\n }\n createAndSendOffer(options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const unlock = yield this.offerLock.lock();\n try {\n if (this.onOffer === undefined) {\n return;\n }\n if (options === null || options === void 0 ? void 0 : options.iceRestart) {\n this.log.debug('restarting ICE', this.logContext);\n this.restartingIce = true;\n }\n if (this._pc && this._pc.signalingState === 'have-local-offer') {\n // we're waiting for the peer to accept our offer, so we'll just wait\n // the only exception to this is when ICE restart is needed\n const currentSD = this._pc.remoteDescription;\n if ((options === null || options === void 0 ? void 0 : options.iceRestart) && currentSD) {\n // TODO: handle when ICE restart is needed but we don't have a remote description\n // the best thing to do is to recreate the peerconnection\n yield this._pc.setRemoteDescription(currentSD);\n } else {\n this.renegotiate = true;\n return;\n }\n } else if (!this._pc || this._pc.signalingState === 'closed') {\n this.log.warn('could not createOffer with closed peer connection', this.logContext);\n return;\n }\n // actually negotiate\n this.log.debug('starting to negotiate', this.logContext);\n // increase the offer id at the start to ensure the offer is always > 0 so that we can use 0 as a default value for legacy behavior\n const offerId = this.latestOfferId + 1;\n this.latestOfferId = offerId;\n const offer = yield this.pc.createOffer(options);\n this.log.debug('original offer', Object.assign({\n sdp: offer.sdp\n }, this.logContext));\n const sdpParsed = libExports.parse((_a = offer.sdp) !== null && _a !== void 0 ? _a : '');\n sdpParsed.media.forEach(media => {\n ensureIPAddrMatchVersion(media);\n if (media.type === 'audio') {\n ensureAudioNackAndStereo(media, [], []);\n } else if (media.type === 'video') {\n this.trackBitrates.some(trackbr => {\n if (!media.msid || !trackbr.cid || !media.msid.includes(trackbr.cid)) {\n return false;\n }\n let codecPayload = 0;\n media.rtp.some(rtp => {\n if (rtp.codec.toUpperCase() === trackbr.codec.toUpperCase()) {\n codecPayload = rtp.payload;\n return true;\n }\n return false;\n });\n if (codecPayload === 0) {\n return true;\n }\n if (isSVCCodec(trackbr.codec) && !isSafari()) {\n this.ensureVideoDDExtensionForSVC(media, sdpParsed);\n }\n // TODO: av1 slow starting issue already fixed in chrome 124, clean this after some versions\n // mung sdp for av1 bitrate setting that can't apply by sendEncoding\n if (trackbr.codec !== 'av1') {\n return true;\n }\n const startBitrate = Math.round(trackbr.maxbr * startBitrateForSVC);\n for (const fmtp of media.fmtp) {\n if (fmtp.payload === codecPayload) {\n // if another track's fmtp already is set, we cannot override the bitrate\n // this has the unfortunate consequence of being forced to use the\n // initial track's bitrate for all tracks\n if (!fmtp.config.includes('x-google-start-bitrate')) {\n fmtp.config += \";x-google-start-bitrate=\".concat(startBitrate);\n }\n break;\n }\n }\n return true;\n });\n }\n });\n if (this.latestOfferId > offerId) {\n this.log.warn('latestOfferId mismatch', Object.assign(Object.assign({}, this.logContext), {\n latestOfferId: this.latestOfferId,\n offerId\n }));\n return;\n }\n yield this.setMungedSDP(offer, libExports.write(sdpParsed));\n this.onOffer(offer, this.latestOfferId);\n } finally {\n unlock();\n }\n });\n }\n createAndSetAnswer() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const answer = yield this.pc.createAnswer();\n const sdpParsed = libExports.parse((_a = answer.sdp) !== null && _a !== void 0 ? _a : '');\n sdpParsed.media.forEach(media => {\n ensureIPAddrMatchVersion(media);\n if (media.type === 'audio') {\n ensureAudioNackAndStereo(media, this.remoteStereoMids, this.remoteNackMids);\n }\n });\n yield this.setMungedSDP(answer, libExports.write(sdpParsed));\n return answer;\n });\n }\n createDataChannel(label, dataChannelDict) {\n return this.pc.createDataChannel(label, dataChannelDict);\n }\n addTransceiver(mediaStreamTrack, transceiverInit) {\n return this.pc.addTransceiver(mediaStreamTrack, transceiverInit);\n }\n addTrack(track) {\n if (!this._pc) {\n throw new UnexpectedConnectionState('PC closed, cannot add track');\n }\n return this._pc.addTrack(track);\n }\n setTrackCodecBitrate(info) {\n this.trackBitrates.push(info);\n }\n setConfiguration(rtcConfig) {\n var _a;\n if (!this._pc) {\n throw new UnexpectedConnectionState('PC closed, cannot configure');\n }\n return (_a = this._pc) === null || _a === void 0 ? void 0 : _a.setConfiguration(rtcConfig);\n }\n canRemoveTrack() {\n var _a;\n return !!((_a = this._pc) === null || _a === void 0 ? void 0 : _a.removeTrack);\n }\n removeTrack(sender) {\n var _a;\n return (_a = this._pc) === null || _a === void 0 ? void 0 : _a.removeTrack(sender);\n }\n getConnectionState() {\n var _a, _b;\n return (_b = (_a = this._pc) === null || _a === void 0 ? void 0 : _a.connectionState) !== null && _b !== void 0 ? _b : 'closed';\n }\n getICEConnectionState() {\n var _a, _b;\n return (_b = (_a = this._pc) === null || _a === void 0 ? void 0 : _a.iceConnectionState) !== null && _b !== void 0 ? _b : 'closed';\n }\n getSignallingState() {\n var _a, _b;\n return (_b = (_a = this._pc) === null || _a === void 0 ? void 0 : _a.signalingState) !== null && _b !== void 0 ? _b : 'closed';\n }\n getTransceivers() {\n var _a, _b;\n return (_b = (_a = this._pc) === null || _a === void 0 ? void 0 : _a.getTransceivers()) !== null && _b !== void 0 ? _b : [];\n }\n getSenders() {\n var _a, _b;\n return (_b = (_a = this._pc) === null || _a === void 0 ? void 0 : _a.getSenders()) !== null && _b !== void 0 ? _b : [];\n }\n getLocalDescription() {\n var _a;\n return (_a = this._pc) === null || _a === void 0 ? void 0 : _a.localDescription;\n }\n getRemoteDescription() {\n var _a;\n return (_a = this.pc) === null || _a === void 0 ? void 0 : _a.remoteDescription;\n }\n getStats() {\n return this.pc.getStats();\n }\n getConnectedAddress() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (!this._pc) {\n return;\n }\n let selectedCandidatePairId = '';\n const candidatePairs = new Map();\n // id -> candidate ip\n const candidates = new Map();\n const stats = yield this._pc.getStats();\n stats.forEach(v => {\n switch (v.type) {\n case 'transport':\n selectedCandidatePairId = v.selectedCandidatePairId;\n break;\n case 'candidate-pair':\n if (selectedCandidatePairId === '' && v.selected) {\n selectedCandidatePairId = v.id;\n }\n candidatePairs.set(v.id, v);\n break;\n case 'remote-candidate':\n candidates.set(v.id, \"\".concat(v.address, \":\").concat(v.port));\n break;\n }\n });\n if (selectedCandidatePairId === '') {\n return undefined;\n }\n const selectedID = (_a = candidatePairs.get(selectedCandidatePairId)) === null || _a === void 0 ? void 0 : _a.remoteCandidateId;\n if (selectedID === undefined) {\n return undefined;\n }\n return candidates.get(selectedID);\n });\n }\n setMungedSDP(sd, munged, remote) {\n return __awaiter(this, void 0, void 0, function* () {\n if (munged) {\n const originalSdp = sd.sdp;\n sd.sdp = munged;\n try {\n this.log.debug(\"setting munged \".concat(remote ? 'remote' : 'local', \" description\"), this.logContext);\n if (remote) {\n yield this.pc.setRemoteDescription(sd);\n } else {\n yield this.pc.setLocalDescription(sd);\n }\n return;\n } catch (e) {\n this.log.warn(\"not able to set \".concat(sd.type, \", falling back to unmodified sdp\"), Object.assign(Object.assign({}, this.logContext), {\n error: e,\n sdp: munged\n }));\n sd.sdp = originalSdp;\n }\n }\n try {\n if (remote) {\n yield this.pc.setRemoteDescription(sd);\n } else {\n yield this.pc.setLocalDescription(sd);\n }\n } catch (e) {\n let msg = 'unknown error';\n if (e instanceof Error) {\n msg = e.message;\n } else if (typeof e === 'string') {\n msg = e;\n }\n const fields = {\n error: msg,\n sdp: sd.sdp\n };\n if (!remote && this.pc.remoteDescription) {\n fields.remoteSdp = this.pc.remoteDescription;\n }\n this.log.error(\"unable to set \".concat(sd.type), Object.assign(Object.assign({}, this.logContext), {\n fields\n }));\n throw new NegotiationError(msg);\n }\n });\n }\n ensureVideoDDExtensionForSVC(media, sdp) {\n var _a, _b;\n const ddFound = (_a = media.ext) === null || _a === void 0 ? void 0 : _a.some(ext => {\n if (ext.uri === ddExtensionURI) {\n return true;\n }\n return false;\n });\n if (!ddFound) {\n if (this.ddExtID === 0) {\n let maxID = 0;\n sdp.media.forEach(m => {\n var _a;\n if (m.type !== 'video') {\n return;\n }\n (_a = m.ext) === null || _a === void 0 ? void 0 : _a.forEach(ext => {\n if (ext.value > maxID) {\n maxID = ext.value;\n }\n });\n });\n this.ddExtID = maxID + 1;\n }\n (_b = media.ext) === null || _b === void 0 ? void 0 : _b.push({\n value: this.ddExtID,\n uri: ddExtensionURI\n });\n }\n }\n}\nfunction ensureAudioNackAndStereo(media, stereoMids, nackMids) {\n // found opus codec to add nack fb\n let opusPayload = 0;\n media.rtp.some(rtp => {\n if (rtp.codec === 'opus') {\n opusPayload = rtp.payload;\n return true;\n }\n return false;\n });\n // add nack rtcpfb if not exist\n if (opusPayload > 0) {\n if (!media.rtcpFb) {\n media.rtcpFb = [];\n }\n if (nackMids.includes(media.mid) && !media.rtcpFb.some(fb => fb.payload === opusPayload && fb.type === 'nack')) {\n media.rtcpFb.push({\n payload: opusPayload,\n type: 'nack'\n });\n }\n if (stereoMids.includes(media.mid)) {\n media.fmtp.some(fmtp => {\n if (fmtp.payload === opusPayload) {\n if (!fmtp.config.includes('stereo=1')) {\n fmtp.config += ';stereo=1';\n }\n return true;\n }\n return false;\n });\n }\n }\n}\nfunction extractStereoAndNackAudioFromOffer(offer) {\n var _a;\n const stereoMids = [];\n const nackMids = [];\n const sdpParsed = libExports.parse((_a = offer.sdp) !== null && _a !== void 0 ? _a : '');\n let opusPayload = 0;\n sdpParsed.media.forEach(media => {\n var _a;\n if (media.type === 'audio') {\n media.rtp.some(rtp => {\n if (rtp.codec === 'opus') {\n opusPayload = rtp.payload;\n return true;\n }\n return false;\n });\n if ((_a = media.rtcpFb) === null || _a === void 0 ? void 0 : _a.some(fb => fb.payload === opusPayload && fb.type === 'nack')) {\n nackMids.push(media.mid);\n }\n media.fmtp.some(fmtp => {\n if (fmtp.payload === opusPayload) {\n if (fmtp.config.includes('sprop-stereo=1')) {\n stereoMids.push(media.mid);\n }\n return true;\n }\n return false;\n });\n }\n });\n return {\n stereoMids,\n nackMids\n };\n}\nfunction ensureIPAddrMatchVersion(media) {\n // Chrome could generate sdp with c = IN IP4 <ipv6 addr>\n // in edge case and return error when set sdp.This is not a\n // sdk error but correct it if the issue detected.\n if (media.connection) {\n const isV6 = media.connection.ip.indexOf(':') >= 0;\n if (media.connection.version === 4 && isV6 || media.connection.version === 6 && !isV6) {\n // fallback to dummy address\n media.connection.ip = '0.0.0.0';\n media.connection.version = 4;\n }\n }\n}\n\nconst defaultVideoCodec = 'vp8';\nconst publishDefaults = {\n audioPreset: AudioPresets.music,\n dtx: true,\n red: true,\n forceStereo: false,\n simulcast: true,\n screenShareEncoding: ScreenSharePresets.h1080fps15.encoding,\n stopMicTrackOnMute: false,\n videoCodec: defaultVideoCodec,\n backupCodec: true,\n preConnectBuffer: false\n};\nconst audioDefaults = {\n deviceId: {\n ideal: 'default'\n },\n autoGainControl: true,\n echoCancellation: true,\n noiseSuppression: true,\n voiceIsolation: true\n};\nconst videoDefaults = {\n deviceId: {\n ideal: 'default'\n },\n resolution: VideoPresets.h720.resolution\n};\nconst roomOptionDefaults = {\n adaptiveStream: false,\n dynacast: false,\n stopLocalTrackOnUnpublish: true,\n reconnectPolicy: new DefaultReconnectPolicy(),\n disconnectOnPageLeave: true,\n webAudioMix: false\n};\nconst roomConnectOptionDefaults = {\n autoSubscribe: true,\n maxRetries: 1,\n peerConnectionTimeout: 15000,\n websocketTimeout: 15000\n};\n\nvar PCTransportState;\n(function (PCTransportState) {\n PCTransportState[PCTransportState[\"NEW\"] = 0] = \"NEW\";\n PCTransportState[PCTransportState[\"CONNECTING\"] = 1] = \"CONNECTING\";\n PCTransportState[PCTransportState[\"CONNECTED\"] = 2] = \"CONNECTED\";\n PCTransportState[PCTransportState[\"FAILED\"] = 3] = \"FAILED\";\n PCTransportState[PCTransportState[\"CLOSING\"] = 4] = \"CLOSING\";\n PCTransportState[PCTransportState[\"CLOSED\"] = 5] = \"CLOSED\";\n})(PCTransportState || (PCTransportState = {}));\nclass PCTransportManager {\n get needsPublisher() {\n return this.isPublisherConnectionRequired;\n }\n get needsSubscriber() {\n return this.isSubscriberConnectionRequired;\n }\n get currentState() {\n return this.state;\n }\n constructor(rtcConfig, subscriberPrimary, loggerOptions) {\n var _a;\n this.peerConnectionTimeout = roomConnectOptionDefaults.peerConnectionTimeout;\n this.log = livekitLogger;\n this.updateState = () => {\n var _a;\n const previousState = this.state;\n const connectionStates = this.requiredTransports.map(tr => tr.getConnectionState());\n if (connectionStates.every(st => st === 'connected')) {\n this.state = PCTransportState.CONNECTED;\n } else if (connectionStates.some(st => st === 'failed')) {\n this.state = PCTransportState.FAILED;\n } else if (connectionStates.some(st => st === 'connecting')) {\n this.state = PCTransportState.CONNECTING;\n } else if (connectionStates.every(st => st === 'closed')) {\n this.state = PCTransportState.CLOSED;\n } else if (connectionStates.some(st => st === 'closed')) {\n this.state = PCTransportState.CLOSING;\n } else if (connectionStates.every(st => st === 'new')) {\n this.state = PCTransportState.NEW;\n }\n if (previousState !== this.state) {\n this.log.debug(\"pc state change: from \".concat(PCTransportState[previousState], \" to \").concat(PCTransportState[this.state]), this.logContext);\n (_a = this.onStateChange) === null || _a === void 0 ? void 0 : _a.call(this, this.state, this.publisher.getConnectionState(), this.subscriber.getConnectionState());\n }\n };\n this.log = getLogger((_a = loggerOptions.loggerName) !== null && _a !== void 0 ? _a : LoggerNames.PCManager);\n this.loggerOptions = loggerOptions;\n this.isPublisherConnectionRequired = !subscriberPrimary;\n this.isSubscriberConnectionRequired = subscriberPrimary;\n this.publisher = new PCTransport(rtcConfig, loggerOptions);\n this.subscriber = new PCTransport(rtcConfig, loggerOptions);\n this.publisher.onConnectionStateChange = this.updateState;\n this.subscriber.onConnectionStateChange = this.updateState;\n this.publisher.onIceConnectionStateChange = this.updateState;\n this.subscriber.onIceConnectionStateChange = this.updateState;\n this.publisher.onSignalingStatechange = this.updateState;\n this.subscriber.onSignalingStatechange = this.updateState;\n this.publisher.onIceCandidate = candidate => {\n var _a;\n (_a = this.onIceCandidate) === null || _a === void 0 ? void 0 : _a.call(this, candidate, SignalTarget.PUBLISHER);\n };\n this.subscriber.onIceCandidate = candidate => {\n var _a;\n (_a = this.onIceCandidate) === null || _a === void 0 ? void 0 : _a.call(this, candidate, SignalTarget.SUBSCRIBER);\n };\n // in subscriber primary mode, server side opens sub data channels.\n this.subscriber.onDataChannel = ev => {\n var _a;\n (_a = this.onDataChannel) === null || _a === void 0 ? void 0 : _a.call(this, ev);\n };\n this.subscriber.onTrack = ev => {\n var _a;\n (_a = this.onTrack) === null || _a === void 0 ? void 0 : _a.call(this, ev);\n };\n this.publisher.onOffer = (offer, offerId) => {\n var _a;\n (_a = this.onPublisherOffer) === null || _a === void 0 ? void 0 : _a.call(this, offer, offerId);\n };\n this.state = PCTransportState.NEW;\n this.connectionLock = new _();\n this.remoteOfferLock = new _();\n }\n get logContext() {\n var _a, _b;\n return Object.assign({}, (_b = (_a = this.loggerOptions).loggerContextCb) === null || _b === void 0 ? void 0 : _b.call(_a));\n }\n requirePublisher() {\n let require = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n this.isPublisherConnectionRequired = require;\n this.updateState();\n }\n requireSubscriber() {\n let require = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n this.isSubscriberConnectionRequired = require;\n this.updateState();\n }\n createAndSendPublisherOffer(options) {\n return this.publisher.createAndSendOffer(options);\n }\n setPublisherAnswer(sd, offerId) {\n return this.publisher.setRemoteDescription(sd, offerId);\n }\n removeTrack(sender) {\n return this.publisher.removeTrack(sender);\n }\n close() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.publisher && this.publisher.getSignallingState() !== 'closed') {\n const publisher = this.publisher;\n for (const sender of publisher.getSenders()) {\n try {\n // TODO: react-native-webrtc doesn't have removeTrack yet.\n if (publisher.canRemoveTrack()) {\n publisher.removeTrack(sender);\n }\n } catch (e) {\n this.log.warn('could not removeTrack', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n }\n }\n }\n yield Promise.all([this.publisher.close(), this.subscriber.close()]);\n this.updateState();\n });\n }\n triggerIceRestart() {\n return __awaiter(this, void 0, void 0, function* () {\n this.subscriber.restartingIce = true;\n // only restart publisher if it's needed\n if (this.needsPublisher) {\n yield this.createAndSendPublisherOffer({\n iceRestart: true\n });\n }\n });\n }\n addIceCandidate(candidate, target) {\n return __awaiter(this, void 0, void 0, function* () {\n if (target === SignalTarget.PUBLISHER) {\n yield this.publisher.addIceCandidate(candidate);\n } else {\n yield this.subscriber.addIceCandidate(candidate);\n }\n });\n }\n createSubscriberAnswerFromOffer(sd, offerId) {\n return __awaiter(this, void 0, void 0, function* () {\n this.log.debug('received server offer', Object.assign(Object.assign({}, this.logContext), {\n RTCSdpType: sd.type,\n sdp: sd.sdp,\n signalingState: this.subscriber.getSignallingState().toString()\n }));\n const unlock = yield this.remoteOfferLock.lock();\n try {\n const success = yield this.subscriber.setRemoteDescription(sd, offerId);\n if (!success) {\n return undefined;\n }\n // answer the offer\n const answer = yield this.subscriber.createAndSetAnswer();\n return answer;\n } finally {\n unlock();\n }\n });\n }\n updateConfiguration(config, iceRestart) {\n this.publisher.setConfiguration(config);\n this.subscriber.setConfiguration(config);\n if (iceRestart) {\n this.triggerIceRestart();\n }\n }\n ensurePCTransportConnection(abortController, timeout) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const unlock = yield this.connectionLock.lock();\n try {\n if (this.isPublisherConnectionRequired && this.publisher.getConnectionState() !== 'connected' && this.publisher.getConnectionState() !== 'connecting') {\n this.log.debug('negotiation required, start negotiating', this.logContext);\n this.publisher.negotiate();\n }\n yield Promise.all((_a = this.requiredTransports) === null || _a === void 0 ? void 0 : _a.map(transport => this.ensureTransportConnected(transport, abortController, timeout)));\n } finally {\n unlock();\n }\n });\n }\n negotiate(abortController) {\n return __awaiter(this, void 0, void 0, function* () {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n const negotiationTimeout = setTimeout(() => {\n reject('negotiation timed out');\n }, this.peerConnectionTimeout);\n const abortHandler = () => {\n clearTimeout(negotiationTimeout);\n reject('negotiation aborted');\n };\n abortController.signal.addEventListener('abort', abortHandler);\n this.publisher.once(PCEvents.NegotiationStarted, () => {\n if (abortController.signal.aborted) {\n return;\n }\n this.publisher.once(PCEvents.NegotiationComplete, () => {\n clearTimeout(negotiationTimeout);\n resolve();\n });\n });\n yield this.publisher.negotiate(e => {\n clearTimeout(negotiationTimeout);\n reject(e);\n });\n }));\n });\n }\n addPublisherTransceiver(track, transceiverInit) {\n return this.publisher.addTransceiver(track, transceiverInit);\n }\n addPublisherTrack(track) {\n return this.publisher.addTrack(track);\n }\n createPublisherDataChannel(label, dataChannelDict) {\n return this.publisher.createDataChannel(label, dataChannelDict);\n }\n /**\n * Returns the first required transport's address if no explicit target is specified\n */\n getConnectedAddress(target) {\n if (target === SignalTarget.PUBLISHER) {\n return this.publisher.getConnectedAddress();\n } else if (target === SignalTarget.SUBSCRIBER) {\n return this.publisher.getConnectedAddress();\n }\n return this.requiredTransports[0].getConnectedAddress();\n }\n get requiredTransports() {\n const transports = [];\n if (this.isPublisherConnectionRequired) {\n transports.push(this.publisher);\n }\n if (this.isSubscriberConnectionRequired) {\n transports.push(this.subscriber);\n }\n return transports;\n }\n ensureTransportConnected(pcTransport_1, abortController_1) {\n return __awaiter(this, arguments, void 0, function (pcTransport, abortController) {\n var _this = this;\n let timeout = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : this.peerConnectionTimeout;\n return function* () {\n const connectionState = pcTransport.getConnectionState();\n if (connectionState === 'connected') {\n return;\n }\n return new Promise((resolve, reject) => __awaiter(_this, void 0, void 0, function* () {\n const abortHandler = () => {\n this.log.warn('abort transport connection', this.logContext);\n CriticalTimers.clearTimeout(connectTimeout);\n reject(new ConnectionError('room connection has been cancelled', ConnectionErrorReason.Cancelled));\n };\n if (abortController === null || abortController === void 0 ? void 0 : abortController.signal.aborted) {\n abortHandler();\n }\n abortController === null || abortController === void 0 ? void 0 : abortController.signal.addEventListener('abort', abortHandler);\n const connectTimeout = CriticalTimers.setTimeout(() => {\n abortController === null || abortController === void 0 ? void 0 : abortController.signal.removeEventListener('abort', abortHandler);\n reject(new ConnectionError('could not establish pc connection', ConnectionErrorReason.InternalError));\n }, timeout);\n while (this.state !== PCTransportState.CONNECTED) {\n yield sleep(50); // FIXME we shouldn't rely on `sleep` in the connection paths, as it invokes `setTimeout` which can be drastically throttled by browser implementations\n if (abortController === null || abortController === void 0 ? void 0 : abortController.signal.aborted) {\n reject(new ConnectionError('room connection has been cancelled', ConnectionErrorReason.Cancelled));\n return;\n }\n }\n CriticalTimers.clearTimeout(connectTimeout);\n abortController === null || abortController === void 0 ? void 0 : abortController.signal.removeEventListener('abort', abortHandler);\n resolve();\n }));\n }();\n });\n }\n}\n\n// SPDX-FileCopyrightText: 2024 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\n/**\n * Specialized error handling for RPC methods.\n *\n * Instances of this type, when thrown in a method handler, will have their `message`\n * serialized and sent across the wire. The sender will receive an equivalent error on the other side.\n *\n * Built-in types are included but developers may use any string, with a max length of 256 bytes.\n */\nclass RpcError extends Error {\n /**\n * Creates an error object with the given code and message, plus an optional data payload.\n *\n * If thrown in an RPC method handler, the error will be sent back to the caller.\n *\n * Error codes 1001-1999 are reserved for built-in errors (see RpcError.ErrorCode for their meanings).\n */\n constructor(code, message, data) {\n super(message);\n this.code = code;\n this.message = truncateBytes(message, RpcError.MAX_MESSAGE_BYTES);\n this.data = data ? truncateBytes(data, RpcError.MAX_DATA_BYTES) : undefined;\n }\n /**\n * @internal\n */\n static fromProto(proto) {\n return new RpcError(proto.code, proto.message, proto.data);\n }\n /**\n * @internal\n */\n toProto() {\n return new RpcError$1({\n code: this.code,\n message: this.message,\n data: this.data\n });\n }\n /**\n * Creates an error object from the code, with an auto-populated message.\n *\n * @internal\n */\n static builtIn(key, data) {\n return new RpcError(RpcError.ErrorCode[key], RpcError.ErrorMessage[key], data);\n }\n}\nRpcError.MAX_MESSAGE_BYTES = 256;\nRpcError.MAX_DATA_BYTES = 15360; // 15 KB\nRpcError.ErrorCode = {\n APPLICATION_ERROR: 1500,\n CONNECTION_TIMEOUT: 1501,\n RESPONSE_TIMEOUT: 1502,\n RECIPIENT_DISCONNECTED: 1503,\n RESPONSE_PAYLOAD_TOO_LARGE: 1504,\n SEND_FAILED: 1505,\n UNSUPPORTED_METHOD: 1400,\n RECIPIENT_NOT_FOUND: 1401,\n REQUEST_PAYLOAD_TOO_LARGE: 1402,\n UNSUPPORTED_SERVER: 1403,\n UNSUPPORTED_VERSION: 1404\n};\n/**\n * @internal\n */\nRpcError.ErrorMessage = {\n APPLICATION_ERROR: 'Application error in method handler',\n CONNECTION_TIMEOUT: 'Connection timeout',\n RESPONSE_TIMEOUT: 'Response timeout',\n RECIPIENT_DISCONNECTED: 'Recipient disconnected',\n RESPONSE_PAYLOAD_TOO_LARGE: 'Response payload too large',\n SEND_FAILED: 'Failed to send',\n UNSUPPORTED_METHOD: 'Method not supported at destination',\n RECIPIENT_NOT_FOUND: 'Recipient not found',\n REQUEST_PAYLOAD_TOO_LARGE: 'Request payload too large',\n UNSUPPORTED_SERVER: 'RPC not supported by server',\n UNSUPPORTED_VERSION: 'Unsupported RPC version'\n};\n/*\n * Maximum payload size for RPC requests and responses. If a payload exceeds this size,\n * the RPC call will fail with a REQUEST_PAYLOAD_TOO_LARGE(1402) or RESPONSE_PAYLOAD_TOO_LARGE(1504) error.\n */\nconst MAX_PAYLOAD_BYTES = 15360; // 15 KB\n/**\n * @internal\n */\nfunction byteLength(str) {\n const encoder = new TextEncoder();\n return encoder.encode(str).length;\n}\n/**\n * @internal\n */\nfunction truncateBytes(str, maxBytes) {\n if (byteLength(str) <= maxBytes) {\n return str;\n }\n let low = 0;\n let high = str.length;\n const encoder = new TextEncoder();\n while (low < high) {\n const mid = Math.floor((low + high + 1) / 2);\n if (encoder.encode(str.slice(0, mid)).length <= maxBytes) {\n low = mid;\n } else {\n high = mid - 1;\n }\n }\n return str.slice(0, low);\n}\n\nconst monitorFrequency = 2000;\nfunction computeBitrate(currentStats, prevStats) {\n if (!prevStats) {\n return 0;\n }\n let bytesNow;\n let bytesPrev;\n if ('bytesReceived' in currentStats) {\n bytesNow = currentStats.bytesReceived;\n bytesPrev = prevStats.bytesReceived;\n } else if ('bytesSent' in currentStats) {\n bytesNow = currentStats.bytesSent;\n bytesPrev = prevStats.bytesSent;\n }\n if (bytesNow === undefined || bytesPrev === undefined || currentStats.timestamp === undefined || prevStats.timestamp === undefined) {\n return 0;\n }\n return (bytesNow - bytesPrev) * 8 * 1000 / (currentStats.timestamp - prevStats.timestamp);\n}\n\n// Check if MediaRecorder is available\nconst isMediaRecorderAvailable = typeof MediaRecorder !== 'undefined';\n// Fallback class for environments without MediaRecorder\nclass FallbackRecorder {\n constructor() {\n throw new Error('MediaRecorder is not available in this environment');\n }\n}\n// Use conditional inheritance to avoid parse-time errors\nconst RecorderBase = isMediaRecorderAvailable ? MediaRecorder : FallbackRecorder;\nclass LocalTrackRecorder extends RecorderBase {\n constructor(track, options) {\n if (!isMediaRecorderAvailable) {\n throw new Error('MediaRecorder is not available in this environment');\n }\n super(new MediaStream([track.mediaStreamTrack]), options);\n let dataListener;\n let streamController;\n const isClosed = () => streamController === undefined;\n const onStop = () => {\n this.removeEventListener('dataavailable', dataListener);\n this.removeEventListener('stop', onStop);\n this.removeEventListener('error', onError);\n streamController === null || streamController === void 0 ? void 0 : streamController.close();\n streamController = undefined;\n };\n const onError = event => {\n streamController === null || streamController === void 0 ? void 0 : streamController.error(event);\n this.removeEventListener('dataavailable', dataListener);\n this.removeEventListener('stop', onStop);\n this.removeEventListener('error', onError);\n streamController = undefined;\n };\n this.byteStream = new ReadableStream({\n start: controller => {\n streamController = controller;\n dataListener = event => __awaiter(this, void 0, void 0, function* () {\n let data;\n if (event.data.arrayBuffer) {\n const arrayBuffer = yield event.data.arrayBuffer();\n data = new Uint8Array(arrayBuffer);\n // @ts-expect-error react-native passes over Uint8Arrays directly\n } else if (event.data.byteArray) {\n // @ts-expect-error\n data = event.data.byteArray;\n } else {\n throw new Error('no data available!');\n }\n if (isClosed()) {\n return;\n }\n controller.enqueue(data);\n });\n this.addEventListener('dataavailable', dataListener);\n },\n cancel: () => {\n onStop();\n }\n });\n this.addEventListener('stop', onStop);\n this.addEventListener('error', onError);\n }\n}\n// Helper function to check if recording is supported\nfunction isRecordingSupported() {\n return isMediaRecorderAvailable;\n}\n\nconst DEFAULT_DIMENSIONS_TIMEOUT = 1000;\nconst PRE_CONNECT_BUFFER_TIMEOUT = 10000;\nclass LocalTrack extends Track {\n /** @internal */\n get sender() {\n return this._sender;\n }\n /** @internal */\n set sender(sender) {\n this._sender = sender;\n }\n get constraints() {\n return this._constraints;\n }\n get hasPreConnectBuffer() {\n return !!this.localTrackRecorder;\n }\n /**\n *\n * @param mediaTrack\n * @param kind\n * @param constraints MediaTrackConstraints that are being used when restarting or reacquiring tracks\n * @param userProvidedTrack Signals to the SDK whether or not the mediaTrack should be managed (i.e. released and reacquired) internally by the SDK\n */\n constructor(mediaTrack, kind, constraints) {\n let userProvidedTrack = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n let loggerOptions = arguments.length > 4 ? arguments[4] : undefined;\n super(mediaTrack, kind, loggerOptions);\n this.manuallyStopped = false;\n this._isUpstreamPaused = false;\n this.handleTrackMuteEvent = () => this.debouncedTrackMuteHandler().catch(() => this.log.debug('track mute bounce got cancelled by an unmute event', this.logContext));\n this.debouncedTrackMuteHandler = r(() => __awaiter(this, void 0, void 0, function* () {\n yield this.pauseUpstream();\n }), 5000);\n this.handleTrackUnmuteEvent = () => __awaiter(this, void 0, void 0, function* () {\n this.debouncedTrackMuteHandler.cancel('unmute');\n yield this.resumeUpstream();\n });\n this.handleEnded = () => {\n if (this.isInBackground) {\n this.reacquireTrack = true;\n }\n this._mediaStreamTrack.removeEventListener('mute', this.handleTrackMuteEvent);\n this._mediaStreamTrack.removeEventListener('unmute', this.handleTrackUnmuteEvent);\n this.emit(TrackEvent.Ended, this);\n };\n this.reacquireTrack = false;\n this.providedByUser = userProvidedTrack;\n this.muteLock = new _();\n this.pauseUpstreamLock = new _();\n this.processorLock = new _();\n this.restartLock = new _();\n this.setMediaStreamTrack(mediaTrack, true);\n // added to satisfy TS compiler, constraints are synced with MediaStreamTrack\n this._constraints = mediaTrack.getConstraints();\n if (constraints) {\n this._constraints = constraints;\n }\n }\n get id() {\n return this._mediaStreamTrack.id;\n }\n get dimensions() {\n if (this.kind !== Track.Kind.Video) {\n return undefined;\n }\n const {\n width,\n height\n } = this._mediaStreamTrack.getSettings();\n if (width && height) {\n return {\n width,\n height\n };\n }\n return undefined;\n }\n get isUpstreamPaused() {\n return this._isUpstreamPaused;\n }\n get isUserProvided() {\n return this.providedByUser;\n }\n get mediaStreamTrack() {\n var _a, _b;\n return (_b = (_a = this.processor) === null || _a === void 0 ? void 0 : _a.processedTrack) !== null && _b !== void 0 ? _b : this._mediaStreamTrack;\n }\n get isLocal() {\n return true;\n }\n /**\n * @internal\n * returns mediaStreamTrack settings of the capturing mediastreamtrack source - ignoring processors\n */\n getSourceTrackSettings() {\n return this._mediaStreamTrack.getSettings();\n }\n setMediaStreamTrack(newTrack, force) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (newTrack === this._mediaStreamTrack && !force) {\n return;\n }\n if (this._mediaStreamTrack) {\n // detach\n this.attachedElements.forEach(el => {\n detachTrack(this._mediaStreamTrack, el);\n });\n this.debouncedTrackMuteHandler.cancel('new-track');\n this._mediaStreamTrack.removeEventListener('ended', this.handleEnded);\n this._mediaStreamTrack.removeEventListener('mute', this.handleTrackMuteEvent);\n this._mediaStreamTrack.removeEventListener('unmute', this.handleTrackUnmuteEvent);\n }\n this.mediaStream = new MediaStream([newTrack]);\n if (newTrack) {\n newTrack.addEventListener('ended', this.handleEnded);\n // when underlying track emits mute, it indicates that the device is unable\n // to produce media. In this case we'll need to signal with remote that\n // the track is \"muted\"\n // note this is different from LocalTrack.mute because we do not want to\n // touch MediaStreamTrack.enabled\n newTrack.addEventListener('mute', this.handleTrackMuteEvent);\n newTrack.addEventListener('unmute', this.handleTrackUnmuteEvent);\n this._constraints = newTrack.getConstraints();\n }\n let processedTrack;\n if (this.processor && newTrack) {\n const unlock = yield this.processorLock.lock();\n try {\n this.log.debug('restarting processor', this.logContext);\n if (this.kind === 'unknown') {\n throw TypeError('cannot set processor on track of unknown kind');\n }\n if (this.processorElement) {\n attachToElement(newTrack, this.processorElement);\n // ensure the processorElement itself stays muted\n this.processorElement.muted = true;\n }\n yield this.processor.restart({\n track: newTrack,\n kind: this.kind,\n element: this.processorElement\n });\n processedTrack = this.processor.processedTrack;\n } finally {\n unlock();\n }\n }\n if (this.sender && ((_a = this.sender.transport) === null || _a === void 0 ? void 0 : _a.state) !== 'closed') {\n yield this.sender.replaceTrack(processedTrack !== null && processedTrack !== void 0 ? processedTrack : newTrack);\n }\n // if `newTrack` is different from the existing track, stop the\n // older track just before replacing it\n if (!this.providedByUser && this._mediaStreamTrack !== newTrack) {\n this._mediaStreamTrack.stop();\n }\n this._mediaStreamTrack = newTrack;\n if (newTrack) {\n // sync muted state with the enabled state of the newly provided track\n this._mediaStreamTrack.enabled = !this.isMuted;\n // when a valid track is replace, we'd want to start producing\n yield this.resumeUpstream();\n this.attachedElements.forEach(el => {\n attachToElement(processedTrack !== null && processedTrack !== void 0 ? processedTrack : newTrack, el);\n });\n }\n });\n }\n waitForDimensions() {\n return __awaiter(this, arguments, void 0, function () {\n var _this = this;\n let timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_DIMENSIONS_TIMEOUT;\n return function* () {\n var _a;\n if (_this.kind === Track.Kind.Audio) {\n throw new Error('cannot get dimensions for audio tracks');\n }\n if (((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.os) === 'iOS') {\n // browsers report wrong initial resolution on iOS.\n // when slightly delaying the call to .getSettings(), the correct resolution is being reported\n yield sleep(10);\n }\n const started = Date.now();\n while (Date.now() - started < timeout) {\n const dims = _this.dimensions;\n if (dims) {\n return dims;\n }\n yield sleep(50);\n }\n throw new TrackInvalidError('unable to get track dimensions after timeout');\n }();\n });\n }\n setDeviceId(deviceId) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this._constraints.deviceId === deviceId && this._mediaStreamTrack.getSettings().deviceId === unwrapConstraint(deviceId)) {\n return true;\n }\n this._constraints.deviceId = deviceId;\n // when track is muted, underlying media stream track is stopped and\n // will be restarted later\n if (this.isMuted) {\n return true;\n }\n yield this.restartTrack();\n return unwrapConstraint(deviceId) === this._mediaStreamTrack.getSettings().deviceId;\n });\n }\n /**\n * @returns DeviceID of the device that is currently being used for this track\n */\n getDeviceId() {\n return __awaiter(this, arguments, void 0, function () {\n var _this2 = this;\n let normalize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n return function* () {\n // screen share doesn't have a usable device id\n if (_this2.source === Track.Source.ScreenShare) {\n return;\n }\n const {\n deviceId,\n groupId\n } = _this2._mediaStreamTrack.getSettings();\n const kind = _this2.kind === Track.Kind.Audio ? 'audioinput' : 'videoinput';\n return normalize ? DeviceManager.getInstance().normalizeDeviceId(kind, deviceId, groupId) : deviceId;\n }();\n });\n }\n mute() {\n return __awaiter(this, void 0, void 0, function* () {\n this.setTrackMuted(true);\n return this;\n });\n }\n unmute() {\n return __awaiter(this, void 0, void 0, function* () {\n this.setTrackMuted(false);\n return this;\n });\n }\n replaceTrack(track, userProvidedOrOptions) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.sender) {\n throw new TrackInvalidError('unable to replace an unpublished track');\n }\n let userProvidedTrack;\n let stopProcessor;\n if (typeof userProvidedOrOptions === 'boolean') {\n userProvidedTrack = userProvidedOrOptions;\n } else if (userProvidedOrOptions !== undefined) {\n userProvidedTrack = userProvidedOrOptions.userProvidedTrack;\n stopProcessor = userProvidedOrOptions.stopProcessor;\n }\n this.providedByUser = userProvidedTrack !== null && userProvidedTrack !== void 0 ? userProvidedTrack : true;\n this.log.debug('replace MediaStreamTrack', this.logContext);\n yield this.setMediaStreamTrack(track);\n // this must be synced *after* setting mediaStreamTrack above, since it relies\n // on the previous state in order to cleanup\n if (stopProcessor && this.processor) {\n yield this.stopProcessor();\n }\n return this;\n });\n }\n restart(constraints) {\n return __awaiter(this, void 0, void 0, function* () {\n this.manuallyStopped = false;\n const unlock = yield this.restartLock.lock();\n try {\n if (!constraints) {\n constraints = this._constraints;\n }\n const {\n deviceId,\n facingMode\n } = constraints,\n otherConstraints = __rest(constraints, [\"deviceId\", \"facingMode\"]);\n this.log.debug('restarting track with constraints', Object.assign(Object.assign({}, this.logContext), {\n constraints\n }));\n const streamConstraints = {\n audio: false,\n video: false\n };\n if (this.kind === Track.Kind.Video) {\n streamConstraints.video = deviceId || facingMode ? {\n deviceId,\n facingMode\n } : true;\n } else {\n streamConstraints.audio = deviceId ? {\n deviceId\n } : true;\n }\n // these steps are duplicated from setMediaStreamTrack because we must stop\n // the previous tracks before new tracks can be acquired\n this.attachedElements.forEach(el => {\n detachTrack(this.mediaStreamTrack, el);\n });\n this._mediaStreamTrack.removeEventListener('ended', this.handleEnded);\n // on Safari, the old audio track must be stopped before attempting to acquire\n // the new track, otherwise the new track will stop with\n // 'A MediaStreamTrack ended due to a capture failure`\n this._mediaStreamTrack.stop();\n // create new track and attach\n const mediaStream = yield navigator.mediaDevices.getUserMedia(streamConstraints);\n const newTrack = mediaStream.getTracks()[0];\n yield newTrack.applyConstraints(otherConstraints);\n newTrack.addEventListener('ended', this.handleEnded);\n this.log.debug('re-acquired MediaStreamTrack', this.logContext);\n yield this.setMediaStreamTrack(newTrack);\n this._constraints = constraints;\n this.emit(TrackEvent.Restarted, this);\n if (this.manuallyStopped) {\n this.log.warn('track was stopped during a restart, stopping restarted track', this.logContext);\n this.stop();\n }\n return this;\n } finally {\n unlock();\n }\n });\n }\n setTrackMuted(muted) {\n this.log.debug(\"setting \".concat(this.kind, \" track \").concat(muted ? 'muted' : 'unmuted'), this.logContext);\n if (this.isMuted === muted && this._mediaStreamTrack.enabled !== muted) {\n return;\n }\n this.isMuted = muted;\n this._mediaStreamTrack.enabled = !muted;\n this.emit(muted ? TrackEvent.Muted : TrackEvent.Unmuted, this);\n }\n get needsReAcquisition() {\n return this._mediaStreamTrack.readyState !== 'live' || this._mediaStreamTrack.muted || !this._mediaStreamTrack.enabled || this.reacquireTrack;\n }\n handleAppVisibilityChanged() {\n const _super = Object.create(null, {\n handleAppVisibilityChanged: {\n get: () => super.handleAppVisibilityChanged\n }\n });\n return __awaiter(this, void 0, void 0, function* () {\n yield _super.handleAppVisibilityChanged.call(this);\n if (!isMobile()) return;\n this.log.debug(\"visibility changed, is in Background: \".concat(this.isInBackground), this.logContext);\n if (!this.isInBackground && this.needsReAcquisition && !this.isUserProvided && !this.isMuted) {\n this.log.debug(\"track needs to be reacquired, restarting \".concat(this.source), this.logContext);\n yield this.restart();\n this.reacquireTrack = false;\n }\n });\n }\n stop() {\n var _a;\n this.manuallyStopped = true;\n super.stop();\n this._mediaStreamTrack.removeEventListener('ended', this.handleEnded);\n this._mediaStreamTrack.removeEventListener('mute', this.handleTrackMuteEvent);\n this._mediaStreamTrack.removeEventListener('unmute', this.handleTrackUnmuteEvent);\n (_a = this.processor) === null || _a === void 0 ? void 0 : _a.destroy();\n this.processor = undefined;\n }\n /**\n * pauses publishing to the server without disabling the local MediaStreamTrack\n * this is used to display a user's own video locally while pausing publishing to\n * the server.\n * this API is unsupported on Safari < 12 due to a bug\n **/\n pauseUpstream() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const unlock = yield this.pauseUpstreamLock.lock();\n try {\n if (this._isUpstreamPaused === true) {\n return;\n }\n if (!this.sender) {\n this.log.warn('unable to pause upstream for an unpublished track', this.logContext);\n return;\n }\n this._isUpstreamPaused = true;\n this.emit(TrackEvent.UpstreamPaused, this);\n const browser = getBrowser();\n if ((browser === null || browser === void 0 ? void 0 : browser.name) === 'Safari' && compareVersions(browser.version, '12.0') < 0) {\n // https://bugs.webkit.org/show_bug.cgi?id=184911\n throw new DeviceUnsupportedError('pauseUpstream is not supported on Safari < 12.');\n }\n if (((_a = this.sender.transport) === null || _a === void 0 ? void 0 : _a.state) !== 'closed') {\n yield this.sender.replaceTrack(null);\n }\n } finally {\n unlock();\n }\n });\n }\n resumeUpstream() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const unlock = yield this.pauseUpstreamLock.lock();\n try {\n if (this._isUpstreamPaused === false) {\n return;\n }\n if (!this.sender) {\n this.log.warn('unable to resume upstream for an unpublished track', this.logContext);\n return;\n }\n this._isUpstreamPaused = false;\n this.emit(TrackEvent.UpstreamResumed, this);\n if (((_a = this.sender.transport) === null || _a === void 0 ? void 0 : _a.state) !== 'closed') {\n // this operation is noop if mediastreamtrack is already being sent\n yield this.sender.replaceTrack(this.mediaStreamTrack);\n }\n } finally {\n unlock();\n }\n });\n }\n /**\n * Gets the RTCStatsReport for the LocalTrack's underlying RTCRtpSender\n * See https://developer.mozilla.org/en-US/docs/Web/API/RTCStatsReport\n *\n * @returns Promise<RTCStatsReport> | undefined\n */\n getRTCStatsReport() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (!((_a = this.sender) === null || _a === void 0 ? void 0 : _a.getStats)) {\n return;\n }\n const statsReport = yield this.sender.getStats();\n return statsReport;\n });\n }\n /**\n * Sets a processor on this track.\n * See https://github.com/livekit/track-processors-js for example usage\n *\n * @experimental\n *\n * @param processor\n * @param showProcessedStreamLocally\n * @returns\n */\n setProcessor(processor_1) {\n return __awaiter(this, arguments, void 0, function (processor) {\n var _this3 = this;\n let showProcessedStreamLocally = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return function* () {\n var _a;\n const unlock = yield _this3.processorLock.lock();\n try {\n _this3.log.debug('setting up processor', _this3.logContext);\n const processorElement = document.createElement(_this3.kind);\n const processorOptions = {\n kind: _this3.kind,\n track: _this3._mediaStreamTrack,\n element: processorElement,\n audioContext: _this3.audioContext\n };\n yield processor.init(processorOptions);\n _this3.log.debug('processor initialized', _this3.logContext);\n if (_this3.processor) {\n yield _this3.stopProcessor();\n }\n if (_this3.kind === 'unknown') {\n throw TypeError('cannot set processor on track of unknown kind');\n }\n attachToElement(_this3._mediaStreamTrack, processorElement);\n processorElement.muted = true;\n processorElement.play().catch(error => {\n if (error instanceof DOMException && error.name === 'AbortError') {\n // This happens on Safari when the processor is restarted, try again after a delay\n _this3.log.warn('failed to play processor element, retrying', Object.assign(Object.assign({}, _this3.logContext), {\n error\n }));\n setTimeout(() => {\n processorElement.play().catch(err => {\n _this3.log.error('failed to play processor element', Object.assign(Object.assign({}, _this3.logContext), {\n err\n }));\n });\n }, 100);\n } else {\n _this3.log.error('failed to play processor element', Object.assign(Object.assign({}, _this3.logContext), {\n error\n }));\n }\n });\n _this3.processor = processor;\n _this3.processorElement = processorElement;\n if (_this3.processor.processedTrack) {\n for (const el of _this3.attachedElements) {\n if (el !== _this3.processorElement && showProcessedStreamLocally) {\n detachTrack(_this3._mediaStreamTrack, el);\n attachToElement(_this3.processor.processedTrack, el);\n }\n }\n yield (_a = _this3.sender) === null || _a === void 0 ? void 0 : _a.replaceTrack(_this3.processor.processedTrack);\n }\n _this3.emit(TrackEvent.TrackProcessorUpdate, _this3.processor);\n } finally {\n unlock();\n }\n }();\n });\n }\n getProcessor() {\n return this.processor;\n }\n /**\n * Stops the track processor\n * See https://github.com/livekit/track-processors-js for example usage\n *\n * @experimental\n * @returns\n */\n stopProcessor() {\n return __awaiter(this, arguments, void 0, function () {\n var _this4 = this;\n let keepElement = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n return function* () {\n var _a, _b;\n if (!_this4.processor) return;\n _this4.log.debug('stopping processor', _this4.logContext);\n (_a = _this4.processor.processedTrack) === null || _a === void 0 ? void 0 : _a.stop();\n yield _this4.processor.destroy();\n _this4.processor = undefined;\n if (!keepElement) {\n (_b = _this4.processorElement) === null || _b === void 0 ? void 0 : _b.remove();\n _this4.processorElement = undefined;\n }\n // apply original track constraints in case the processor changed them\n yield _this4._mediaStreamTrack.applyConstraints(_this4._constraints);\n // force re-setting of the mediaStreamTrack on the sender\n yield _this4.setMediaStreamTrack(_this4._mediaStreamTrack, true);\n _this4.emit(TrackEvent.TrackProcessorUpdate);\n }();\n });\n }\n /** @internal */\n startPreConnectBuffer() {\n let timeslice = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 100;\n if (!isRecordingSupported()) {\n this.log.warn('MediaRecorder is not available, cannot start preconnect buffer', this.logContext);\n return;\n }\n if (!this.localTrackRecorder) {\n let mimeType = 'audio/webm;codecs=opus';\n if (!MediaRecorder.isTypeSupported(mimeType)) {\n // iOS currently only supports video/mp4 as a mime type - even for audio.\n mimeType = 'video/mp4';\n }\n this.localTrackRecorder = new LocalTrackRecorder(this, {\n mimeType\n });\n } else {\n this.log.warn('preconnect buffer already started');\n return;\n }\n this.localTrackRecorder.start(timeslice);\n this.autoStopPreConnectBuffer = setTimeout(() => {\n this.log.warn('preconnect buffer timed out, stopping recording automatically', this.logContext);\n this.stopPreConnectBuffer();\n }, PRE_CONNECT_BUFFER_TIMEOUT);\n }\n /** @internal */\n stopPreConnectBuffer() {\n clearTimeout(this.autoStopPreConnectBuffer);\n if (this.localTrackRecorder) {\n this.localTrackRecorder.stop();\n this.localTrackRecorder = undefined;\n }\n }\n /** @internal */\n getPreConnectBuffer() {\n var _a;\n return (_a = this.localTrackRecorder) === null || _a === void 0 ? void 0 : _a.byteStream;\n }\n getPreConnectBufferMimeType() {\n var _a;\n return (_a = this.localTrackRecorder) === null || _a === void 0 ? void 0 : _a.mimeType;\n }\n}\n\nclass LocalAudioTrack extends LocalTrack {\n /**\n * boolean indicating whether enhanced noise cancellation is currently being used on this track\n */\n get enhancedNoiseCancellation() {\n return this.isKrispNoiseFilterEnabled;\n }\n /**\n *\n * @param mediaTrack\n * @param constraints MediaTrackConstraints that are being used when restarting or reacquiring tracks\n * @param userProvidedTrack Signals to the SDK whether or not the mediaTrack should be managed (i.e. released and reacquired) internally by the SDK\n */\n constructor(mediaTrack, constraints) {\n let userProvidedTrack = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n let audioContext = arguments.length > 3 ? arguments[3] : undefined;\n let loggerOptions = arguments.length > 4 ? arguments[4] : undefined;\n super(mediaTrack, Track.Kind.Audio, constraints, userProvidedTrack, loggerOptions);\n /** @internal */\n this.stopOnMute = false;\n this.isKrispNoiseFilterEnabled = false;\n this.monitorSender = () => __awaiter(this, void 0, void 0, function* () {\n if (!this.sender) {\n this._currentBitrate = 0;\n return;\n }\n let stats;\n try {\n stats = yield this.getSenderStats();\n } catch (e) {\n this.log.error('could not get audio sender stats', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n return;\n }\n if (stats && this.prevStats) {\n this._currentBitrate = computeBitrate(stats, this.prevStats);\n }\n this.prevStats = stats;\n });\n this.handleKrispNoiseFilterEnable = () => {\n this.isKrispNoiseFilterEnabled = true;\n this.log.debug(\"Krisp noise filter enabled\", this.logContext);\n this.emit(TrackEvent.AudioTrackFeatureUpdate, this, AudioTrackFeature.TF_ENHANCED_NOISE_CANCELLATION, true);\n };\n this.handleKrispNoiseFilterDisable = () => {\n this.isKrispNoiseFilterEnabled = false;\n this.log.debug(\"Krisp noise filter disabled\", this.logContext);\n this.emit(TrackEvent.AudioTrackFeatureUpdate, this, AudioTrackFeature.TF_ENHANCED_NOISE_CANCELLATION, false);\n };\n this.audioContext = audioContext;\n this.checkForSilence();\n }\n mute() {\n const _super = Object.create(null, {\n mute: {\n get: () => super.mute\n }\n });\n return __awaiter(this, void 0, void 0, function* () {\n const unlock = yield this.muteLock.lock();\n try {\n if (this.isMuted) {\n this.log.debug('Track already muted', this.logContext);\n return this;\n }\n // disabled special handling as it will cause BT headsets to switch communication modes\n if (this.source === Track.Source.Microphone && this.stopOnMute && !this.isUserProvided) {\n this.log.debug('stopping mic track', this.logContext);\n // also stop the track, so that microphone indicator is turned off\n this._mediaStreamTrack.stop();\n }\n yield _super.mute.call(this);\n return this;\n } finally {\n unlock();\n }\n });\n }\n unmute() {\n const _super = Object.create(null, {\n unmute: {\n get: () => super.unmute\n }\n });\n return __awaiter(this, void 0, void 0, function* () {\n const unlock = yield this.muteLock.lock();\n try {\n if (!this.isMuted) {\n this.log.debug('Track already unmuted', this.logContext);\n return this;\n }\n const deviceHasChanged = this._constraints.deviceId && this._mediaStreamTrack.getSettings().deviceId !== unwrapConstraint(this._constraints.deviceId);\n if (this.source === Track.Source.Microphone && (this.stopOnMute || this._mediaStreamTrack.readyState === 'ended' || deviceHasChanged) && !this.isUserProvided) {\n this.log.debug('reacquiring mic track', this.logContext);\n yield this.restartTrack();\n }\n yield _super.unmute.call(this);\n return this;\n } finally {\n unlock();\n }\n });\n }\n restartTrack(options) {\n return __awaiter(this, void 0, void 0, function* () {\n let constraints;\n if (options) {\n const streamConstraints = constraintsForOptions({\n audio: options\n });\n if (typeof streamConstraints.audio !== 'boolean') {\n constraints = streamConstraints.audio;\n }\n }\n yield this.restart(constraints);\n });\n }\n restart(constraints) {\n const _super = Object.create(null, {\n restart: {\n get: () => super.restart\n }\n });\n return __awaiter(this, void 0, void 0, function* () {\n const track = yield _super.restart.call(this, constraints);\n this.checkForSilence();\n return track;\n });\n }\n /* @internal */\n startMonitor() {\n if (!isWeb()) {\n return;\n }\n if (this.monitorInterval) {\n return;\n }\n this.monitorInterval = setInterval(() => {\n this.monitorSender();\n }, monitorFrequency);\n }\n setProcessor(processor) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const unlock = yield this.processorLock.lock();\n try {\n if (!isReactNative() && !this.audioContext) {\n throw Error('Audio context needs to be set on LocalAudioTrack in order to enable processors');\n }\n if (this.processor) {\n yield this.stopProcessor();\n }\n const processorOptions = {\n kind: this.kind,\n track: this._mediaStreamTrack,\n // RN won't have or use AudioContext\n audioContext: this.audioContext\n };\n this.log.debug(\"setting up audio processor \".concat(processor.name), this.logContext);\n yield processor.init(processorOptions);\n this.processor = processor;\n if (this.processor.processedTrack) {\n yield (_a = this.sender) === null || _a === void 0 ? void 0 : _a.replaceTrack(this.processor.processedTrack);\n this.processor.processedTrack.addEventListener('enable-lk-krisp-noise-filter', this.handleKrispNoiseFilterEnable);\n this.processor.processedTrack.addEventListener('disable-lk-krisp-noise-filter', this.handleKrispNoiseFilterDisable);\n }\n this.emit(TrackEvent.TrackProcessorUpdate, this.processor);\n } finally {\n unlock();\n }\n });\n }\n /**\n * @internal\n * @experimental\n */\n setAudioContext(audioContext) {\n this.audioContext = audioContext;\n }\n getSenderStats() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (!((_a = this.sender) === null || _a === void 0 ? void 0 : _a.getStats)) {\n return undefined;\n }\n const stats = yield this.sender.getStats();\n let audioStats;\n stats.forEach(v => {\n if (v.type === 'outbound-rtp') {\n audioStats = {\n type: 'audio',\n streamId: v.id,\n packetsSent: v.packetsSent,\n packetsLost: v.packetsLost,\n bytesSent: v.bytesSent,\n timestamp: v.timestamp,\n roundTripTime: v.roundTripTime,\n jitter: v.jitter\n };\n }\n });\n return audioStats;\n });\n }\n checkForSilence() {\n return __awaiter(this, void 0, void 0, function* () {\n const trackIsSilent = yield detectSilence(this);\n if (trackIsSilent) {\n if (!this.isMuted) {\n this.log.warn('silence detected on local audio track', this.logContext);\n }\n this.emit(TrackEvent.AudioSilenceDetected);\n }\n return trackIsSilent;\n });\n }\n}\n\n/** @internal */\nfunction mediaTrackToLocalTrack(mediaStreamTrack, constraints, loggerOptions) {\n switch (mediaStreamTrack.kind) {\n case 'audio':\n return new LocalAudioTrack(mediaStreamTrack, constraints, false, undefined, loggerOptions);\n case 'video':\n return new LocalVideoTrack(mediaStreamTrack, constraints, false, loggerOptions);\n default:\n throw new TrackInvalidError(\"unsupported track type: \".concat(mediaStreamTrack.kind));\n }\n}\n/* @internal */\nconst presets169 = Object.values(VideoPresets);\n/* @internal */\nconst presets43 = Object.values(VideoPresets43);\n/* @internal */\nconst presetsScreenShare = Object.values(ScreenSharePresets);\n/* @internal */\nconst defaultSimulcastPresets169 = [VideoPresets.h180, VideoPresets.h360];\n/* @internal */\nconst defaultSimulcastPresets43 = [VideoPresets43.h180, VideoPresets43.h360];\n/* @internal */\nconst computeDefaultScreenShareSimulcastPresets = fromPreset => {\n const layers = [{\n scaleResolutionDownBy: 2,\n fps: fromPreset.encoding.maxFramerate\n }];\n return layers.map(t => {\n var _a, _b;\n return new VideoPreset(Math.floor(fromPreset.width / t.scaleResolutionDownBy), Math.floor(fromPreset.height / t.scaleResolutionDownBy), Math.max(150000, Math.floor(fromPreset.encoding.maxBitrate / (Math.pow(t.scaleResolutionDownBy, 2) * (((_a = fromPreset.encoding.maxFramerate) !== null && _a !== void 0 ? _a : 30) / ((_b = t.fps) !== null && _b !== void 0 ? _b : 30))))), t.fps, fromPreset.encoding.priority);\n });\n};\n// /**\n// *\n// * @internal\n// * @experimental\n// */\n// const computeDefaultMultiCodecSimulcastEncodings = (width: number, height: number) => {\n// // use vp8 as a default\n// const vp8 = determineAppropriateEncoding(false, width, height);\n// const vp9 = { ...vp8, maxBitrate: vp8.maxBitrate * 0.9 };\n// const h264 = { ...vp8, maxBitrate: vp8.maxBitrate * 1.1 };\n// const av1 = { ...vp8, maxBitrate: vp8.maxBitrate * 0.7 };\n// return {\n// vp8,\n// vp9,\n// h264,\n// av1,\n// };\n// };\nconst videoRids = ['q', 'h', 'f'];\n/* @internal */\nfunction computeVideoEncodings(isScreenShare, width, height, options) {\n var _a, _b;\n let videoEncoding = options === null || options === void 0 ? void 0 : options.videoEncoding;\n if (isScreenShare) {\n videoEncoding = options === null || options === void 0 ? void 0 : options.screenShareEncoding;\n }\n const useSimulcast = options === null || options === void 0 ? void 0 : options.simulcast;\n const scalabilityMode = options === null || options === void 0 ? void 0 : options.scalabilityMode;\n const videoCodec = options === null || options === void 0 ? void 0 : options.videoCodec;\n if (!videoEncoding && !useSimulcast && !scalabilityMode || !width || !height) {\n // when we aren't simulcasting or svc, will need to return a single encoding without\n // capping bandwidth. we always require a encoding for dynacast\n return [{}];\n }\n if (!videoEncoding) {\n // find the right encoding based on width/height\n videoEncoding = determineAppropriateEncoding(isScreenShare, width, height, videoCodec);\n livekitLogger.debug('using video encoding', videoEncoding);\n }\n const sourceFramerate = videoEncoding.maxFramerate;\n const original = new VideoPreset(width, height, videoEncoding.maxBitrate, videoEncoding.maxFramerate, videoEncoding.priority);\n if (scalabilityMode && isSVCCodec(videoCodec)) {\n const sm = new ScalabilityMode(scalabilityMode);\n const encodings = [];\n if (sm.spatial > 3) {\n throw new Error(\"unsupported scalabilityMode: \".concat(scalabilityMode));\n }\n // Before M113 in Chrome, defining multiple encodings with an SVC codec indicated\n // that SVC mode should be used. Safari still works this way.\n // This is a bit confusing but is due to how libwebrtc interpreted the encodings field\n // before M113.\n // Announced here: https://groups.google.com/g/discuss-webrtc/c/-QQ3pxrl-fw?pli=1\n const browser = getBrowser();\n if (isSafariBased() ||\n // Even tho RN runs M114, it does not produce SVC layers when a single encoding\n // is provided. So we'll use the legacy SVC specification for now.\n // TODO: when we upstream libwebrtc, this will need additional verification\n isReactNative() || (browser === null || browser === void 0 ? void 0 : browser.name) === 'Chrome' && compareVersions(browser === null || browser === void 0 ? void 0 : browser.version, '113') < 0) {\n const bitratesRatio = sm.suffix == 'h' ? 2 : 3;\n // safari 18.4 uses a different svc API that requires scaleResolutionDownBy to be set.\n const requireScale = isSafariSvcApi(browser);\n for (let i = 0; i < sm.spatial; i += 1) {\n // in legacy SVC, scaleResolutionDownBy cannot be set\n encodings.push({\n rid: videoRids[2 - i],\n maxBitrate: videoEncoding.maxBitrate / Math.pow(bitratesRatio, i),\n maxFramerate: original.encoding.maxFramerate,\n scaleResolutionDownBy: requireScale ? Math.pow(2, i) : undefined\n });\n }\n // legacy SVC, scalabilityMode is set only on the first encoding\n /* @ts-ignore */\n encodings[0].scalabilityMode = scalabilityMode;\n } else {\n encodings.push({\n maxBitrate: videoEncoding.maxBitrate,\n maxFramerate: original.encoding.maxFramerate,\n /* @ts-ignore */\n scalabilityMode: scalabilityMode\n });\n }\n if (original.encoding.priority) {\n encodings[0].priority = original.encoding.priority;\n encodings[0].networkPriority = original.encoding.priority;\n }\n livekitLogger.debug(\"using svc encoding\", {\n encodings\n });\n return encodings;\n }\n if (!useSimulcast) {\n return [videoEncoding];\n }\n let presets = [];\n if (isScreenShare) {\n presets = (_a = sortPresets(options === null || options === void 0 ? void 0 : options.screenShareSimulcastLayers)) !== null && _a !== void 0 ? _a : defaultSimulcastLayers(isScreenShare, original);\n } else {\n presets = (_b = sortPresets(options === null || options === void 0 ? void 0 : options.videoSimulcastLayers)) !== null && _b !== void 0 ? _b : defaultSimulcastLayers(isScreenShare, original);\n }\n let midPreset;\n if (presets.length > 0) {\n const lowPreset = presets[0];\n if (presets.length > 1) {\n [, midPreset] = presets;\n }\n // NOTE:\n // 1. Ordering of these encodings is important. Chrome seems\n // to use the index into encodings to decide which layer\n // to disable when CPU constrained.\n // So encodings should be ordered in increasing spatial\n // resolution order.\n // 2. livekit-server translates rids into layers. So, all encodings\n // should have the base layer `q` and then more added\n // based on other conditions.\n const size = Math.max(width, height);\n if (size >= 960 && midPreset) {\n return encodingsFromPresets(width, height, [lowPreset, midPreset, original], sourceFramerate);\n }\n if (size >= 480) {\n return encodingsFromPresets(width, height, [lowPreset, original], sourceFramerate);\n }\n }\n return encodingsFromPresets(width, height, [original]);\n}\nfunction computeTrackBackupEncodings(track, videoCodec, opts) {\n var _a, _b, _c, _d;\n // backupCodec should not be true anymore, default codec is set in LocalParticipant.publish\n if (!opts.backupCodec || opts.backupCodec === true || opts.backupCodec.codec === opts.videoCodec) {\n // backup codec publishing is disabled\n return;\n }\n if (videoCodec !== opts.backupCodec.codec) {\n livekitLogger.warn('requested a different codec than specified as backup', {\n serverRequested: videoCodec,\n backup: opts.backupCodec.codec\n });\n }\n opts.videoCodec = videoCodec;\n // use backup encoding setting as videoEncoding for backup codec publishing\n opts.videoEncoding = opts.backupCodec.encoding;\n const settings = track.mediaStreamTrack.getSettings();\n const width = (_a = settings.width) !== null && _a !== void 0 ? _a : (_b = track.dimensions) === null || _b === void 0 ? void 0 : _b.width;\n const height = (_c = settings.height) !== null && _c !== void 0 ? _c : (_d = track.dimensions) === null || _d === void 0 ? void 0 : _d.height;\n // disable simulcast for screenshare backup codec since L1Tx is used by primary codec\n if (track.source === Track.Source.ScreenShare && opts.simulcast) {\n opts.simulcast = false;\n }\n const encodings = computeVideoEncodings(track.source === Track.Source.ScreenShare, width, height, opts);\n return encodings;\n}\n/* @internal */\nfunction determineAppropriateEncoding(isScreenShare, width, height, codec) {\n const presets = presetsForResolution(isScreenShare, width, height);\n let {\n encoding\n } = presets[0];\n // handle portrait by swapping dimensions\n const size = Math.max(width, height);\n for (let i = 0; i < presets.length; i += 1) {\n const preset = presets[i];\n encoding = preset.encoding;\n if (preset.width >= size) {\n break;\n }\n }\n // presets are based on the assumption of vp8 as a codec\n // for other codecs we adjust the maxBitrate if no specific videoEncoding has been provided\n // users should override these with ones that are optimized for their use case\n // NOTE: SVC codec bitrates are inclusive of all scalability layers. while\n // bitrate for non-SVC codecs does not include other simulcast layers.\n if (codec) {\n switch (codec) {\n case 'av1':\n case 'h265':\n encoding = Object.assign({}, encoding);\n encoding.maxBitrate = encoding.maxBitrate * 0.7;\n break;\n case 'vp9':\n encoding = Object.assign({}, encoding);\n encoding.maxBitrate = encoding.maxBitrate * 0.85;\n break;\n }\n }\n return encoding;\n}\n/* @internal */\nfunction presetsForResolution(isScreenShare, width, height) {\n if (isScreenShare) {\n return presetsScreenShare;\n }\n const aspect = width > height ? width / height : height / width;\n if (Math.abs(aspect - 16.0 / 9) < Math.abs(aspect - 4.0 / 3)) {\n return presets169;\n }\n return presets43;\n}\n/* @internal */\nfunction defaultSimulcastLayers(isScreenShare, original) {\n if (isScreenShare) {\n return computeDefaultScreenShareSimulcastPresets(original);\n }\n const {\n width,\n height\n } = original;\n const aspect = width > height ? width / height : height / width;\n if (Math.abs(aspect - 16.0 / 9) < Math.abs(aspect - 4.0 / 3)) {\n return defaultSimulcastPresets169;\n }\n return defaultSimulcastPresets43;\n}\n// presets should be ordered by low, medium, high\nfunction encodingsFromPresets(width, height, presets, sourceFramerate) {\n const encodings = [];\n presets.forEach((preset, idx) => {\n if (idx >= videoRids.length) {\n return;\n }\n const size = Math.min(width, height);\n const rid = videoRids[idx];\n const encoding = {\n rid,\n scaleResolutionDownBy: Math.max(1, size / Math.min(preset.width, preset.height)),\n maxBitrate: preset.encoding.maxBitrate\n };\n // ensure that the sourceFramerate is the highest framerate applied across all layers so that the\n // original encoding doesn't get bumped unintentionally by any of the other layers\n const maxFramerate = sourceFramerate && preset.encoding.maxFramerate ? Math.min(sourceFramerate, preset.encoding.maxFramerate) : preset.encoding.maxFramerate;\n if (maxFramerate) {\n encoding.maxFramerate = maxFramerate;\n }\n const canSetPriority = isFireFox() || idx === 0;\n if (preset.encoding.priority && canSetPriority) {\n encoding.priority = preset.encoding.priority;\n encoding.networkPriority = preset.encoding.priority;\n }\n encodings.push(encoding);\n });\n // RN ios simulcast requires all same framerates.\n if (isReactNative() && getReactNativeOs() === 'ios') {\n let topFramerate = undefined;\n encodings.forEach(encoding => {\n if (!topFramerate) {\n topFramerate = encoding.maxFramerate;\n } else if (encoding.maxFramerate && encoding.maxFramerate > topFramerate) {\n topFramerate = encoding.maxFramerate;\n }\n });\n let notifyOnce = true;\n encodings.forEach(encoding => {\n var _a;\n if (encoding.maxFramerate != topFramerate) {\n if (notifyOnce) {\n notifyOnce = false;\n livekitLogger.info(\"Simulcast on iOS React-Native requires all encodings to share the same framerate.\");\n }\n livekitLogger.info(\"Setting framerate of encoding \\\"\".concat((_a = encoding.rid) !== null && _a !== void 0 ? _a : '', \"\\\" to \").concat(topFramerate));\n encoding.maxFramerate = topFramerate;\n }\n });\n }\n return encodings;\n}\n/** @internal */\nfunction sortPresets(presets) {\n if (!presets) return;\n return presets.sort((a, b) => {\n const {\n encoding: aEnc\n } = a;\n const {\n encoding: bEnc\n } = b;\n if (aEnc.maxBitrate > bEnc.maxBitrate) {\n return 1;\n }\n if (aEnc.maxBitrate < bEnc.maxBitrate) return -1;\n if (aEnc.maxBitrate === bEnc.maxBitrate && aEnc.maxFramerate && bEnc.maxFramerate) {\n return aEnc.maxFramerate > bEnc.maxFramerate ? 1 : -1;\n }\n return 0;\n });\n}\n/** @internal */\nclass ScalabilityMode {\n constructor(scalabilityMode) {\n const results = scalabilityMode.match(/^L(\\d)T(\\d)(h|_KEY|_KEY_SHIFT){0,1}$/);\n if (!results) {\n throw new Error('invalid scalability mode');\n }\n this.spatial = parseInt(results[1]);\n this.temporal = parseInt(results[2]);\n if (results.length > 3) {\n switch (results[3]) {\n case 'h':\n case '_KEY':\n case '_KEY_SHIFT':\n this.suffix = results[3];\n }\n }\n }\n toString() {\n var _a;\n return \"L\".concat(this.spatial, \"T\").concat(this.temporal).concat((_a = this.suffix) !== null && _a !== void 0 ? _a : '');\n }\n}\nfunction getDefaultDegradationPreference(track) {\n // a few of reasons we have different default paths:\n // 1. without this, Chrome seems to aggressively resize the SVC video stating `quality-limitation: bandwidth` even when BW isn't an issue\n // 2. since we are overriding contentHint to motion (to workaround L1T3 publishing), it overrides the default degradationPreference to `balanced`\n if (track.source === Track.Source.ScreenShare || track.constraints.height && unwrapConstraint(track.constraints.height) >= 1080) {\n return 'maintain-resolution';\n } else {\n return 'balanced';\n }\n}\n\nconst refreshSubscribedCodecAfterNewCodec = 5000;\nclass LocalVideoTrack extends LocalTrack {\n get sender() {\n return this._sender;\n }\n set sender(sender) {\n this._sender = sender;\n if (this.degradationPreference) {\n this.setDegradationPreference(this.degradationPreference);\n }\n }\n /**\n *\n * @param mediaTrack\n * @param constraints MediaTrackConstraints that are being used when restarting or reacquiring tracks\n * @param userProvidedTrack Signals to the SDK whether or not the mediaTrack should be managed (i.e. released and reacquired) internally by the SDK\n */\n constructor(mediaTrack, constraints) {\n let userProvidedTrack = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n let loggerOptions = arguments.length > 3 ? arguments[3] : undefined;\n super(mediaTrack, Track.Kind.Video, constraints, userProvidedTrack, loggerOptions);\n /* @internal */\n this.simulcastCodecs = new Map();\n this.degradationPreference = 'balanced';\n this.isCpuConstrained = false;\n this.optimizeForPerformance = false;\n this.monitorSender = () => __awaiter(this, void 0, void 0, function* () {\n if (!this.sender) {\n this._currentBitrate = 0;\n return;\n }\n let stats;\n try {\n stats = yield this.getSenderStats();\n } catch (e) {\n this.log.error('could not get video sender stats', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n return;\n }\n const statsMap = new Map(stats.map(s => [s.rid, s]));\n const isCpuConstrained = stats.some(s => s.qualityLimitationReason === 'cpu');\n if (isCpuConstrained !== this.isCpuConstrained) {\n this.isCpuConstrained = isCpuConstrained;\n if (this.isCpuConstrained) {\n this.emit(TrackEvent.CpuConstrained);\n }\n }\n if (this.prevStats) {\n let totalBitrate = 0;\n statsMap.forEach((s, key) => {\n var _a;\n const prev = (_a = this.prevStats) === null || _a === void 0 ? void 0 : _a.get(key);\n totalBitrate += computeBitrate(s, prev);\n });\n this._currentBitrate = totalBitrate;\n }\n this.prevStats = statsMap;\n });\n this.senderLock = new _();\n }\n get isSimulcast() {\n if (this.sender && this.sender.getParameters().encodings.length > 1) {\n return true;\n }\n return false;\n }\n /* @internal */\n startMonitor(signalClient) {\n var _a;\n this.signalClient = signalClient;\n if (!isWeb()) {\n return;\n }\n // save original encodings\n // TODO : merge simulcast tracks stats\n const params = (_a = this.sender) === null || _a === void 0 ? void 0 : _a.getParameters();\n if (params) {\n this.encodings = params.encodings;\n }\n if (this.monitorInterval) {\n return;\n }\n this.monitorInterval = setInterval(() => {\n this.monitorSender();\n }, monitorFrequency);\n }\n stop() {\n this._mediaStreamTrack.getConstraints();\n this.simulcastCodecs.forEach(trackInfo => {\n trackInfo.mediaStreamTrack.stop();\n });\n super.stop();\n }\n pauseUpstream() {\n const _super = Object.create(null, {\n pauseUpstream: {\n get: () => super.pauseUpstream\n }\n });\n return __awaiter(this, void 0, void 0, function* () {\n var _a, e_1, _b, _c;\n var _d;\n yield _super.pauseUpstream.call(this);\n try {\n for (var _e = true, _f = __asyncValues(this.simulcastCodecs.values()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) {\n _c = _g.value;\n _e = false;\n const sc = _c;\n yield (_d = sc.sender) === null || _d === void 0 ? void 0 : _d.replaceTrack(null);\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (!_e && !_a && (_b = _f.return)) yield _b.call(_f);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n });\n }\n resumeUpstream() {\n const _super = Object.create(null, {\n resumeUpstream: {\n get: () => super.resumeUpstream\n }\n });\n return __awaiter(this, void 0, void 0, function* () {\n var _a, e_2, _b, _c;\n var _d;\n yield _super.resumeUpstream.call(this);\n try {\n for (var _e = true, _f = __asyncValues(this.simulcastCodecs.values()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) {\n _c = _g.value;\n _e = false;\n const sc = _c;\n yield (_d = sc.sender) === null || _d === void 0 ? void 0 : _d.replaceTrack(sc.mediaStreamTrack);\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (!_e && !_a && (_b = _f.return)) yield _b.call(_f);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n });\n }\n mute() {\n const _super = Object.create(null, {\n mute: {\n get: () => super.mute\n }\n });\n return __awaiter(this, void 0, void 0, function* () {\n const unlock = yield this.muteLock.lock();\n try {\n if (this.isMuted) {\n this.log.debug('Track already muted', this.logContext);\n return this;\n }\n if (this.source === Track.Source.Camera && !this.isUserProvided) {\n this.log.debug('stopping camera track', this.logContext);\n // also stop the track, so that camera indicator is turned off\n this._mediaStreamTrack.stop();\n }\n yield _super.mute.call(this);\n return this;\n } finally {\n unlock();\n }\n });\n }\n unmute() {\n const _super = Object.create(null, {\n unmute: {\n get: () => super.unmute\n }\n });\n return __awaiter(this, void 0, void 0, function* () {\n const unlock = yield this.muteLock.lock();\n try {\n if (!this.isMuted) {\n this.log.debug('Track already unmuted', this.logContext);\n return this;\n }\n if (this.source === Track.Source.Camera && !this.isUserProvided) {\n this.log.debug('reacquiring camera track', this.logContext);\n yield this.restartTrack();\n }\n yield _super.unmute.call(this);\n return this;\n } finally {\n unlock();\n }\n });\n }\n setTrackMuted(muted) {\n super.setTrackMuted(muted);\n for (const sc of this.simulcastCodecs.values()) {\n sc.mediaStreamTrack.enabled = !muted;\n }\n }\n getSenderStats() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (!((_a = this.sender) === null || _a === void 0 ? void 0 : _a.getStats)) {\n return [];\n }\n const items = [];\n const stats = yield this.sender.getStats();\n stats.forEach(v => {\n var _a;\n if (v.type === 'outbound-rtp') {\n const vs = {\n type: 'video',\n streamId: v.id,\n frameHeight: v.frameHeight,\n frameWidth: v.frameWidth,\n framesPerSecond: v.framesPerSecond,\n framesSent: v.framesSent,\n firCount: v.firCount,\n pliCount: v.pliCount,\n nackCount: v.nackCount,\n packetsSent: v.packetsSent,\n bytesSent: v.bytesSent,\n qualityLimitationReason: v.qualityLimitationReason,\n qualityLimitationDurations: v.qualityLimitationDurations,\n qualityLimitationResolutionChanges: v.qualityLimitationResolutionChanges,\n rid: (_a = v.rid) !== null && _a !== void 0 ? _a : v.id,\n retransmittedPacketsSent: v.retransmittedPacketsSent,\n targetBitrate: v.targetBitrate,\n timestamp: v.timestamp\n };\n // locate the appropriate remote-inbound-rtp item\n const r = stats.get(v.remoteId);\n if (r) {\n vs.jitter = r.jitter;\n vs.packetsLost = r.packetsLost;\n vs.roundTripTime = r.roundTripTime;\n }\n items.push(vs);\n }\n });\n // make sure highest res layer is always first\n items.sort((a, b) => {\n var _a, _b;\n return ((_a = b.frameWidth) !== null && _a !== void 0 ? _a : 0) - ((_b = a.frameWidth) !== null && _b !== void 0 ? _b : 0);\n });\n return items;\n });\n }\n setPublishingQuality(maxQuality) {\n const qualities = [];\n for (let q = VideoQuality.LOW; q <= VideoQuality.HIGH; q += 1) {\n qualities.push(new SubscribedQuality({\n quality: q,\n enabled: q <= maxQuality\n }));\n }\n this.log.debug(\"setting publishing quality. max quality \".concat(maxQuality), this.logContext);\n this.setPublishingLayers(isSVCCodec(this.codec), qualities);\n }\n restartTrack(options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, e_3, _b, _c;\n var _d;\n let constraints;\n if (options) {\n const streamConstraints = constraintsForOptions({\n video: options\n });\n if (typeof streamConstraints.video !== 'boolean') {\n constraints = streamConstraints.video;\n }\n }\n yield this.restart(constraints);\n // reset cpu constrained state after track is restarted\n this.isCpuConstrained = false;\n try {\n for (var _e = true, _f = __asyncValues(this.simulcastCodecs.values()), _g; _g = yield _f.next(), _a = _g.done, !_a; _e = true) {\n _c = _g.value;\n _e = false;\n const sc = _c;\n if (sc.sender && ((_d = sc.sender.transport) === null || _d === void 0 ? void 0 : _d.state) !== 'closed') {\n sc.mediaStreamTrack = this.mediaStreamTrack.clone();\n yield sc.sender.replaceTrack(sc.mediaStreamTrack);\n }\n }\n } catch (e_3_1) {\n e_3 = {\n error: e_3_1\n };\n } finally {\n try {\n if (!_e && !_a && (_b = _f.return)) yield _b.call(_f);\n } finally {\n if (e_3) throw e_3.error;\n }\n }\n });\n }\n setProcessor(processor_1) {\n const _super = Object.create(null, {\n setProcessor: {\n get: () => super.setProcessor\n }\n });\n return __awaiter(this, arguments, void 0, function (processor) {\n var _this = this;\n let showProcessedStreamLocally = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return function* () {\n var _a, e_4, _b, _c;\n var _d, _e;\n yield _super.setProcessor.call(_this, processor, showProcessedStreamLocally);\n if ((_d = _this.processor) === null || _d === void 0 ? void 0 : _d.processedTrack) {\n try {\n for (var _f = true, _g = __asyncValues(_this.simulcastCodecs.values()), _h; _h = yield _g.next(), _a = _h.done, !_a; _f = true) {\n _c = _h.value;\n _f = false;\n const sc = _c;\n yield (_e = sc.sender) === null || _e === void 0 ? void 0 : _e.replaceTrack(_this.processor.processedTrack);\n }\n } catch (e_4_1) {\n e_4 = {\n error: e_4_1\n };\n } finally {\n try {\n if (!_f && !_a && (_b = _g.return)) yield _b.call(_g);\n } finally {\n if (e_4) throw e_4.error;\n }\n }\n }\n }();\n });\n }\n setDegradationPreference(preference) {\n return __awaiter(this, void 0, void 0, function* () {\n this.degradationPreference = preference;\n if (this.sender) {\n try {\n this.log.debug(\"setting degradationPreference to \".concat(preference), this.logContext);\n const params = this.sender.getParameters();\n params.degradationPreference = preference;\n this.sender.setParameters(params);\n } catch (e) {\n this.log.warn(\"failed to set degradationPreference\", Object.assign({\n error: e\n }, this.logContext));\n }\n }\n });\n }\n addSimulcastTrack(codec, encodings) {\n if (this.simulcastCodecs.has(codec)) {\n this.log.error(\"\".concat(codec, \" already added, skipping adding simulcast codec\"), this.logContext);\n return;\n }\n const simulcastCodecInfo = {\n codec,\n mediaStreamTrack: this.mediaStreamTrack.clone(),\n sender: undefined,\n encodings\n };\n this.simulcastCodecs.set(codec, simulcastCodecInfo);\n return simulcastCodecInfo;\n }\n setSimulcastTrackSender(codec, sender) {\n const simulcastCodecInfo = this.simulcastCodecs.get(codec);\n if (!simulcastCodecInfo) {\n return;\n }\n simulcastCodecInfo.sender = sender;\n // browser will reenable disabled codec/layers after new codec has been published,\n // so refresh subscribedCodecs after publish a new codec\n setTimeout(() => {\n if (this.subscribedCodecs) {\n this.setPublishingCodecs(this.subscribedCodecs);\n }\n }, refreshSubscribedCodecAfterNewCodec);\n }\n /**\n * @internal\n * Sets codecs that should be publishing, returns new codecs that have not yet\n * been published\n */\n setPublishingCodecs(codecs) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, codecs_1, codecs_1_1;\n var _b, e_5, _c, _d;\n this.log.debug('setting publishing codecs', Object.assign(Object.assign({}, this.logContext), {\n codecs,\n currentCodec: this.codec\n }));\n // only enable simulcast codec for preference codec setted\n if (!this.codec && codecs.length > 0) {\n yield this.setPublishingLayers(isSVCCodec(codecs[0].codec), codecs[0].qualities);\n return [];\n }\n this.subscribedCodecs = codecs;\n const newCodecs = [];\n try {\n for (_a = true, codecs_1 = __asyncValues(codecs); codecs_1_1 = yield codecs_1.next(), _b = codecs_1_1.done, !_b; _a = true) {\n _d = codecs_1_1.value;\n _a = false;\n const codec = _d;\n if (!this.codec || this.codec === codec.codec) {\n yield this.setPublishingLayers(isSVCCodec(codec.codec), codec.qualities);\n } else {\n const simulcastCodecInfo = this.simulcastCodecs.get(codec.codec);\n this.log.debug(\"try setPublishingCodec for \".concat(codec.codec), Object.assign(Object.assign({}, this.logContext), {\n simulcastCodecInfo\n }));\n if (!simulcastCodecInfo || !simulcastCodecInfo.sender) {\n for (const q of codec.qualities) {\n if (q.enabled) {\n newCodecs.push(codec.codec);\n break;\n }\n }\n } else if (simulcastCodecInfo.encodings) {\n this.log.debug(\"try setPublishingLayersForSender \".concat(codec.codec), this.logContext);\n yield setPublishingLayersForSender(simulcastCodecInfo.sender, simulcastCodecInfo.encodings, codec.qualities, this.senderLock, isSVCCodec(codec.codec), this.log, this.logContext);\n }\n }\n }\n } catch (e_5_1) {\n e_5 = {\n error: e_5_1\n };\n } finally {\n try {\n if (!_a && !_b && (_c = codecs_1.return)) yield _c.call(codecs_1);\n } finally {\n if (e_5) throw e_5.error;\n }\n }\n return newCodecs;\n });\n }\n /**\n * @internal\n * Sets layers that should be publishing\n */\n setPublishingLayers(isSvc, qualities) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.optimizeForPerformance) {\n this.log.info('skipping setPublishingLayers due to optimized publishing performance', Object.assign(Object.assign({}, this.logContext), {\n qualities\n }));\n return;\n }\n this.log.debug('setting publishing layers', Object.assign(Object.assign({}, this.logContext), {\n qualities\n }));\n if (!this.sender || !this.encodings) {\n return;\n }\n yield setPublishingLayersForSender(this.sender, this.encodings, qualities, this.senderLock, isSvc, this.log, this.logContext);\n });\n }\n /**\n * Designed for lower powered devices, reduces video publishing quality and disables simulcast.\n * @experimental\n */\n prioritizePerformance() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.sender) {\n throw new Error('sender not found');\n }\n const unlock = yield this.senderLock.lock();\n try {\n this.optimizeForPerformance = true;\n const params = this.sender.getParameters();\n params.encodings = params.encodings.map((e, idx) => {\n var _a;\n return Object.assign(Object.assign({}, e), {\n active: idx === 0,\n scaleResolutionDownBy: Math.max(1, Math.ceil(((_a = this.mediaStreamTrack.getSettings().height) !== null && _a !== void 0 ? _a : 360) / 360)),\n scalabilityMode: idx === 0 && isSVCCodec(this.codec) ? 'L1T3' : undefined,\n maxFramerate: idx === 0 ? 15 : 0,\n maxBitrate: idx === 0 ? e.maxBitrate : 0\n });\n });\n this.log.debug('setting performance optimised encodings', Object.assign(Object.assign({}, this.logContext), {\n encodings: params.encodings\n }));\n this.encodings = params.encodings;\n yield this.sender.setParameters(params);\n } catch (e) {\n this.log.error('failed to set performance optimised encodings', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n this.optimizeForPerformance = false;\n } finally {\n unlock();\n }\n });\n }\n handleAppVisibilityChanged() {\n const _super = Object.create(null, {\n handleAppVisibilityChanged: {\n get: () => super.handleAppVisibilityChanged\n }\n });\n return __awaiter(this, void 0, void 0, function* () {\n yield _super.handleAppVisibilityChanged.call(this);\n if (!isMobile()) return;\n if (this.isInBackground && this.source === Track.Source.Camera) {\n this._mediaStreamTrack.enabled = false;\n }\n });\n }\n}\nfunction setPublishingLayersForSender(sender, senderEncodings, qualities, senderLock, isSVC, log, logContext) {\n return __awaiter(this, void 0, void 0, function* () {\n const unlock = yield senderLock.lock();\n log.debug('setPublishingLayersForSender', Object.assign(Object.assign({}, logContext), {\n sender,\n qualities,\n senderEncodings\n }));\n try {\n const params = sender.getParameters();\n const {\n encodings\n } = params;\n if (!encodings) {\n return;\n }\n if (encodings.length !== senderEncodings.length) {\n log.warn('cannot set publishing layers, encodings mismatch', Object.assign(Object.assign({}, logContext), {\n encodings,\n senderEncodings\n }));\n return;\n }\n let hasChanged = false;\n /* disable closable spatial layer as it has video blur / frozen issue with current server / client\n 1. chrome 113: when switching to up layer with scalability Mode change, it will generate a\n low resolution frame and recover very quickly, but noticable\n 2. livekit sfu: additional pli request cause video frozen for a few frames, also noticable */\n const closableSpatial = false;\n /* @ts-ignore */\n if (closableSpatial && encodings[0].scalabilityMode) ; else {\n if (isSVC) {\n const hasEnabledEncoding = qualities.some(q => q.enabled);\n if (hasEnabledEncoding) {\n qualities.forEach(q => q.enabled = true);\n }\n }\n // simulcast dynacast encodings\n encodings.forEach((encoding, idx) => {\n var _a;\n let rid = (_a = encoding.rid) !== null && _a !== void 0 ? _a : '';\n if (rid === '') {\n rid = 'q';\n }\n const quality = videoQualityForRid(rid);\n const subscribedQuality = qualities.find(q => q.quality === quality);\n if (!subscribedQuality) {\n return;\n }\n if (encoding.active !== subscribedQuality.enabled) {\n hasChanged = true;\n encoding.active = subscribedQuality.enabled;\n log.debug(\"setting layer \".concat(subscribedQuality.quality, \" to \").concat(encoding.active ? 'enabled' : 'disabled'), logContext);\n // FireFox does not support setting encoding.active to false, so we\n // have a workaround of lowering its bitrate and resolution to the min.\n if (isFireFox()) {\n if (subscribedQuality.enabled) {\n encoding.scaleResolutionDownBy = senderEncodings[idx].scaleResolutionDownBy;\n encoding.maxBitrate = senderEncodings[idx].maxBitrate;\n /* @ts-ignore */\n encoding.maxFrameRate = senderEncodings[idx].maxFrameRate;\n } else {\n encoding.scaleResolutionDownBy = 4;\n encoding.maxBitrate = 10;\n /* @ts-ignore */\n encoding.maxFrameRate = 2;\n }\n }\n }\n });\n }\n if (hasChanged) {\n params.encodings = encodings;\n log.debug(\"setting encodings\", Object.assign(Object.assign({}, logContext), {\n encodings: params.encodings\n }));\n yield sender.setParameters(params);\n }\n } finally {\n unlock();\n }\n });\n}\nfunction videoQualityForRid(rid) {\n switch (rid) {\n case 'f':\n return VideoQuality.HIGH;\n case 'h':\n return VideoQuality.MEDIUM;\n case 'q':\n return VideoQuality.LOW;\n default:\n return VideoQuality.HIGH;\n }\n}\nfunction videoLayersFromEncodings(width, height, encodings, svc) {\n // default to a single layer, HQ\n if (!encodings) {\n return [new VideoLayer({\n quality: VideoQuality.HIGH,\n width,\n height,\n bitrate: 0,\n ssrc: 0\n })];\n }\n if (svc) {\n // svc layers\n /* @ts-ignore */\n const encodingSM = encodings[0].scalabilityMode;\n const sm = new ScalabilityMode(encodingSM);\n const layers = [];\n const resRatio = sm.suffix == 'h' ? 1.5 : 2;\n const bitratesRatio = sm.suffix == 'h' ? 2 : 3;\n for (let i = 0; i < sm.spatial; i += 1) {\n layers.push(new VideoLayer({\n quality: Math.min(VideoQuality.HIGH, sm.spatial - 1) - i,\n width: Math.ceil(width / Math.pow(resRatio, i)),\n height: Math.ceil(height / Math.pow(resRatio, i)),\n bitrate: encodings[0].maxBitrate ? Math.ceil(encodings[0].maxBitrate / Math.pow(bitratesRatio, i)) : 0,\n ssrc: 0\n }));\n }\n return layers;\n }\n return encodings.map(encoding => {\n var _a, _b, _c;\n const scale = (_a = encoding.scaleResolutionDownBy) !== null && _a !== void 0 ? _a : 1;\n let quality = videoQualityForRid((_b = encoding.rid) !== null && _b !== void 0 ? _b : '');\n return new VideoLayer({\n quality,\n width: Math.ceil(width / scale),\n height: Math.ceil(height / scale),\n bitrate: (_c = encoding.maxBitrate) !== null && _c !== void 0 ? _c : 0,\n ssrc: 0\n });\n });\n}\n\nconst lossyDataChannel = '_lossy';\nconst reliableDataChannel = '_reliable';\nconst minReconnectWait = 2 * 1000;\nconst leaveReconnect = 'leave-reconnect';\nconst reliabeReceiveStateTTL = 30000;\nvar PCState;\n(function (PCState) {\n PCState[PCState[\"New\"] = 0] = \"New\";\n PCState[PCState[\"Connected\"] = 1] = \"Connected\";\n PCState[PCState[\"Disconnected\"] = 2] = \"Disconnected\";\n PCState[PCState[\"Reconnecting\"] = 3] = \"Reconnecting\";\n PCState[PCState[\"Closed\"] = 4] = \"Closed\";\n})(PCState || (PCState = {}));\n/** @internal */\nclass RTCEngine extends eventsExports.EventEmitter {\n get isClosed() {\n return this._isClosed;\n }\n get pendingReconnect() {\n return !!this.reconnectTimeout;\n }\n constructor(options) {\n var _a;\n super();\n this.options = options;\n this.rtcConfig = {};\n this.peerConnectionTimeout = roomConnectOptionDefaults.peerConnectionTimeout;\n this.fullReconnectOnNext = false;\n /**\n * @internal\n */\n this.latestRemoteOfferId = 0;\n this.subscriberPrimary = false;\n this.pcState = PCState.New;\n this._isClosed = true;\n this.pendingTrackResolvers = {};\n this.reconnectAttempts = 0;\n this.reconnectStart = 0;\n this.attemptingReconnect = false;\n /** keeps track of how often an initial join connection has been tried */\n this.joinAttempts = 0;\n /** specifies how often an initial join connection is allowed to retry */\n this.maxJoinAttempts = 1;\n this.shouldFailNext = false;\n this.log = livekitLogger;\n this.reliableDataSequence = 1;\n this.reliableMessageBuffer = new DataPacketBuffer();\n this.reliableReceivedState = new TTLMap(reliabeReceiveStateTTL);\n this.handleDataChannel = _a => __awaiter(this, [_a], void 0, function (_ref) {\n var _this = this;\n let {\n channel\n } = _ref;\n return function* () {\n if (!channel) {\n return;\n }\n if (channel.label === reliableDataChannel) {\n _this.reliableDCSub = channel;\n } else if (channel.label === lossyDataChannel) {\n _this.lossyDCSub = channel;\n } else {\n return;\n }\n _this.log.debug(\"on data channel \".concat(channel.id, \", \").concat(channel.label), _this.logContext);\n channel.onmessage = _this.handleDataMessage;\n }();\n });\n this.handleDataMessage = message => __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n // make sure to respect incoming data message order by processing message events one after the other\n const unlock = yield this.dataProcessLock.lock();\n try {\n // decode\n let buffer;\n if (message.data instanceof ArrayBuffer) {\n buffer = message.data;\n } else if (message.data instanceof Blob) {\n buffer = yield message.data.arrayBuffer();\n } else {\n this.log.error('unsupported data type', Object.assign(Object.assign({}, this.logContext), {\n data: message.data\n }));\n return;\n }\n const dp = DataPacket.fromBinary(new Uint8Array(buffer));\n if (dp.sequence > 0 && dp.participantSid !== '') {\n const lastSeq = this.reliableReceivedState.get(dp.participantSid);\n if (lastSeq && dp.sequence <= lastSeq) {\n // ignore duplicate or out-of-order packets in reliable channel\n return;\n }\n this.reliableReceivedState.set(dp.participantSid, dp.sequence);\n }\n if (((_a = dp.value) === null || _a === void 0 ? void 0 : _a.case) === 'speaker') {\n // dispatch speaker updates\n this.emit(EngineEvent.ActiveSpeakersUpdate, dp.value.value.speakers);\n } else {\n if (((_b = dp.value) === null || _b === void 0 ? void 0 : _b.case) === 'user') {\n // compatibility\n applyUserDataCompat(dp, dp.value.value);\n }\n this.emit(EngineEvent.DataPacketReceived, dp);\n }\n } finally {\n unlock();\n }\n });\n this.handleDataError = event => {\n const channel = event.currentTarget;\n const channelKind = channel.maxRetransmits === 0 ? 'lossy' : 'reliable';\n if (event instanceof ErrorEvent && event.error) {\n const {\n error\n } = event.error;\n this.log.error(\"DataChannel error on \".concat(channelKind, \": \").concat(event.message), Object.assign(Object.assign({}, this.logContext), {\n error\n }));\n } else {\n this.log.error(\"Unknown DataChannel error on \".concat(channelKind), Object.assign(Object.assign({}, this.logContext), {\n event\n }));\n }\n };\n this.handleBufferedAmountLow = event => {\n const channel = event.currentTarget;\n const channelKind = channel.maxRetransmits === 0 ? DataPacket_Kind.LOSSY : DataPacket_Kind.RELIABLE;\n this.updateAndEmitDCBufferStatus(channelKind);\n };\n // websocket reconnect behavior. if websocket is interrupted, and the PeerConnection\n // continues to work, we can reconnect to websocket to continue the session\n // after a number of retries, we'll close and give up permanently\n this.handleDisconnect = (connection, disconnectReason) => {\n if (this._isClosed) {\n return;\n }\n this.log.warn(\"\".concat(connection, \" disconnected\"), this.logContext);\n if (this.reconnectAttempts === 0) {\n // only reset start time on the first try\n this.reconnectStart = Date.now();\n }\n const disconnect = duration => {\n this.log.warn(\"could not recover connection after \".concat(this.reconnectAttempts, \" attempts, \").concat(duration, \"ms. giving up\"), this.logContext);\n this.emit(EngineEvent.Disconnected);\n this.close();\n };\n const duration = Date.now() - this.reconnectStart;\n let delay = this.getNextRetryDelay({\n elapsedMs: duration,\n retryCount: this.reconnectAttempts\n });\n if (delay === null) {\n disconnect(duration);\n return;\n }\n if (connection === leaveReconnect) {\n delay = 0;\n }\n this.log.debug(\"reconnecting in \".concat(delay, \"ms\"), this.logContext);\n this.clearReconnectTimeout();\n if (this.token && this.regionUrlProvider) {\n // token may have been refreshed, we do not want to recreate the regionUrlProvider\n // since the current engine may have inherited a regional url\n this.regionUrlProvider.updateToken(this.token);\n }\n this.reconnectTimeout = CriticalTimers.setTimeout(() => this.attemptReconnect(disconnectReason).finally(() => this.reconnectTimeout = undefined), delay);\n };\n this.waitForRestarted = () => {\n return new Promise((resolve, reject) => {\n if (this.pcState === PCState.Connected) {\n resolve();\n }\n const onRestarted = () => {\n this.off(EngineEvent.Disconnected, onDisconnected);\n resolve();\n };\n const onDisconnected = () => {\n this.off(EngineEvent.Restarted, onRestarted);\n reject();\n };\n this.once(EngineEvent.Restarted, onRestarted);\n this.once(EngineEvent.Disconnected, onDisconnected);\n });\n };\n this.updateAndEmitDCBufferStatus = kind => {\n const status = this.isBufferStatusLow(kind);\n if (typeof status !== 'undefined' && status !== this.dcBufferStatus.get(kind)) {\n this.dcBufferStatus.set(kind, status);\n this.emit(EngineEvent.DCBufferStatusChanged, status, kind);\n }\n };\n this.isBufferStatusLow = kind => {\n const dc = this.dataChannelForKind(kind);\n if (dc) {\n if (kind === DataPacket_Kind.RELIABLE) {\n this.reliableMessageBuffer.alignBufferedAmount(dc.bufferedAmount);\n }\n return dc.bufferedAmount <= dc.bufferedAmountLowThreshold;\n }\n };\n this.handleBrowserOnLine = () => {\n // in case the engine is currently reconnecting, attempt a reconnect immediately after the browser state has changed to 'onLine'\n if (this.client.currentState === SignalConnectionState.RECONNECTING) {\n this.clearReconnectTimeout();\n this.attemptReconnect(ReconnectReason.RR_SIGNAL_DISCONNECTED);\n }\n };\n this.log = getLogger((_a = options.loggerName) !== null && _a !== void 0 ? _a : LoggerNames.Engine);\n this.loggerOptions = {\n loggerName: options.loggerName,\n loggerContextCb: () => this.logContext\n };\n this.client = new SignalClient(undefined, this.loggerOptions);\n this.client.signalLatency = this.options.expSignalLatency;\n this.reconnectPolicy = this.options.reconnectPolicy;\n this.registerOnLineListener();\n this.closingLock = new _();\n this.dataProcessLock = new _();\n this.dcBufferStatus = new Map([[DataPacket_Kind.LOSSY, true], [DataPacket_Kind.RELIABLE, true]]);\n this.client.onParticipantUpdate = updates => this.emit(EngineEvent.ParticipantUpdate, updates);\n this.client.onConnectionQuality = update => this.emit(EngineEvent.ConnectionQualityUpdate, update);\n this.client.onRoomUpdate = update => this.emit(EngineEvent.RoomUpdate, update);\n this.client.onSubscriptionError = resp => this.emit(EngineEvent.SubscriptionError, resp);\n this.client.onSubscriptionPermissionUpdate = update => this.emit(EngineEvent.SubscriptionPermissionUpdate, update);\n this.client.onSpeakersChanged = update => this.emit(EngineEvent.SpeakersChanged, update);\n this.client.onStreamStateUpdate = update => this.emit(EngineEvent.StreamStateChanged, update);\n this.client.onRequestResponse = response => this.emit(EngineEvent.SignalRequestResponse, response);\n }\n /** @internal */\n get logContext() {\n var _a, _b, _c, _d, _e, _f;\n return {\n room: (_b = (_a = this.latestJoinResponse) === null || _a === void 0 ? void 0 : _a.room) === null || _b === void 0 ? void 0 : _b.name,\n roomID: (_d = (_c = this.latestJoinResponse) === null || _c === void 0 ? void 0 : _c.room) === null || _d === void 0 ? void 0 : _d.sid,\n participant: (_f = (_e = this.latestJoinResponse) === null || _e === void 0 ? void 0 : _e.participant) === null || _f === void 0 ? void 0 : _f.identity,\n pID: this.participantSid\n };\n }\n join(url, token, opts, abortSignal) {\n return __awaiter(this, void 0, void 0, function* () {\n this.url = url;\n this.token = token;\n this.signalOpts = opts;\n this.maxJoinAttempts = opts.maxRetries;\n try {\n this.joinAttempts += 1;\n this.setupSignalClientCallbacks();\n const joinResponse = yield this.client.join(url, token, opts, abortSignal);\n this._isClosed = false;\n this.latestJoinResponse = joinResponse;\n this.subscriberPrimary = joinResponse.subscriberPrimary;\n if (!this.pcManager) {\n yield this.configure(joinResponse);\n }\n // create offer\n if (!this.subscriberPrimary || joinResponse.fastPublish) {\n this.negotiate();\n }\n this.clientConfiguration = joinResponse.clientConfiguration;\n this.emit(EngineEvent.SignalConnected, joinResponse);\n return joinResponse;\n } catch (e) {\n if (e instanceof ConnectionError) {\n if (e.reason === ConnectionErrorReason.ServerUnreachable) {\n this.log.warn(\"Couldn't connect to server, attempt \".concat(this.joinAttempts, \" of \").concat(this.maxJoinAttempts), this.logContext);\n if (this.joinAttempts < this.maxJoinAttempts) {\n return this.join(url, token, opts, abortSignal);\n }\n }\n }\n throw e;\n }\n });\n }\n close() {\n return __awaiter(this, void 0, void 0, function* () {\n const unlock = yield this.closingLock.lock();\n if (this.isClosed) {\n unlock();\n return;\n }\n try {\n this._isClosed = true;\n this.joinAttempts = 0;\n this.emit(EngineEvent.Closing);\n this.removeAllListeners();\n this.deregisterOnLineListener();\n this.clearPendingReconnect();\n yield this.cleanupPeerConnections();\n yield this.cleanupClient();\n } finally {\n unlock();\n }\n });\n }\n cleanupPeerConnections() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n yield (_a = this.pcManager) === null || _a === void 0 ? void 0 : _a.close();\n this.pcManager = undefined;\n const dcCleanup = dc => {\n if (!dc) return;\n dc.close();\n dc.onbufferedamountlow = null;\n dc.onclose = null;\n dc.onclosing = null;\n dc.onerror = null;\n dc.onmessage = null;\n dc.onopen = null;\n };\n dcCleanup(this.lossyDC);\n dcCleanup(this.lossyDCSub);\n dcCleanup(this.reliableDC);\n dcCleanup(this.reliableDCSub);\n this.lossyDC = undefined;\n this.lossyDCSub = undefined;\n this.reliableDC = undefined;\n this.reliableDCSub = undefined;\n this.reliableMessageBuffer = new DataPacketBuffer();\n this.reliableDataSequence = 1;\n this.reliableReceivedState.clear();\n });\n }\n cleanupClient() {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.client.close();\n this.client.resetCallbacks();\n });\n }\n addTrack(req) {\n if (this.pendingTrackResolvers[req.cid]) {\n throw new TrackInvalidError('a track with the same ID has already been published');\n }\n return new Promise((resolve, reject) => {\n const publicationTimeout = setTimeout(() => {\n delete this.pendingTrackResolvers[req.cid];\n reject(new ConnectionError('publication of local track timed out, no response from server', ConnectionErrorReason.Timeout));\n }, 10000);\n this.pendingTrackResolvers[req.cid] = {\n resolve: info => {\n clearTimeout(publicationTimeout);\n resolve(info);\n },\n reject: () => {\n clearTimeout(publicationTimeout);\n reject(new Error('Cancelled publication by calling unpublish'));\n }\n };\n this.client.sendAddTrack(req);\n });\n }\n /**\n * Removes sender from PeerConnection, returning true if it was removed successfully\n * and a negotiation is necessary\n * @param sender\n * @returns\n */\n removeTrack(sender) {\n if (sender.track && this.pendingTrackResolvers[sender.track.id]) {\n const {\n reject\n } = this.pendingTrackResolvers[sender.track.id];\n if (reject) {\n reject();\n }\n delete this.pendingTrackResolvers[sender.track.id];\n }\n try {\n this.pcManager.removeTrack(sender);\n return true;\n } catch (e) {\n this.log.warn('failed to remove track', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n }\n return false;\n }\n updateMuteStatus(trackSid, muted) {\n this.client.sendMuteTrack(trackSid, muted);\n }\n get dataSubscriberReadyState() {\n var _a;\n return (_a = this.reliableDCSub) === null || _a === void 0 ? void 0 : _a.readyState;\n }\n getConnectedServerAddress() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n return (_a = this.pcManager) === null || _a === void 0 ? void 0 : _a.getConnectedAddress();\n });\n }\n /* @internal */\n setRegionUrlProvider(provider) {\n this.regionUrlProvider = provider;\n }\n configure(joinResponse) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n // already configured\n if (this.pcManager && this.pcManager.currentState !== PCTransportState.NEW) {\n return;\n }\n this.participantSid = (_a = joinResponse.participant) === null || _a === void 0 ? void 0 : _a.sid;\n const rtcConfig = this.makeRTCConfiguration(joinResponse);\n this.pcManager = new PCTransportManager(rtcConfig, joinResponse.subscriberPrimary, this.loggerOptions);\n this.emit(EngineEvent.TransportsCreated, this.pcManager.publisher, this.pcManager.subscriber);\n this.pcManager.onIceCandidate = (candidate, target) => {\n this.client.sendIceCandidate(candidate, target);\n };\n this.pcManager.onPublisherOffer = (offer, offerId) => {\n this.client.sendOffer(offer, offerId);\n };\n this.pcManager.onDataChannel = this.handleDataChannel;\n this.pcManager.onStateChange = (connectionState, publisherState, subscriberState) => __awaiter(this, void 0, void 0, function* () {\n this.log.debug(\"primary PC state changed \".concat(connectionState), this.logContext);\n if (['closed', 'disconnected', 'failed'].includes(publisherState)) {\n // reset publisher connection promise\n this.publisherConnectionPromise = undefined;\n }\n if (connectionState === PCTransportState.CONNECTED) {\n const shouldEmit = this.pcState === PCState.New;\n this.pcState = PCState.Connected;\n if (shouldEmit) {\n this.emit(EngineEvent.Connected, joinResponse);\n }\n } else if (connectionState === PCTransportState.FAILED) {\n // on Safari, PeerConnection will switch to 'disconnected' during renegotiation\n if (this.pcState === PCState.Connected) {\n this.pcState = PCState.Disconnected;\n this.handleDisconnect('peerconnection failed', subscriberState === 'failed' ? ReconnectReason.RR_SUBSCRIBER_FAILED : ReconnectReason.RR_PUBLISHER_FAILED);\n }\n }\n // detect cases where both signal client and peer connection are severed and assume that user has lost network connection\n const isSignalSevered = this.client.isDisconnected || this.client.currentState === SignalConnectionState.RECONNECTING;\n const isPCSevered = [PCTransportState.FAILED, PCTransportState.CLOSING, PCTransportState.CLOSED].includes(connectionState);\n if (isSignalSevered && isPCSevered && !this._isClosed) {\n this.emit(EngineEvent.Offline);\n }\n });\n this.pcManager.onTrack = ev => {\n this.emit(EngineEvent.MediaTrackAdded, ev.track, ev.streams[0], ev.receiver);\n };\n if (!supportOptionalDatachannel((_b = joinResponse.serverInfo) === null || _b === void 0 ? void 0 : _b.protocol)) {\n this.createDataChannels();\n }\n });\n }\n setupSignalClientCallbacks() {\n // configure signaling client\n this.client.onAnswer = (sd, offerId) => __awaiter(this, void 0, void 0, function* () {\n if (!this.pcManager) {\n return;\n }\n this.log.debug('received server answer', Object.assign(Object.assign({}, this.logContext), {\n RTCSdpType: sd.type\n }));\n yield this.pcManager.setPublisherAnswer(sd, offerId);\n });\n // add candidate on trickle\n this.client.onTrickle = (candidate, target) => {\n if (!this.pcManager) {\n return;\n }\n this.log.debug('got ICE candidate from peer', Object.assign(Object.assign({}, this.logContext), {\n candidate,\n target\n }));\n this.pcManager.addIceCandidate(candidate, target);\n };\n // when server creates an offer for the client\n this.client.onOffer = (sd, offerId) => __awaiter(this, void 0, void 0, function* () {\n this.latestRemoteOfferId = offerId;\n if (!this.pcManager) {\n return;\n }\n const answer = yield this.pcManager.createSubscriberAnswerFromOffer(sd, offerId);\n if (answer) {\n this.client.sendAnswer(answer, offerId);\n }\n });\n this.client.onLocalTrackPublished = res => {\n var _a;\n this.log.debug('received trackPublishedResponse', Object.assign(Object.assign({}, this.logContext), {\n cid: res.cid,\n track: (_a = res.track) === null || _a === void 0 ? void 0 : _a.sid\n }));\n if (!this.pendingTrackResolvers[res.cid]) {\n this.log.error(\"missing track resolver for \".concat(res.cid), Object.assign(Object.assign({}, this.logContext), {\n cid: res.cid\n }));\n return;\n }\n const {\n resolve\n } = this.pendingTrackResolvers[res.cid];\n delete this.pendingTrackResolvers[res.cid];\n resolve(res.track);\n };\n this.client.onLocalTrackUnpublished = response => {\n this.emit(EngineEvent.LocalTrackUnpublished, response);\n };\n this.client.onLocalTrackSubscribed = trackSid => {\n this.emit(EngineEvent.LocalTrackSubscribed, trackSid);\n };\n this.client.onTokenRefresh = token => {\n this.token = token;\n };\n this.client.onRemoteMuteChanged = (trackSid, muted) => {\n this.emit(EngineEvent.RemoteMute, trackSid, muted);\n };\n this.client.onSubscribedQualityUpdate = update => {\n this.emit(EngineEvent.SubscribedQualityUpdate, update);\n };\n this.client.onRoomMoved = res => {\n var _a;\n this.participantSid = (_a = res.participant) === null || _a === void 0 ? void 0 : _a.sid;\n if (this.latestJoinResponse) {\n this.latestJoinResponse.room = res.room;\n }\n this.emit(EngineEvent.RoomMoved, res);\n };\n this.client.onClose = () => {\n this.handleDisconnect('signal', ReconnectReason.RR_SIGNAL_DISCONNECTED);\n };\n this.client.onLeave = leave => {\n this.log.debug('client leave request', Object.assign(Object.assign({}, this.logContext), {\n reason: leave === null || leave === void 0 ? void 0 : leave.reason\n }));\n if (leave.regions && this.regionUrlProvider) {\n this.log.debug('updating regions', this.logContext);\n this.regionUrlProvider.setServerReportedRegions(leave.regions);\n }\n switch (leave.action) {\n case LeaveRequest_Action.DISCONNECT:\n this.emit(EngineEvent.Disconnected, leave === null || leave === void 0 ? void 0 : leave.reason);\n this.close();\n break;\n case LeaveRequest_Action.RECONNECT:\n this.fullReconnectOnNext = true;\n // reconnect immediately instead of waiting for next attempt\n this.handleDisconnect(leaveReconnect);\n break;\n case LeaveRequest_Action.RESUME:\n // reconnect immediately instead of waiting for next attempt\n this.handleDisconnect(leaveReconnect);\n }\n };\n }\n makeRTCConfiguration(serverResponse) {\n var _a;\n const rtcConfig = Object.assign({}, this.rtcConfig);\n if ((_a = this.signalOpts) === null || _a === void 0 ? void 0 : _a.e2eeEnabled) {\n this.log.debug('E2EE - setting up transports with insertable streams', this.logContext);\n // this makes sure that no data is sent before the transforms are ready\n // @ts-ignore\n rtcConfig.encodedInsertableStreams = true;\n }\n // update ICE servers before creating PeerConnection\n if (serverResponse.iceServers && !rtcConfig.iceServers) {\n const rtcIceServers = [];\n serverResponse.iceServers.forEach(iceServer => {\n const rtcIceServer = {\n urls: iceServer.urls\n };\n if (iceServer.username) rtcIceServer.username = iceServer.username;\n if (iceServer.credential) {\n rtcIceServer.credential = iceServer.credential;\n }\n rtcIceServers.push(rtcIceServer);\n });\n rtcConfig.iceServers = rtcIceServers;\n }\n if (serverResponse.clientConfiguration && serverResponse.clientConfiguration.forceRelay === ClientConfigSetting.ENABLED) {\n rtcConfig.iceTransportPolicy = 'relay';\n }\n // @ts-ignore\n rtcConfig.sdpSemantics = 'unified-plan';\n // @ts-ignore\n rtcConfig.continualGatheringPolicy = 'gather_continually';\n return rtcConfig;\n }\n createDataChannels() {\n if (!this.pcManager) {\n return;\n }\n // clear old data channel callbacks if recreate\n if (this.lossyDC) {\n this.lossyDC.onmessage = null;\n this.lossyDC.onerror = null;\n }\n if (this.reliableDC) {\n this.reliableDC.onmessage = null;\n this.reliableDC.onerror = null;\n }\n // create data channels\n this.lossyDC = this.pcManager.createPublisherDataChannel(lossyDataChannel, {\n ordered: false,\n maxRetransmits: 0\n });\n this.reliableDC = this.pcManager.createPublisherDataChannel(reliableDataChannel, {\n ordered: true\n });\n // also handle messages over the pub channel, for backwards compatibility\n this.lossyDC.onmessage = this.handleDataMessage;\n this.reliableDC.onmessage = this.handleDataMessage;\n // handle datachannel errors\n this.lossyDC.onerror = this.handleDataError;\n this.reliableDC.onerror = this.handleDataError;\n // set up dc buffer threshold, set to 64kB (otherwise 0 by default)\n this.lossyDC.bufferedAmountLowThreshold = 65535;\n this.reliableDC.bufferedAmountLowThreshold = 65535;\n // handle buffer amount low events\n this.lossyDC.onbufferedamountlow = this.handleBufferedAmountLow;\n this.reliableDC.onbufferedamountlow = this.handleBufferedAmountLow;\n }\n createSender(track, opts, encodings) {\n return __awaiter(this, void 0, void 0, function* () {\n if (supportsTransceiver()) {\n const sender = yield this.createTransceiverRTCRtpSender(track, opts, encodings);\n return sender;\n }\n if (supportsAddTrack()) {\n this.log.warn('using add-track fallback', this.logContext);\n const sender = yield this.createRTCRtpSender(track.mediaStreamTrack);\n return sender;\n }\n throw new UnexpectedConnectionState('Required webRTC APIs not supported on this device');\n });\n }\n createSimulcastSender(track, simulcastTrack, opts, encodings) {\n return __awaiter(this, void 0, void 0, function* () {\n // store RTCRtpSender\n if (supportsTransceiver()) {\n return this.createSimulcastTransceiverSender(track, simulcastTrack, opts, encodings);\n }\n if (supportsAddTrack()) {\n this.log.debug('using add-track fallback', this.logContext);\n return this.createRTCRtpSender(track.mediaStreamTrack);\n }\n throw new UnexpectedConnectionState('Cannot stream on this device');\n });\n }\n createTransceiverRTCRtpSender(track, opts, encodings) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.pcManager) {\n throw new UnexpectedConnectionState('publisher is closed');\n }\n const streams = [];\n if (track.mediaStream) {\n streams.push(track.mediaStream);\n }\n if (isVideoTrack(track)) {\n track.codec = opts.videoCodec;\n }\n const transceiverInit = {\n direction: 'sendonly',\n streams\n };\n if (encodings) {\n transceiverInit.sendEncodings = encodings;\n }\n // addTransceiver for react-native is async. web is synchronous, but await won't effect it.\n const transceiver = yield this.pcManager.addPublisherTransceiver(track.mediaStreamTrack, transceiverInit);\n return transceiver.sender;\n });\n }\n createSimulcastTransceiverSender(track, simulcastTrack, opts, encodings) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.pcManager) {\n throw new UnexpectedConnectionState('publisher is closed');\n }\n const transceiverInit = {\n direction: 'sendonly'\n };\n if (encodings) {\n transceiverInit.sendEncodings = encodings;\n }\n // addTransceiver for react-native is async. web is synchronous, but await won't effect it.\n const transceiver = yield this.pcManager.addPublisherTransceiver(simulcastTrack.mediaStreamTrack, transceiverInit);\n if (!opts.videoCodec) {\n return;\n }\n track.setSimulcastTrackSender(opts.videoCodec, transceiver.sender);\n return transceiver.sender;\n });\n }\n createRTCRtpSender(track) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.pcManager) {\n throw new UnexpectedConnectionState('publisher is closed');\n }\n return this.pcManager.addPublisherTrack(track);\n });\n }\n attemptReconnect(reason) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c;\n if (this._isClosed) {\n return;\n }\n // guard for attempting reconnection multiple times while one attempt is still not finished\n if (this.attemptingReconnect) {\n livekitLogger.warn('already attempting reconnect, returning early', this.logContext);\n return;\n }\n if (((_a = this.clientConfiguration) === null || _a === void 0 ? void 0 : _a.resumeConnection) === ClientConfigSetting.DISABLED ||\n // signaling state could change to closed due to hardware sleep\n // those connections cannot be resumed\n ((_c = (_b = this.pcManager) === null || _b === void 0 ? void 0 : _b.currentState) !== null && _c !== void 0 ? _c : PCTransportState.NEW) === PCTransportState.NEW) {\n this.fullReconnectOnNext = true;\n }\n try {\n this.attemptingReconnect = true;\n if (this.fullReconnectOnNext) {\n yield this.restartConnection();\n } else {\n yield this.resumeConnection(reason);\n }\n this.clearPendingReconnect();\n this.fullReconnectOnNext = false;\n } catch (e) {\n this.reconnectAttempts += 1;\n let recoverable = true;\n if (e instanceof UnexpectedConnectionState) {\n this.log.debug('received unrecoverable error', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n // unrecoverable\n recoverable = false;\n } else if (!(e instanceof SignalReconnectError)) {\n // cannot resume\n this.fullReconnectOnNext = true;\n }\n if (recoverable) {\n this.handleDisconnect('reconnect', ReconnectReason.RR_UNKNOWN);\n } else {\n this.log.info(\"could not recover connection after \".concat(this.reconnectAttempts, \" attempts, \").concat(Date.now() - this.reconnectStart, \"ms. giving up\"), this.logContext);\n this.emit(EngineEvent.Disconnected);\n yield this.close();\n }\n } finally {\n this.attemptingReconnect = false;\n }\n });\n }\n getNextRetryDelay(context) {\n try {\n return this.reconnectPolicy.nextRetryDelayInMs(context);\n } catch (e) {\n this.log.warn('encountered error in reconnect policy', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n }\n // error in user code with provided reconnect policy, stop reconnecting\n return null;\n }\n restartConnection(regionUrl) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c;\n try {\n if (!this.url || !this.token) {\n // permanent failure, don't attempt reconnection\n throw new UnexpectedConnectionState('could not reconnect, url or token not saved');\n }\n this.log.info(\"reconnecting, attempt: \".concat(this.reconnectAttempts), this.logContext);\n this.emit(EngineEvent.Restarting);\n if (!this.client.isDisconnected) {\n yield this.client.sendLeave();\n }\n yield this.cleanupPeerConnections();\n yield this.cleanupClient();\n let joinResponse;\n try {\n if (!this.signalOpts) {\n this.log.warn('attempted connection restart, without signal options present', this.logContext);\n throw new SignalReconnectError();\n }\n // in case a regionUrl is passed, the region URL takes precedence\n joinResponse = yield this.join(regionUrl !== null && regionUrl !== void 0 ? regionUrl : this.url, this.token, this.signalOpts);\n } catch (e) {\n if (e instanceof ConnectionError && e.reason === ConnectionErrorReason.NotAllowed) {\n throw new UnexpectedConnectionState('could not reconnect, token might be expired');\n }\n throw new SignalReconnectError();\n }\n if (this.shouldFailNext) {\n this.shouldFailNext = false;\n throw new Error('simulated failure');\n }\n this.client.setReconnected();\n this.emit(EngineEvent.SignalRestarted, joinResponse);\n yield this.waitForPCReconnected();\n // re-check signal connection state before setting engine as resumed\n if (this.client.currentState !== SignalConnectionState.CONNECTED) {\n throw new SignalReconnectError('Signal connection got severed during reconnect');\n }\n (_a = this.regionUrlProvider) === null || _a === void 0 ? void 0 : _a.resetAttempts();\n // reconnect success\n this.emit(EngineEvent.Restarted);\n } catch (error) {\n const nextRegionUrl = yield (_b = this.regionUrlProvider) === null || _b === void 0 ? void 0 : _b.getNextBestRegionUrl();\n if (nextRegionUrl) {\n yield this.restartConnection(nextRegionUrl);\n return;\n } else {\n // no more regions to try (or we're not on cloud)\n (_c = this.regionUrlProvider) === null || _c === void 0 ? void 0 : _c.resetAttempts();\n throw error;\n }\n }\n });\n }\n resumeConnection(reason) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (!this.url || !this.token) {\n // permanent failure, don't attempt reconnection\n throw new UnexpectedConnectionState('could not reconnect, url or token not saved');\n }\n // trigger publisher reconnect\n if (!this.pcManager) {\n throw new UnexpectedConnectionState('publisher and subscriber connections unset');\n }\n this.log.info(\"resuming signal connection, attempt \".concat(this.reconnectAttempts), this.logContext);\n this.emit(EngineEvent.Resuming);\n let res;\n try {\n this.setupSignalClientCallbacks();\n res = yield this.client.reconnect(this.url, this.token, this.participantSid, reason);\n } catch (error) {\n let message = '';\n if (error instanceof Error) {\n message = error.message;\n this.log.error(error.message, Object.assign(Object.assign({}, this.logContext), {\n error\n }));\n }\n if (error instanceof ConnectionError && error.reason === ConnectionErrorReason.NotAllowed) {\n throw new UnexpectedConnectionState('could not reconnect, token might be expired');\n }\n if (error instanceof ConnectionError && error.reason === ConnectionErrorReason.LeaveRequest) {\n throw error;\n }\n throw new SignalReconnectError(message);\n }\n this.emit(EngineEvent.SignalResumed);\n if (res) {\n const rtcConfig = this.makeRTCConfiguration(res);\n this.pcManager.updateConfiguration(rtcConfig);\n if (this.latestJoinResponse) {\n this.latestJoinResponse.serverInfo = res.serverInfo;\n }\n } else {\n this.log.warn('Did not receive reconnect response', this.logContext);\n }\n if (this.shouldFailNext) {\n this.shouldFailNext = false;\n throw new Error('simulated failure');\n }\n yield this.pcManager.triggerIceRestart();\n yield this.waitForPCReconnected();\n // re-check signal connection state before setting engine as resumed\n if (this.client.currentState !== SignalConnectionState.CONNECTED) {\n throw new SignalReconnectError('Signal connection got severed during reconnect');\n }\n this.client.setReconnected();\n // recreate publish datachannel if it's id is null\n // (for safari https://bugs.webkit.org/show_bug.cgi?id=184688)\n if (((_a = this.reliableDC) === null || _a === void 0 ? void 0 : _a.readyState) === 'open' && this.reliableDC.id === null) {\n this.createDataChannels();\n }\n if (res === null || res === void 0 ? void 0 : res.lastMessageSeq) {\n this.resendReliableMessagesForResume(res.lastMessageSeq);\n }\n // resume success\n this.emit(EngineEvent.Resumed);\n });\n }\n waitForPCInitialConnection(timeout, abortController) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.pcManager) {\n throw new UnexpectedConnectionState('PC manager is closed');\n }\n yield this.pcManager.ensurePCTransportConnection(abortController, timeout);\n });\n }\n waitForPCReconnected() {\n return __awaiter(this, void 0, void 0, function* () {\n this.pcState = PCState.Reconnecting;\n this.log.debug('waiting for peer connection to reconnect', this.logContext);\n try {\n yield sleep(minReconnectWait); // FIXME setTimeout again not ideal for a connection critical path\n if (!this.pcManager) {\n throw new UnexpectedConnectionState('PC manager is closed');\n }\n yield this.pcManager.ensurePCTransportConnection(undefined, this.peerConnectionTimeout);\n this.pcState = PCState.Connected;\n } catch (e) {\n // TODO do we need a `failed` state here for the PC?\n this.pcState = PCState.Disconnected;\n throw new ConnectionError(\"could not establish PC connection, \".concat(e.message), ConnectionErrorReason.InternalError);\n }\n });\n }\n /** @internal */\n publishRpcResponse(destinationIdentity, requestId, payload, error) {\n return __awaiter(this, void 0, void 0, function* () {\n const packet = new DataPacket({\n destinationIdentities: [destinationIdentity],\n kind: DataPacket_Kind.RELIABLE,\n value: {\n case: 'rpcResponse',\n value: new RpcResponse({\n requestId,\n value: error ? {\n case: 'error',\n value: error.toProto()\n } : {\n case: 'payload',\n value: payload !== null && payload !== void 0 ? payload : ''\n }\n })\n }\n });\n yield this.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n });\n }\n /** @internal */\n publishRpcAck(destinationIdentity, requestId) {\n return __awaiter(this, void 0, void 0, function* () {\n const packet = new DataPacket({\n destinationIdentities: [destinationIdentity],\n kind: DataPacket_Kind.RELIABLE,\n value: {\n case: 'rpcAck',\n value: new RpcAck({\n requestId\n })\n }\n });\n yield this.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n });\n }\n /* @internal */\n sendDataPacket(packet, kind) {\n return __awaiter(this, void 0, void 0, function* () {\n // make sure we do have a data connection\n yield this.ensurePublisherConnected(kind);\n if (kind === DataPacket_Kind.RELIABLE) {\n packet.sequence = this.reliableDataSequence;\n this.reliableDataSequence += 1;\n }\n const msg = packet.toBinary();\n const dc = this.dataChannelForKind(kind);\n if (dc) {\n if (kind === DataPacket_Kind.RELIABLE) {\n this.reliableMessageBuffer.push({\n data: msg,\n sequence: packet.sequence\n });\n }\n if (this.attemptingReconnect) {\n return;\n }\n dc.send(msg);\n }\n this.updateAndEmitDCBufferStatus(kind);\n });\n }\n resendReliableMessagesForResume(lastMessageSeq) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.ensurePublisherConnected(DataPacket_Kind.RELIABLE);\n const dc = this.dataChannelForKind(DataPacket_Kind.RELIABLE);\n if (dc) {\n this.reliableMessageBuffer.popToSequence(lastMessageSeq);\n this.reliableMessageBuffer.getAll().forEach(msg => {\n dc.send(msg.data);\n });\n }\n this.updateAndEmitDCBufferStatus(DataPacket_Kind.RELIABLE);\n });\n }\n waitForBufferStatusLow(kind) {\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n if (this.isBufferStatusLow(kind)) {\n resolve();\n } else {\n const onClosing = () => reject('Engine closed');\n this.once(EngineEvent.Closing, onClosing);\n while (!this.dcBufferStatus.get(kind)) {\n yield sleep(10);\n }\n this.off(EngineEvent.Closing, onClosing);\n resolve();\n }\n }));\n }\n /**\n * @internal\n */\n ensureDataTransportConnected(kind_1) {\n return __awaiter(this, arguments, void 0, function (kind) {\n var _this2 = this;\n let subscriber = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : this.subscriberPrimary;\n return function* () {\n var _a;\n if (!_this2.pcManager) {\n throw new UnexpectedConnectionState('PC manager is closed');\n }\n const transport = subscriber ? _this2.pcManager.subscriber : _this2.pcManager.publisher;\n const transportName = subscriber ? 'Subscriber' : 'Publisher';\n if (!transport) {\n throw new ConnectionError(\"\".concat(transportName, \" connection not set\"), ConnectionErrorReason.InternalError);\n }\n let needNegotiation = false;\n if (!subscriber && !_this2.dataChannelForKind(kind, subscriber)) {\n _this2.createDataChannels();\n needNegotiation = true;\n }\n if (!needNegotiation && !subscriber && !_this2.pcManager.publisher.isICEConnected && _this2.pcManager.publisher.getICEConnectionState() !== 'checking') {\n needNegotiation = true;\n }\n if (needNegotiation) {\n // start negotiation\n _this2.negotiate();\n }\n const targetChannel = _this2.dataChannelForKind(kind, subscriber);\n if ((targetChannel === null || targetChannel === void 0 ? void 0 : targetChannel.readyState) === 'open') {\n return;\n }\n // wait until ICE connected\n const endTime = new Date().getTime() + _this2.peerConnectionTimeout;\n while (new Date().getTime() < endTime) {\n if (transport.isICEConnected && ((_a = _this2.dataChannelForKind(kind, subscriber)) === null || _a === void 0 ? void 0 : _a.readyState) === 'open') {\n return;\n }\n yield sleep(50);\n }\n throw new ConnectionError(\"could not establish \".concat(transportName, \" connection, state: \").concat(transport.getICEConnectionState()), ConnectionErrorReason.InternalError);\n }();\n });\n }\n ensurePublisherConnected(kind) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.publisherConnectionPromise) {\n this.publisherConnectionPromise = this.ensureDataTransportConnected(kind, false);\n }\n yield this.publisherConnectionPromise;\n });\n }\n /* @internal */\n verifyTransport() {\n if (!this.pcManager) {\n return false;\n }\n // primary connection\n if (this.pcManager.currentState !== PCTransportState.CONNECTED) {\n return false;\n }\n // ensure signal is connected\n if (!this.client.ws || this.client.ws.readyState === WebSocket.CLOSED) {\n return false;\n }\n return true;\n }\n /** @internal */\n negotiate() {\n return __awaiter(this, void 0, void 0, function* () {\n // observe signal state\n return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n if (!this.pcManager) {\n reject(new NegotiationError('PC manager is closed'));\n return;\n }\n this.pcManager.requirePublisher();\n // don't negotiate without any transceivers or data channel, it will generate sdp without ice frag then negotiate failed\n if (this.pcManager.publisher.getTransceivers().length == 0 && !this.lossyDC && !this.reliableDC) {\n this.createDataChannels();\n }\n const abortController = new AbortController();\n const handleClosed = () => {\n abortController.abort();\n this.log.debug('engine disconnected while negotiation was ongoing', this.logContext);\n resolve();\n return;\n };\n if (this.isClosed) {\n reject('cannot negotiate on closed engine');\n }\n this.on(EngineEvent.Closing, handleClosed);\n this.pcManager.publisher.once(PCEvents.RTPVideoPayloadTypes, rtpTypes => {\n const rtpMap = new Map();\n rtpTypes.forEach(rtp => {\n const codec = rtp.codec.toLowerCase();\n if (isVideoCodec(codec)) {\n rtpMap.set(rtp.payload, codec);\n }\n });\n this.emit(EngineEvent.RTPVideoMapUpdate, rtpMap);\n });\n try {\n yield this.pcManager.negotiate(abortController);\n resolve();\n } catch (e) {\n if (e instanceof NegotiationError) {\n this.fullReconnectOnNext = true;\n }\n this.handleDisconnect('negotiation', ReconnectReason.RR_UNKNOWN);\n reject(e);\n } finally {\n this.off(EngineEvent.Closing, handleClosed);\n }\n }));\n });\n }\n dataChannelForKind(kind, sub) {\n if (!sub) {\n if (kind === DataPacket_Kind.LOSSY) {\n return this.lossyDC;\n }\n if (kind === DataPacket_Kind.RELIABLE) {\n return this.reliableDC;\n }\n } else {\n if (kind === DataPacket_Kind.LOSSY) {\n return this.lossyDCSub;\n }\n if (kind === DataPacket_Kind.RELIABLE) {\n return this.reliableDCSub;\n }\n }\n }\n /** @internal */\n sendSyncState(remoteTracks, localTracks) {\n var _a, _b;\n if (!this.pcManager) {\n this.log.warn('sync state cannot be sent without peer connection setup', this.logContext);\n return;\n }\n const previousAnswer = this.pcManager.subscriber.getLocalDescription();\n const previousOffer = this.pcManager.subscriber.getRemoteDescription();\n /* 1. autosubscribe on, so subscribed tracks = all tracks - unsub tracks,\n in this case, we send unsub tracks, so server add all tracks to this\n subscribe pc and unsub special tracks from it.\n 2. autosubscribe off, we send subscribed tracks.\n */\n const autoSubscribe = (_b = (_a = this.signalOpts) === null || _a === void 0 ? void 0 : _a.autoSubscribe) !== null && _b !== void 0 ? _b : true;\n const trackSids = new Array();\n const trackSidsDisabled = new Array();\n remoteTracks.forEach(track => {\n if (track.isDesired !== autoSubscribe) {\n trackSids.push(track.trackSid);\n }\n if (!track.isEnabled) {\n trackSidsDisabled.push(track.trackSid);\n }\n });\n this.client.sendSyncState(new SyncState({\n answer: previousAnswer ? toProtoSessionDescription({\n sdp: previousAnswer.sdp,\n type: previousAnswer.type\n }) : undefined,\n offer: previousOffer ? toProtoSessionDescription({\n sdp: previousOffer.sdp,\n type: previousOffer.type\n }) : undefined,\n subscription: new UpdateSubscription({\n trackSids,\n subscribe: !autoSubscribe,\n participantTracks: []\n }),\n publishTracks: getTrackPublicationInfo(localTracks),\n dataChannels: this.dataChannelsInfo(),\n trackSidsDisabled,\n datachannelReceiveStates: this.reliableReceivedState.map((seq, sid) => {\n return new DataChannelReceiveState({\n publisherSid: sid,\n lastSeq: seq\n });\n })\n }));\n }\n /* @internal */\n failNext() {\n // debugging method to fail the next reconnect/resume attempt\n this.shouldFailNext = true;\n }\n dataChannelsInfo() {\n const infos = [];\n const getInfo = (dc, target) => {\n if ((dc === null || dc === void 0 ? void 0 : dc.id) !== undefined && dc.id !== null) {\n infos.push(new DataChannelInfo({\n label: dc.label,\n id: dc.id,\n target\n }));\n }\n };\n getInfo(this.dataChannelForKind(DataPacket_Kind.LOSSY), SignalTarget.PUBLISHER);\n getInfo(this.dataChannelForKind(DataPacket_Kind.RELIABLE), SignalTarget.PUBLISHER);\n getInfo(this.dataChannelForKind(DataPacket_Kind.LOSSY, true), SignalTarget.SUBSCRIBER);\n getInfo(this.dataChannelForKind(DataPacket_Kind.RELIABLE, true), SignalTarget.SUBSCRIBER);\n return infos;\n }\n clearReconnectTimeout() {\n if (this.reconnectTimeout) {\n CriticalTimers.clearTimeout(this.reconnectTimeout);\n }\n }\n clearPendingReconnect() {\n this.clearReconnectTimeout();\n this.reconnectAttempts = 0;\n }\n registerOnLineListener() {\n if (isWeb()) {\n window.addEventListener('online', this.handleBrowserOnLine);\n }\n }\n deregisterOnLineListener() {\n if (isWeb()) {\n window.removeEventListener('online', this.handleBrowserOnLine);\n }\n }\n}\nclass SignalReconnectError extends Error {}\nfunction supportOptionalDatachannel(protocol) {\n return protocol !== undefined && protocol > 13;\n}\nfunction applyUserDataCompat(newObj, oldObj) {\n const participantIdentity = newObj.participantIdentity ? newObj.participantIdentity : oldObj.participantIdentity;\n newObj.participantIdentity = participantIdentity;\n oldObj.participantIdentity = participantIdentity;\n const destinationIdentities = newObj.destinationIdentities.length !== 0 ? newObj.destinationIdentities : oldObj.destinationIdentities;\n newObj.destinationIdentities = destinationIdentities;\n oldObj.destinationIdentities = destinationIdentities;\n}\n\nclass RegionUrlProvider {\n constructor(url, token) {\n this.lastUpdateAt = 0;\n this.settingsCacheTime = 3000;\n this.attemptedRegions = [];\n this.serverUrl = new URL(url);\n this.token = token;\n }\n updateToken(token) {\n this.token = token;\n }\n isCloud() {\n return isCloud(this.serverUrl);\n }\n getServerUrl() {\n return this.serverUrl;\n }\n getNextBestRegionUrl(abortSignal) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.isCloud()) {\n throw Error('region availability is only supported for LiveKit Cloud domains');\n }\n if (!this.regionSettings || Date.now() - this.lastUpdateAt > this.settingsCacheTime) {\n this.regionSettings = yield this.fetchRegionSettings(abortSignal);\n }\n const regionsLeft = this.regionSettings.regions.filter(region => !this.attemptedRegions.find(attempted => attempted.url === region.url));\n if (regionsLeft.length > 0) {\n const nextRegion = regionsLeft[0];\n this.attemptedRegions.push(nextRegion);\n livekitLogger.debug(\"next region: \".concat(nextRegion.region));\n return nextRegion.url;\n } else {\n return null;\n }\n });\n }\n resetAttempts() {\n this.attemptedRegions = [];\n }\n /* @internal */\n fetchRegionSettings(signal) {\n return __awaiter(this, void 0, void 0, function* () {\n const regionSettingsResponse = yield fetch(\"\".concat(getCloudConfigUrl(this.serverUrl), \"/regions\"), {\n headers: {\n authorization: \"Bearer \".concat(this.token)\n },\n signal\n });\n if (regionSettingsResponse.ok) {\n const regionSettings = yield regionSettingsResponse.json();\n this.lastUpdateAt = Date.now();\n return regionSettings;\n } else {\n throw new ConnectionError(\"Could not fetch region settings: \".concat(regionSettingsResponse.statusText), regionSettingsResponse.status === 401 ? ConnectionErrorReason.NotAllowed : ConnectionErrorReason.InternalError, regionSettingsResponse.status);\n }\n });\n }\n setServerReportedRegions(regions) {\n this.regionSettings = regions;\n this.lastUpdateAt = Date.now();\n }\n}\nfunction getCloudConfigUrl(serverUrl) {\n return \"\".concat(serverUrl.protocol.replace('ws', 'http'), \"//\").concat(serverUrl.host, \"/settings\");\n}\n\nclass BaseStreamReader {\n get info() {\n return this._info;\n }\n constructor(info, stream, totalByteSize) {\n this.reader = stream;\n this.totalByteSize = totalByteSize;\n this._info = info;\n this.bytesReceived = 0;\n }\n}\nclass ByteStreamReader extends BaseStreamReader {\n handleChunkReceived(chunk) {\n var _a;\n this.bytesReceived += chunk.content.byteLength;\n const currentProgress = this.totalByteSize ? this.bytesReceived / this.totalByteSize : undefined;\n (_a = this.onProgress) === null || _a === void 0 ? void 0 : _a.call(this, currentProgress);\n }\n [Symbol.asyncIterator]() {\n const reader = this.reader.getReader();\n return {\n next: () => __awaiter(this, void 0, void 0, function* () {\n try {\n const {\n done,\n value\n } = yield reader.read();\n if (done) {\n return {\n done: true,\n value: undefined\n };\n } else {\n this.handleChunkReceived(value);\n return {\n done: false,\n value: value.content\n };\n }\n } catch (error) {\n // TODO handle errors\n return {\n done: true,\n value: undefined\n };\n }\n }),\n return() {\n return __awaiter(this, void 0, void 0, function* () {\n reader.releaseLock();\n return {\n done: true,\n value: undefined\n };\n });\n }\n };\n }\n readAll() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, e_1, _b, _c;\n let chunks = new Set();\n try {\n for (var _d = true, _e = __asyncValues(this), _f; _f = yield _e.next(), _a = _f.done, !_a; _d = true) {\n _c = _f.value;\n _d = false;\n const chunk = _c;\n chunks.add(chunk);\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n return Array.from(chunks);\n });\n }\n}\n/**\n * A class to read chunks from a ReadableStream and provide them in a structured format.\n */\nclass TextStreamReader extends BaseStreamReader {\n /**\n * A TextStreamReader instance can be used as an AsyncIterator that returns the entire string\n * that has been received up to the current point in time.\n */\n constructor(info, stream, totalChunkCount) {\n super(info, stream, totalChunkCount);\n this.receivedChunks = new Map();\n }\n handleChunkReceived(chunk) {\n var _a;\n const index = bigIntToNumber(chunk.chunkIndex);\n const previousChunkAtIndex = this.receivedChunks.get(index);\n if (previousChunkAtIndex && previousChunkAtIndex.version > chunk.version) {\n // we have a newer version already, dropping the old one\n return;\n }\n this.receivedChunks.set(index, chunk);\n this.bytesReceived += chunk.content.byteLength;\n const currentProgress = this.totalByteSize ? this.bytesReceived / this.totalByteSize : undefined;\n (_a = this.onProgress) === null || _a === void 0 ? void 0 : _a.call(this, currentProgress);\n }\n /**\n * Async iterator implementation to allow usage of `for await...of` syntax.\n * Yields structured chunks from the stream.\n *\n */\n [Symbol.asyncIterator]() {\n const reader = this.reader.getReader();\n const decoder = new TextDecoder();\n return {\n next: () => __awaiter(this, void 0, void 0, function* () {\n try {\n const {\n done,\n value\n } = yield reader.read();\n if (done) {\n return {\n done: true,\n value: undefined\n };\n } else {\n this.handleChunkReceived(value);\n return {\n done: false,\n value: decoder.decode(value.content)\n };\n }\n } catch (error) {\n // TODO handle errors\n return {\n done: true,\n value: undefined\n };\n }\n }),\n return() {\n return __awaiter(this, void 0, void 0, function* () {\n reader.releaseLock();\n return {\n done: true,\n value: undefined\n };\n });\n }\n };\n }\n readAll() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, e_2, _b, _c;\n let finalString = '';\n try {\n for (var _d = true, _e = __asyncValues(this), _f; _f = yield _e.next(), _a = _f.done, !_a; _d = true) {\n _c = _f.value;\n _d = false;\n const chunk = _c;\n finalString += chunk;\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (!_d && !_a && (_b = _e.return)) yield _b.call(_e);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n return finalString;\n });\n }\n}\n\nclass BaseStreamWriter {\n constructor(writableStream, info, onClose) {\n this.writableStream = writableStream;\n this.defaultWriter = writableStream.getWriter();\n this.onClose = onClose;\n this.info = info;\n }\n write(chunk) {\n return this.defaultWriter.write(chunk);\n }\n close() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n yield this.defaultWriter.close();\n this.defaultWriter.releaseLock();\n (_a = this.onClose) === null || _a === void 0 ? void 0 : _a.call(this);\n });\n }\n}\nclass TextStreamWriter extends BaseStreamWriter {}\nclass ByteStreamWriter extends BaseStreamWriter {}\n\nclass RemoteTrack extends Track {\n constructor(mediaTrack, sid, kind, receiver, loggerOptions) {\n super(mediaTrack, kind, loggerOptions);\n this.sid = sid;\n this.receiver = receiver;\n }\n get isLocal() {\n return false;\n }\n /** @internal */\n setMuted(muted) {\n if (this.isMuted !== muted) {\n this.isMuted = muted;\n this._mediaStreamTrack.enabled = !muted;\n this.emit(muted ? TrackEvent.Muted : TrackEvent.Unmuted, this);\n }\n }\n /** @internal */\n setMediaStream(stream) {\n // this is needed to determine when the track is finished\n this.mediaStream = stream;\n const onRemoveTrack = event => {\n if (event.track === this._mediaStreamTrack) {\n stream.removeEventListener('removetrack', onRemoveTrack);\n if (this.receiver && 'playoutDelayHint' in this.receiver) {\n this.receiver.playoutDelayHint = undefined;\n }\n this.receiver = undefined;\n this._currentBitrate = 0;\n this.emit(TrackEvent.Ended, this);\n }\n };\n stream.addEventListener('removetrack', onRemoveTrack);\n }\n start() {\n this.startMonitor();\n // use `enabled` of track to enable re-use of transceiver\n super.enable();\n }\n stop() {\n this.stopMonitor();\n // use `enabled` of track to enable re-use of transceiver\n super.disable();\n }\n /**\n * Gets the RTCStatsReport for the RemoteTrack's underlying RTCRtpReceiver\n * See https://developer.mozilla.org/en-US/docs/Web/API/RTCStatsReport\n *\n * @returns Promise<RTCStatsReport> | undefined\n */\n getRTCStatsReport() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (!((_a = this.receiver) === null || _a === void 0 ? void 0 : _a.getStats)) {\n return;\n }\n const statsReport = yield this.receiver.getStats();\n return statsReport;\n });\n }\n /**\n * Allows to set a playout delay (in seconds) for this track.\n * A higher value allows for more buffering of the track in the browser\n * and will result in a delay of media being played back of `delayInSeconds`\n */\n setPlayoutDelay(delayInSeconds) {\n if (this.receiver) {\n if ('playoutDelayHint' in this.receiver) {\n this.receiver.playoutDelayHint = delayInSeconds;\n } else {\n this.log.warn('Playout delay not supported in this browser');\n }\n } else {\n this.log.warn('Cannot set playout delay, track already ended');\n }\n }\n /**\n * Returns the current playout delay (in seconds) of this track.\n */\n getPlayoutDelay() {\n if (this.receiver) {\n if ('playoutDelayHint' in this.receiver) {\n return this.receiver.playoutDelayHint;\n } else {\n this.log.warn('Playout delay not supported in this browser');\n }\n } else {\n this.log.warn('Cannot get playout delay, track already ended');\n }\n return 0;\n }\n /* @internal */\n startMonitor() {\n if (!this.monitorInterval) {\n this.monitorInterval = setInterval(() => this.monitorReceiver(), monitorFrequency);\n }\n if (supportsSynchronizationSources()) {\n this.registerTimeSyncUpdate();\n }\n }\n registerTimeSyncUpdate() {\n const loop = () => {\n var _a;\n this.timeSyncHandle = requestAnimationFrame(() => loop());\n const sources = (_a = this.receiver) === null || _a === void 0 ? void 0 : _a.getSynchronizationSources()[0];\n if (sources) {\n const {\n timestamp,\n rtpTimestamp\n } = sources;\n if (rtpTimestamp && this.rtpTimestamp !== rtpTimestamp) {\n this.emit(TrackEvent.TimeSyncUpdate, {\n timestamp,\n rtpTimestamp\n });\n this.rtpTimestamp = rtpTimestamp;\n }\n }\n };\n loop();\n }\n}\n\nclass RemoteAudioTrack extends RemoteTrack {\n constructor(mediaTrack, sid, receiver, audioContext, audioOutput, loggerOptions) {\n super(mediaTrack, sid, Track.Kind.Audio, receiver, loggerOptions);\n this.monitorReceiver = () => __awaiter(this, void 0, void 0, function* () {\n if (!this.receiver) {\n this._currentBitrate = 0;\n return;\n }\n const stats = yield this.getReceiverStats();\n if (stats && this.prevStats && this.receiver) {\n this._currentBitrate = computeBitrate(stats, this.prevStats);\n }\n this.prevStats = stats;\n });\n this.audioContext = audioContext;\n this.webAudioPluginNodes = [];\n if (audioOutput) {\n this.sinkId = audioOutput.deviceId;\n }\n }\n /**\n * sets the volume for all attached audio elements\n */\n setVolume(volume) {\n var _a;\n for (const el of this.attachedElements) {\n if (this.audioContext) {\n (_a = this.gainNode) === null || _a === void 0 ? void 0 : _a.gain.setTargetAtTime(volume, 0, 0.1);\n } else {\n el.volume = volume;\n }\n }\n if (isReactNative()) {\n // @ts-ignore\n this._mediaStreamTrack._setVolume(volume);\n }\n this.elementVolume = volume;\n }\n /**\n * gets the volume of attached audio elements (loudest)\n */\n getVolume() {\n if (this.elementVolume) {\n return this.elementVolume;\n }\n if (isReactNative()) {\n // RN volume value defaults to 1.0 if hasn't been changed.\n return 1.0;\n }\n let highestVolume = 0;\n this.attachedElements.forEach(element => {\n if (element.volume > highestVolume) {\n highestVolume = element.volume;\n }\n });\n return highestVolume;\n }\n /**\n * calls setSinkId on all attached elements, if supported\n * @param deviceId audio output device\n */\n setSinkId(deviceId) {\n return __awaiter(this, void 0, void 0, function* () {\n this.sinkId = deviceId;\n yield Promise.all(this.attachedElements.map(elm => {\n if (!supportsSetSinkId(elm)) {\n return;\n }\n /* @ts-ignore */\n return elm.setSinkId(deviceId);\n }));\n });\n }\n attach(element) {\n const needsNewWebAudioConnection = this.attachedElements.length === 0;\n if (!element) {\n element = super.attach();\n } else {\n super.attach(element);\n }\n if (this.sinkId && supportsSetSinkId(element)) {\n element.setSinkId(this.sinkId).catch(e => {\n this.log.error('Failed to set sink id on remote audio track', e, this.logContext);\n });\n }\n if (this.audioContext && needsNewWebAudioConnection) {\n this.log.debug('using audio context mapping', this.logContext);\n this.connectWebAudio(this.audioContext, element);\n element.volume = 0;\n element.muted = true;\n }\n if (this.elementVolume) {\n // make sure volume setting is being applied to the newly attached element\n this.setVolume(this.elementVolume);\n }\n return element;\n }\n detach(element) {\n let detached;\n if (!element) {\n detached = super.detach();\n this.disconnectWebAudio();\n } else {\n detached = super.detach(element);\n // if there are still any attached elements after detaching, connect webaudio to the first element that's left\n // disconnect webaudio otherwise\n if (this.audioContext) {\n if (this.attachedElements.length > 0) {\n this.connectWebAudio(this.audioContext, this.attachedElements[0]);\n } else {\n this.disconnectWebAudio();\n }\n }\n }\n return detached;\n }\n /**\n * @internal\n * @experimental\n */\n setAudioContext(audioContext) {\n this.audioContext = audioContext;\n if (audioContext && this.attachedElements.length > 0) {\n this.connectWebAudio(audioContext, this.attachedElements[0]);\n } else if (!audioContext) {\n this.disconnectWebAudio();\n }\n }\n /**\n * @internal\n * @experimental\n * @param {AudioNode[]} nodes - An array of WebAudio nodes. These nodes should not be connected to each other when passed, as the sdk will take care of connecting them in the order of the array.\n */\n setWebAudioPlugins(nodes) {\n this.webAudioPluginNodes = nodes;\n if (this.attachedElements.length > 0 && this.audioContext) {\n this.connectWebAudio(this.audioContext, this.attachedElements[0]);\n }\n }\n connectWebAudio(context, element) {\n this.disconnectWebAudio();\n // @ts-ignore attached elements always have a srcObject set\n this.sourceNode = context.createMediaStreamSource(element.srcObject);\n let lastNode = this.sourceNode;\n this.webAudioPluginNodes.forEach(node => {\n lastNode.connect(node);\n lastNode = node;\n });\n this.gainNode = context.createGain();\n lastNode.connect(this.gainNode);\n this.gainNode.connect(context.destination);\n if (this.elementVolume) {\n this.gainNode.gain.setTargetAtTime(this.elementVolume, 0, 0.1);\n }\n // try to resume the context if it isn't running already\n if (context.state !== 'running') {\n context.resume().then(() => {\n if (context.state !== 'running') {\n this.emit(TrackEvent.AudioPlaybackFailed, new Error(\"Audio Context couldn't be started automatically\"));\n }\n }).catch(e => {\n this.emit(TrackEvent.AudioPlaybackFailed, e);\n });\n }\n }\n disconnectWebAudio() {\n var _a, _b;\n (_a = this.gainNode) === null || _a === void 0 ? void 0 : _a.disconnect();\n (_b = this.sourceNode) === null || _b === void 0 ? void 0 : _b.disconnect();\n this.gainNode = undefined;\n this.sourceNode = undefined;\n }\n getReceiverStats() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.receiver || !this.receiver.getStats) {\n return;\n }\n const stats = yield this.receiver.getStats();\n let receiverStats;\n stats.forEach(v => {\n if (v.type === 'inbound-rtp') {\n receiverStats = {\n type: 'audio',\n streamId: v.id,\n timestamp: v.timestamp,\n jitter: v.jitter,\n bytesReceived: v.bytesReceived,\n concealedSamples: v.concealedSamples,\n concealmentEvents: v.concealmentEvents,\n silentConcealedSamples: v.silentConcealedSamples,\n silentConcealmentEvents: v.silentConcealmentEvents,\n totalAudioEnergy: v.totalAudioEnergy,\n totalSamplesDuration: v.totalSamplesDuration\n };\n }\n });\n return receiverStats;\n });\n }\n}\n\nconst REACTION_DELAY = 100;\nclass RemoteVideoTrack extends RemoteTrack {\n constructor(mediaTrack, sid, receiver, adaptiveStreamSettings, loggerOptions) {\n super(mediaTrack, sid, Track.Kind.Video, receiver, loggerOptions);\n this.elementInfos = [];\n this.monitorReceiver = () => __awaiter(this, void 0, void 0, function* () {\n if (!this.receiver) {\n this._currentBitrate = 0;\n return;\n }\n const stats = yield this.getReceiverStats();\n if (stats && this.prevStats && this.receiver) {\n this._currentBitrate = computeBitrate(stats, this.prevStats);\n }\n this.prevStats = stats;\n });\n this.debouncedHandleResize = r(() => {\n this.updateDimensions();\n }, REACTION_DELAY);\n this.adaptiveStreamSettings = adaptiveStreamSettings;\n }\n get isAdaptiveStream() {\n return this.adaptiveStreamSettings !== undefined;\n }\n /**\n * Note: When using adaptiveStream, you need to use remoteVideoTrack.attach() to add the track to a HTMLVideoElement, otherwise your video tracks might never start\n */\n get mediaStreamTrack() {\n return this._mediaStreamTrack;\n }\n /** @internal */\n setMuted(muted) {\n super.setMuted(muted);\n this.attachedElements.forEach(element => {\n // detach or attach\n if (muted) {\n detachTrack(this._mediaStreamTrack, element);\n } else {\n attachToElement(this._mediaStreamTrack, element);\n }\n });\n }\n attach(element) {\n if (!element) {\n element = super.attach();\n } else {\n super.attach(element);\n }\n // It's possible attach is called multiple times on an element. When that's\n // the case, we'd want to avoid adding duplicate elementInfos\n if (this.adaptiveStreamSettings && this.elementInfos.find(info => info.element === element) === undefined) {\n const elementInfo = new HTMLElementInfo(element);\n this.observeElementInfo(elementInfo);\n }\n return element;\n }\n /**\n * Observe an ElementInfo for changes when adaptive streaming.\n * @param elementInfo\n * @internal\n */\n observeElementInfo(elementInfo) {\n if (this.adaptiveStreamSettings && this.elementInfos.find(info => info === elementInfo) === undefined) {\n elementInfo.handleResize = () => {\n this.debouncedHandleResize();\n };\n elementInfo.handleVisibilityChanged = () => {\n this.updateVisibility();\n };\n this.elementInfos.push(elementInfo);\n elementInfo.observe();\n // trigger the first resize update cycle\n // if the tab is backgrounded, the initial resize event does not fire until\n // the tab comes into focus for the first time.\n this.debouncedHandleResize();\n this.updateVisibility();\n } else {\n this.log.warn('visibility resize observer not triggered', this.logContext);\n }\n }\n /**\n * Stop observing an ElementInfo for changes.\n * @param elementInfo\n * @internal\n */\n stopObservingElementInfo(elementInfo) {\n if (!this.isAdaptiveStream) {\n this.log.warn('stopObservingElementInfo ignored', this.logContext);\n return;\n }\n const stopElementInfos = this.elementInfos.filter(info => info === elementInfo);\n for (const info of stopElementInfos) {\n info.stopObserving();\n }\n this.elementInfos = this.elementInfos.filter(info => info !== elementInfo);\n this.updateVisibility();\n this.debouncedHandleResize();\n }\n detach(element) {\n let detachedElements = [];\n if (element) {\n this.stopObservingElement(element);\n return super.detach(element);\n }\n detachedElements = super.detach();\n for (const e of detachedElements) {\n this.stopObservingElement(e);\n }\n return detachedElements;\n }\n /** @internal */\n getDecoderImplementation() {\n var _a;\n return (_a = this.prevStats) === null || _a === void 0 ? void 0 : _a.decoderImplementation;\n }\n getReceiverStats() {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.receiver || !this.receiver.getStats) {\n return;\n }\n const stats = yield this.receiver.getStats();\n let receiverStats;\n let codecID = '';\n let codecs = new Map();\n stats.forEach(v => {\n if (v.type === 'inbound-rtp') {\n codecID = v.codecId;\n receiverStats = {\n type: 'video',\n streamId: v.id,\n framesDecoded: v.framesDecoded,\n framesDropped: v.framesDropped,\n framesReceived: v.framesReceived,\n packetsReceived: v.packetsReceived,\n packetsLost: v.packetsLost,\n frameWidth: v.frameWidth,\n frameHeight: v.frameHeight,\n pliCount: v.pliCount,\n firCount: v.firCount,\n nackCount: v.nackCount,\n jitter: v.jitter,\n timestamp: v.timestamp,\n bytesReceived: v.bytesReceived,\n decoderImplementation: v.decoderImplementation\n };\n } else if (v.type === 'codec') {\n codecs.set(v.id, v);\n }\n });\n if (receiverStats && codecID !== '' && codecs.get(codecID)) {\n receiverStats.mimeType = codecs.get(codecID).mimeType;\n }\n return receiverStats;\n });\n }\n stopObservingElement(element) {\n const stopElementInfos = this.elementInfos.filter(info => info.element === element);\n for (const info of stopElementInfos) {\n this.stopObservingElementInfo(info);\n }\n }\n handleAppVisibilityChanged() {\n const _super = Object.create(null, {\n handleAppVisibilityChanged: {\n get: () => super.handleAppVisibilityChanged\n }\n });\n return __awaiter(this, void 0, void 0, function* () {\n yield _super.handleAppVisibilityChanged.call(this);\n if (!this.isAdaptiveStream) return;\n this.updateVisibility();\n });\n }\n updateVisibility() {\n var _a, _b;\n const lastVisibilityChange = this.elementInfos.reduce((prev, info) => Math.max(prev, info.visibilityChangedAt || 0), 0);\n const backgroundPause = ((_b = (_a = this.adaptiveStreamSettings) === null || _a === void 0 ? void 0 : _a.pauseVideoInBackground) !== null && _b !== void 0 ? _b : true // default to true\n ) ? this.isInBackground : false;\n const isPiPMode = this.elementInfos.some(info => info.pictureInPicture);\n const isVisible = this.elementInfos.some(info => info.visible) && !backgroundPause || isPiPMode;\n if (this.lastVisible === isVisible) {\n return;\n }\n if (!isVisible && Date.now() - lastVisibilityChange < REACTION_DELAY) {\n // delay hidden events\n CriticalTimers.setTimeout(() => {\n this.updateVisibility();\n }, REACTION_DELAY);\n return;\n }\n this.lastVisible = isVisible;\n this.emit(TrackEvent.VisibilityChanged, isVisible, this);\n }\n updateDimensions() {\n var _a, _b;\n let maxWidth = 0;\n let maxHeight = 0;\n const pixelDensity = this.getPixelDensity();\n for (const info of this.elementInfos) {\n const currentElementWidth = info.width() * pixelDensity;\n const currentElementHeight = info.height() * pixelDensity;\n if (currentElementWidth + currentElementHeight > maxWidth + maxHeight) {\n maxWidth = currentElementWidth;\n maxHeight = currentElementHeight;\n }\n }\n if (((_a = this.lastDimensions) === null || _a === void 0 ? void 0 : _a.width) === maxWidth && ((_b = this.lastDimensions) === null || _b === void 0 ? void 0 : _b.height) === maxHeight) {\n return;\n }\n this.lastDimensions = {\n width: maxWidth,\n height: maxHeight\n };\n this.emit(TrackEvent.VideoDimensionsChanged, this.lastDimensions, this);\n }\n getPixelDensity() {\n var _a;\n const pixelDensity = (_a = this.adaptiveStreamSettings) === null || _a === void 0 ? void 0 : _a.pixelDensity;\n if (pixelDensity === 'screen') {\n return getDevicePixelRatio();\n } else if (!pixelDensity) {\n // when unset, we'll pick a sane default here.\n // for higher pixel density devices (mobile phones, etc), we'll use 2\n // otherwise it defaults to 1\n const devicePixelRatio = getDevicePixelRatio();\n if (devicePixelRatio > 2) {\n return 2;\n } else {\n return 1;\n }\n }\n return pixelDensity;\n }\n}\nclass HTMLElementInfo {\n get visible() {\n return this.isPiP || this.isIntersecting;\n }\n get pictureInPicture() {\n return this.isPiP;\n }\n constructor(element, visible) {\n this.onVisibilityChanged = entry => {\n var _a;\n const {\n target,\n isIntersecting\n } = entry;\n if (target === this.element) {\n this.isIntersecting = isIntersecting;\n this.isPiP = isElementInPiP(this.element);\n this.visibilityChangedAt = Date.now();\n (_a = this.handleVisibilityChanged) === null || _a === void 0 ? void 0 : _a.call(this);\n }\n };\n this.onEnterPiP = () => {\n var _a, _b, _c;\n (_b = (_a = window.documentPictureInPicture) === null || _a === void 0 ? void 0 : _a.window) === null || _b === void 0 ? void 0 : _b.addEventListener('pagehide', this.onLeavePiP);\n this.isPiP = isElementInPiP(this.element);\n (_c = this.handleVisibilityChanged) === null || _c === void 0 ? void 0 : _c.call(this);\n };\n this.onLeavePiP = () => {\n var _a;\n this.isPiP = isElementInPiP(this.element);\n (_a = this.handleVisibilityChanged) === null || _a === void 0 ? void 0 : _a.call(this);\n };\n this.element = element;\n this.isIntersecting = visible !== null && visible !== void 0 ? visible : isElementInViewport(element);\n this.isPiP = isWeb() && isElementInPiP(element);\n this.visibilityChangedAt = 0;\n }\n width() {\n return this.element.clientWidth;\n }\n height() {\n return this.element.clientHeight;\n }\n observe() {\n var _a, _b, _c;\n // make sure we update the current visible state once we start to observe\n this.isIntersecting = isElementInViewport(this.element);\n this.isPiP = isElementInPiP(this.element);\n this.element.handleResize = () => {\n var _a;\n (_a = this.handleResize) === null || _a === void 0 ? void 0 : _a.call(this);\n };\n this.element.handleVisibilityChanged = this.onVisibilityChanged;\n getIntersectionObserver().observe(this.element);\n getResizeObserver().observe(this.element);\n this.element.addEventListener('enterpictureinpicture', this.onEnterPiP);\n this.element.addEventListener('leavepictureinpicture', this.onLeavePiP);\n (_a = window.documentPictureInPicture) === null || _a === void 0 ? void 0 : _a.addEventListener('enter', this.onEnterPiP);\n (_c = (_b = window.documentPictureInPicture) === null || _b === void 0 ? void 0 : _b.window) === null || _c === void 0 ? void 0 : _c.addEventListener('pagehide', this.onLeavePiP);\n }\n stopObserving() {\n var _a, _b, _c, _d, _e;\n (_a = getIntersectionObserver()) === null || _a === void 0 ? void 0 : _a.unobserve(this.element);\n (_b = getResizeObserver()) === null || _b === void 0 ? void 0 : _b.unobserve(this.element);\n this.element.removeEventListener('enterpictureinpicture', this.onEnterPiP);\n this.element.removeEventListener('leavepictureinpicture', this.onLeavePiP);\n (_c = window.documentPictureInPicture) === null || _c === void 0 ? void 0 : _c.removeEventListener('enter', this.onEnterPiP);\n (_e = (_d = window.documentPictureInPicture) === null || _d === void 0 ? void 0 : _d.window) === null || _e === void 0 ? void 0 : _e.removeEventListener('pagehide', this.onLeavePiP);\n }\n}\nfunction isElementInPiP(el) {\n var _a, _b;\n // Simple video PiP\n if (document.pictureInPictureElement === el) return true;\n // Document PiP\n if ((_a = window.documentPictureInPicture) === null || _a === void 0 ? void 0 : _a.window) return isElementInViewport(el, (_b = window.documentPictureInPicture) === null || _b === void 0 ? void 0 : _b.window);\n return false;\n}\n// does not account for occlusion by other elements or opacity property\nfunction isElementInViewport(el, win) {\n const viewportWindow = win || window;\n let top = el.offsetTop;\n let left = el.offsetLeft;\n const width = el.offsetWidth;\n const height = el.offsetHeight;\n const {\n hidden\n } = el;\n const {\n display\n } = getComputedStyle(el);\n while (el.offsetParent) {\n el = el.offsetParent;\n top += el.offsetTop;\n left += el.offsetLeft;\n }\n return top < viewportWindow.pageYOffset + viewportWindow.innerHeight && left < viewportWindow.pageXOffset + viewportWindow.innerWidth && top + height > viewportWindow.pageYOffset && left + width > viewportWindow.pageXOffset && !hidden && display !== 'none';\n}\n\nclass TrackPublication extends eventsExports.EventEmitter {\n constructor(kind, id, name, loggerOptions) {\n var _a;\n super();\n this.metadataMuted = false;\n this.encryption = Encryption_Type.NONE;\n this.log = livekitLogger;\n this.handleMuted = () => {\n this.emit(TrackEvent.Muted);\n };\n this.handleUnmuted = () => {\n this.emit(TrackEvent.Unmuted);\n };\n this.log = getLogger((_a = loggerOptions === null || loggerOptions === void 0 ? void 0 : loggerOptions.loggerName) !== null && _a !== void 0 ? _a : LoggerNames.Publication);\n this.loggerContextCb = this.loggerContextCb;\n this.setMaxListeners(100);\n this.kind = kind;\n this.trackSid = id;\n this.trackName = name;\n this.source = Track.Source.Unknown;\n }\n /** @internal */\n setTrack(track) {\n if (this.track) {\n this.track.off(TrackEvent.Muted, this.handleMuted);\n this.track.off(TrackEvent.Unmuted, this.handleUnmuted);\n }\n this.track = track;\n if (track) {\n // forward events\n track.on(TrackEvent.Muted, this.handleMuted);\n track.on(TrackEvent.Unmuted, this.handleUnmuted);\n }\n }\n get logContext() {\n var _a;\n return Object.assign(Object.assign({}, (_a = this.loggerContextCb) === null || _a === void 0 ? void 0 : _a.call(this)), getLogContextFromTrack(this));\n }\n get isMuted() {\n return this.metadataMuted;\n }\n get isEnabled() {\n return true;\n }\n get isSubscribed() {\n return this.track !== undefined;\n }\n get isEncrypted() {\n return this.encryption !== Encryption_Type.NONE;\n }\n /**\n * an [AudioTrack] if this publication holds an audio track\n */\n get audioTrack() {\n if (isAudioTrack(this.track)) {\n return this.track;\n }\n }\n /**\n * an [VideoTrack] if this publication holds a video track\n */\n get videoTrack() {\n if (isVideoTrack(this.track)) {\n return this.track;\n }\n }\n /** @internal */\n updateInfo(info) {\n this.trackSid = info.sid;\n this.trackName = info.name;\n this.source = Track.sourceFromProto(info.source);\n this.mimeType = info.mimeType;\n if (this.kind === Track.Kind.Video && info.width > 0) {\n this.dimensions = {\n width: info.width,\n height: info.height\n };\n this.simulcasted = info.simulcast;\n }\n this.encryption = info.encryption;\n this.trackInfo = info;\n this.log.debug('update publication info', Object.assign(Object.assign({}, this.logContext), {\n info\n }));\n }\n}\n(function (TrackPublication) {\n (function (SubscriptionStatus) {\n SubscriptionStatus[\"Desired\"] = \"desired\";\n SubscriptionStatus[\"Subscribed\"] = \"subscribed\";\n SubscriptionStatus[\"Unsubscribed\"] = \"unsubscribed\";\n })(TrackPublication.SubscriptionStatus || (TrackPublication.SubscriptionStatus = {}));\n (function (PermissionStatus) {\n PermissionStatus[\"Allowed\"] = \"allowed\";\n PermissionStatus[\"NotAllowed\"] = \"not_allowed\";\n })(TrackPublication.PermissionStatus || (TrackPublication.PermissionStatus = {}));\n})(TrackPublication || (TrackPublication = {}));\n\nclass LocalTrackPublication extends TrackPublication {\n get isUpstreamPaused() {\n var _a;\n return (_a = this.track) === null || _a === void 0 ? void 0 : _a.isUpstreamPaused;\n }\n constructor(kind, ti, track, loggerOptions) {\n super(kind, ti.sid, ti.name, loggerOptions);\n this.track = undefined;\n this.handleTrackEnded = () => {\n this.emit(TrackEvent.Ended);\n };\n this.handleCpuConstrained = () => {\n if (this.track && isVideoTrack(this.track)) {\n this.emit(TrackEvent.CpuConstrained, this.track);\n }\n };\n this.updateInfo(ti);\n this.setTrack(track);\n }\n setTrack(track) {\n if (this.track) {\n this.track.off(TrackEvent.Ended, this.handleTrackEnded);\n this.track.off(TrackEvent.CpuConstrained, this.handleCpuConstrained);\n }\n super.setTrack(track);\n if (track) {\n track.on(TrackEvent.Ended, this.handleTrackEnded);\n track.on(TrackEvent.CpuConstrained, this.handleCpuConstrained);\n }\n }\n get isMuted() {\n if (this.track) {\n return this.track.isMuted;\n }\n return super.isMuted;\n }\n get audioTrack() {\n return super.audioTrack;\n }\n get videoTrack() {\n return super.videoTrack;\n }\n get isLocal() {\n return true;\n }\n /**\n * Mute the track associated with this publication\n */\n mute() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n return (_a = this.track) === null || _a === void 0 ? void 0 : _a.mute();\n });\n }\n /**\n * Unmute track associated with this publication\n */\n unmute() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n return (_a = this.track) === null || _a === void 0 ? void 0 : _a.unmute();\n });\n }\n /**\n * Pauses the media stream track associated with this publication from being sent to the server\n * and signals \"muted\" event to other participants\n * Useful if you want to pause the stream without pausing the local media stream track\n */\n pauseUpstream() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n yield (_a = this.track) === null || _a === void 0 ? void 0 : _a.pauseUpstream();\n });\n }\n /**\n * Resumes sending the media stream track associated with this publication to the server after a call to [[pauseUpstream()]]\n * and signals \"unmuted\" event to other participants (unless the track is explicitly muted)\n */\n resumeUpstream() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n yield (_a = this.track) === null || _a === void 0 ? void 0 : _a.resumeUpstream();\n });\n }\n getTrackFeatures() {\n var _a;\n if (isAudioTrack(this.track)) {\n const settings = this.track.getSourceTrackSettings();\n const features = new Set();\n if (settings.autoGainControl) {\n features.add(AudioTrackFeature.TF_AUTO_GAIN_CONTROL);\n }\n if (settings.echoCancellation) {\n features.add(AudioTrackFeature.TF_ECHO_CANCELLATION);\n }\n if (settings.noiseSuppression) {\n features.add(AudioTrackFeature.TF_NOISE_SUPPRESSION);\n }\n if (settings.channelCount && settings.channelCount > 1) {\n features.add(AudioTrackFeature.TF_STEREO);\n }\n if (!((_a = this.options) === null || _a === void 0 ? void 0 : _a.dtx)) {\n features.add(AudioTrackFeature.TF_NO_DTX);\n }\n if (this.track.enhancedNoiseCancellation) {\n features.add(AudioTrackFeature.TF_ENHANCED_NOISE_CANCELLATION);\n }\n return Array.from(features.values());\n } else return [];\n }\n}\n\n/**\n * Creates a local video and audio track at the same time. When acquiring both\n * audio and video tracks together, it'll display a single permission prompt to\n * the user instead of two separate ones.\n * @param options\n */\nfunction createLocalTracks(options, loggerOptions) {\n return __awaiter(this, void 0, void 0, function* () {\n options !== null && options !== void 0 ? options : options = {};\n let attemptExactMatch = false;\n const {\n audioProcessor,\n videoProcessor,\n optionsWithoutProcessor: internalOptions\n } = extractProcessorsFromOptions(options);\n let retryAudioOptions = internalOptions.audio;\n let retryVideoOptions = internalOptions.video;\n if (audioProcessor && typeof internalOptions.audio === 'object') {\n internalOptions.audio.processor = audioProcessor;\n }\n if (videoProcessor && typeof internalOptions.video === 'object') {\n internalOptions.video.processor = videoProcessor;\n }\n // if the user passes a device id as a string, we default to exact match\n if (options.audio && typeof internalOptions.audio === 'object' && typeof internalOptions.audio.deviceId === 'string') {\n const deviceId = internalOptions.audio.deviceId;\n internalOptions.audio.deviceId = {\n exact: deviceId\n };\n attemptExactMatch = true;\n retryAudioOptions = Object.assign(Object.assign({}, internalOptions.audio), {\n deviceId: {\n ideal: deviceId\n }\n });\n }\n if (internalOptions.video && typeof internalOptions.video === 'object' && typeof internalOptions.video.deviceId === 'string') {\n const deviceId = internalOptions.video.deviceId;\n internalOptions.video.deviceId = {\n exact: deviceId\n };\n attemptExactMatch = true;\n retryVideoOptions = Object.assign(Object.assign({}, internalOptions.video), {\n deviceId: {\n ideal: deviceId\n }\n });\n }\n if (internalOptions.audio === true || typeof internalOptions.audio === 'object' && !internalOptions.audio.deviceId) {\n internalOptions.audio = {\n deviceId: 'default'\n };\n }\n if (internalOptions.video === true) {\n internalOptions.video = {\n deviceId: 'default'\n };\n } else if (typeof internalOptions.video === 'object' && !internalOptions.video.deviceId) {\n internalOptions.video.deviceId = 'default';\n }\n const opts = mergeDefaultOptions(internalOptions, audioDefaults, videoDefaults);\n const constraints = constraintsForOptions(opts);\n // Keep a reference to the promise on DeviceManager and await it in getLocalDevices()\n // works around iOS Safari Bug https://bugs.webkit.org/show_bug.cgi?id=179363\n const mediaPromise = navigator.mediaDevices.getUserMedia(constraints);\n if (internalOptions.audio) {\n DeviceManager.userMediaPromiseMap.set('audioinput', mediaPromise);\n mediaPromise.catch(() => DeviceManager.userMediaPromiseMap.delete('audioinput'));\n }\n if (internalOptions.video) {\n DeviceManager.userMediaPromiseMap.set('videoinput', mediaPromise);\n mediaPromise.catch(() => DeviceManager.userMediaPromiseMap.delete('videoinput'));\n }\n try {\n const stream = yield mediaPromise;\n return yield Promise.all(stream.getTracks().map(mediaStreamTrack => __awaiter(this, void 0, void 0, function* () {\n const isAudio = mediaStreamTrack.kind === 'audio';\n let trackOptions = isAudio ? opts.audio : opts.video;\n if (typeof trackOptions === 'boolean' || !trackOptions) {\n trackOptions = {};\n }\n let trackConstraints;\n const conOrBool = isAudio ? constraints.audio : constraints.video;\n if (typeof conOrBool !== 'boolean') {\n trackConstraints = conOrBool;\n }\n // update the constraints with the device id the user gave permissions to in the permission prompt\n // otherwise each track restart (e.g. mute - unmute) will try to initialize the device again -> causing additional permission prompts\n const newDeviceId = mediaStreamTrack.getSettings().deviceId;\n if ((trackConstraints === null || trackConstraints === void 0 ? void 0 : trackConstraints.deviceId) && unwrapConstraint(trackConstraints.deviceId) !== newDeviceId) {\n trackConstraints.deviceId = newDeviceId;\n } else if (!trackConstraints) {\n trackConstraints = {\n deviceId: newDeviceId\n };\n }\n const track = mediaTrackToLocalTrack(mediaStreamTrack, trackConstraints, loggerOptions);\n if (track.kind === Track.Kind.Video) {\n track.source = Track.Source.Camera;\n } else if (track.kind === Track.Kind.Audio) {\n track.source = Track.Source.Microphone;\n }\n track.mediaStream = stream;\n if (isAudioTrack(track) && audioProcessor) {\n yield track.setProcessor(audioProcessor);\n } else if (isVideoTrack(track) && videoProcessor) {\n yield track.setProcessor(videoProcessor);\n }\n return track;\n })));\n } catch (e) {\n if (!attemptExactMatch) {\n throw e;\n }\n return createLocalTracks(Object.assign(Object.assign({}, options), {\n audio: retryAudioOptions,\n video: retryVideoOptions\n }), loggerOptions);\n }\n });\n}\n/**\n * Creates a [[LocalVideoTrack]] with getUserMedia()\n * @param options\n */\nfunction createLocalVideoTrack(options) {\n return __awaiter(this, void 0, void 0, function* () {\n const tracks = yield createLocalTracks({\n audio: false,\n video: options !== null && options !== void 0 ? options : true\n });\n return tracks[0];\n });\n}\nfunction createLocalAudioTrack(options) {\n return __awaiter(this, void 0, void 0, function* () {\n const tracks = yield createLocalTracks({\n audio: options !== null && options !== void 0 ? options : true,\n video: false\n });\n return tracks[0];\n });\n}\n/**\n * Creates a screen capture tracks with getDisplayMedia().\n * A LocalVideoTrack is always created and returned.\n * If { audio: true }, and the browser supports audio capture, a LocalAudioTrack is also created.\n */\nfunction createLocalScreenTracks(options) {\n return __awaiter(this, void 0, void 0, function* () {\n if (options === undefined) {\n options = {};\n }\n if (options.resolution === undefined && !isSafari17Based()) {\n options.resolution = ScreenSharePresets.h1080fps30.resolution;\n }\n if (navigator.mediaDevices.getDisplayMedia === undefined) {\n throw new DeviceUnsupportedError('getDisplayMedia not supported');\n }\n const constraints = screenCaptureToDisplayMediaStreamOptions(options);\n const stream = yield navigator.mediaDevices.getDisplayMedia(constraints);\n const tracks = stream.getVideoTracks();\n if (tracks.length === 0) {\n throw new TrackInvalidError('no video track found');\n }\n const screenVideo = new LocalVideoTrack(tracks[0], undefined, false);\n screenVideo.source = Track.Source.ScreenShare;\n const localTracks = [screenVideo];\n if (stream.getAudioTracks().length > 0) {\n const screenAudio = new LocalAudioTrack(stream.getAudioTracks()[0], undefined, false);\n screenAudio.source = Track.Source.ScreenShareAudio;\n localTracks.push(screenAudio);\n }\n return localTracks;\n });\n}\n\nvar ConnectionQuality;\n(function (ConnectionQuality) {\n ConnectionQuality[\"Excellent\"] = \"excellent\";\n ConnectionQuality[\"Good\"] = \"good\";\n ConnectionQuality[\"Poor\"] = \"poor\";\n /**\n * Indicates that a participant has temporarily (or permanently) lost connection to LiveKit.\n * For permanent disconnection a `ParticipantDisconnected` event will be emitted after a timeout\n */\n ConnectionQuality[\"Lost\"] = \"lost\";\n ConnectionQuality[\"Unknown\"] = \"unknown\";\n})(ConnectionQuality || (ConnectionQuality = {}));\nfunction qualityFromProto(q) {\n switch (q) {\n case ConnectionQuality$1.EXCELLENT:\n return ConnectionQuality.Excellent;\n case ConnectionQuality$1.GOOD:\n return ConnectionQuality.Good;\n case ConnectionQuality$1.POOR:\n return ConnectionQuality.Poor;\n case ConnectionQuality$1.LOST:\n return ConnectionQuality.Lost;\n default:\n return ConnectionQuality.Unknown;\n }\n}\nclass Participant extends eventsExports.EventEmitter {\n get logContext() {\n var _a, _b;\n return Object.assign({}, (_b = (_a = this.loggerOptions) === null || _a === void 0 ? void 0 : _a.loggerContextCb) === null || _b === void 0 ? void 0 : _b.call(_a));\n }\n get isEncrypted() {\n return this.trackPublications.size > 0 && Array.from(this.trackPublications.values()).every(tr => tr.isEncrypted);\n }\n get isAgent() {\n var _a;\n return ((_a = this.permissions) === null || _a === void 0 ? void 0 : _a.agent) || this.kind === ParticipantInfo_Kind.AGENT;\n }\n get isActive() {\n var _a;\n return ((_a = this.participantInfo) === null || _a === void 0 ? void 0 : _a.state) === ParticipantInfo_State.ACTIVE;\n }\n get kind() {\n return this._kind;\n }\n /** participant attributes, similar to metadata, but as a key/value map */\n get attributes() {\n return Object.freeze(Object.assign({}, this._attributes));\n }\n /** @internal */\n constructor(sid, identity, name, metadata, attributes, loggerOptions) {\n let kind = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : ParticipantInfo_Kind.STANDARD;\n var _a;\n super();\n /** audio level between 0-1.0, 1 being loudest, 0 being softest */\n this.audioLevel = 0;\n /** if participant is currently speaking */\n this.isSpeaking = false;\n this._connectionQuality = ConnectionQuality.Unknown;\n this.log = livekitLogger;\n this.log = getLogger((_a = loggerOptions === null || loggerOptions === void 0 ? void 0 : loggerOptions.loggerName) !== null && _a !== void 0 ? _a : LoggerNames.Participant);\n this.loggerOptions = loggerOptions;\n this.setMaxListeners(100);\n this.sid = sid;\n this.identity = identity;\n this.name = name;\n this.metadata = metadata;\n this.audioTrackPublications = new Map();\n this.videoTrackPublications = new Map();\n this.trackPublications = new Map();\n this._kind = kind;\n this._attributes = attributes !== null && attributes !== void 0 ? attributes : {};\n }\n getTrackPublications() {\n return Array.from(this.trackPublications.values());\n }\n /**\n * Finds the first track that matches the source filter, for example, getting\n * the user's camera track with getTrackBySource(Track.Source.Camera).\n */\n getTrackPublication(source) {\n for (const [, pub] of this.trackPublications) {\n if (pub.source === source) {\n return pub;\n }\n }\n }\n /**\n * Finds the first track that matches the track's name.\n */\n getTrackPublicationByName(name) {\n for (const [, pub] of this.trackPublications) {\n if (pub.trackName === name) {\n return pub;\n }\n }\n }\n /**\n * Waits until the participant is active and ready to receive data messages\n * @returns a promise that resolves when the participant is active\n */\n waitUntilActive() {\n if (this.isActive) {\n return Promise.resolve();\n }\n if (this.activeFuture) {\n return this.activeFuture.promise;\n }\n this.activeFuture = new Future();\n this.once(ParticipantEvent.Active, () => {\n var _a, _b;\n (_b = (_a = this.activeFuture) === null || _a === void 0 ? void 0 : _a.resolve) === null || _b === void 0 ? void 0 : _b.call(_a);\n this.activeFuture = undefined;\n });\n return this.activeFuture.promise;\n }\n get connectionQuality() {\n return this._connectionQuality;\n }\n get isCameraEnabled() {\n var _a;\n const track = this.getTrackPublication(Track.Source.Camera);\n return !((_a = track === null || track === void 0 ? void 0 : track.isMuted) !== null && _a !== void 0 ? _a : true);\n }\n get isMicrophoneEnabled() {\n var _a;\n const track = this.getTrackPublication(Track.Source.Microphone);\n return !((_a = track === null || track === void 0 ? void 0 : track.isMuted) !== null && _a !== void 0 ? _a : true);\n }\n get isScreenShareEnabled() {\n const track = this.getTrackPublication(Track.Source.ScreenShare);\n return !!track;\n }\n get isLocal() {\n return false;\n }\n /** when participant joined the room */\n get joinedAt() {\n if (this.participantInfo) {\n return new Date(Number.parseInt(this.participantInfo.joinedAt.toString()) * 1000);\n }\n return new Date();\n }\n /** @internal */\n updateInfo(info) {\n var _a;\n // it's possible the update could be applied out of order due to await\n // during reconnect sequences. when that happens, it's possible for server\n // to have sent more recent version of participant info while JS is waiting\n // to process the existing payload.\n // when the participant sid remains the same, and we already have a later version\n // of the payload, they can be safely skipped\n if (this.participantInfo && this.participantInfo.sid === info.sid && this.participantInfo.version > info.version) {\n return false;\n }\n this.identity = info.identity;\n this.sid = info.sid;\n this._setName(info.name);\n this._setMetadata(info.metadata);\n this._setAttributes(info.attributes);\n if (info.state === ParticipantInfo_State.ACTIVE && ((_a = this.participantInfo) === null || _a === void 0 ? void 0 : _a.state) !== ParticipantInfo_State.ACTIVE) {\n this.emit(ParticipantEvent.Active);\n }\n if (info.permission) {\n this.setPermissions(info.permission);\n }\n // set this last so setMetadata can detect changes\n this.participantInfo = info;\n return true;\n }\n /**\n * Updates metadata from server\n **/\n _setMetadata(md) {\n const changed = this.metadata !== md;\n const prevMetadata = this.metadata;\n this.metadata = md;\n if (changed) {\n this.emit(ParticipantEvent.ParticipantMetadataChanged, prevMetadata);\n }\n }\n _setName(name) {\n const changed = this.name !== name;\n this.name = name;\n if (changed) {\n this.emit(ParticipantEvent.ParticipantNameChanged, name);\n }\n }\n /**\n * Updates metadata from server\n **/\n _setAttributes(attributes) {\n const diff = diffAttributes(this.attributes, attributes);\n this._attributes = attributes;\n if (Object.keys(diff).length > 0) {\n this.emit(ParticipantEvent.AttributesChanged, diff);\n }\n }\n /** @internal */\n setPermissions(permissions) {\n var _a, _b, _c, _d, _e, _f;\n const prevPermissions = this.permissions;\n const changed = permissions.canPublish !== ((_a = this.permissions) === null || _a === void 0 ? void 0 : _a.canPublish) || permissions.canSubscribe !== ((_b = this.permissions) === null || _b === void 0 ? void 0 : _b.canSubscribe) || permissions.canPublishData !== ((_c = this.permissions) === null || _c === void 0 ? void 0 : _c.canPublishData) || permissions.hidden !== ((_d = this.permissions) === null || _d === void 0 ? void 0 : _d.hidden) || permissions.recorder !== ((_e = this.permissions) === null || _e === void 0 ? void 0 : _e.recorder) || permissions.canPublishSources.length !== this.permissions.canPublishSources.length || permissions.canPublishSources.some((value, index) => {\n var _a;\n return value !== ((_a = this.permissions) === null || _a === void 0 ? void 0 : _a.canPublishSources[index]);\n }) || permissions.canSubscribeMetrics !== ((_f = this.permissions) === null || _f === void 0 ? void 0 : _f.canSubscribeMetrics);\n this.permissions = permissions;\n if (changed) {\n this.emit(ParticipantEvent.ParticipantPermissionsChanged, prevPermissions);\n }\n return changed;\n }\n /** @internal */\n setIsSpeaking(speaking) {\n if (speaking === this.isSpeaking) {\n return;\n }\n this.isSpeaking = speaking;\n if (speaking) {\n this.lastSpokeAt = new Date();\n }\n this.emit(ParticipantEvent.IsSpeakingChanged, speaking);\n }\n /** @internal */\n setConnectionQuality(q) {\n const prevQuality = this._connectionQuality;\n this._connectionQuality = qualityFromProto(q);\n if (prevQuality !== this._connectionQuality) {\n this.emit(ParticipantEvent.ConnectionQualityChanged, this._connectionQuality);\n }\n }\n /**\n * @internal\n */\n setDisconnected() {\n var _a, _b;\n if (this.activeFuture) {\n (_b = (_a = this.activeFuture).reject) === null || _b === void 0 ? void 0 : _b.call(_a, new Error('Participant disconnected'));\n this.activeFuture = undefined;\n }\n }\n /**\n * @internal\n */\n setAudioContext(ctx) {\n this.audioContext = ctx;\n this.audioTrackPublications.forEach(track => isAudioTrack(track.track) && track.track.setAudioContext(ctx));\n }\n addTrackPublication(publication) {\n // forward publication driven events\n publication.on(TrackEvent.Muted, () => {\n this.emit(ParticipantEvent.TrackMuted, publication);\n });\n publication.on(TrackEvent.Unmuted, () => {\n this.emit(ParticipantEvent.TrackUnmuted, publication);\n });\n const pub = publication;\n if (pub.track) {\n pub.track.sid = publication.trackSid;\n }\n this.trackPublications.set(publication.trackSid, publication);\n switch (publication.kind) {\n case Track.Kind.Audio:\n this.audioTrackPublications.set(publication.trackSid, publication);\n break;\n case Track.Kind.Video:\n this.videoTrackPublications.set(publication.trackSid, publication);\n break;\n }\n }\n}\n\nfunction trackPermissionToProto(perms) {\n var _a, _b, _c;\n if (!perms.participantSid && !perms.participantIdentity) {\n throw new Error('Invalid track permission, must provide at least one of participantIdentity and participantSid');\n }\n return new TrackPermission({\n participantIdentity: (_a = perms.participantIdentity) !== null && _a !== void 0 ? _a : '',\n participantSid: (_b = perms.participantSid) !== null && _b !== void 0 ? _b : '',\n allTracks: (_c = perms.allowAll) !== null && _c !== void 0 ? _c : false,\n trackSids: perms.allowedTrackSids || []\n });\n}\n\nconst STREAM_CHUNK_SIZE = 15000;\nclass LocalParticipant extends Participant {\n /** @internal */\n constructor(sid, identity, engine, options, roomRpcHandlers) {\n super(sid, identity, undefined, undefined, undefined, {\n loggerName: options.loggerName,\n loggerContextCb: () => this.engine.logContext\n });\n this.pendingPublishing = new Set();\n this.pendingPublishPromises = new Map();\n this.participantTrackPermissions = [];\n this.allParticipantsAllowedToSubscribe = true;\n this.encryptionType = Encryption_Type.NONE;\n this.enabledPublishVideoCodecs = [];\n this.pendingAcks = new Map();\n this.pendingResponses = new Map();\n this.handleReconnecting = () => {\n if (!this.reconnectFuture) {\n this.reconnectFuture = new Future();\n }\n };\n this.handleReconnected = () => {\n var _a, _b;\n (_b = (_a = this.reconnectFuture) === null || _a === void 0 ? void 0 : _a.resolve) === null || _b === void 0 ? void 0 : _b.call(_a);\n this.reconnectFuture = undefined;\n this.updateTrackSubscriptionPermissions();\n };\n this.handleClosing = () => {\n var _a, _b, _c, _d, _e, _f;\n if (this.reconnectFuture) {\n this.reconnectFuture.promise.catch(e => this.log.warn(e.message, this.logContext));\n (_b = (_a = this.reconnectFuture) === null || _a === void 0 ? void 0 : _a.reject) === null || _b === void 0 ? void 0 : _b.call(_a, 'Got disconnected during reconnection attempt');\n this.reconnectFuture = undefined;\n }\n if (this.signalConnectedFuture) {\n (_d = (_c = this.signalConnectedFuture).reject) === null || _d === void 0 ? void 0 : _d.call(_c, 'Got disconnected without signal connected');\n this.signalConnectedFuture = undefined;\n }\n (_f = (_e = this.activeAgentFuture) === null || _e === void 0 ? void 0 : _e.reject) === null || _f === void 0 ? void 0 : _f.call(_e, 'Got disconnected without active agent present');\n this.activeAgentFuture = undefined;\n this.firstActiveAgent = undefined;\n };\n this.handleSignalConnected = joinResponse => {\n var _a, _b;\n if (joinResponse.participant) {\n this.updateInfo(joinResponse.participant);\n }\n if (!this.signalConnectedFuture) {\n this.signalConnectedFuture = new Future();\n }\n (_b = (_a = this.signalConnectedFuture).resolve) === null || _b === void 0 ? void 0 : _b.call(_a);\n };\n this.handleSignalRequestResponse = response => {\n const {\n requestId,\n reason,\n message\n } = response;\n const targetRequest = this.pendingSignalRequests.get(requestId);\n if (targetRequest) {\n if (reason !== RequestResponse_Reason.OK) {\n targetRequest.reject(new SignalRequestError(message, reason));\n }\n this.pendingSignalRequests.delete(requestId);\n }\n };\n this.handleDataPacket = packet => {\n switch (packet.value.case) {\n case 'rpcResponse':\n let rpcResponse = packet.value.value;\n let payload = null;\n let error = null;\n if (rpcResponse.value.case === 'payload') {\n payload = rpcResponse.value.value;\n } else if (rpcResponse.value.case === 'error') {\n error = RpcError.fromProto(rpcResponse.value.value);\n }\n this.handleIncomingRpcResponse(rpcResponse.requestId, payload, error);\n break;\n case 'rpcAck':\n let rpcAck = packet.value.value;\n this.handleIncomingRpcAck(rpcAck.requestId);\n break;\n }\n };\n this.updateTrackSubscriptionPermissions = () => {\n this.log.debug('updating track subscription permissions', Object.assign(Object.assign({}, this.logContext), {\n allParticipantsAllowed: this.allParticipantsAllowedToSubscribe,\n participantTrackPermissions: this.participantTrackPermissions\n }));\n this.engine.client.sendUpdateSubscriptionPermissions(this.allParticipantsAllowedToSubscribe, this.participantTrackPermissions.map(p => trackPermissionToProto(p)));\n };\n /** @internal */\n this.onTrackUnmuted = track => {\n this.onTrackMuted(track, track.isUpstreamPaused);\n };\n // when the local track changes in mute status, we'll notify server as such\n /** @internal */\n this.onTrackMuted = (track, muted) => {\n if (muted === undefined) {\n muted = true;\n }\n if (!track.sid) {\n this.log.error('could not update mute status for unpublished track', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n return;\n }\n this.engine.updateMuteStatus(track.sid, muted);\n };\n this.onTrackUpstreamPaused = track => {\n this.log.debug('upstream paused', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n this.onTrackMuted(track, true);\n };\n this.onTrackUpstreamResumed = track => {\n this.log.debug('upstream resumed', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n this.onTrackMuted(track, track.isMuted);\n };\n this.onTrackFeatureUpdate = track => {\n const pub = this.audioTrackPublications.get(track.sid);\n if (!pub) {\n this.log.warn(\"Could not update local audio track settings, missing publication for track \".concat(track.sid), this.logContext);\n return;\n }\n this.engine.client.sendUpdateLocalAudioTrack(pub.trackSid, pub.getTrackFeatures());\n };\n this.onTrackCpuConstrained = (track, publication) => {\n this.log.debug('track cpu constrained', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(publication)));\n this.emit(ParticipantEvent.LocalTrackCpuConstrained, track, publication);\n };\n this.handleSubscribedQualityUpdate = update => __awaiter(this, void 0, void 0, function* () {\n var _a, e_1, _b, _c;\n var _d;\n if (!((_d = this.roomOptions) === null || _d === void 0 ? void 0 : _d.dynacast)) {\n return;\n }\n const pub = this.videoTrackPublications.get(update.trackSid);\n if (!pub) {\n this.log.warn('received subscribed quality update for unknown track', Object.assign(Object.assign({}, this.logContext), {\n trackSid: update.trackSid\n }));\n return;\n }\n if (!pub.videoTrack) {\n return;\n }\n const newCodecs = yield pub.videoTrack.setPublishingCodecs(update.subscribedCodecs);\n try {\n for (var _e = true, newCodecs_1 = __asyncValues(newCodecs), newCodecs_1_1; newCodecs_1_1 = yield newCodecs_1.next(), _a = newCodecs_1_1.done, !_a; _e = true) {\n _c = newCodecs_1_1.value;\n _e = false;\n const codec = _c;\n if (isBackupCodec(codec)) {\n this.log.debug(\"publish \".concat(codec, \" for \").concat(pub.videoTrack.sid), Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(pub)));\n yield this.publishAdditionalCodecForTrack(pub.videoTrack, codec, pub.options);\n }\n }\n } catch (e_1_1) {\n e_1 = {\n error: e_1_1\n };\n } finally {\n try {\n if (!_e && !_a && (_b = newCodecs_1.return)) yield _b.call(newCodecs_1);\n } finally {\n if (e_1) throw e_1.error;\n }\n }\n });\n this.handleLocalTrackUnpublished = unpublished => {\n const track = this.trackPublications.get(unpublished.trackSid);\n if (!track) {\n this.log.warn('received unpublished event for unknown track', Object.assign(Object.assign({}, this.logContext), {\n trackSid: unpublished.trackSid\n }));\n return;\n }\n this.unpublishTrack(track.track);\n };\n this.handleTrackEnded = track => __awaiter(this, void 0, void 0, function* () {\n if (track.source === Track.Source.ScreenShare || track.source === Track.Source.ScreenShareAudio) {\n this.log.debug('unpublishing local track due to TrackEnded', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n this.unpublishTrack(track);\n } else if (track.isUserProvided) {\n yield track.mute();\n } else if (isLocalAudioTrack(track) || isLocalVideoTrack(track)) {\n try {\n if (isWeb()) {\n try {\n const currentPermissions = yield navigator === null || navigator === void 0 ? void 0 : navigator.permissions.query({\n // the permission query for camera and microphone currently not supported in Safari and Firefox\n // @ts-ignore\n name: track.source === Track.Source.Camera ? 'camera' : 'microphone'\n });\n if (currentPermissions && currentPermissions.state === 'denied') {\n this.log.warn(\"user has revoked access to \".concat(track.source), Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n // detect granted change after permissions were denied to try and resume then\n currentPermissions.onchange = () => {\n if (currentPermissions.state !== 'denied') {\n if (!track.isMuted) {\n track.restartTrack();\n }\n currentPermissions.onchange = null;\n }\n };\n throw new Error('GetUserMedia Permission denied');\n }\n } catch (e) {\n // permissions query fails for firefox, we continue and try to restart the track\n }\n }\n if (!track.isMuted) {\n this.log.debug('track ended, attempting to use a different device', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n if (isLocalAudioTrack(track)) {\n // fall back to default device if available\n yield track.restartTrack({\n deviceId: 'default'\n });\n } else {\n yield track.restartTrack();\n }\n }\n } catch (e) {\n this.log.warn(\"could not restart track, muting instead\", Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n yield track.mute();\n }\n }\n });\n this.audioTrackPublications = new Map();\n this.videoTrackPublications = new Map();\n this.trackPublications = new Map();\n this.engine = engine;\n this.roomOptions = options;\n this.setupEngine(engine);\n this.activeDeviceMap = new Map([['audioinput', 'default'], ['videoinput', 'default'], ['audiooutput', 'default']]);\n this.pendingSignalRequests = new Map();\n this.rpcHandlers = roomRpcHandlers;\n }\n get lastCameraError() {\n return this.cameraError;\n }\n get lastMicrophoneError() {\n return this.microphoneError;\n }\n get isE2EEEnabled() {\n return this.encryptionType !== Encryption_Type.NONE;\n }\n getTrackPublication(source) {\n const track = super.getTrackPublication(source);\n if (track) {\n return track;\n }\n }\n getTrackPublicationByName(name) {\n const track = super.getTrackPublicationByName(name);\n if (track) {\n return track;\n }\n }\n /**\n * @internal\n */\n setupEngine(engine) {\n var _a;\n this.engine = engine;\n this.engine.on(EngineEvent.RemoteMute, (trackSid, muted) => {\n const pub = this.trackPublications.get(trackSid);\n if (!pub || !pub.track) {\n return;\n }\n if (muted) {\n pub.mute();\n } else {\n pub.unmute();\n }\n });\n if ((_a = this.signalConnectedFuture) === null || _a === void 0 ? void 0 : _a.isResolved) {\n this.signalConnectedFuture = undefined;\n }\n this.engine.on(EngineEvent.Connected, this.handleReconnected).on(EngineEvent.SignalConnected, this.handleSignalConnected).on(EngineEvent.SignalRestarted, this.handleReconnected).on(EngineEvent.SignalResumed, this.handleReconnected).on(EngineEvent.Restarting, this.handleReconnecting).on(EngineEvent.Resuming, this.handleReconnecting).on(EngineEvent.LocalTrackUnpublished, this.handleLocalTrackUnpublished).on(EngineEvent.SubscribedQualityUpdate, this.handleSubscribedQualityUpdate).on(EngineEvent.Closing, this.handleClosing).on(EngineEvent.SignalRequestResponse, this.handleSignalRequestResponse).on(EngineEvent.DataPacketReceived, this.handleDataPacket);\n }\n /**\n * Sets and updates the metadata of the local participant.\n * Note: this requires `canUpdateOwnMetadata` permission.\n * method will throw if the user doesn't have the required permissions\n * @param metadata\n */\n setMetadata(metadata) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.requestMetadataUpdate({\n metadata\n });\n });\n }\n /**\n * Sets and updates the name of the local participant.\n * Note: this requires `canUpdateOwnMetadata` permission.\n * method will throw if the user doesn't have the required permissions\n * @param metadata\n */\n setName(name) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.requestMetadataUpdate({\n name\n });\n });\n }\n /**\n * Set or update participant attributes. It will make updates only to keys that\n * are present in `attributes`, and will not override others.\n * Note: this requires `canUpdateOwnMetadata` permission.\n * @param attributes attributes to update\n */\n setAttributes(attributes) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.requestMetadataUpdate({\n attributes\n });\n });\n }\n requestMetadataUpdate(_a) {\n return __awaiter(this, arguments, void 0, function (_ref) {\n var _this = this;\n let {\n metadata,\n name,\n attributes\n } = _ref;\n return function* () {\n return new Promise((resolve, reject) => __awaiter(_this, void 0, void 0, function* () {\n var _a, _b;\n try {\n let isRejected = false;\n const requestId = yield this.engine.client.sendUpdateLocalMetadata((_a = metadata !== null && metadata !== void 0 ? metadata : this.metadata) !== null && _a !== void 0 ? _a : '', (_b = name !== null && name !== void 0 ? name : this.name) !== null && _b !== void 0 ? _b : '', attributes);\n const startTime = performance.now();\n this.pendingSignalRequests.set(requestId, {\n resolve,\n reject: error => {\n reject(error);\n isRejected = true;\n },\n values: {\n name,\n metadata,\n attributes\n }\n });\n while (performance.now() - startTime < 5000 && !isRejected) {\n if ((!name || this.name === name) && (!metadata || this.metadata === metadata) && (!attributes || Object.entries(attributes).every(_ref2 => {\n let [key, value] = _ref2;\n return this.attributes[key] === value || value === '' && !this.attributes[key];\n }))) {\n this.pendingSignalRequests.delete(requestId);\n resolve();\n return;\n }\n yield sleep(50);\n }\n reject(new SignalRequestError('Request to update local metadata timed out', 'TimeoutError'));\n } catch (e) {\n if (e instanceof Error) reject(e);\n }\n }));\n }();\n });\n }\n /**\n * Enable or disable a participant's camera track.\n *\n * If a track has already published, it'll mute or unmute the track.\n * Resolves with a `LocalTrackPublication` instance if successful and `undefined` otherwise\n */\n setCameraEnabled(enabled, options, publishOptions) {\n return this.setTrackEnabled(Track.Source.Camera, enabled, options, publishOptions);\n }\n /**\n * Enable or disable a participant's microphone track.\n *\n * If a track has already published, it'll mute or unmute the track.\n * Resolves with a `LocalTrackPublication` instance if successful and `undefined` otherwise\n */\n setMicrophoneEnabled(enabled, options, publishOptions) {\n return this.setTrackEnabled(Track.Source.Microphone, enabled, options, publishOptions);\n }\n /**\n * Start or stop sharing a participant's screen\n * Resolves with a `LocalTrackPublication` instance if successful and `undefined` otherwise\n */\n setScreenShareEnabled(enabled, options, publishOptions) {\n return this.setTrackEnabled(Track.Source.ScreenShare, enabled, options, publishOptions);\n }\n /** @internal */\n setPermissions(permissions) {\n const prevPermissions = this.permissions;\n const changed = super.setPermissions(permissions);\n if (changed && prevPermissions) {\n this.emit(ParticipantEvent.ParticipantPermissionsChanged, prevPermissions);\n }\n return changed;\n }\n /** @internal */\n setE2EEEnabled(enabled) {\n return __awaiter(this, void 0, void 0, function* () {\n this.encryptionType = enabled ? Encryption_Type.GCM : Encryption_Type.NONE;\n yield this.republishAllTracks(undefined, false);\n });\n }\n setTrackEnabled(source, enabled, options, publishOptions) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n this.log.debug('setTrackEnabled', Object.assign(Object.assign({}, this.logContext), {\n source,\n enabled\n }));\n if (this.republishPromise) {\n yield this.republishPromise;\n }\n let track = this.getTrackPublication(source);\n if (enabled) {\n if (track) {\n yield track.unmute();\n } else {\n let localTracks;\n if (this.pendingPublishing.has(source)) {\n const pendingTrack = yield this.waitForPendingPublicationOfSource(source);\n if (!pendingTrack) {\n this.log.info('waiting for pending publication promise timed out', Object.assign(Object.assign({}, this.logContext), {\n source\n }));\n }\n yield pendingTrack === null || pendingTrack === void 0 ? void 0 : pendingTrack.unmute();\n return pendingTrack;\n }\n this.pendingPublishing.add(source);\n try {\n switch (source) {\n case Track.Source.Camera:\n localTracks = yield this.createTracks({\n video: (_a = options) !== null && _a !== void 0 ? _a : true\n });\n break;\n case Track.Source.Microphone:\n localTracks = yield this.createTracks({\n audio: (_b = options) !== null && _b !== void 0 ? _b : true\n });\n break;\n case Track.Source.ScreenShare:\n localTracks = yield this.createScreenTracks(Object.assign({}, options));\n break;\n default:\n throw new TrackInvalidError(source);\n }\n } catch (e) {\n localTracks === null || localTracks === void 0 ? void 0 : localTracks.forEach(tr => {\n tr.stop();\n });\n if (e instanceof Error) {\n this.emit(ParticipantEvent.MediaDevicesError, e, sourceToKind(source));\n }\n this.pendingPublishing.delete(source);\n throw e;\n }\n for (const localTrack of localTracks) {\n const opts = Object.assign(Object.assign({}, this.roomOptions.publishDefaults), options);\n if (source === Track.Source.Microphone && isAudioTrack(localTrack) && opts.preConnectBuffer) {\n this.log.info('starting preconnect buffer for microphone', Object.assign({}, this.logContext));\n localTrack.startPreConnectBuffer();\n }\n }\n try {\n const publishPromises = [];\n for (const localTrack of localTracks) {\n this.log.info('publishing track', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(localTrack)));\n publishPromises.push(this.publishTrack(localTrack, publishOptions));\n }\n const publishedTracks = yield Promise.all(publishPromises);\n // for screen share publications including audio, this will only return the screen share publication, not the screen share audio one\n // revisit if we want to return an array of tracks instead for v2\n [track] = publishedTracks;\n } catch (e) {\n localTracks === null || localTracks === void 0 ? void 0 : localTracks.forEach(tr => {\n tr.stop();\n });\n throw e;\n } finally {\n this.pendingPublishing.delete(source);\n }\n }\n } else {\n if (!(track === null || track === void 0 ? void 0 : track.track) && this.pendingPublishing.has(source)) {\n // if there's no track available yet first wait for pending publishing promises of that source to see if it becomes available\n track = yield this.waitForPendingPublicationOfSource(source);\n if (!track) {\n this.log.info('waiting for pending publication promise timed out', Object.assign(Object.assign({}, this.logContext), {\n source\n }));\n }\n }\n if (track && track.track) {\n // screenshare cannot be muted, unpublish instead\n if (source === Track.Source.ScreenShare) {\n track = yield this.unpublishTrack(track.track);\n const screenAudioTrack = this.getTrackPublication(Track.Source.ScreenShareAudio);\n if (screenAudioTrack && screenAudioTrack.track) {\n this.unpublishTrack(screenAudioTrack.track);\n }\n } else {\n yield track.mute();\n }\n }\n }\n return track;\n });\n }\n /**\n * Publish both camera and microphone at the same time. This is useful for\n * displaying a single Permission Dialog box to the end user.\n */\n enableCameraAndMicrophone() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.pendingPublishing.has(Track.Source.Camera) || this.pendingPublishing.has(Track.Source.Microphone)) {\n // no-op it's already been requested\n return;\n }\n this.pendingPublishing.add(Track.Source.Camera);\n this.pendingPublishing.add(Track.Source.Microphone);\n try {\n const tracks = yield this.createTracks({\n audio: true,\n video: true\n });\n yield Promise.all(tracks.map(track => this.publishTrack(track)));\n } finally {\n this.pendingPublishing.delete(Track.Source.Camera);\n this.pendingPublishing.delete(Track.Source.Microphone);\n }\n });\n }\n /**\n * Create local camera and/or microphone tracks\n * @param options\n * @returns\n */\n createTracks(options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n options !== null && options !== void 0 ? options : options = {};\n const mergedOptionsWithProcessors = mergeDefaultOptions(options, (_a = this.roomOptions) === null || _a === void 0 ? void 0 : _a.audioCaptureDefaults, (_b = this.roomOptions) === null || _b === void 0 ? void 0 : _b.videoCaptureDefaults);\n try {\n const tracks = yield createLocalTracks(mergedOptionsWithProcessors, {\n loggerName: this.roomOptions.loggerName,\n loggerContextCb: () => this.logContext\n });\n const localTracks = tracks.map(track => {\n if (isAudioTrack(track)) {\n this.microphoneError = undefined;\n track.setAudioContext(this.audioContext);\n track.source = Track.Source.Microphone;\n this.emit(ParticipantEvent.AudioStreamAcquired);\n }\n if (isVideoTrack(track)) {\n this.cameraError = undefined;\n track.source = Track.Source.Camera;\n }\n return track;\n });\n return localTracks;\n } catch (err) {\n if (err instanceof Error) {\n if (options.audio) {\n this.microphoneError = err;\n }\n if (options.video) {\n this.cameraError = err;\n }\n }\n throw err;\n }\n });\n }\n /**\n * Creates a screen capture tracks with getDisplayMedia().\n * A LocalVideoTrack is always created and returned.\n * If { audio: true }, and the browser supports audio capture, a LocalAudioTrack is also created.\n */\n createScreenTracks(options) {\n return __awaiter(this, void 0, void 0, function* () {\n if (options === undefined) {\n options = {};\n }\n if (navigator.mediaDevices.getDisplayMedia === undefined) {\n throw new DeviceUnsupportedError('getDisplayMedia not supported');\n }\n if (options.resolution === undefined && !isSafari17Based()) {\n // we need to constrain the dimensions, otherwise it could lead to low bitrate\n // due to encoding a huge video. Encoding such large surfaces is really expensive\n // unfortunately Safari 17 has a but and cannot be constrained by default\n options.resolution = ScreenSharePresets.h1080fps30.resolution;\n }\n const constraints = screenCaptureToDisplayMediaStreamOptions(options);\n const stream = yield navigator.mediaDevices.getDisplayMedia(constraints);\n const tracks = stream.getVideoTracks();\n if (tracks.length === 0) {\n throw new TrackInvalidError('no video track found');\n }\n const screenVideo = new LocalVideoTrack(tracks[0], undefined, false, {\n loggerName: this.roomOptions.loggerName,\n loggerContextCb: () => this.logContext\n });\n screenVideo.source = Track.Source.ScreenShare;\n if (options.contentHint) {\n screenVideo.mediaStreamTrack.contentHint = options.contentHint;\n }\n const localTracks = [screenVideo];\n if (stream.getAudioTracks().length > 0) {\n this.emit(ParticipantEvent.AudioStreamAcquired);\n const screenAudio = new LocalAudioTrack(stream.getAudioTracks()[0], undefined, false, this.audioContext, {\n loggerName: this.roomOptions.loggerName,\n loggerContextCb: () => this.logContext\n });\n screenAudio.source = Track.Source.ScreenShareAudio;\n localTracks.push(screenAudio);\n }\n return localTracks;\n });\n }\n /**\n * Publish a new track to the room\n * @param track\n * @param options\n */\n publishTrack(track, options) {\n return __awaiter(this, void 0, void 0, function* () {\n return this.publishOrRepublishTrack(track, options);\n });\n }\n publishOrRepublishTrack(track_1, options_1) {\n return __awaiter(this, arguments, void 0, function (track, options) {\n var _this2 = this;\n let isRepublish = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n return function* () {\n var _a, _b, _c, _d;\n if (isLocalAudioTrack(track)) {\n track.setAudioContext(_this2.audioContext);\n }\n yield (_a = _this2.reconnectFuture) === null || _a === void 0 ? void 0 : _a.promise;\n if (_this2.republishPromise && !isRepublish) {\n yield _this2.republishPromise;\n }\n if (isLocalTrack(track) && _this2.pendingPublishPromises.has(track)) {\n yield _this2.pendingPublishPromises.get(track);\n }\n let defaultConstraints;\n if (track instanceof MediaStreamTrack) {\n defaultConstraints = track.getConstraints();\n } else {\n // we want to access constraints directly as `track.mediaStreamTrack`\n // might be pointing to a non-device track (e.g. processed track) already\n defaultConstraints = track.constraints;\n let deviceKind = undefined;\n switch (track.source) {\n case Track.Source.Microphone:\n deviceKind = 'audioinput';\n break;\n case Track.Source.Camera:\n deviceKind = 'videoinput';\n }\n if (deviceKind && _this2.activeDeviceMap.has(deviceKind)) {\n defaultConstraints = Object.assign(Object.assign({}, defaultConstraints), {\n deviceId: _this2.activeDeviceMap.get(deviceKind)\n });\n }\n }\n // convert raw media track into audio or video track\n if (track instanceof MediaStreamTrack) {\n switch (track.kind) {\n case 'audio':\n track = new LocalAudioTrack(track, defaultConstraints, true, _this2.audioContext, {\n loggerName: _this2.roomOptions.loggerName,\n loggerContextCb: () => _this2.logContext\n });\n break;\n case 'video':\n track = new LocalVideoTrack(track, defaultConstraints, true, {\n loggerName: _this2.roomOptions.loggerName,\n loggerContextCb: () => _this2.logContext\n });\n break;\n default:\n throw new TrackInvalidError(\"unsupported MediaStreamTrack kind \".concat(track.kind));\n }\n } else {\n track.updateLoggerOptions({\n loggerName: _this2.roomOptions.loggerName,\n loggerContextCb: () => _this2.logContext\n });\n }\n // is it already published? if so skip\n let existingPublication;\n _this2.trackPublications.forEach(publication => {\n if (!publication.track) {\n return;\n }\n if (publication.track === track) {\n existingPublication = publication;\n }\n });\n if (existingPublication) {\n _this2.log.warn('track has already been published, skipping', Object.assign(Object.assign({}, _this2.logContext), getLogContextFromTrack(existingPublication)));\n return existingPublication;\n }\n const isStereoInput = 'channelCount' in track.mediaStreamTrack.getSettings() &&\n // @ts-ignore `channelCount` on getSettings() is currently only available for Safari, but is generally the best way to determine a stereo track https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackSettings/channelCount\n track.mediaStreamTrack.getSettings().channelCount === 2 || track.mediaStreamTrack.getConstraints().channelCount === 2;\n const isStereo = (_b = options === null || options === void 0 ? void 0 : options.forceStereo) !== null && _b !== void 0 ? _b : isStereoInput;\n // disable dtx for stereo track if not enabled explicitly\n if (isStereo) {\n if (!options) {\n options = {};\n }\n if (options.dtx === undefined) {\n _this2.log.info(\"Opus DTX will be disabled for stereo tracks by default. Enable them explicitly to make it work.\", Object.assign(Object.assign({}, _this2.logContext), getLogContextFromTrack(track)));\n }\n if (options.red === undefined) {\n _this2.log.info(\"Opus RED will be disabled for stereo tracks by default. Enable them explicitly to make it work.\");\n }\n (_c = options.dtx) !== null && _c !== void 0 ? _c : options.dtx = false;\n (_d = options.red) !== null && _d !== void 0 ? _d : options.red = false;\n }\n const opts = Object.assign(Object.assign({}, _this2.roomOptions.publishDefaults), options);\n if (!isE2EESimulcastSupported() && _this2.roomOptions.e2ee) {\n _this2.log.info(\"End-to-end encryption is set up, simulcast publishing will be disabled on Safari versions and iOS browsers running iOS < v17.2\", Object.assign({}, _this2.logContext));\n opts.simulcast = false;\n }\n if (opts.source) {\n track.source = opts.source;\n }\n const publishPromise = new Promise((resolve, reject) => __awaiter(_this2, void 0, void 0, function* () {\n try {\n if (this.engine.client.currentState !== SignalConnectionState.CONNECTED) {\n this.log.debug('deferring track publication until signal is connected', Object.assign(Object.assign({}, this.logContext), {\n track: getLogContextFromTrack(track)\n }));\n const timeout = setTimeout(() => {\n reject(new PublishTrackError('publishing rejected as engine not connected within timeout', 408));\n }, 15000);\n yield this.waitUntilEngineConnected();\n clearTimeout(timeout);\n const publication = yield this.publish(track, opts, isStereo);\n resolve(publication);\n } else {\n try {\n const publication = yield this.publish(track, opts, isStereo);\n resolve(publication);\n } catch (e) {\n reject(e);\n }\n }\n } catch (e) {\n reject(e);\n }\n }));\n _this2.pendingPublishPromises.set(track, publishPromise);\n try {\n const publication = yield publishPromise;\n return publication;\n } catch (e) {\n throw e;\n } finally {\n _this2.pendingPublishPromises.delete(track);\n }\n }();\n });\n }\n waitUntilEngineConnected() {\n if (!this.signalConnectedFuture) {\n this.signalConnectedFuture = new Future();\n }\n return this.signalConnectedFuture.promise;\n }\n hasPermissionsToPublish(track) {\n if (!this.permissions) {\n this.log.warn('no permissions present for publishing track', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n return false;\n }\n const {\n canPublish,\n canPublishSources\n } = this.permissions;\n if (canPublish && (canPublishSources.length === 0 || canPublishSources.map(source => getTrackSourceFromProto(source)).includes(track.source))) {\n return true;\n }\n this.log.warn('insufficient permissions to publish', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n return false;\n }\n publish(track, opts, isStereo) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;\n if (!this.hasPermissionsToPublish(track)) {\n throw new PublishTrackError('failed to publish track, insufficient permissions', 403);\n }\n const existingTrackOfSource = Array.from(this.trackPublications.values()).find(publishedTrack => isLocalTrack(track) && publishedTrack.source === track.source);\n if (existingTrackOfSource && track.source !== Track.Source.Unknown) {\n this.log.info(\"publishing a second track with the same source: \".concat(track.source), Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n }\n if (opts.stopMicTrackOnMute && isAudioTrack(track)) {\n track.stopOnMute = true;\n }\n if (track.source === Track.Source.ScreenShare && isFireFox()) {\n // Firefox does not work well with simulcasted screen share\n // we frequently get no data on layer 0 when enabled\n opts.simulcast = false;\n }\n // require full AV1/VP9 SVC support prior to using it\n if (opts.videoCodec === 'av1' && !supportsAV1()) {\n opts.videoCodec = undefined;\n }\n if (opts.videoCodec === 'vp9' && !supportsVP9()) {\n opts.videoCodec = undefined;\n }\n if (opts.videoCodec === undefined) {\n opts.videoCodec = defaultVideoCodec;\n }\n if (this.enabledPublishVideoCodecs.length > 0) {\n // fallback to a supported codec if it is not supported\n if (!this.enabledPublishVideoCodecs.some(c => opts.videoCodec === mimeTypeToVideoCodecString(c.mime))) {\n opts.videoCodec = mimeTypeToVideoCodecString(this.enabledPublishVideoCodecs[0].mime);\n }\n }\n const videoCodec = opts.videoCodec;\n // handle track actions\n track.on(TrackEvent.Muted, this.onTrackMuted);\n track.on(TrackEvent.Unmuted, this.onTrackUnmuted);\n track.on(TrackEvent.Ended, this.handleTrackEnded);\n track.on(TrackEvent.UpstreamPaused, this.onTrackUpstreamPaused);\n track.on(TrackEvent.UpstreamResumed, this.onTrackUpstreamResumed);\n track.on(TrackEvent.AudioTrackFeatureUpdate, this.onTrackFeatureUpdate);\n const audioFeatures = [];\n const disableDtx = !((_a = opts.dtx) !== null && _a !== void 0 ? _a : true);\n const settings = track.getSourceTrackSettings();\n if (settings.autoGainControl) {\n audioFeatures.push(AudioTrackFeature.TF_AUTO_GAIN_CONTROL);\n }\n if (settings.echoCancellation) {\n audioFeatures.push(AudioTrackFeature.TF_ECHO_CANCELLATION);\n }\n if (settings.noiseSuppression) {\n audioFeatures.push(AudioTrackFeature.TF_NOISE_SUPPRESSION);\n }\n if (settings.channelCount && settings.channelCount > 1) {\n audioFeatures.push(AudioTrackFeature.TF_STEREO);\n }\n if (disableDtx) {\n audioFeatures.push(AudioTrackFeature.TF_NO_DTX);\n }\n if (isLocalAudioTrack(track) && track.hasPreConnectBuffer) {\n audioFeatures.push(AudioTrackFeature.TF_PRECONNECT_BUFFER);\n }\n // create track publication from track\n const req = new AddTrackRequest({\n // get local track id for use during publishing\n cid: track.mediaStreamTrack.id,\n name: opts.name,\n type: Track.kindToProto(track.kind),\n muted: track.isMuted,\n source: Track.sourceToProto(track.source),\n disableDtx,\n encryption: this.encryptionType,\n stereo: isStereo,\n disableRed: this.isE2EEEnabled || !((_b = opts.red) !== null && _b !== void 0 ? _b : true),\n stream: opts === null || opts === void 0 ? void 0 : opts.stream,\n backupCodecPolicy: opts === null || opts === void 0 ? void 0 : opts.backupCodecPolicy,\n audioFeatures\n });\n // compute encodings and layers for video\n let encodings;\n if (track.kind === Track.Kind.Video) {\n let dims = {\n width: 0,\n height: 0\n };\n try {\n dims = yield track.waitForDimensions();\n } catch (e) {\n // use defaults, it's quite painful for congestion control without simulcast\n // so using default dims according to publish settings\n const defaultRes = (_d = (_c = this.roomOptions.videoCaptureDefaults) === null || _c === void 0 ? void 0 : _c.resolution) !== null && _d !== void 0 ? _d : VideoPresets.h720.resolution;\n dims = {\n width: defaultRes.width,\n height: defaultRes.height\n };\n // log failure\n this.log.error('could not determine track dimensions, using defaults', Object.assign(Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)), {\n dims\n }));\n }\n // width and height should be defined for video\n req.width = dims.width;\n req.height = dims.height;\n // for svc codecs, disable simulcast and use vp8 for backup codec\n if (isLocalVideoTrack(track)) {\n if (isSVCCodec(videoCodec)) {\n if (track.source === Track.Source.ScreenShare) {\n // vp9 svc with screenshare cannot encode multiple spatial layers\n // doing so reduces publish resolution to minimal resolution\n opts.scalabilityMode = 'L1T3';\n // Chrome does not allow more than 5 fps with L1T3, and it has encoding bugs with L3T3\n // It has a different path for screenshare handling and it seems to be untested/buggy\n // As a workaround, we are setting contentHint to force it to go through the same\n // path as regular camera video. While this is not optimal, it delivers the performance\n // that we need\n if ('contentHint' in track.mediaStreamTrack) {\n track.mediaStreamTrack.contentHint = 'motion';\n this.log.info('forcing contentHint to motion for screenshare with SVC codecs', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n }\n }\n // set scalabilityMode to 'L3T3_KEY' by default\n opts.scalabilityMode = (_e = opts.scalabilityMode) !== null && _e !== void 0 ? _e : 'L3T3_KEY';\n }\n req.simulcastCodecs = [new SimulcastCodec({\n codec: videoCodec,\n cid: track.mediaStreamTrack.id\n })];\n // set up backup\n if (opts.backupCodec === true) {\n opts.backupCodec = {\n codec: defaultVideoCodec\n };\n }\n if (opts.backupCodec && videoCodec !== opts.backupCodec.codec &&\n // TODO remove this once e2ee is supported for backup codecs\n req.encryption === Encryption_Type.NONE) {\n // multi-codec simulcast requires dynacast\n if (!this.roomOptions.dynacast) {\n this.roomOptions.dynacast = true;\n }\n req.simulcastCodecs.push(new SimulcastCodec({\n codec: opts.backupCodec.codec,\n cid: ''\n }));\n }\n }\n encodings = computeVideoEncodings(track.source === Track.Source.ScreenShare, req.width, req.height, opts);\n req.layers = videoLayersFromEncodings(req.width, req.height, encodings, isSVCCodec(opts.videoCodec));\n } else if (track.kind === Track.Kind.Audio) {\n encodings = [{\n maxBitrate: (_f = opts.audioPreset) === null || _f === void 0 ? void 0 : _f.maxBitrate,\n priority: (_h = (_g = opts.audioPreset) === null || _g === void 0 ? void 0 : _g.priority) !== null && _h !== void 0 ? _h : 'high',\n networkPriority: (_k = (_j = opts.audioPreset) === null || _j === void 0 ? void 0 : _j.priority) !== null && _k !== void 0 ? _k : 'high'\n }];\n }\n if (!this.engine || this.engine.isClosed) {\n throw new UnexpectedConnectionState('cannot publish track when not connected');\n }\n const negotiate = () => __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c;\n if (!this.engine.pcManager) {\n throw new UnexpectedConnectionState('pcManager is not ready');\n }\n track.sender = yield this.engine.createSender(track, opts, encodings);\n this.emit(ParticipantEvent.LocalSenderCreated, track.sender, track);\n if (isLocalVideoTrack(track)) {\n (_a = opts.degradationPreference) !== null && _a !== void 0 ? _a : opts.degradationPreference = getDefaultDegradationPreference(track);\n track.setDegradationPreference(opts.degradationPreference);\n }\n if (encodings) {\n if (isFireFox() && track.kind === Track.Kind.Audio) {\n /* Refer to RFC https://datatracker.ietf.org/doc/html/rfc7587#section-6.1,\n livekit-server uses maxaveragebitrate=510000 in the answer sdp to permit client to\n publish high quality audio track. But firefox always uses this value as the actual\n bitrates, causing the audio bitrates to rise to 510Kbps in any stereo case unexpectedly.\n So the client need to modify maxaverragebitrates in answer sdp to user provided value to\n fix the issue.\n */\n let trackTransceiver = undefined;\n for (const transceiver of this.engine.pcManager.publisher.getTransceivers()) {\n if (transceiver.sender === track.sender) {\n trackTransceiver = transceiver;\n break;\n }\n }\n if (trackTransceiver) {\n this.engine.pcManager.publisher.setTrackCodecBitrate({\n transceiver: trackTransceiver,\n codec: 'opus',\n maxbr: ((_b = encodings[0]) === null || _b === void 0 ? void 0 : _b.maxBitrate) ? encodings[0].maxBitrate / 1000 : 0\n });\n }\n } else if (track.codec && isSVCCodec(track.codec) && ((_c = encodings[0]) === null || _c === void 0 ? void 0 : _c.maxBitrate)) {\n this.engine.pcManager.publisher.setTrackCodecBitrate({\n cid: req.cid,\n codec: track.codec,\n maxbr: encodings[0].maxBitrate / 1000\n });\n }\n }\n yield this.engine.negotiate();\n });\n let ti;\n const addTrackPromise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n var _a;\n try {\n ti = yield this.engine.addTrack(req);\n resolve(ti);\n } catch (err) {\n if (track.sender && ((_a = this.engine.pcManager) === null || _a === void 0 ? void 0 : _a.publisher)) {\n this.engine.pcManager.publisher.removeTrack(track.sender);\n yield this.engine.negotiate().catch(negotiateErr => {\n this.log.error('failed to negotiate after removing track due to failed add track request', Object.assign(Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)), {\n error: negotiateErr\n }));\n });\n }\n reject(err);\n }\n }));\n if (this.enabledPublishVideoCodecs.length > 0) {\n const rets = yield Promise.all([addTrackPromise, negotiate()]);\n ti = rets[0];\n } else {\n ti = yield addTrackPromise;\n // server might not support the codec the client has requested, in that case, fallback\n // to a supported codec\n let primaryCodecMime;\n ti.codecs.forEach(codec => {\n if (primaryCodecMime === undefined) {\n primaryCodecMime = codec.mimeType;\n }\n });\n if (primaryCodecMime && track.kind === Track.Kind.Video) {\n const updatedCodec = mimeTypeToVideoCodecString(primaryCodecMime);\n if (updatedCodec !== videoCodec) {\n this.log.debug('falling back to server selected codec', Object.assign(Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)), {\n codec: updatedCodec\n }));\n opts.videoCodec = updatedCodec;\n // recompute encodings since bitrates/etc could have changed\n encodings = computeVideoEncodings(track.source === Track.Source.ScreenShare, req.width, req.height, opts);\n }\n }\n yield negotiate();\n }\n const publication = new LocalTrackPublication(track.kind, ti, track, {\n loggerName: this.roomOptions.loggerName,\n loggerContextCb: () => this.logContext\n });\n publication.on(TrackEvent.CpuConstrained, constrainedTrack => this.onTrackCpuConstrained(constrainedTrack, publication));\n // save options for when it needs to be republished again\n publication.options = opts;\n track.sid = ti.sid;\n this.log.debug(\"publishing \".concat(track.kind, \" with encodings\"), Object.assign(Object.assign({}, this.logContext), {\n encodings,\n trackInfo: ti\n }));\n if (isLocalVideoTrack(track)) {\n track.startMonitor(this.engine.client);\n } else if (isLocalAudioTrack(track)) {\n track.startMonitor();\n }\n this.addTrackPublication(publication);\n // send event for publication\n this.emit(ParticipantEvent.LocalTrackPublished, publication);\n if (isLocalAudioTrack(track) && ti.audioFeatures.includes(AudioTrackFeature.TF_PRECONNECT_BUFFER)) {\n const stream = track.getPreConnectBuffer();\n const mimeType = track.getPreConnectBufferMimeType();\n // TODO: we're registering the listener after negotiation, so there might be a race\n this.on(ParticipantEvent.LocalTrackSubscribed, pub => {\n if (pub.trackSid === ti.sid) {\n if (!track.hasPreConnectBuffer) {\n this.log.warn('subscribe event came to late, buffer already closed', this.logContext);\n return;\n }\n this.log.debug('finished recording preconnect buffer', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n track.stopPreConnectBuffer();\n }\n });\n if (stream) {\n const bufferStreamPromise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n var _a, e_2, _b, _c;\n var _d, _e;\n try {\n this.log.debug('waiting for agent', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n const agentActiveTimeout = setTimeout(() => {\n reject(new Error('agent not active within 10 seconds'));\n }, 10000);\n const agent = yield this.waitUntilActiveAgentPresent();\n clearTimeout(agentActiveTimeout);\n this.log.debug('sending preconnect buffer', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n const writer = yield this.streamBytes({\n name: 'preconnect-buffer',\n mimeType,\n topic: 'lk.agent.pre-connect-audio-buffer',\n destinationIdentities: [agent.identity],\n attributes: {\n trackId: publication.trackSid,\n sampleRate: String((_d = settings.sampleRate) !== null && _d !== void 0 ? _d : '48000'),\n channels: String((_e = settings.channelCount) !== null && _e !== void 0 ? _e : '1')\n }\n });\n try {\n for (var _f = true, stream_1 = __asyncValues(stream), stream_1_1; stream_1_1 = yield stream_1.next(), _a = stream_1_1.done, !_a; _f = true) {\n _c = stream_1_1.value;\n _f = false;\n const chunk = _c;\n yield writer.write(chunk);\n }\n } catch (e_2_1) {\n e_2 = {\n error: e_2_1\n };\n } finally {\n try {\n if (!_f && !_a && (_b = stream_1.return)) yield _b.call(stream_1);\n } finally {\n if (e_2) throw e_2.error;\n }\n }\n yield writer.close();\n resolve();\n } catch (e) {\n reject(e);\n }\n }));\n bufferStreamPromise.then(() => {\n this.log.debug('preconnect buffer sent successfully', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n }).catch(e => {\n this.log.error('error sending preconnect buffer', Object.assign(Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)), {\n error: e\n }));\n });\n }\n }\n return publication;\n });\n }\n get isLocal() {\n return true;\n }\n /** @internal\n * publish additional codec to existing track\n */\n publishAdditionalCodecForTrack(track, videoCodec, options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n // TODO remove once e2ee is supported for backup tracks\n if (this.encryptionType !== Encryption_Type.NONE) {\n return;\n }\n // is it not published? if so skip\n let existingPublication;\n this.trackPublications.forEach(publication => {\n if (!publication.track) {\n return;\n }\n if (publication.track === track) {\n existingPublication = publication;\n }\n });\n if (!existingPublication) {\n throw new TrackInvalidError('track is not published');\n }\n if (!isLocalVideoTrack(track)) {\n throw new TrackInvalidError('track is not a video track');\n }\n const opts = Object.assign(Object.assign({}, (_a = this.roomOptions) === null || _a === void 0 ? void 0 : _a.publishDefaults), options);\n const encodings = computeTrackBackupEncodings(track, videoCodec, opts);\n if (!encodings) {\n this.log.info(\"backup codec has been disabled, ignoring request to add additional codec for track\", Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n return;\n }\n const simulcastTrack = track.addSimulcastTrack(videoCodec, encodings);\n if (!simulcastTrack) {\n return;\n }\n const req = new AddTrackRequest({\n cid: simulcastTrack.mediaStreamTrack.id,\n type: Track.kindToProto(track.kind),\n muted: track.isMuted,\n source: Track.sourceToProto(track.source),\n sid: track.sid,\n simulcastCodecs: [{\n codec: opts.videoCodec,\n cid: simulcastTrack.mediaStreamTrack.id\n }]\n });\n req.layers = videoLayersFromEncodings(req.width, req.height, encodings);\n if (!this.engine || this.engine.isClosed) {\n throw new UnexpectedConnectionState('cannot publish track when not connected');\n }\n const negotiate = () => __awaiter(this, void 0, void 0, function* () {\n yield this.engine.createSimulcastSender(track, simulcastTrack, opts, encodings);\n yield this.engine.negotiate();\n });\n const rets = yield Promise.all([this.engine.addTrack(req), negotiate()]);\n const ti = rets[0];\n this.log.debug(\"published \".concat(videoCodec, \" for track \").concat(track.sid), Object.assign(Object.assign({}, this.logContext), {\n encodings,\n trackInfo: ti\n }));\n });\n }\n unpublishTrack(track, stopOnUnpublish) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n if (isLocalTrack(track)) {\n const publishPromise = this.pendingPublishPromises.get(track);\n if (publishPromise) {\n this.log.info('awaiting publish promise before attempting to unpublish', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(track)));\n yield publishPromise;\n }\n }\n // look through all published tracks to find the right ones\n const publication = this.getPublicationForTrack(track);\n const pubLogContext = publication ? getLogContextFromTrack(publication) : undefined;\n this.log.debug('unpublishing track', Object.assign(Object.assign({}, this.logContext), pubLogContext));\n if (!publication || !publication.track) {\n this.log.warn('track was not unpublished because no publication was found', Object.assign(Object.assign({}, this.logContext), pubLogContext));\n return undefined;\n }\n track = publication.track;\n track.off(TrackEvent.Muted, this.onTrackMuted);\n track.off(TrackEvent.Unmuted, this.onTrackUnmuted);\n track.off(TrackEvent.Ended, this.handleTrackEnded);\n track.off(TrackEvent.UpstreamPaused, this.onTrackUpstreamPaused);\n track.off(TrackEvent.UpstreamResumed, this.onTrackUpstreamResumed);\n track.off(TrackEvent.AudioTrackFeatureUpdate, this.onTrackFeatureUpdate);\n if (stopOnUnpublish === undefined) {\n stopOnUnpublish = (_b = (_a = this.roomOptions) === null || _a === void 0 ? void 0 : _a.stopLocalTrackOnUnpublish) !== null && _b !== void 0 ? _b : true;\n }\n if (stopOnUnpublish) {\n track.stop();\n } else {\n track.stopMonitor();\n }\n let negotiationNeeded = false;\n const trackSender = track.sender;\n track.sender = undefined;\n if (this.engine.pcManager && this.engine.pcManager.currentState < PCTransportState.FAILED && trackSender) {\n try {\n for (const transceiver of this.engine.pcManager.publisher.getTransceivers()) {\n // if sender is not currently sending (after replaceTrack(null))\n // removeTrack would have no effect.\n // to ensure we end up successfully removing the track, manually set\n // the transceiver to inactive\n if (transceiver.sender === trackSender) {\n transceiver.direction = 'inactive';\n negotiationNeeded = true;\n }\n }\n if (this.engine.removeTrack(trackSender)) {\n negotiationNeeded = true;\n }\n if (isLocalVideoTrack(track)) {\n for (const [, trackInfo] of track.simulcastCodecs) {\n if (trackInfo.sender) {\n if (this.engine.removeTrack(trackInfo.sender)) {\n negotiationNeeded = true;\n }\n trackInfo.sender = undefined;\n }\n }\n track.simulcastCodecs.clear();\n }\n } catch (e) {\n this.log.warn('failed to unpublish track', Object.assign(Object.assign(Object.assign({}, this.logContext), pubLogContext), {\n error: e\n }));\n }\n }\n // remove from our maps\n this.trackPublications.delete(publication.trackSid);\n switch (publication.kind) {\n case Track.Kind.Audio:\n this.audioTrackPublications.delete(publication.trackSid);\n break;\n case Track.Kind.Video:\n this.videoTrackPublications.delete(publication.trackSid);\n break;\n }\n this.emit(ParticipantEvent.LocalTrackUnpublished, publication);\n publication.setTrack(undefined);\n if (negotiationNeeded) {\n yield this.engine.negotiate();\n }\n return publication;\n });\n }\n unpublishTracks(tracks) {\n return __awaiter(this, void 0, void 0, function* () {\n const results = yield Promise.all(tracks.map(track => this.unpublishTrack(track)));\n return results.filter(track => !!track);\n });\n }\n republishAllTracks(options_1) {\n return __awaiter(this, arguments, void 0, function (options) {\n var _this3 = this;\n let restartTracks = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return function* () {\n if (_this3.republishPromise) {\n yield _this3.republishPromise;\n }\n _this3.republishPromise = new Promise((resolve, reject) => __awaiter(_this3, void 0, void 0, function* () {\n try {\n const localPubs = [];\n this.trackPublications.forEach(pub => {\n if (pub.track) {\n if (options) {\n pub.options = Object.assign(Object.assign({}, pub.options), options);\n }\n localPubs.push(pub);\n }\n });\n yield Promise.all(localPubs.map(pub => __awaiter(this, void 0, void 0, function* () {\n const track = pub.track;\n yield this.unpublishTrack(track, false);\n if (restartTracks && !track.isMuted && track.source !== Track.Source.ScreenShare && track.source !== Track.Source.ScreenShareAudio && (isLocalAudioTrack(track) || isLocalVideoTrack(track)) && !track.isUserProvided) {\n // generally we need to restart the track before publishing, often a full reconnect\n // is necessary because computer had gone to sleep.\n this.log.debug('restarting existing track', Object.assign(Object.assign({}, this.logContext), {\n track: pub.trackSid\n }));\n yield track.restartTrack();\n }\n yield this.publishOrRepublishTrack(track, pub.options, true);\n })));\n resolve();\n } catch (error) {\n reject(error);\n } finally {\n this.republishPromise = undefined;\n }\n }));\n yield _this3.republishPromise;\n }();\n });\n }\n /**\n * Publish a new data payload to the room. Data will be forwarded to each\n * participant in the room if the destination field in publishOptions is empty\n *\n * @param data Uint8Array of the payload. To send string data, use TextEncoder.encode\n * @param options optionally specify a `reliable`, `topic` and `destination`\n */\n publishData(data_1) {\n return __awaiter(this, arguments, void 0, function (data) {\n var _this4 = this;\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return function* () {\n const kind = options.reliable ? DataPacket_Kind.RELIABLE : DataPacket_Kind.LOSSY;\n const destinationIdentities = options.destinationIdentities;\n const topic = options.topic;\n const packet = new DataPacket({\n kind: kind,\n value: {\n case: 'user',\n value: new UserPacket({\n participantIdentity: _this4.identity,\n payload: data,\n destinationIdentities,\n topic\n })\n }\n });\n yield _this4.engine.sendDataPacket(packet, kind);\n }();\n });\n }\n /**\n * Publish SIP DTMF message to the room.\n *\n * @param code DTMF code\n * @param digit DTMF digit\n */\n publishDtmf(code, digit) {\n return __awaiter(this, void 0, void 0, function* () {\n const packet = new DataPacket({\n kind: DataPacket_Kind.RELIABLE,\n value: {\n case: 'sipDtmf',\n value: new SipDTMF({\n code: code,\n digit: digit\n })\n }\n });\n yield this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n });\n }\n sendChatMessage(text, options) {\n return __awaiter(this, void 0, void 0, function* () {\n const msg = {\n id: crypto.randomUUID(),\n message: text,\n timestamp: Date.now(),\n attachedFiles: options === null || options === void 0 ? void 0 : options.attachments\n };\n const packet = new DataPacket({\n value: {\n case: 'chatMessage',\n value: new ChatMessage(Object.assign(Object.assign({}, msg), {\n timestamp: protoInt64.parse(msg.timestamp)\n }))\n }\n });\n yield this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n this.emit(ParticipantEvent.ChatMessage, msg);\n return msg;\n });\n }\n editChatMessage(editText, originalMessage) {\n return __awaiter(this, void 0, void 0, function* () {\n const msg = Object.assign(Object.assign({}, originalMessage), {\n message: editText,\n editTimestamp: Date.now()\n });\n const packet = new DataPacket({\n value: {\n case: 'chatMessage',\n value: new ChatMessage(Object.assign(Object.assign({}, msg), {\n timestamp: protoInt64.parse(msg.timestamp),\n editTimestamp: protoInt64.parse(msg.editTimestamp)\n }))\n }\n });\n yield this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n this.emit(ParticipantEvent.ChatMessage, msg);\n return msg;\n });\n }\n sendText(text, options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const streamId = crypto.randomUUID();\n const textInBytes = new TextEncoder().encode(text);\n const totalTextLength = textInBytes.byteLength;\n const fileIds = (_a = options === null || options === void 0 ? void 0 : options.attachments) === null || _a === void 0 ? void 0 : _a.map(() => crypto.randomUUID());\n const progresses = new Array(fileIds ? fileIds.length + 1 : 1).fill(0);\n const handleProgress = (progress, idx) => {\n var _a;\n progresses[idx] = progress;\n const totalProgress = progresses.reduce((acc, val) => acc + val, 0);\n (_a = options === null || options === void 0 ? void 0 : options.onProgress) === null || _a === void 0 ? void 0 : _a.call(options, totalProgress);\n };\n const writer = yield this.streamText({\n streamId,\n totalSize: totalTextLength,\n destinationIdentities: options === null || options === void 0 ? void 0 : options.destinationIdentities,\n topic: options === null || options === void 0 ? void 0 : options.topic,\n attachedStreamIds: fileIds,\n attributes: options === null || options === void 0 ? void 0 : options.attributes\n });\n yield writer.write(text);\n // set text part of progress to 1\n handleProgress(1, 0);\n yield writer.close();\n if ((options === null || options === void 0 ? void 0 : options.attachments) && fileIds) {\n yield Promise.all(options.attachments.map((file, idx) => __awaiter(this, void 0, void 0, function* () {\n return this._sendFile(fileIds[idx], file, {\n topic: options.topic,\n mimeType: file.type,\n onProgress: progress => {\n handleProgress(progress, idx + 1);\n }\n });\n })));\n }\n return writer.info;\n });\n }\n /**\n * @internal\n * @experimental CAUTION, might get removed in a minor release\n */\n streamText(options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n const streamId = (_a = options === null || options === void 0 ? void 0 : options.streamId) !== null && _a !== void 0 ? _a : crypto.randomUUID();\n const info = {\n id: streamId,\n mimeType: 'text/plain',\n timestamp: Date.now(),\n topic: (_b = options === null || options === void 0 ? void 0 : options.topic) !== null && _b !== void 0 ? _b : '',\n size: options === null || options === void 0 ? void 0 : options.totalSize,\n attributes: options === null || options === void 0 ? void 0 : options.attributes\n };\n const header = new DataStream_Header({\n streamId,\n mimeType: info.mimeType,\n topic: info.topic,\n timestamp: numberToBigInt(info.timestamp),\n totalLength: numberToBigInt(options === null || options === void 0 ? void 0 : options.totalSize),\n attributes: info.attributes,\n contentHeader: {\n case: 'textHeader',\n value: new DataStream_TextHeader({\n version: options === null || options === void 0 ? void 0 : options.version,\n attachedStreamIds: options === null || options === void 0 ? void 0 : options.attachedStreamIds,\n replyToStreamId: options === null || options === void 0 ? void 0 : options.replyToStreamId,\n operationType: (options === null || options === void 0 ? void 0 : options.type) === 'update' ? DataStream_OperationType.UPDATE : DataStream_OperationType.CREATE\n })\n }\n });\n const destinationIdentities = options === null || options === void 0 ? void 0 : options.destinationIdentities;\n const packet = new DataPacket({\n destinationIdentities,\n value: {\n case: 'streamHeader',\n value: header\n }\n });\n yield this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n let chunkId = 0;\n const localP = this;\n const writableStream = new WritableStream({\n // Implement the sink\n write(text) {\n return __awaiter(this, void 0, void 0, function* () {\n for (const textByteChunk of splitUtf8(text, STREAM_CHUNK_SIZE)) {\n yield localP.engine.waitForBufferStatusLow(DataPacket_Kind.RELIABLE);\n const chunk = new DataStream_Chunk({\n content: textByteChunk,\n streamId,\n chunkIndex: numberToBigInt(chunkId)\n });\n const chunkPacket = new DataPacket({\n destinationIdentities,\n value: {\n case: 'streamChunk',\n value: chunk\n }\n });\n yield localP.engine.sendDataPacket(chunkPacket, DataPacket_Kind.RELIABLE);\n chunkId += 1;\n }\n });\n },\n close() {\n return __awaiter(this, void 0, void 0, function* () {\n const trailer = new DataStream_Trailer({\n streamId\n });\n const trailerPacket = new DataPacket({\n destinationIdentities,\n value: {\n case: 'streamTrailer',\n value: trailer\n }\n });\n yield localP.engine.sendDataPacket(trailerPacket, DataPacket_Kind.RELIABLE);\n });\n },\n abort(err) {\n console.log('Sink error:', err);\n // TODO handle aborts to signal something to receiver side\n }\n });\n let onEngineClose = () => __awaiter(this, void 0, void 0, function* () {\n yield writer.close();\n });\n localP.engine.once(EngineEvent.Closing, onEngineClose);\n const writer = new TextStreamWriter(writableStream, info, () => this.engine.off(EngineEvent.Closing, onEngineClose));\n return writer;\n });\n }\n sendFile(file, options) {\n return __awaiter(this, void 0, void 0, function* () {\n const streamId = crypto.randomUUID();\n yield this._sendFile(streamId, file, options);\n return {\n id: streamId\n };\n });\n }\n _sendFile(streamId, file, options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const writer = yield this.streamBytes({\n streamId,\n totalSize: file.size,\n name: file.name,\n mimeType: (_a = options === null || options === void 0 ? void 0 : options.mimeType) !== null && _a !== void 0 ? _a : file.type,\n topic: options === null || options === void 0 ? void 0 : options.topic,\n destinationIdentities: options === null || options === void 0 ? void 0 : options.destinationIdentities\n });\n const reader = file.stream().getReader();\n while (true) {\n const {\n done,\n value\n } = yield reader.read();\n if (done) {\n break;\n }\n yield writer.write(value);\n }\n yield writer.close();\n return writer.info;\n });\n }\n streamBytes(options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c, _d, _e;\n const streamId = (_a = options === null || options === void 0 ? void 0 : options.streamId) !== null && _a !== void 0 ? _a : crypto.randomUUID();\n const destinationIdentities = options === null || options === void 0 ? void 0 : options.destinationIdentities;\n const info = {\n id: streamId,\n mimeType: (_b = options === null || options === void 0 ? void 0 : options.mimeType) !== null && _b !== void 0 ? _b : 'application/octet-stream',\n topic: (_c = options === null || options === void 0 ? void 0 : options.topic) !== null && _c !== void 0 ? _c : '',\n timestamp: Date.now(),\n attributes: options === null || options === void 0 ? void 0 : options.attributes,\n size: options === null || options === void 0 ? void 0 : options.totalSize,\n name: (_d = options === null || options === void 0 ? void 0 : options.name) !== null && _d !== void 0 ? _d : 'unknown'\n };\n const header = new DataStream_Header({\n totalLength: numberToBigInt((_e = info.size) !== null && _e !== void 0 ? _e : 0),\n mimeType: info.mimeType,\n streamId,\n topic: info.topic,\n timestamp: numberToBigInt(Date.now()),\n attributes: info.attributes,\n contentHeader: {\n case: 'byteHeader',\n value: new DataStream_ByteHeader({\n name: info.name\n })\n }\n });\n const packet = new DataPacket({\n destinationIdentities,\n value: {\n case: 'streamHeader',\n value: header\n }\n });\n yield this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n let chunkId = 0;\n const writeMutex = new _();\n const engine = this.engine;\n const log = this.log;\n const writableStream = new WritableStream({\n write(chunk) {\n return __awaiter(this, void 0, void 0, function* () {\n const unlock = yield writeMutex.lock();\n let byteOffset = 0;\n try {\n while (byteOffset < chunk.byteLength) {\n const subChunk = chunk.slice(byteOffset, byteOffset + STREAM_CHUNK_SIZE);\n yield engine.waitForBufferStatusLow(DataPacket_Kind.RELIABLE);\n const chunkPacket = new DataPacket({\n destinationIdentities,\n value: {\n case: 'streamChunk',\n value: new DataStream_Chunk({\n content: subChunk,\n streamId,\n chunkIndex: numberToBigInt(chunkId)\n })\n }\n });\n yield engine.sendDataPacket(chunkPacket, DataPacket_Kind.RELIABLE);\n chunkId += 1;\n byteOffset += subChunk.byteLength;\n }\n } finally {\n unlock();\n }\n });\n },\n close() {\n return __awaiter(this, void 0, void 0, function* () {\n const trailer = new DataStream_Trailer({\n streamId\n });\n const trailerPacket = new DataPacket({\n destinationIdentities,\n value: {\n case: 'streamTrailer',\n value: trailer\n }\n });\n yield engine.sendDataPacket(trailerPacket, DataPacket_Kind.RELIABLE);\n });\n },\n abort(err) {\n log.error('Sink error:', err);\n }\n });\n const byteWriter = new ByteStreamWriter(writableStream, info);\n return byteWriter;\n });\n }\n /**\n * Initiate an RPC call to a remote participant\n * @param params - Parameters for initiating the RPC call, see {@link PerformRpcParams}\n * @returns A promise that resolves with the response payload or rejects with an error.\n * @throws Error on failure. Details in `message`.\n */\n performRpc(_a) {\n return __awaiter(this, arguments, void 0, function (_ref3) {\n var _this5 = this;\n let {\n destinationIdentity,\n method,\n payload,\n responseTimeout = 10000\n } = _ref3;\n return function* () {\n const maxRoundTripLatency = 2000;\n return new Promise((resolve, reject) => __awaiter(_this5, void 0, void 0, function* () {\n var _a, _b, _c, _d;\n if (byteLength(payload) > MAX_PAYLOAD_BYTES) {\n reject(RpcError.builtIn('REQUEST_PAYLOAD_TOO_LARGE'));\n return;\n }\n if (((_b = (_a = this.engine.latestJoinResponse) === null || _a === void 0 ? void 0 : _a.serverInfo) === null || _b === void 0 ? void 0 : _b.version) && compareVersions((_d = (_c = this.engine.latestJoinResponse) === null || _c === void 0 ? void 0 : _c.serverInfo) === null || _d === void 0 ? void 0 : _d.version, '1.8.0') < 0) {\n reject(RpcError.builtIn('UNSUPPORTED_SERVER'));\n return;\n }\n const id = crypto.randomUUID();\n yield this.publishRpcRequest(destinationIdentity, id, method, payload, responseTimeout - maxRoundTripLatency);\n const ackTimeoutId = setTimeout(() => {\n this.pendingAcks.delete(id);\n reject(RpcError.builtIn('CONNECTION_TIMEOUT'));\n this.pendingResponses.delete(id);\n clearTimeout(responseTimeoutId);\n }, maxRoundTripLatency);\n this.pendingAcks.set(id, {\n resolve: () => {\n clearTimeout(ackTimeoutId);\n },\n participantIdentity: destinationIdentity\n });\n const responseTimeoutId = setTimeout(() => {\n this.pendingResponses.delete(id);\n reject(RpcError.builtIn('RESPONSE_TIMEOUT'));\n }, responseTimeout);\n this.pendingResponses.set(id, {\n resolve: (responsePayload, responseError) => {\n clearTimeout(responseTimeoutId);\n if (this.pendingAcks.has(id)) {\n console.warn('RPC response received before ack', id);\n this.pendingAcks.delete(id);\n clearTimeout(ackTimeoutId);\n }\n if (responseError) {\n reject(responseError);\n } else {\n resolve(responsePayload !== null && responsePayload !== void 0 ? responsePayload : '');\n }\n },\n participantIdentity: destinationIdentity\n });\n }));\n }();\n });\n }\n /**\n * @deprecated use `room.registerRpcMethod` instead\n */\n registerRpcMethod(method, handler) {\n if (this.rpcHandlers.has(method)) {\n this.log.warn(\"you're overriding the RPC handler for method \".concat(method, \", in the future this will throw an error\"));\n }\n this.rpcHandlers.set(method, handler);\n }\n /**\n * @deprecated use `room.unregisterRpcMethod` instead\n */\n unregisterRpcMethod(method) {\n this.rpcHandlers.delete(method);\n }\n /**\n * Control who can subscribe to LocalParticipant's published tracks.\n *\n * By default, all participants can subscribe. This allows fine-grained control over\n * who is able to subscribe at a participant and track level.\n *\n * Note: if access is given at a track-level (i.e. both [allParticipantsAllowed] and\n * [ParticipantTrackPermission.allTracksAllowed] are false), any newer published tracks\n * will not grant permissions to any participants and will require a subsequent\n * permissions update to allow subscription.\n *\n * @param allParticipantsAllowed Allows all participants to subscribe all tracks.\n * Takes precedence over [[participantTrackPermissions]] if set to true.\n * By default this is set to true.\n * @param participantTrackPermissions Full list of individual permissions per\n * participant/track. Any omitted participants will not receive any permissions.\n */\n setTrackSubscriptionPermissions(allParticipantsAllowed) {\n let participantTrackPermissions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];\n this.participantTrackPermissions = participantTrackPermissions;\n this.allParticipantsAllowedToSubscribe = allParticipantsAllowed;\n if (!this.engine.client.isDisconnected) {\n this.updateTrackSubscriptionPermissions();\n }\n }\n handleIncomingRpcAck(requestId) {\n const handler = this.pendingAcks.get(requestId);\n if (handler) {\n handler.resolve();\n this.pendingAcks.delete(requestId);\n } else {\n console.error('Ack received for unexpected RPC request', requestId);\n }\n }\n handleIncomingRpcResponse(requestId, payload, error) {\n const handler = this.pendingResponses.get(requestId);\n if (handler) {\n handler.resolve(payload, error);\n this.pendingResponses.delete(requestId);\n } else {\n console.error('Response received for unexpected RPC request', requestId);\n }\n }\n /** @internal */\n publishRpcRequest(destinationIdentity, requestId, method, payload, responseTimeout) {\n return __awaiter(this, void 0, void 0, function* () {\n const packet = new DataPacket({\n destinationIdentities: [destinationIdentity],\n kind: DataPacket_Kind.RELIABLE,\n value: {\n case: 'rpcRequest',\n value: new RpcRequest({\n id: requestId,\n method,\n payload,\n responseTimeoutMs: responseTimeout,\n version: 1\n })\n }\n });\n yield this.engine.sendDataPacket(packet, DataPacket_Kind.RELIABLE);\n });\n }\n /** @internal */\n handleParticipantDisconnected(participantIdentity) {\n for (const [id, {\n participantIdentity: pendingIdentity\n }] of this.pendingAcks) {\n if (pendingIdentity === participantIdentity) {\n this.pendingAcks.delete(id);\n }\n }\n for (const [id, {\n participantIdentity: pendingIdentity,\n resolve\n }] of this.pendingResponses) {\n if (pendingIdentity === participantIdentity) {\n resolve(null, RpcError.builtIn('RECIPIENT_DISCONNECTED'));\n this.pendingResponses.delete(id);\n }\n }\n }\n /** @internal */\n setEnabledPublishCodecs(codecs) {\n this.enabledPublishVideoCodecs = codecs.filter(c => c.mime.split('/')[0].toLowerCase() === 'video');\n }\n /** @internal */\n updateInfo(info) {\n if (!super.updateInfo(info)) {\n return false;\n }\n // reconcile track mute status.\n // if server's track mute status doesn't match actual, we'll have to update\n // the server's copy\n info.tracks.forEach(ti => {\n var _a, _b;\n const pub = this.trackPublications.get(ti.sid);\n if (pub) {\n const mutedOnServer = pub.isMuted || ((_b = (_a = pub.track) === null || _a === void 0 ? void 0 : _a.isUpstreamPaused) !== null && _b !== void 0 ? _b : false);\n if (mutedOnServer !== ti.muted) {\n this.log.debug('updating server mute state after reconcile', Object.assign(Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(pub)), {\n mutedOnServer\n }));\n this.engine.client.sendMuteTrack(ti.sid, mutedOnServer);\n }\n }\n });\n return true;\n }\n /** @internal */\n setActiveAgent(agent) {\n var _a, _b, _c, _d;\n this.firstActiveAgent = agent;\n if (agent && !this.firstActiveAgent) {\n this.firstActiveAgent = agent;\n }\n if (agent) {\n (_b = (_a = this.activeAgentFuture) === null || _a === void 0 ? void 0 : _a.resolve) === null || _b === void 0 ? void 0 : _b.call(_a, agent);\n } else {\n (_d = (_c = this.activeAgentFuture) === null || _c === void 0 ? void 0 : _c.reject) === null || _d === void 0 ? void 0 : _d.call(_c, 'Agent disconnected');\n }\n this.activeAgentFuture = undefined;\n }\n waitUntilActiveAgentPresent() {\n if (this.firstActiveAgent) {\n return Promise.resolve(this.firstActiveAgent);\n }\n if (!this.activeAgentFuture) {\n this.activeAgentFuture = new Future();\n }\n return this.activeAgentFuture.promise;\n }\n getPublicationForTrack(track) {\n let publication;\n this.trackPublications.forEach(pub => {\n const localTrack = pub.track;\n if (!localTrack) {\n return;\n }\n // this looks overly complicated due to this object tree\n if (track instanceof MediaStreamTrack) {\n if (isLocalAudioTrack(localTrack) || isLocalVideoTrack(localTrack)) {\n if (localTrack.mediaStreamTrack === track) {\n publication = pub;\n }\n }\n } else if (track === localTrack) {\n publication = pub;\n }\n });\n return publication;\n }\n waitForPendingPublicationOfSource(source) {\n return __awaiter(this, void 0, void 0, function* () {\n const waitForPendingTimeout = 10000;\n const startTime = Date.now();\n while (Date.now() < startTime + waitForPendingTimeout) {\n const publishPromiseEntry = Array.from(this.pendingPublishPromises.entries()).find(_ref4 => {\n let [pendingTrack] = _ref4;\n return pendingTrack.source === source;\n });\n if (publishPromiseEntry) {\n return publishPromiseEntry[1];\n }\n yield sleep(20);\n }\n });\n }\n}\n\nclass RemoteTrackPublication extends TrackPublication {\n constructor(kind, ti, autoSubscribe, loggerOptions) {\n super(kind, ti.sid, ti.name, loggerOptions);\n this.track = undefined;\n /** @internal */\n this.allowed = true;\n this.requestedDisabled = undefined;\n this.visible = true;\n this.handleEnded = track => {\n this.setTrack(undefined);\n this.emit(TrackEvent.Ended, track);\n };\n this.handleVisibilityChange = visible => {\n this.log.debug(\"adaptivestream video visibility \".concat(this.trackSid, \", visible=\").concat(visible), this.logContext);\n this.visible = visible;\n this.emitTrackUpdate();\n };\n this.handleVideoDimensionsChange = dimensions => {\n this.log.debug(\"adaptivestream video dimensions \".concat(dimensions.width, \"x\").concat(dimensions.height), this.logContext);\n this.videoDimensionsAdaptiveStream = dimensions;\n this.emitTrackUpdate();\n };\n this.subscribed = autoSubscribe;\n this.updateInfo(ti);\n }\n /**\n * Subscribe or unsubscribe to this remote track\n * @param subscribed true to subscribe to a track, false to unsubscribe\n */\n setSubscribed(subscribed) {\n const prevStatus = this.subscriptionStatus;\n const prevPermission = this.permissionStatus;\n this.subscribed = subscribed;\n // reset allowed status when desired subscription state changes\n // server will notify client via signal message if it's not allowed\n if (subscribed) {\n this.allowed = true;\n }\n const sub = new UpdateSubscription({\n trackSids: [this.trackSid],\n subscribe: this.subscribed,\n participantTracks: [new ParticipantTracks({\n // sending an empty participant id since TrackPublication doesn't keep it\n // this is filled in by the participant that receives this message\n participantSid: '',\n trackSids: [this.trackSid]\n })]\n });\n this.emit(TrackEvent.UpdateSubscription, sub);\n this.emitSubscriptionUpdateIfChanged(prevStatus);\n this.emitPermissionUpdateIfChanged(prevPermission);\n }\n get subscriptionStatus() {\n if (this.subscribed === false) {\n return TrackPublication.SubscriptionStatus.Unsubscribed;\n }\n if (!super.isSubscribed) {\n return TrackPublication.SubscriptionStatus.Desired;\n }\n return TrackPublication.SubscriptionStatus.Subscribed;\n }\n get permissionStatus() {\n return this.allowed ? TrackPublication.PermissionStatus.Allowed : TrackPublication.PermissionStatus.NotAllowed;\n }\n /**\n * Returns true if track is subscribed, and ready for playback\n */\n get isSubscribed() {\n if (this.subscribed === false) {\n return false;\n }\n return super.isSubscribed;\n }\n // returns client's desire to subscribe to a track, also true if autoSubscribe is enabled\n get isDesired() {\n return this.subscribed !== false;\n }\n get isEnabled() {\n return this.requestedDisabled !== undefined ? !this.requestedDisabled : this.isAdaptiveStream ? this.visible : true;\n }\n get isLocal() {\n return false;\n }\n /**\n * disable server from sending down data for this track. this is useful when\n * the participant is off screen, you may disable streaming down their video\n * to reduce bandwidth requirements\n * @param enabled\n */\n setEnabled(enabled) {\n if (!this.isManualOperationAllowed() || this.requestedDisabled === !enabled) {\n return;\n }\n this.requestedDisabled = !enabled;\n this.emitTrackUpdate();\n }\n /**\n * for tracks that support simulcasting, adjust subscribed quality\n *\n * This indicates the highest quality the client can accept. if network\n * bandwidth does not allow, server will automatically reduce quality to\n * optimize for uninterrupted video\n */\n setVideoQuality(quality) {\n if (!this.isManualOperationAllowed() || this.requestedMaxQuality === quality) {\n return;\n }\n this.requestedMaxQuality = quality;\n this.requestedVideoDimensions = undefined;\n this.emitTrackUpdate();\n }\n /**\n * Explicitly set the video dimensions for this track.\n *\n * This will take precedence over adaptive stream dimensions.\n *\n * @param dimensions The video dimensions to set.\n */\n setVideoDimensions(dimensions) {\n var _a, _b;\n if (!this.isManualOperationAllowed()) {\n return;\n }\n if (((_a = this.requestedVideoDimensions) === null || _a === void 0 ? void 0 : _a.width) === dimensions.width && ((_b = this.requestedVideoDimensions) === null || _b === void 0 ? void 0 : _b.height) === dimensions.height) {\n return;\n }\n if (isRemoteVideoTrack(this.track)) {\n this.requestedVideoDimensions = dimensions;\n }\n this.requestedMaxQuality = undefined;\n this.emitTrackUpdate();\n }\n setVideoFPS(fps) {\n if (!this.isManualOperationAllowed()) {\n return;\n }\n if (!isRemoteVideoTrack(this.track)) {\n return;\n }\n if (this.fps === fps) {\n return;\n }\n this.fps = fps;\n this.emitTrackUpdate();\n }\n get videoQuality() {\n var _a;\n return (_a = this.requestedMaxQuality) !== null && _a !== void 0 ? _a : VideoQuality.HIGH;\n }\n /** @internal */\n setTrack(track) {\n const prevStatus = this.subscriptionStatus;\n const prevPermission = this.permissionStatus;\n const prevTrack = this.track;\n if (prevTrack === track) {\n return;\n }\n if (prevTrack) {\n // unregister listener\n prevTrack.off(TrackEvent.VideoDimensionsChanged, this.handleVideoDimensionsChange);\n prevTrack.off(TrackEvent.VisibilityChanged, this.handleVisibilityChange);\n prevTrack.off(TrackEvent.Ended, this.handleEnded);\n prevTrack.detach();\n prevTrack.stopMonitor();\n this.emit(TrackEvent.Unsubscribed, prevTrack);\n }\n super.setTrack(track);\n if (track) {\n track.sid = this.trackSid;\n track.on(TrackEvent.VideoDimensionsChanged, this.handleVideoDimensionsChange);\n track.on(TrackEvent.VisibilityChanged, this.handleVisibilityChange);\n track.on(TrackEvent.Ended, this.handleEnded);\n this.emit(TrackEvent.Subscribed, track);\n }\n this.emitPermissionUpdateIfChanged(prevPermission);\n this.emitSubscriptionUpdateIfChanged(prevStatus);\n }\n /** @internal */\n setAllowed(allowed) {\n const prevStatus = this.subscriptionStatus;\n const prevPermission = this.permissionStatus;\n this.allowed = allowed;\n this.emitPermissionUpdateIfChanged(prevPermission);\n this.emitSubscriptionUpdateIfChanged(prevStatus);\n }\n /** @internal */\n setSubscriptionError(error) {\n this.emit(TrackEvent.SubscriptionFailed, error);\n }\n /** @internal */\n updateInfo(info) {\n super.updateInfo(info);\n const prevMetadataMuted = this.metadataMuted;\n this.metadataMuted = info.muted;\n if (this.track) {\n this.track.setMuted(info.muted);\n } else if (prevMetadataMuted !== info.muted) {\n this.emit(info.muted ? TrackEvent.Muted : TrackEvent.Unmuted);\n }\n }\n emitSubscriptionUpdateIfChanged(previousStatus) {\n const currentStatus = this.subscriptionStatus;\n if (previousStatus === currentStatus) {\n return;\n }\n this.emit(TrackEvent.SubscriptionStatusChanged, currentStatus, previousStatus);\n }\n emitPermissionUpdateIfChanged(previousPermissionStatus) {\n const currentPermissionStatus = this.permissionStatus;\n if (currentPermissionStatus !== previousPermissionStatus) {\n this.emit(TrackEvent.SubscriptionPermissionChanged, this.permissionStatus, previousPermissionStatus);\n }\n }\n isManualOperationAllowed() {\n if (!this.isDesired) {\n this.log.warn('cannot update track settings when not subscribed', this.logContext);\n return false;\n }\n return true;\n }\n get isAdaptiveStream() {\n return isRemoteVideoTrack(this.track) && this.track.isAdaptiveStream;\n }\n /* @internal */\n emitTrackUpdate() {\n const settings = new UpdateTrackSettings({\n trackSids: [this.trackSid],\n disabled: !this.isEnabled,\n fps: this.fps\n });\n if (this.kind === Track.Kind.Video) {\n let minDimensions = this.requestedVideoDimensions;\n if (this.videoDimensionsAdaptiveStream !== undefined) {\n if (minDimensions) {\n // check whether the adaptive stream dimensions are smaller than the requested dimensions and use smaller one\n const smallerAdaptive = areDimensionsSmaller(this.videoDimensionsAdaptiveStream, minDimensions);\n if (smallerAdaptive) {\n this.log.debug('using adaptive stream dimensions instead of requested', Object.assign(Object.assign({}, this.logContext), this.videoDimensionsAdaptiveStream));\n minDimensions = this.videoDimensionsAdaptiveStream;\n }\n } else if (this.requestedMaxQuality !== undefined && this.trackInfo) {\n // check whether adaptive stream dimensions are smaller than the max quality layer and use smaller one\n const maxQualityLayer = layerDimensionsFor(this.trackInfo, this.requestedMaxQuality);\n if (maxQualityLayer && areDimensionsSmaller(this.videoDimensionsAdaptiveStream, maxQualityLayer)) {\n this.log.debug('using adaptive stream dimensions instead of max quality layer', Object.assign(Object.assign({}, this.logContext), this.videoDimensionsAdaptiveStream));\n minDimensions = this.videoDimensionsAdaptiveStream;\n }\n } else {\n this.log.debug('using adaptive stream dimensions', Object.assign(Object.assign({}, this.logContext), this.videoDimensionsAdaptiveStream));\n minDimensions = this.videoDimensionsAdaptiveStream;\n }\n }\n if (minDimensions) {\n settings.width = Math.ceil(minDimensions.width);\n settings.height = Math.ceil(minDimensions.height);\n } else if (this.requestedMaxQuality !== undefined) {\n this.log.debug('using requested max quality', Object.assign(Object.assign({}, this.logContext), {\n quality: this.requestedMaxQuality\n }));\n settings.quality = this.requestedMaxQuality;\n } else {\n this.log.debug('using default quality', Object.assign(Object.assign({}, this.logContext), {\n quality: VideoQuality.HIGH\n }));\n // defaults to high quality\n settings.quality = VideoQuality.HIGH;\n }\n }\n this.emit(TrackEvent.UpdateSettings, settings);\n }\n}\n\nclass RemoteParticipant extends Participant {\n /** @internal */\n static fromParticipantInfo(signalClient, pi, loggerOptions) {\n return new RemoteParticipant(signalClient, pi.sid, pi.identity, pi.name, pi.metadata, pi.attributes, loggerOptions, pi.kind);\n }\n get logContext() {\n return Object.assign(Object.assign({}, super.logContext), {\n rpID: this.sid,\n remoteParticipant: this.identity\n });\n }\n /** @internal */\n constructor(signalClient, sid, identity, name, metadata, attributes, loggerOptions) {\n let kind = arguments.length > 7 && arguments[7] !== undefined ? arguments[7] : ParticipantInfo_Kind.STANDARD;\n super(sid, identity || '', name, metadata, attributes, loggerOptions, kind);\n this.signalClient = signalClient;\n this.trackPublications = new Map();\n this.audioTrackPublications = new Map();\n this.videoTrackPublications = new Map();\n this.volumeMap = new Map();\n }\n addTrackPublication(publication) {\n super.addTrackPublication(publication);\n // register action events\n publication.on(TrackEvent.UpdateSettings, settings => {\n this.log.debug('send update settings', Object.assign(Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(publication)), {\n settings\n }));\n this.signalClient.sendUpdateTrackSettings(settings);\n });\n publication.on(TrackEvent.UpdateSubscription, sub => {\n sub.participantTracks.forEach(pt => {\n pt.participantSid = this.sid;\n });\n this.signalClient.sendUpdateSubscription(sub);\n });\n publication.on(TrackEvent.SubscriptionPermissionChanged, status => {\n this.emit(ParticipantEvent.TrackSubscriptionPermissionChanged, publication, status);\n });\n publication.on(TrackEvent.SubscriptionStatusChanged, status => {\n this.emit(ParticipantEvent.TrackSubscriptionStatusChanged, publication, status);\n });\n publication.on(TrackEvent.Subscribed, track => {\n this.emit(ParticipantEvent.TrackSubscribed, track, publication);\n });\n publication.on(TrackEvent.Unsubscribed, previousTrack => {\n this.emit(ParticipantEvent.TrackUnsubscribed, previousTrack, publication);\n });\n publication.on(TrackEvent.SubscriptionFailed, error => {\n this.emit(ParticipantEvent.TrackSubscriptionFailed, publication.trackSid, error);\n });\n }\n getTrackPublication(source) {\n const track = super.getTrackPublication(source);\n if (track) {\n return track;\n }\n }\n getTrackPublicationByName(name) {\n const track = super.getTrackPublicationByName(name);\n if (track) {\n return track;\n }\n }\n /**\n * sets the volume on the participant's audio track\n * by default, this affects the microphone publication\n * a different source can be passed in as a second argument\n * if no track exists the volume will be applied when the microphone track is added\n */\n setVolume(volume) {\n let source = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Track.Source.Microphone;\n this.volumeMap.set(source, volume);\n const audioPublication = this.getTrackPublication(source);\n if (audioPublication && audioPublication.track) {\n audioPublication.track.setVolume(volume);\n }\n }\n /**\n * gets the volume on the participant's microphone track\n */\n getVolume() {\n let source = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Track.Source.Microphone;\n const audioPublication = this.getTrackPublication(source);\n if (audioPublication && audioPublication.track) {\n return audioPublication.track.getVolume();\n }\n return this.volumeMap.get(source);\n }\n /** @internal */\n addSubscribedMediaTrack(mediaTrack, sid, mediaStream, receiver, adaptiveStreamSettings, triesLeft) {\n // find the track publication\n // it's possible for the media track to arrive before participant info\n let publication = this.getTrackPublicationBySid(sid);\n // it's also possible that the browser didn't honor our original track id\n // FireFox would use its own local uuid instead of server track id\n if (!publication) {\n if (!sid.startsWith('TR')) {\n // find the first track that matches type\n this.trackPublications.forEach(p => {\n if (!publication && mediaTrack.kind === p.kind.toString()) {\n publication = p;\n }\n });\n }\n }\n // when we couldn't locate the track, it's possible that the metadata hasn't\n // yet arrived. Wait a bit longer for it to arrive, or fire an error\n if (!publication) {\n if (triesLeft === 0) {\n this.log.error('could not find published track', Object.assign(Object.assign({}, this.logContext), {\n trackSid: sid\n }));\n this.emit(ParticipantEvent.TrackSubscriptionFailed, sid);\n return;\n }\n if (triesLeft === undefined) triesLeft = 20;\n setTimeout(() => {\n this.addSubscribedMediaTrack(mediaTrack, sid, mediaStream, receiver, adaptiveStreamSettings, triesLeft - 1);\n }, 150);\n return;\n }\n if (mediaTrack.readyState === 'ended') {\n this.log.error('unable to subscribe because MediaStreamTrack is ended. Do not call MediaStreamTrack.stop()', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(publication)));\n this.emit(ParticipantEvent.TrackSubscriptionFailed, sid);\n return;\n }\n const isVideo = mediaTrack.kind === 'video';\n let track;\n if (isVideo) {\n track = new RemoteVideoTrack(mediaTrack, sid, receiver, adaptiveStreamSettings);\n } else {\n track = new RemoteAudioTrack(mediaTrack, sid, receiver, this.audioContext, this.audioOutput);\n }\n // set track info\n track.source = publication.source;\n // keep publication's muted status\n track.isMuted = publication.isMuted;\n track.setMediaStream(mediaStream);\n track.start();\n publication.setTrack(track);\n // set participant volumes on new audio tracks\n if (this.volumeMap.has(publication.source) && isRemoteTrack(track) && isAudioTrack(track)) {\n track.setVolume(this.volumeMap.get(publication.source));\n }\n return publication;\n }\n /** @internal */\n get hasMetadata() {\n return !!this.participantInfo;\n }\n /**\n * @internal\n */\n getTrackPublicationBySid(sid) {\n return this.trackPublications.get(sid);\n }\n /** @internal */\n updateInfo(info) {\n if (!super.updateInfo(info)) {\n return false;\n }\n // we are getting a list of all available tracks, reconcile in here\n // and send out events for changes\n // reconcile track publications, publish events only if metadata is already there\n // i.e. changes since the local participant has joined\n const validTracks = new Map();\n const newTracks = new Map();\n info.tracks.forEach(ti => {\n var _a, _b;\n let publication = this.getTrackPublicationBySid(ti.sid);\n if (!publication) {\n // new publication\n const kind = Track.kindFromProto(ti.type);\n if (!kind) {\n return;\n }\n publication = new RemoteTrackPublication(kind, ti, (_a = this.signalClient.connectOptions) === null || _a === void 0 ? void 0 : _a.autoSubscribe, {\n loggerContextCb: () => this.logContext,\n loggerName: (_b = this.loggerOptions) === null || _b === void 0 ? void 0 : _b.loggerName\n });\n publication.updateInfo(ti);\n newTracks.set(ti.sid, publication);\n const existingTrackOfSource = Array.from(this.trackPublications.values()).find(publishedTrack => publishedTrack.source === (publication === null || publication === void 0 ? void 0 : publication.source));\n if (existingTrackOfSource && publication.source !== Track.Source.Unknown) {\n this.log.debug(\"received a second track publication for \".concat(this.identity, \" with the same source: \").concat(publication.source), Object.assign(Object.assign({}, this.logContext), {\n oldTrack: getLogContextFromTrack(existingTrackOfSource),\n newTrack: getLogContextFromTrack(publication)\n }));\n }\n this.addTrackPublication(publication);\n } else {\n publication.updateInfo(ti);\n }\n validTracks.set(ti.sid, publication);\n });\n // detect removed tracks\n this.trackPublications.forEach(publication => {\n if (!validTracks.has(publication.trackSid)) {\n this.log.trace('detected removed track on remote participant, unpublishing', Object.assign(Object.assign({}, this.logContext), getLogContextFromTrack(publication)));\n this.unpublishTrack(publication.trackSid, true);\n }\n });\n // always emit events for new publications, Room will not forward them unless it's ready\n newTracks.forEach(publication => {\n this.emit(ParticipantEvent.TrackPublished, publication);\n });\n return true;\n }\n /** @internal */\n unpublishTrack(sid, sendUnpublish) {\n const publication = this.trackPublications.get(sid);\n if (!publication) {\n return;\n }\n // also send unsubscribe, if track is actively subscribed\n const {\n track\n } = publication;\n if (track) {\n track.stop();\n publication.setTrack(undefined);\n }\n // remove track from maps only after unsubscribed has been fired\n this.trackPublications.delete(sid);\n // remove from the right type map\n switch (publication.kind) {\n case Track.Kind.Audio:\n this.audioTrackPublications.delete(sid);\n break;\n case Track.Kind.Video:\n this.videoTrackPublications.delete(sid);\n break;\n }\n if (sendUnpublish) {\n this.emit(ParticipantEvent.TrackUnpublished, publication);\n }\n }\n /**\n * @internal\n */\n setAudioOutput(output) {\n return __awaiter(this, void 0, void 0, function* () {\n this.audioOutput = output;\n const promises = [];\n this.audioTrackPublications.forEach(pub => {\n var _a;\n if (isAudioTrack(pub.track) && isRemoteTrack(pub.track)) {\n promises.push(pub.track.setSinkId((_a = output.deviceId) !== null && _a !== void 0 ? _a : 'default'));\n }\n });\n yield Promise.all(promises);\n });\n }\n /** @internal */\n emit(event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n this.log.trace('participant event', Object.assign(Object.assign({}, this.logContext), {\n event,\n args\n }));\n return super.emit(event, ...args);\n }\n}\n\nvar ConnectionState;\n(function (ConnectionState) {\n ConnectionState[\"Disconnected\"] = \"disconnected\";\n ConnectionState[\"Connecting\"] = \"connecting\";\n ConnectionState[\"Connected\"] = \"connected\";\n ConnectionState[\"Reconnecting\"] = \"reconnecting\";\n ConnectionState[\"SignalReconnecting\"] = \"signalReconnecting\";\n})(ConnectionState || (ConnectionState = {}));\nconst connectionReconcileFrequency = 4 * 1000;\n/**\n * In LiveKit, a room is the logical grouping for a list of participants.\n * Participants in a room can publish tracks, and subscribe to others' tracks.\n *\n * a Room fires [[RoomEvent | RoomEvents]].\n *\n * @noInheritDoc\n */\nclass Room extends eventsExports.EventEmitter {\n /**\n * Creates a new Room, the primary construct for a LiveKit session.\n * @param options\n */\n constructor(options) {\n var _this;\n var _a, _b, _c;\n super();\n _this = this;\n this.state = ConnectionState.Disconnected;\n /**\n * list of participants that are actively speaking. when this changes\n * a [[RoomEvent.ActiveSpeakersChanged]] event is fired\n */\n this.activeSpeakers = [];\n /** reflects the sender encryption status of the local participant */\n this.isE2EEEnabled = false;\n this.audioEnabled = true;\n this.isVideoPlaybackBlocked = false;\n this.log = livekitLogger;\n this.bufferedEvents = [];\n this.isResuming = false;\n this.byteStreamControllers = new Map();\n this.textStreamControllers = new Map();\n this.byteStreamHandlers = new Map();\n this.textStreamHandlers = new Map();\n this.rpcHandlers = new Map();\n this.connect = (url, token, opts) => __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (!isBrowserSupported()) {\n if (isReactNative()) {\n throw Error(\"WebRTC isn't detected, have you called registerGlobals?\");\n } else {\n throw Error(\"LiveKit doesn't seem to be supported on this browser. Try to update your browser and make sure no browser extensions are disabling webRTC.\");\n }\n }\n // In case a disconnect called happened right before the connect call, make sure the disconnect is completed first by awaiting its lock\n const unlockDisconnect = yield this.disconnectLock.lock();\n if (this.state === ConnectionState.Connected) {\n // when the state is reconnecting or connected, this function returns immediately\n this.log.info(\"already connected to room \".concat(this.name), this.logContext);\n unlockDisconnect();\n return Promise.resolve();\n }\n if (this.connectFuture) {\n unlockDisconnect();\n return this.connectFuture.promise;\n }\n this.setAndEmitConnectionState(ConnectionState.Connecting);\n if (((_a = this.regionUrlProvider) === null || _a === void 0 ? void 0 : _a.getServerUrl().toString()) !== url) {\n this.regionUrl = undefined;\n this.regionUrlProvider = undefined;\n }\n if (isCloud(new URL(url))) {\n if (this.regionUrlProvider === undefined) {\n this.regionUrlProvider = new RegionUrlProvider(url, token);\n } else {\n this.regionUrlProvider.updateToken(token);\n }\n // trigger the first fetch without waiting for a response\n // if initial connection fails, this will speed up picking regional url\n // on subsequent runs\n this.regionUrlProvider.fetchRegionSettings().then(settings => {\n var _a;\n (_a = this.regionUrlProvider) === null || _a === void 0 ? void 0 : _a.setServerReportedRegions(settings);\n }).catch(e => {\n this.log.warn('could not fetch region settings', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n });\n }\n const connectFn = (resolve, reject, regionUrl) => __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n if (this.abortController) {\n this.abortController.abort();\n }\n // explicit creation as local var needed to satisfy TS compiler when passing it to `attemptConnection` further down\n const abortController = new AbortController();\n this.abortController = abortController;\n // at this point the intention to connect has been signalled so we can allow cancelling of the connection via disconnect() again\n unlockDisconnect === null || unlockDisconnect === void 0 ? void 0 : unlockDisconnect();\n try {\n yield this.attemptConnection(regionUrl !== null && regionUrl !== void 0 ? regionUrl : url, token, opts, abortController);\n this.abortController = undefined;\n resolve();\n } catch (e) {\n if (this.regionUrlProvider && e instanceof ConnectionError && e.reason !== ConnectionErrorReason.Cancelled && e.reason !== ConnectionErrorReason.NotAllowed) {\n let nextUrl = null;\n try {\n nextUrl = yield this.regionUrlProvider.getNextBestRegionUrl((_a = this.abortController) === null || _a === void 0 ? void 0 : _a.signal);\n } catch (error) {\n if (error instanceof ConnectionError && (error.status === 401 || error.reason === ConnectionErrorReason.Cancelled)) {\n this.handleDisconnect(this.options.stopLocalTrackOnUnpublish);\n reject(error);\n return;\n }\n }\n if (nextUrl && !((_b = this.abortController) === null || _b === void 0 ? void 0 : _b.signal.aborted)) {\n this.log.info(\"Initial connection failed with ConnectionError: \".concat(e.message, \". Retrying with another region: \").concat(nextUrl), this.logContext);\n this.recreateEngine();\n yield connectFn(resolve, reject, nextUrl);\n } else {\n this.handleDisconnect(this.options.stopLocalTrackOnUnpublish, getDisconnectReasonFromConnectionError(e));\n reject(e);\n }\n } else {\n let disconnectReason = DisconnectReason.UNKNOWN_REASON;\n if (e instanceof ConnectionError) {\n disconnectReason = getDisconnectReasonFromConnectionError(e);\n }\n this.handleDisconnect(this.options.stopLocalTrackOnUnpublish, disconnectReason);\n reject(e);\n }\n }\n });\n const regionUrl = this.regionUrl;\n this.regionUrl = undefined;\n this.connectFuture = new Future((resolve, reject) => {\n connectFn(resolve, reject, regionUrl);\n }, () => {\n this.clearConnectionFutures();\n });\n return this.connectFuture.promise;\n });\n this.connectSignal = (url, token, engine, connectOptions, roomOptions, abortController) => __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c;\n const joinResponse = yield engine.join(url, token, {\n autoSubscribe: connectOptions.autoSubscribe,\n adaptiveStream: typeof roomOptions.adaptiveStream === 'object' ? true : roomOptions.adaptiveStream,\n maxRetries: connectOptions.maxRetries,\n e2eeEnabled: !!this.e2eeManager,\n websocketTimeout: connectOptions.websocketTimeout\n }, abortController.signal);\n let serverInfo = joinResponse.serverInfo;\n if (!serverInfo) {\n serverInfo = {\n version: joinResponse.serverVersion,\n region: joinResponse.serverRegion\n };\n }\n this.serverInfo = serverInfo;\n this.log.debug(\"connected to Livekit Server \".concat(Object.entries(serverInfo).map(_ref => {\n let [key, value] = _ref;\n return \"\".concat(key, \": \").concat(value);\n }).join(', ')), {\n room: (_a = joinResponse.room) === null || _a === void 0 ? void 0 : _a.name,\n roomSid: (_b = joinResponse.room) === null || _b === void 0 ? void 0 : _b.sid,\n identity: (_c = joinResponse.participant) === null || _c === void 0 ? void 0 : _c.identity\n });\n if (!serverInfo.version) {\n throw new UnsupportedServer('unknown server version');\n }\n if (serverInfo.version === '0.15.1' && this.options.dynacast) {\n this.log.debug('disabling dynacast due to server version', this.logContext);\n // dynacast has a bug in 0.15.1, so we cannot use it then\n roomOptions.dynacast = false;\n }\n return joinResponse;\n });\n this.applyJoinResponse = joinResponse => {\n const pi = joinResponse.participant;\n this.localParticipant.sid = pi.sid;\n this.localParticipant.identity = pi.identity;\n this.localParticipant.setEnabledPublishCodecs(joinResponse.enabledPublishCodecs);\n if (this.options.e2ee && this.e2eeManager) {\n try {\n this.e2eeManager.setSifTrailer(joinResponse.sifTrailer);\n } catch (e) {\n this.log.error(e instanceof Error ? e.message : 'Could not set SifTrailer', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n }\n }\n // populate remote participants, these should not trigger new events\n this.handleParticipantUpdates([pi, ...joinResponse.otherParticipants]);\n if (joinResponse.room) {\n this.handleRoomUpdate(joinResponse.room);\n }\n };\n this.attemptConnection = (url, token, opts, abortController) => __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n if (this.state === ConnectionState.Reconnecting || this.isResuming || ((_a = this.engine) === null || _a === void 0 ? void 0 : _a.pendingReconnect)) {\n this.log.info('Reconnection attempt replaced by new connection attempt', this.logContext);\n // make sure we close and recreate the existing engine in order to get rid of any potentially ongoing reconnection attempts\n this.recreateEngine();\n } else {\n // create engine if previously disconnected\n this.maybeCreateEngine();\n }\n if ((_b = this.regionUrlProvider) === null || _b === void 0 ? void 0 : _b.isCloud()) {\n this.engine.setRegionUrlProvider(this.regionUrlProvider);\n }\n this.acquireAudioContext();\n this.connOptions = Object.assign(Object.assign({}, roomConnectOptionDefaults), opts);\n if (this.connOptions.rtcConfig) {\n this.engine.rtcConfig = this.connOptions.rtcConfig;\n }\n if (this.connOptions.peerConnectionTimeout) {\n this.engine.peerConnectionTimeout = this.connOptions.peerConnectionTimeout;\n }\n try {\n const joinResponse = yield this.connectSignal(url, token, this.engine, this.connOptions, this.options, abortController);\n this.applyJoinResponse(joinResponse);\n // forward metadata changed for the local participant\n this.setupLocalParticipantEvents();\n this.emit(RoomEvent.SignalConnected);\n } catch (err) {\n yield this.engine.close();\n this.recreateEngine();\n const resultingError = new ConnectionError(\"could not establish signal connection\", ConnectionErrorReason.ServerUnreachable);\n if (err instanceof Error) {\n resultingError.message = \"\".concat(resultingError.message, \": \").concat(err.message);\n }\n if (err instanceof ConnectionError) {\n resultingError.reason = err.reason;\n resultingError.status = err.status;\n }\n this.log.debug(\"error trying to establish signal connection\", Object.assign(Object.assign({}, this.logContext), {\n error: err\n }));\n throw resultingError;\n }\n if (abortController.signal.aborted) {\n yield this.engine.close();\n this.recreateEngine();\n throw new ConnectionError(\"Connection attempt aborted\", ConnectionErrorReason.Cancelled);\n }\n try {\n yield this.engine.waitForPCInitialConnection(this.connOptions.peerConnectionTimeout, abortController);\n } catch (e) {\n yield this.engine.close();\n this.recreateEngine();\n throw e;\n }\n // also hook unload event\n if (isWeb() && this.options.disconnectOnPageLeave) {\n // capturing both 'pagehide' and 'beforeunload' to capture broadest set of browser behaviors\n window.addEventListener('pagehide', this.onPageLeave);\n window.addEventListener('beforeunload', this.onPageLeave);\n }\n if (isWeb()) {\n document.addEventListener('freeze', this.onPageLeave);\n }\n this.setAndEmitConnectionState(ConnectionState.Connected);\n this.emit(RoomEvent.Connected);\n this.registerConnectionReconcile();\n });\n /**\n * disconnects the room, emits [[RoomEvent.Disconnected]]\n */\n this.disconnect = function () {\n for (var _len = arguments.length, args_1 = new Array(_len), _key = 0; _key < _len; _key++) {\n args_1[_key] = arguments[_key];\n }\n return __awaiter(_this, [...args_1], void 0, function () {\n var _this2 = this;\n let stopTracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n return function* () {\n var _a, _b, _c, _d;\n const unlock = yield _this2.disconnectLock.lock();\n try {\n if (_this2.state === ConnectionState.Disconnected) {\n _this2.log.debug('already disconnected', _this2.logContext);\n return;\n }\n _this2.log.info('disconnect from room', Object.assign({}, _this2.logContext));\n if (_this2.state === ConnectionState.Connecting || _this2.state === ConnectionState.Reconnecting || _this2.isResuming) {\n // try aborting pending connection attempt\n _this2.log.warn('abort connection attempt', _this2.logContext);\n (_a = _this2.abortController) === null || _a === void 0 ? void 0 : _a.abort();\n // in case the abort controller didn't manage to cancel the connection attempt, reject the connect promise explicitly\n (_c = (_b = _this2.connectFuture) === null || _b === void 0 ? void 0 : _b.reject) === null || _c === void 0 ? void 0 : _c.call(_b, new ConnectionError('Client initiated disconnect', ConnectionErrorReason.Cancelled));\n _this2.connectFuture = undefined;\n }\n // send leave\n if (!((_d = _this2.engine) === null || _d === void 0 ? void 0 : _d.client.isDisconnected)) {\n yield _this2.engine.client.sendLeave();\n }\n // close engine (also closes client)\n if (_this2.engine) {\n yield _this2.engine.close();\n }\n _this2.handleDisconnect(stopTracks, DisconnectReason.CLIENT_INITIATED);\n /* @ts-ignore */\n _this2.engine = undefined;\n } finally {\n unlock();\n }\n }();\n });\n };\n this.onPageLeave = () => __awaiter(this, void 0, void 0, function* () {\n this.log.info('Page leave detected, disconnecting', this.logContext);\n yield this.disconnect();\n });\n /**\n * Browsers have different policies regarding audio playback. Most requiring\n * some form of user interaction (click/tap/etc).\n * In those cases, audio will be silent until a click/tap triggering one of the following\n * - `startAudio`\n * - `getUserMedia`\n */\n this.startAudio = () => __awaiter(this, void 0, void 0, function* () {\n const elements = [];\n const browser = getBrowser();\n if (browser && browser.os === 'iOS') {\n /**\n * iOS blocks audio element playback if\n * - user is not publishing audio themselves and\n * - no other audio source is playing\n *\n * as a workaround, we create an audio element with an empty track, so that\n * silent audio is always playing\n */\n const audioId = 'livekit-dummy-audio-el';\n let dummyAudioEl = document.getElementById(audioId);\n if (!dummyAudioEl) {\n dummyAudioEl = document.createElement('audio');\n dummyAudioEl.id = audioId;\n dummyAudioEl.autoplay = true;\n dummyAudioEl.hidden = true;\n const track = getEmptyAudioStreamTrack();\n track.enabled = true;\n const stream = new MediaStream([track]);\n dummyAudioEl.srcObject = stream;\n document.addEventListener('visibilitychange', () => {\n if (!dummyAudioEl) {\n return;\n }\n // set the srcObject to null on page hide in order to prevent lock screen controls to show up for it\n dummyAudioEl.srcObject = document.hidden ? null : stream;\n if (!document.hidden) {\n this.log.debug('page visible again, triggering startAudio to resume playback and update playback status', this.logContext);\n this.startAudio();\n }\n });\n document.body.append(dummyAudioEl);\n this.once(RoomEvent.Disconnected, () => {\n dummyAudioEl === null || dummyAudioEl === void 0 ? void 0 : dummyAudioEl.remove();\n dummyAudioEl = null;\n });\n }\n elements.push(dummyAudioEl);\n }\n this.remoteParticipants.forEach(p => {\n p.audioTrackPublications.forEach(t => {\n if (t.track) {\n t.track.attachedElements.forEach(e => {\n elements.push(e);\n });\n }\n });\n });\n try {\n yield Promise.all([this.acquireAudioContext(), ...elements.map(e => {\n e.muted = false;\n return e.play();\n })]);\n this.handleAudioPlaybackStarted();\n } catch (err) {\n this.handleAudioPlaybackFailed(err);\n throw err;\n }\n });\n this.startVideo = () => __awaiter(this, void 0, void 0, function* () {\n const elements = [];\n for (const p of this.remoteParticipants.values()) {\n p.videoTrackPublications.forEach(tr => {\n var _a;\n (_a = tr.track) === null || _a === void 0 ? void 0 : _a.attachedElements.forEach(el => {\n if (!elements.includes(el)) {\n elements.push(el);\n }\n });\n });\n }\n yield Promise.all(elements.map(el => el.play())).then(() => {\n this.handleVideoPlaybackStarted();\n }).catch(e => {\n if (e.name === 'NotAllowedError') {\n this.handleVideoPlaybackFailed();\n } else {\n this.log.warn('Resuming video playback failed, make sure you call `startVideo` directly in a user gesture handler', this.logContext);\n }\n });\n });\n this.handleRestarting = () => {\n this.clearConnectionReconcile();\n // in case we went from resuming to full-reconnect, make sure to reflect it on the isResuming flag\n this.isResuming = false;\n // also unwind existing participants & existing subscriptions\n for (const p of this.remoteParticipants.values()) {\n this.handleParticipantDisconnected(p.identity, p);\n }\n if (this.setAndEmitConnectionState(ConnectionState.Reconnecting)) {\n this.emit(RoomEvent.Reconnecting);\n }\n };\n this.handleSignalRestarted = joinResponse => __awaiter(this, void 0, void 0, function* () {\n this.log.debug(\"signal reconnected to server, region \".concat(joinResponse.serverRegion), Object.assign(Object.assign({}, this.logContext), {\n region: joinResponse.serverRegion\n }));\n this.bufferedEvents = [];\n this.applyJoinResponse(joinResponse);\n try {\n // unpublish & republish tracks\n yield this.localParticipant.republishAllTracks(undefined, true);\n } catch (error) {\n this.log.error('error trying to re-publish tracks after reconnection', Object.assign(Object.assign({}, this.logContext), {\n error\n }));\n }\n try {\n yield this.engine.waitForRestarted();\n this.log.debug(\"fully reconnected to server\", Object.assign(Object.assign({}, this.logContext), {\n region: joinResponse.serverRegion\n }));\n } catch (_a) {\n // reconnection failed, handleDisconnect is being invoked already, just return here\n return;\n }\n this.setAndEmitConnectionState(ConnectionState.Connected);\n this.emit(RoomEvent.Reconnected);\n this.registerConnectionReconcile();\n this.emitBufferedEvents();\n });\n this.handleParticipantUpdates = participantInfos => {\n // handle changes to participant state, and send events\n participantInfos.forEach(info => {\n var _a;\n if (info.identity === this.localParticipant.identity) {\n this.localParticipant.updateInfo(info);\n return;\n }\n // LiveKit server doesn't send identity info prior to version 1.5.2 in disconnect updates\n // so we try to map an empty identity to an already known sID manually\n if (info.identity === '') {\n info.identity = (_a = this.sidToIdentity.get(info.sid)) !== null && _a !== void 0 ? _a : '';\n }\n let remoteParticipant = this.remoteParticipants.get(info.identity);\n // when it's disconnected, send updates\n if (info.state === ParticipantInfo_State.DISCONNECTED) {\n this.handleParticipantDisconnected(info.identity, remoteParticipant);\n } else {\n // create participant if doesn't exist\n remoteParticipant = this.getOrCreateParticipant(info.identity, info);\n }\n });\n };\n // updates are sent only when there's a change to speaker ordering\n this.handleActiveSpeakersUpdate = speakers => {\n const activeSpeakers = [];\n const seenSids = {};\n speakers.forEach(speaker => {\n seenSids[speaker.sid] = true;\n if (speaker.sid === this.localParticipant.sid) {\n this.localParticipant.audioLevel = speaker.level;\n this.localParticipant.setIsSpeaking(true);\n activeSpeakers.push(this.localParticipant);\n } else {\n const p = this.getRemoteParticipantBySid(speaker.sid);\n if (p) {\n p.audioLevel = speaker.level;\n p.setIsSpeaking(true);\n activeSpeakers.push(p);\n }\n }\n });\n if (!seenSids[this.localParticipant.sid]) {\n this.localParticipant.audioLevel = 0;\n this.localParticipant.setIsSpeaking(false);\n }\n this.remoteParticipants.forEach(p => {\n if (!seenSids[p.sid]) {\n p.audioLevel = 0;\n p.setIsSpeaking(false);\n }\n });\n this.activeSpeakers = activeSpeakers;\n this.emitWhenConnected(RoomEvent.ActiveSpeakersChanged, activeSpeakers);\n };\n // process list of changed speakers\n this.handleSpeakersChanged = speakerUpdates => {\n const lastSpeakers = new Map();\n this.activeSpeakers.forEach(p => {\n const remoteParticipant = this.remoteParticipants.get(p.identity);\n if (remoteParticipant && remoteParticipant.sid !== p.sid) {\n return;\n }\n lastSpeakers.set(p.sid, p);\n });\n speakerUpdates.forEach(speaker => {\n let p = this.getRemoteParticipantBySid(speaker.sid);\n if (speaker.sid === this.localParticipant.sid) {\n p = this.localParticipant;\n }\n if (!p) {\n return;\n }\n p.audioLevel = speaker.level;\n p.setIsSpeaking(speaker.active);\n if (speaker.active) {\n lastSpeakers.set(speaker.sid, p);\n } else {\n lastSpeakers.delete(speaker.sid);\n }\n });\n const activeSpeakers = Array.from(lastSpeakers.values());\n activeSpeakers.sort((a, b) => b.audioLevel - a.audioLevel);\n this.activeSpeakers = activeSpeakers;\n this.emitWhenConnected(RoomEvent.ActiveSpeakersChanged, activeSpeakers);\n };\n this.handleStreamStateUpdate = streamStateUpdate => {\n streamStateUpdate.streamStates.forEach(streamState => {\n const participant = this.getRemoteParticipantBySid(streamState.participantSid);\n if (!participant) {\n return;\n }\n const pub = participant.getTrackPublicationBySid(streamState.trackSid);\n if (!pub || !pub.track) {\n return;\n }\n const newStreamState = Track.streamStateFromProto(streamState.state);\n if (newStreamState !== pub.track.streamState) {\n pub.track.streamState = newStreamState;\n participant.emit(ParticipantEvent.TrackStreamStateChanged, pub, pub.track.streamState);\n this.emitWhenConnected(RoomEvent.TrackStreamStateChanged, pub, pub.track.streamState, participant);\n }\n });\n };\n this.handleSubscriptionPermissionUpdate = update => {\n const participant = this.getRemoteParticipantBySid(update.participantSid);\n if (!participant) {\n return;\n }\n const pub = participant.getTrackPublicationBySid(update.trackSid);\n if (!pub) {\n return;\n }\n pub.setAllowed(update.allowed);\n };\n this.handleSubscriptionError = update => {\n const participant = Array.from(this.remoteParticipants.values()).find(p => p.trackPublications.has(update.trackSid));\n if (!participant) {\n return;\n }\n const pub = participant.getTrackPublicationBySid(update.trackSid);\n if (!pub) {\n return;\n }\n pub.setSubscriptionError(update.err);\n };\n this.handleDataPacket = packet => {\n // find the participant\n const participant = this.remoteParticipants.get(packet.participantIdentity);\n if (packet.value.case === 'user') {\n this.handleUserPacket(participant, packet.value.value, packet.kind);\n } else if (packet.value.case === 'transcription') {\n this.handleTranscription(participant, packet.value.value);\n } else if (packet.value.case === 'sipDtmf') {\n this.handleSipDtmf(participant, packet.value.value);\n } else if (packet.value.case === 'chatMessage') {\n this.handleChatMessage(participant, packet.value.value);\n } else if (packet.value.case === 'metrics') {\n this.handleMetrics(packet.value.value, participant);\n } else if (packet.value.case === 'streamHeader') {\n this.handleStreamHeader(packet.value.value, packet.participantIdentity);\n } else if (packet.value.case === 'streamChunk') {\n this.handleStreamChunk(packet.value.value);\n } else if (packet.value.case === 'streamTrailer') {\n this.handleStreamTrailer(packet.value.value);\n } else if (packet.value.case === 'rpcRequest') {\n const rpc = packet.value.value;\n this.handleIncomingRpcRequest(packet.participantIdentity, rpc.id, rpc.method, rpc.payload, rpc.responseTimeoutMs, rpc.version);\n }\n };\n this.handleUserPacket = (participant, userPacket, kind) => {\n this.emit(RoomEvent.DataReceived, userPacket.payload, participant, kind, userPacket.topic);\n // also emit on the participant\n participant === null || participant === void 0 ? void 0 : participant.emit(ParticipantEvent.DataReceived, userPacket.payload, kind);\n };\n this.handleSipDtmf = (participant, dtmf) => {\n this.emit(RoomEvent.SipDTMFReceived, dtmf, participant);\n // also emit on the participant\n participant === null || participant === void 0 ? void 0 : participant.emit(ParticipantEvent.SipDTMFReceived, dtmf);\n };\n this.bufferedSegments = new Map();\n this.handleTranscription = (_remoteParticipant, transcription) => {\n // find the participant\n const participant = transcription.transcribedParticipantIdentity === this.localParticipant.identity ? this.localParticipant : this.getParticipantByIdentity(transcription.transcribedParticipantIdentity);\n const publication = participant === null || participant === void 0 ? void 0 : participant.trackPublications.get(transcription.trackId);\n const segments = extractTranscriptionSegments(transcription, this.transcriptionReceivedTimes);\n publication === null || publication === void 0 ? void 0 : publication.emit(TrackEvent.TranscriptionReceived, segments);\n participant === null || participant === void 0 ? void 0 : participant.emit(ParticipantEvent.TranscriptionReceived, segments, publication);\n this.emit(RoomEvent.TranscriptionReceived, segments, participant, publication);\n };\n this.handleChatMessage = (participant, chatMessage) => {\n const msg = extractChatMessage(chatMessage);\n this.emit(RoomEvent.ChatMessage, msg, participant);\n };\n this.handleMetrics = (metrics, participant) => {\n this.emit(RoomEvent.MetricsReceived, metrics, participant);\n };\n this.handleAudioPlaybackStarted = () => {\n if (this.canPlaybackAudio) {\n return;\n }\n this.audioEnabled = true;\n this.emit(RoomEvent.AudioPlaybackStatusChanged, true);\n };\n this.handleAudioPlaybackFailed = e => {\n this.log.warn('could not playback audio', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n if (!this.canPlaybackAudio) {\n return;\n }\n this.audioEnabled = false;\n this.emit(RoomEvent.AudioPlaybackStatusChanged, false);\n };\n this.handleVideoPlaybackStarted = () => {\n if (this.isVideoPlaybackBlocked) {\n this.isVideoPlaybackBlocked = false;\n this.emit(RoomEvent.VideoPlaybackStatusChanged, true);\n }\n };\n this.handleVideoPlaybackFailed = () => {\n if (!this.isVideoPlaybackBlocked) {\n this.isVideoPlaybackBlocked = true;\n this.emit(RoomEvent.VideoPlaybackStatusChanged, false);\n }\n };\n this.handleDeviceChange = () => __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (((_a = getBrowser()) === null || _a === void 0 ? void 0 : _a.os) !== 'iOS') {\n // default devices are non deterministic on iOS, so we don't attempt to select them here\n yield this.selectDefaultDevices();\n }\n this.emit(RoomEvent.MediaDevicesChanged);\n });\n this.handleRoomUpdate = room => {\n const oldRoom = this.roomInfo;\n this.roomInfo = room;\n if (oldRoom && oldRoom.metadata !== room.metadata) {\n this.emitWhenConnected(RoomEvent.RoomMetadataChanged, room.metadata);\n }\n if ((oldRoom === null || oldRoom === void 0 ? void 0 : oldRoom.activeRecording) !== room.activeRecording) {\n this.emitWhenConnected(RoomEvent.RecordingStatusChanged, room.activeRecording);\n }\n };\n this.handleConnectionQualityUpdate = update => {\n update.updates.forEach(info => {\n if (info.participantSid === this.localParticipant.sid) {\n this.localParticipant.setConnectionQuality(info.quality);\n return;\n }\n const participant = this.getRemoteParticipantBySid(info.participantSid);\n if (participant) {\n participant.setConnectionQuality(info.quality);\n }\n });\n };\n this.onLocalParticipantMetadataChanged = metadata => {\n this.emit(RoomEvent.ParticipantMetadataChanged, metadata, this.localParticipant);\n };\n this.onLocalParticipantNameChanged = name => {\n this.emit(RoomEvent.ParticipantNameChanged, name, this.localParticipant);\n };\n this.onLocalAttributesChanged = changedAttributes => {\n this.emit(RoomEvent.ParticipantAttributesChanged, changedAttributes, this.localParticipant);\n };\n this.onLocalTrackMuted = pub => {\n this.emit(RoomEvent.TrackMuted, pub, this.localParticipant);\n };\n this.onLocalTrackUnmuted = pub => {\n this.emit(RoomEvent.TrackUnmuted, pub, this.localParticipant);\n };\n this.onTrackProcessorUpdate = processor => {\n var _a;\n (_a = processor === null || processor === void 0 ? void 0 : processor.onPublish) === null || _a === void 0 ? void 0 : _a.call(processor, this);\n };\n this.onLocalTrackPublished = pub => __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c, _d, _e, _f;\n (_a = pub.track) === null || _a === void 0 ? void 0 : _a.on(TrackEvent.TrackProcessorUpdate, this.onTrackProcessorUpdate);\n (_b = pub.track) === null || _b === void 0 ? void 0 : _b.on(TrackEvent.Restarted, this.onLocalTrackRestarted);\n (_e = (_d = (_c = pub.track) === null || _c === void 0 ? void 0 : _c.getProcessor()) === null || _d === void 0 ? void 0 : _d.onPublish) === null || _e === void 0 ? void 0 : _e.call(_d, this);\n this.emit(RoomEvent.LocalTrackPublished, pub, this.localParticipant);\n if (isLocalAudioTrack(pub.track)) {\n const trackIsSilent = yield pub.track.checkForSilence();\n if (trackIsSilent) {\n this.emit(RoomEvent.LocalAudioSilenceDetected, pub);\n }\n }\n const deviceId = yield (_f = pub.track) === null || _f === void 0 ? void 0 : _f.getDeviceId(false);\n const deviceKind = sourceToKind(pub.source);\n if (deviceKind && deviceId && deviceId !== this.localParticipant.activeDeviceMap.get(deviceKind)) {\n this.localParticipant.activeDeviceMap.set(deviceKind, deviceId);\n this.emit(RoomEvent.ActiveDeviceChanged, deviceKind, deviceId);\n }\n });\n this.onLocalTrackUnpublished = pub => {\n var _a, _b;\n (_a = pub.track) === null || _a === void 0 ? void 0 : _a.off(TrackEvent.TrackProcessorUpdate, this.onTrackProcessorUpdate);\n (_b = pub.track) === null || _b === void 0 ? void 0 : _b.off(TrackEvent.Restarted, this.onLocalTrackRestarted);\n this.emit(RoomEvent.LocalTrackUnpublished, pub, this.localParticipant);\n };\n this.onLocalTrackRestarted = track => __awaiter(this, void 0, void 0, function* () {\n const deviceId = yield track.getDeviceId(false);\n const deviceKind = sourceToKind(track.source);\n if (deviceKind && deviceId && deviceId !== this.localParticipant.activeDeviceMap.get(deviceKind)) {\n this.log.debug(\"local track restarted, setting \".concat(deviceKind, \" \").concat(deviceId, \" active\"), this.logContext);\n this.localParticipant.activeDeviceMap.set(deviceKind, deviceId);\n this.emit(RoomEvent.ActiveDeviceChanged, deviceKind, deviceId);\n }\n });\n this.onLocalConnectionQualityChanged = quality => {\n this.emit(RoomEvent.ConnectionQualityChanged, quality, this.localParticipant);\n };\n this.onMediaDevicesError = (e, kind) => {\n this.emit(RoomEvent.MediaDevicesError, e, kind);\n };\n this.onLocalParticipantPermissionsChanged = prevPermissions => {\n this.emit(RoomEvent.ParticipantPermissionsChanged, prevPermissions, this.localParticipant);\n };\n this.onLocalChatMessageSent = msg => {\n this.emit(RoomEvent.ChatMessage, msg, this.localParticipant);\n };\n this.setMaxListeners(100);\n this.remoteParticipants = new Map();\n this.sidToIdentity = new Map();\n this.options = Object.assign(Object.assign({}, roomOptionDefaults), options);\n this.log = getLogger((_a = this.options.loggerName) !== null && _a !== void 0 ? _a : LoggerNames.Room);\n this.transcriptionReceivedTimes = new Map();\n this.options.audioCaptureDefaults = Object.assign(Object.assign({}, audioDefaults), options === null || options === void 0 ? void 0 : options.audioCaptureDefaults);\n this.options.videoCaptureDefaults = Object.assign(Object.assign({}, videoDefaults), options === null || options === void 0 ? void 0 : options.videoCaptureDefaults);\n this.options.publishDefaults = Object.assign(Object.assign({}, publishDefaults), options === null || options === void 0 ? void 0 : options.publishDefaults);\n this.maybeCreateEngine();\n this.disconnectLock = new _();\n this.localParticipant = new LocalParticipant('', '', this.engine, this.options, this.rpcHandlers);\n if (this.options.videoCaptureDefaults.deviceId) {\n this.localParticipant.activeDeviceMap.set('videoinput', unwrapConstraint(this.options.videoCaptureDefaults.deviceId));\n }\n if (this.options.audioCaptureDefaults.deviceId) {\n this.localParticipant.activeDeviceMap.set('audioinput', unwrapConstraint(this.options.audioCaptureDefaults.deviceId));\n }\n if ((_b = this.options.audioOutput) === null || _b === void 0 ? void 0 : _b.deviceId) {\n this.switchActiveDevice('audiooutput', unwrapConstraint(this.options.audioOutput.deviceId)).catch(e => this.log.warn(\"Could not set audio output: \".concat(e.message), this.logContext));\n }\n if (this.options.e2ee) {\n this.setupE2EE();\n }\n if (isWeb()) {\n const abortController = new AbortController();\n // in order to catch device changes prior to room connection we need to register the event in the constructor\n (_c = navigator.mediaDevices) === null || _c === void 0 ? void 0 : _c.addEventListener('devicechange', this.handleDeviceChange, {\n signal: abortController.signal\n });\n if (Room.cleanupRegistry) {\n Room.cleanupRegistry.register(this, () => {\n abortController.abort();\n });\n }\n }\n }\n registerTextStreamHandler(topic, callback) {\n if (this.textStreamHandlers.has(topic)) {\n throw new TypeError(\"A text stream handler for topic \\\"\".concat(topic, \"\\\" has already been set.\"));\n }\n this.textStreamHandlers.set(topic, callback);\n }\n unregisterTextStreamHandler(topic) {\n this.textStreamHandlers.delete(topic);\n }\n registerByteStreamHandler(topic, callback) {\n if (this.byteStreamHandlers.has(topic)) {\n throw new TypeError(\"A byte stream handler for topic \\\"\".concat(topic, \"\\\" has already been set.\"));\n }\n this.byteStreamHandlers.set(topic, callback);\n }\n unregisterByteStreamHandler(topic) {\n this.byteStreamHandlers.delete(topic);\n }\n /**\n * Establishes the participant as a receiver for calls of the specified RPC method.\n *\n * @param method - The name of the indicated RPC method\n * @param handler - Will be invoked when an RPC request for this method is received\n * @returns A promise that resolves when the method is successfully registered\n * @throws {Error} If a handler for this method is already registered (must call unregisterRpcMethod first)\n *\n * @example\n * ```typescript\n * room.localParticipant?.registerRpcMethod(\n * 'greet',\n * async (data: RpcInvocationData) => {\n * console.log(`Received greeting from ${data.callerIdentity}: ${data.payload}`);\n * return `Hello, ${data.callerIdentity}!`;\n * }\n * );\n * ```\n *\n * The handler should return a Promise that resolves to a string.\n * If unable to respond within `responseTimeout`, the request will result in an error on the caller's side.\n *\n * You may throw errors of type `RpcError` with a string `message` in the handler,\n * and they will be received on the caller's side with the message intact.\n * Other errors thrown in your handler will not be transmitted as-is, and will instead arrive to the caller as `1500` (\"Application Error\").\n */\n registerRpcMethod(method, handler) {\n if (this.rpcHandlers.has(method)) {\n throw Error(\"RPC handler already registered for method \".concat(method, \", unregisterRpcMethod before trying to register again\"));\n }\n this.rpcHandlers.set(method, handler);\n }\n /**\n * Unregisters a previously registered RPC method.\n *\n * @param method - The name of the RPC method to unregister\n */\n unregisterRpcMethod(method) {\n this.rpcHandlers.delete(method);\n }\n handleIncomingRpcRequest(callerIdentity, requestId, method, payload, responseTimeout, version) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.engine.publishRpcAck(callerIdentity, requestId);\n if (version !== 1) {\n yield this.engine.publishRpcResponse(callerIdentity, requestId, null, RpcError.builtIn('UNSUPPORTED_VERSION'));\n return;\n }\n const handler = this.rpcHandlers.get(method);\n if (!handler) {\n yield this.engine.publishRpcResponse(callerIdentity, requestId, null, RpcError.builtIn('UNSUPPORTED_METHOD'));\n return;\n }\n let responseError = null;\n let responsePayload = null;\n try {\n const response = yield handler({\n requestId,\n callerIdentity,\n payload,\n responseTimeout\n });\n if (byteLength(response) > MAX_PAYLOAD_BYTES) {\n responseError = RpcError.builtIn('RESPONSE_PAYLOAD_TOO_LARGE');\n console.warn(\"RPC Response payload too large for \".concat(method));\n } else {\n responsePayload = response;\n }\n } catch (error) {\n if (error instanceof RpcError) {\n responseError = error;\n } else {\n console.warn(\"Uncaught error returned by RPC handler for \".concat(method, \". Returning APPLICATION_ERROR instead.\"), error);\n responseError = RpcError.builtIn('APPLICATION_ERROR');\n }\n }\n yield this.engine.publishRpcResponse(callerIdentity, requestId, responsePayload, responseError);\n });\n }\n /**\n * @experimental\n */\n setE2EEEnabled(enabled) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.e2eeManager) {\n yield Promise.all([this.localParticipant.setE2EEEnabled(enabled)]);\n if (this.localParticipant.identity !== '') {\n this.e2eeManager.setParticipantCryptorEnabled(enabled, this.localParticipant.identity);\n }\n } else {\n throw Error('e2ee not configured, please set e2ee settings within the room options');\n }\n });\n }\n setupE2EE() {\n var _a;\n if (this.options.e2ee) {\n if ('e2eeManager' in this.options.e2ee) {\n this.e2eeManager = this.options.e2ee.e2eeManager;\n } else {\n this.e2eeManager = new E2EEManager(this.options.e2ee);\n }\n this.e2eeManager.on(EncryptionEvent.ParticipantEncryptionStatusChanged, (enabled, participant) => {\n if (isLocalParticipant(participant)) {\n this.isE2EEEnabled = enabled;\n }\n this.emit(RoomEvent.ParticipantEncryptionStatusChanged, enabled, participant);\n });\n this.e2eeManager.on(EncryptionEvent.EncryptionError, error => this.emit(RoomEvent.EncryptionError, error));\n (_a = this.e2eeManager) === null || _a === void 0 ? void 0 : _a.setup(this);\n }\n }\n get logContext() {\n var _a;\n return {\n room: this.name,\n roomID: (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.sid,\n participant: this.localParticipant.identity,\n pID: this.localParticipant.sid\n };\n }\n /**\n * if the current room has a participant with `recorder: true` in its JWT grant\n **/\n get isRecording() {\n var _a, _b;\n return (_b = (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.activeRecording) !== null && _b !== void 0 ? _b : false;\n }\n /**\n * server assigned unique room id.\n * returns once a sid has been issued by the server.\n */\n getSid() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.state === ConnectionState.Disconnected) {\n return '';\n }\n if (this.roomInfo && this.roomInfo.sid !== '') {\n return this.roomInfo.sid;\n }\n return new Promise((resolve, reject) => {\n const handleRoomUpdate = roomInfo => {\n if (roomInfo.sid !== '') {\n this.engine.off(EngineEvent.RoomUpdate, handleRoomUpdate);\n resolve(roomInfo.sid);\n }\n };\n this.engine.on(EngineEvent.RoomUpdate, handleRoomUpdate);\n this.once(RoomEvent.Disconnected, () => {\n this.engine.off(EngineEvent.RoomUpdate, handleRoomUpdate);\n reject('Room disconnected before room server id was available');\n });\n });\n });\n }\n /** user assigned name, derived from JWT token */\n get name() {\n var _a, _b;\n return (_b = (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.name) !== null && _b !== void 0 ? _b : '';\n }\n /** room metadata */\n get metadata() {\n var _a;\n return (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.metadata;\n }\n get numParticipants() {\n var _a, _b;\n return (_b = (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.numParticipants) !== null && _b !== void 0 ? _b : 0;\n }\n get numPublishers() {\n var _a, _b;\n return (_b = (_a = this.roomInfo) === null || _a === void 0 ? void 0 : _a.numPublishers) !== null && _b !== void 0 ? _b : 0;\n }\n maybeCreateEngine() {\n if (this.engine && !this.engine.isClosed) {\n return;\n }\n this.engine = new RTCEngine(this.options);\n this.engine.on(EngineEvent.ParticipantUpdate, this.handleParticipantUpdates).on(EngineEvent.RoomUpdate, this.handleRoomUpdate).on(EngineEvent.SpeakersChanged, this.handleSpeakersChanged).on(EngineEvent.StreamStateChanged, this.handleStreamStateUpdate).on(EngineEvent.ConnectionQualityUpdate, this.handleConnectionQualityUpdate).on(EngineEvent.SubscriptionError, this.handleSubscriptionError).on(EngineEvent.SubscriptionPermissionUpdate, this.handleSubscriptionPermissionUpdate).on(EngineEvent.MediaTrackAdded, (mediaTrack, stream, receiver) => {\n this.onTrackAdded(mediaTrack, stream, receiver);\n }).on(EngineEvent.Disconnected, reason => {\n this.handleDisconnect(this.options.stopLocalTrackOnUnpublish, reason);\n }).on(EngineEvent.ActiveSpeakersUpdate, this.handleActiveSpeakersUpdate).on(EngineEvent.DataPacketReceived, this.handleDataPacket).on(EngineEvent.Resuming, () => {\n this.clearConnectionReconcile();\n this.isResuming = true;\n this.log.info('Resuming signal connection', this.logContext);\n if (this.setAndEmitConnectionState(ConnectionState.SignalReconnecting)) {\n this.emit(RoomEvent.SignalReconnecting);\n }\n }).on(EngineEvent.Resumed, () => {\n this.registerConnectionReconcile();\n this.isResuming = false;\n this.log.info('Resumed signal connection', this.logContext);\n this.updateSubscriptions();\n this.emitBufferedEvents();\n if (this.setAndEmitConnectionState(ConnectionState.Connected)) {\n this.emit(RoomEvent.Reconnected);\n }\n }).on(EngineEvent.SignalResumed, () => {\n this.bufferedEvents = [];\n if (this.state === ConnectionState.Reconnecting || this.isResuming) {\n this.sendSyncState();\n }\n }).on(EngineEvent.Restarting, this.handleRestarting).on(EngineEvent.SignalRestarted, this.handleSignalRestarted).on(EngineEvent.Offline, () => {\n if (this.setAndEmitConnectionState(ConnectionState.Reconnecting)) {\n this.emit(RoomEvent.Reconnecting);\n }\n }).on(EngineEvent.DCBufferStatusChanged, (status, kind) => {\n this.emit(RoomEvent.DCBufferStatusChanged, status, kind);\n }).on(EngineEvent.LocalTrackSubscribed, subscribedSid => {\n const trackPublication = this.localParticipant.getTrackPublications().find(_ref2 => {\n let {\n trackSid\n } = _ref2;\n return trackSid === subscribedSid;\n });\n if (!trackPublication) {\n this.log.warn('could not find local track subscription for subscribed event', this.logContext);\n return;\n }\n this.localParticipant.emit(ParticipantEvent.LocalTrackSubscribed, trackPublication);\n this.emitWhenConnected(RoomEvent.LocalTrackSubscribed, trackPublication, this.localParticipant);\n }).on(EngineEvent.RoomMoved, roomMoved => {\n this.log.debug('room moved', roomMoved);\n if (roomMoved.room) {\n this.handleRoomUpdate(roomMoved.room);\n }\n this.remoteParticipants.forEach((participant, identity) => {\n this.handleParticipantDisconnected(identity, participant);\n });\n this.emit(RoomEvent.Moved, roomMoved.room.name);\n if (roomMoved.participant) {\n this.handleParticipantUpdates([roomMoved.participant, ...roomMoved.otherParticipants]);\n } else {\n this.handleParticipantUpdates(roomMoved.otherParticipants);\n }\n });\n if (this.localParticipant) {\n this.localParticipant.setupEngine(this.engine);\n }\n if (this.e2eeManager) {\n this.e2eeManager.setupEngine(this.engine);\n }\n }\n /**\n * getLocalDevices abstracts navigator.mediaDevices.enumerateDevices.\n * In particular, it requests device permissions by default if needed\n * and makes sure the returned device does not consist of dummy devices\n * @param kind\n * @returns a list of available local devices\n */\n static getLocalDevices(kind) {\n let requestPermissions = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return DeviceManager.getInstance().getDevices(kind, requestPermissions);\n }\n /**\n * prepareConnection should be called as soon as the page is loaded, in order\n * to speed up the connection attempt. This function will\n * - perform DNS resolution and pre-warm the DNS cache\n * - establish TLS connection and cache TLS keys\n *\n * With LiveKit Cloud, it will also determine the best edge data center for\n * the current client to connect to if a token is provided.\n */\n prepareConnection(url, token) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.state !== ConnectionState.Disconnected) {\n return;\n }\n this.log.debug(\"prepareConnection to \".concat(url), this.logContext);\n try {\n if (isCloud(new URL(url)) && token) {\n this.regionUrlProvider = new RegionUrlProvider(url, token);\n const regionUrl = yield this.regionUrlProvider.getNextBestRegionUrl();\n // we will not replace the regionUrl if an attempt had already started\n // to avoid overriding regionUrl after a new connection attempt had started\n if (regionUrl && this.state === ConnectionState.Disconnected) {\n this.regionUrl = regionUrl;\n yield fetch(toHttpUrl(regionUrl), {\n method: 'HEAD'\n });\n this.log.debug(\"prepared connection to \".concat(regionUrl), this.logContext);\n }\n } else {\n yield fetch(toHttpUrl(url), {\n method: 'HEAD'\n });\n }\n } catch (e) {\n this.log.warn('could not prepare connection', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n }\n });\n }\n /**\n * retrieves a participant by identity\n * @param identity\n * @returns\n */\n getParticipantByIdentity(identity) {\n if (this.localParticipant.identity === identity) {\n return this.localParticipant;\n }\n return this.remoteParticipants.get(identity);\n }\n clearConnectionFutures() {\n this.connectFuture = undefined;\n }\n /**\n * @internal for testing\n */\n simulateScenario(scenario, arg) {\n return __awaiter(this, void 0, void 0, function* () {\n let postAction = () => {};\n let req;\n switch (scenario) {\n case 'signal-reconnect':\n // @ts-expect-error function is private\n yield this.engine.client.handleOnClose('simulate disconnect');\n break;\n case 'speaker':\n req = new SimulateScenario({\n scenario: {\n case: 'speakerUpdate',\n value: 3\n }\n });\n break;\n case 'node-failure':\n req = new SimulateScenario({\n scenario: {\n case: 'nodeFailure',\n value: true\n }\n });\n break;\n case 'server-leave':\n req = new SimulateScenario({\n scenario: {\n case: 'serverLeave',\n value: true\n }\n });\n break;\n case 'migration':\n req = new SimulateScenario({\n scenario: {\n case: 'migration',\n value: true\n }\n });\n break;\n case 'resume-reconnect':\n this.engine.failNext();\n // @ts-expect-error function is private\n yield this.engine.client.handleOnClose('simulate resume-disconnect');\n break;\n case 'disconnect-signal-on-resume':\n postAction = () => __awaiter(this, void 0, void 0, function* () {\n // @ts-expect-error function is private\n yield this.engine.client.handleOnClose('simulate resume-disconnect');\n });\n req = new SimulateScenario({\n scenario: {\n case: 'disconnectSignalOnResume',\n value: true\n }\n });\n break;\n case 'disconnect-signal-on-resume-no-messages':\n postAction = () => __awaiter(this, void 0, void 0, function* () {\n // @ts-expect-error function is private\n yield this.engine.client.handleOnClose('simulate resume-disconnect');\n });\n req = new SimulateScenario({\n scenario: {\n case: 'disconnectSignalOnResumeNoMessages',\n value: true\n }\n });\n break;\n case 'full-reconnect':\n this.engine.fullReconnectOnNext = true;\n // @ts-expect-error function is private\n yield this.engine.client.handleOnClose('simulate full-reconnect');\n break;\n case 'force-tcp':\n case 'force-tls':\n req = new SimulateScenario({\n scenario: {\n case: 'switchCandidateProtocol',\n value: scenario === 'force-tls' ? 2 : 1\n }\n });\n postAction = () => __awaiter(this, void 0, void 0, function* () {\n const onLeave = this.engine.client.onLeave;\n if (onLeave) {\n onLeave(new LeaveRequest({\n reason: DisconnectReason.CLIENT_INITIATED,\n action: LeaveRequest_Action.RECONNECT\n }));\n }\n });\n break;\n case 'subscriber-bandwidth':\n if (arg === undefined || typeof arg !== 'number') {\n throw new Error('subscriber-bandwidth requires a number as argument');\n }\n req = new SimulateScenario({\n scenario: {\n case: 'subscriberBandwidth',\n value: numberToBigInt(arg)\n }\n });\n break;\n case 'leave-full-reconnect':\n req = new SimulateScenario({\n scenario: {\n case: 'leaveRequestFullReconnect',\n value: true\n }\n });\n }\n if (req) {\n yield this.engine.client.sendSimulateScenario(req);\n yield postAction();\n }\n });\n }\n /**\n * Returns true if audio playback is enabled\n */\n get canPlaybackAudio() {\n return this.audioEnabled;\n }\n /**\n * Returns true if video playback is enabled\n */\n get canPlaybackVideo() {\n return !this.isVideoPlaybackBlocked;\n }\n getActiveDevice(kind) {\n return this.localParticipant.activeDeviceMap.get(kind);\n }\n /**\n * Switches all active devices used in this room to the given device.\n *\n * Note: setting AudioOutput is not supported on some browsers. See [setSinkId](https://developer.mozilla.org/en-US/docs/Web/API/HTMLMediaElement/setSinkId#browser_compatibility)\n *\n * @param kind use `videoinput` for camera track,\n * `audioinput` for microphone track,\n * `audiooutput` to set speaker for all incoming audio tracks\n * @param deviceId\n */\n switchActiveDevice(kind_1, deviceId_1) {\n return __awaiter(this, arguments, void 0, function (kind, deviceId) {\n var _this3 = this;\n let exact = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n return function* () {\n var _a, _b, _c, _d, _e, _f;\n var _g;\n let success = true;\n let shouldTriggerImmediateDeviceChange = false;\n const deviceConstraint = exact ? {\n exact: deviceId\n } : deviceId;\n if (kind === 'audioinput') {\n shouldTriggerImmediateDeviceChange = _this3.localParticipant.audioTrackPublications.size === 0;\n const prevDeviceId = (_a = _this3.getActiveDevice(kind)) !== null && _a !== void 0 ? _a : _this3.options.audioCaptureDefaults.deviceId;\n _this3.options.audioCaptureDefaults.deviceId = deviceConstraint;\n const tracks = Array.from(_this3.localParticipant.audioTrackPublications.values()).filter(track => track.source === Track.Source.Microphone);\n try {\n success = (yield Promise.all(tracks.map(t => {\n var _a;\n return (_a = t.audioTrack) === null || _a === void 0 ? void 0 : _a.setDeviceId(deviceConstraint);\n }))).every(val => val === true);\n } catch (e) {\n _this3.options.audioCaptureDefaults.deviceId = prevDeviceId;\n throw e;\n }\n const isMuted = tracks.some(t => {\n var _a, _b;\n return (_b = (_a = t.track) === null || _a === void 0 ? void 0 : _a.isMuted) !== null && _b !== void 0 ? _b : false;\n });\n if (success && isMuted) shouldTriggerImmediateDeviceChange = true;\n } else if (kind === 'videoinput') {\n shouldTriggerImmediateDeviceChange = _this3.localParticipant.videoTrackPublications.size === 0;\n const prevDeviceId = (_b = _this3.getActiveDevice(kind)) !== null && _b !== void 0 ? _b : _this3.options.videoCaptureDefaults.deviceId;\n _this3.options.videoCaptureDefaults.deviceId = deviceConstraint;\n const tracks = Array.from(_this3.localParticipant.videoTrackPublications.values()).filter(track => track.source === Track.Source.Camera);\n try {\n success = (yield Promise.all(tracks.map(t => {\n var _a;\n return (_a = t.videoTrack) === null || _a === void 0 ? void 0 : _a.setDeviceId(deviceConstraint);\n }))).every(val => val === true);\n } catch (e) {\n _this3.options.videoCaptureDefaults.deviceId = prevDeviceId;\n throw e;\n }\n const isMuted = tracks.some(t => {\n var _a, _b;\n return (_b = (_a = t.track) === null || _a === void 0 ? void 0 : _a.isMuted) !== null && _b !== void 0 ? _b : false;\n });\n if (success && isMuted) shouldTriggerImmediateDeviceChange = true;\n } else if (kind === 'audiooutput') {\n shouldTriggerImmediateDeviceChange = true;\n if (!supportsSetSinkId() && !_this3.options.webAudioMix || _this3.options.webAudioMix && _this3.audioContext && !('setSinkId' in _this3.audioContext)) {\n throw new Error('cannot switch audio output, the current browser does not support it');\n }\n if (_this3.options.webAudioMix) {\n // setting `default` for web audio output doesn't work, so we need to normalize the id before\n deviceId = (_c = yield DeviceManager.getInstance().normalizeDeviceId('audiooutput', deviceId)) !== null && _c !== void 0 ? _c : '';\n }\n (_d = (_g = _this3.options).audioOutput) !== null && _d !== void 0 ? _d : _g.audioOutput = {};\n const prevDeviceId = (_e = _this3.getActiveDevice(kind)) !== null && _e !== void 0 ? _e : _this3.options.audioOutput.deviceId;\n _this3.options.audioOutput.deviceId = deviceId;\n try {\n if (_this3.options.webAudioMix) {\n // @ts-expect-error setSinkId is not yet in the typescript type of AudioContext\n (_f = _this3.audioContext) === null || _f === void 0 ? void 0 : _f.setSinkId(deviceId);\n }\n // also set audio output on all audio elements, even if webAudioMix is enabled in order to workaround echo cancellation not working on chrome with non-default output devices\n // see https://issues.chromium.org/issues/40252911#comment7\n yield Promise.all(Array.from(_this3.remoteParticipants.values()).map(p => p.setAudioOutput({\n deviceId\n })));\n } catch (e) {\n _this3.options.audioOutput.deviceId = prevDeviceId;\n throw e;\n }\n }\n if (shouldTriggerImmediateDeviceChange) {\n _this3.localParticipant.activeDeviceMap.set(kind, deviceId);\n _this3.emit(RoomEvent.ActiveDeviceChanged, kind, deviceId);\n }\n return success;\n }();\n });\n }\n setupLocalParticipantEvents() {\n this.localParticipant.on(ParticipantEvent.ParticipantMetadataChanged, this.onLocalParticipantMetadataChanged).on(ParticipantEvent.ParticipantNameChanged, this.onLocalParticipantNameChanged).on(ParticipantEvent.AttributesChanged, this.onLocalAttributesChanged).on(ParticipantEvent.TrackMuted, this.onLocalTrackMuted).on(ParticipantEvent.TrackUnmuted, this.onLocalTrackUnmuted).on(ParticipantEvent.LocalTrackPublished, this.onLocalTrackPublished).on(ParticipantEvent.LocalTrackUnpublished, this.onLocalTrackUnpublished).on(ParticipantEvent.ConnectionQualityChanged, this.onLocalConnectionQualityChanged).on(ParticipantEvent.MediaDevicesError, this.onMediaDevicesError).on(ParticipantEvent.AudioStreamAcquired, this.startAudio).on(ParticipantEvent.ChatMessage, this.onLocalChatMessageSent).on(ParticipantEvent.ParticipantPermissionsChanged, this.onLocalParticipantPermissionsChanged);\n }\n recreateEngine() {\n var _a;\n (_a = this.engine) === null || _a === void 0 ? void 0 : _a.close();\n /* @ts-ignore */\n this.engine = undefined;\n this.isResuming = false;\n // clear out existing remote participants, since they may have attached\n // the old engine\n this.remoteParticipants.clear();\n this.sidToIdentity.clear();\n this.bufferedEvents = [];\n this.maybeCreateEngine();\n }\n onTrackAdded(mediaTrack, stream, receiver) {\n // don't fire onSubscribed when connecting\n // WebRTC fires onTrack as soon as setRemoteDescription is called on the offer\n // at that time, ICE connectivity has not been established so the track is not\n // technically subscribed.\n // We'll defer these events until when the room is connected or eventually disconnected.\n if (this.state === ConnectionState.Connecting || this.state === ConnectionState.Reconnecting) {\n const reconnectedHandler = () => {\n this.onTrackAdded(mediaTrack, stream, receiver);\n cleanup();\n };\n const cleanup = () => {\n this.off(RoomEvent.Reconnected, reconnectedHandler);\n this.off(RoomEvent.Connected, reconnectedHandler);\n this.off(RoomEvent.Disconnected, cleanup);\n };\n this.once(RoomEvent.Reconnected, reconnectedHandler);\n this.once(RoomEvent.Connected, reconnectedHandler);\n this.once(RoomEvent.Disconnected, cleanup);\n return;\n }\n if (this.state === ConnectionState.Disconnected) {\n this.log.warn('skipping incoming track after Room disconnected', this.logContext);\n return;\n }\n if (mediaTrack.readyState === 'ended') {\n this.log.info('skipping incoming track as it already ended', this.logContext);\n return;\n }\n const parts = unpackStreamId(stream.id);\n const participantSid = parts[0];\n let streamId = parts[1];\n let trackId = mediaTrack.id;\n // firefox will get streamId (pID|trackId) instead of (pID|streamId) as it doesn't support sync tracks by stream\n // and generates its own track id instead of infer from sdp track id.\n if (streamId && streamId.startsWith('TR')) trackId = streamId;\n if (participantSid === this.localParticipant.sid) {\n this.log.warn('tried to create RemoteParticipant for local participant', this.logContext);\n return;\n }\n const participant = Array.from(this.remoteParticipants.values()).find(p => p.sid === participantSid);\n if (!participant) {\n this.log.error(\"Tried to add a track for a participant, that's not present. Sid: \".concat(participantSid), this.logContext);\n return;\n }\n let adaptiveStreamSettings;\n if (this.options.adaptiveStream) {\n if (typeof this.options.adaptiveStream === 'object') {\n adaptiveStreamSettings = this.options.adaptiveStream;\n } else {\n adaptiveStreamSettings = {};\n }\n }\n participant.addSubscribedMediaTrack(mediaTrack, trackId, stream, receiver, adaptiveStreamSettings);\n }\n handleDisconnect() {\n let shouldStopTracks = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n let reason = arguments.length > 1 ? arguments[1] : undefined;\n var _a;\n this.clearConnectionReconcile();\n this.isResuming = false;\n this.bufferedEvents = [];\n this.transcriptionReceivedTimes.clear();\n if (this.state === ConnectionState.Disconnected) {\n return;\n }\n this.regionUrl = undefined;\n try {\n this.remoteParticipants.forEach(p => {\n p.trackPublications.forEach(pub => {\n p.unpublishTrack(pub.trackSid);\n });\n });\n this.localParticipant.trackPublications.forEach(pub => {\n var _a, _b, _c;\n if (pub.track) {\n this.localParticipant.unpublishTrack(pub.track, shouldStopTracks);\n }\n if (shouldStopTracks) {\n (_a = pub.track) === null || _a === void 0 ? void 0 : _a.detach();\n (_b = pub.track) === null || _b === void 0 ? void 0 : _b.stop();\n } else {\n (_c = pub.track) === null || _c === void 0 ? void 0 : _c.stopMonitor();\n }\n });\n this.localParticipant.off(ParticipantEvent.ParticipantMetadataChanged, this.onLocalParticipantMetadataChanged).off(ParticipantEvent.ParticipantNameChanged, this.onLocalParticipantNameChanged).off(ParticipantEvent.AttributesChanged, this.onLocalAttributesChanged).off(ParticipantEvent.TrackMuted, this.onLocalTrackMuted).off(ParticipantEvent.TrackUnmuted, this.onLocalTrackUnmuted).off(ParticipantEvent.LocalTrackPublished, this.onLocalTrackPublished).off(ParticipantEvent.LocalTrackUnpublished, this.onLocalTrackUnpublished).off(ParticipantEvent.ConnectionQualityChanged, this.onLocalConnectionQualityChanged).off(ParticipantEvent.MediaDevicesError, this.onMediaDevicesError).off(ParticipantEvent.AudioStreamAcquired, this.startAudio).off(ParticipantEvent.ChatMessage, this.onLocalChatMessageSent).off(ParticipantEvent.ParticipantPermissionsChanged, this.onLocalParticipantPermissionsChanged);\n this.localParticipant.trackPublications.clear();\n this.localParticipant.videoTrackPublications.clear();\n this.localParticipant.audioTrackPublications.clear();\n this.remoteParticipants.clear();\n this.sidToIdentity.clear();\n this.activeSpeakers = [];\n if (this.audioContext && typeof this.options.webAudioMix === 'boolean') {\n this.audioContext.close();\n this.audioContext = undefined;\n }\n if (isWeb()) {\n window.removeEventListener('beforeunload', this.onPageLeave);\n window.removeEventListener('pagehide', this.onPageLeave);\n window.removeEventListener('freeze', this.onPageLeave);\n (_a = navigator.mediaDevices) === null || _a === void 0 ? void 0 : _a.removeEventListener('devicechange', this.handleDeviceChange);\n }\n } finally {\n this.setAndEmitConnectionState(ConnectionState.Disconnected);\n this.emit(RoomEvent.Disconnected, reason);\n }\n }\n handleParticipantDisconnected(identity, participant) {\n var _a;\n // remove and send event\n this.remoteParticipants.delete(identity);\n if (!participant) {\n return;\n }\n participant.trackPublications.forEach(publication => {\n participant.unpublishTrack(publication.trackSid, true);\n });\n this.emit(RoomEvent.ParticipantDisconnected, participant);\n participant.setDisconnected();\n (_a = this.localParticipant) === null || _a === void 0 ? void 0 : _a.handleParticipantDisconnected(participant.identity);\n }\n handleStreamHeader(streamHeader, participantIdentity) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (streamHeader.contentHeader.case === 'byteHeader') {\n const streamHandlerCallback = this.byteStreamHandlers.get(streamHeader.topic);\n if (!streamHandlerCallback) {\n this.log.debug('ignoring incoming byte stream due to no handler for topic', streamHeader.topic);\n return;\n }\n let streamController;\n const info = {\n id: streamHeader.streamId,\n name: (_a = streamHeader.contentHeader.value.name) !== null && _a !== void 0 ? _a : 'unknown',\n mimeType: streamHeader.mimeType,\n size: streamHeader.totalLength ? Number(streamHeader.totalLength) : undefined,\n topic: streamHeader.topic,\n timestamp: bigIntToNumber(streamHeader.timestamp),\n attributes: streamHeader.attributes\n };\n const stream = new ReadableStream({\n start: controller => {\n streamController = controller;\n this.byteStreamControllers.set(streamHeader.streamId, {\n info,\n controller: streamController,\n startTime: Date.now()\n });\n }\n });\n streamHandlerCallback(new ByteStreamReader(info, stream, bigIntToNumber(streamHeader.totalLength)), {\n identity: participantIdentity\n });\n } else if (streamHeader.contentHeader.case === 'textHeader') {\n const streamHandlerCallback = this.textStreamHandlers.get(streamHeader.topic);\n if (!streamHandlerCallback) {\n this.log.debug('ignoring incoming text stream due to no handler for topic', streamHeader.topic);\n return;\n }\n let streamController;\n const info = {\n id: streamHeader.streamId,\n mimeType: streamHeader.mimeType,\n size: streamHeader.totalLength ? Number(streamHeader.totalLength) : undefined,\n topic: streamHeader.topic,\n timestamp: Number(streamHeader.timestamp),\n attributes: streamHeader.attributes\n };\n const stream = new ReadableStream({\n start: controller => {\n streamController = controller;\n this.textStreamControllers.set(streamHeader.streamId, {\n info,\n controller: streamController,\n startTime: Date.now()\n });\n }\n });\n streamHandlerCallback(new TextStreamReader(info, stream, bigIntToNumber(streamHeader.totalLength)), {\n identity: participantIdentity\n });\n }\n });\n }\n handleStreamChunk(chunk) {\n const fileBuffer = this.byteStreamControllers.get(chunk.streamId);\n if (fileBuffer) {\n if (chunk.content.length > 0) {\n fileBuffer.controller.enqueue(chunk);\n }\n }\n const textBuffer = this.textStreamControllers.get(chunk.streamId);\n if (textBuffer) {\n if (chunk.content.length > 0) {\n textBuffer.controller.enqueue(chunk);\n }\n }\n }\n handleStreamTrailer(trailer) {\n const textBuffer = this.textStreamControllers.get(trailer.streamId);\n if (textBuffer) {\n textBuffer.info.attributes = Object.assign(Object.assign({}, textBuffer.info.attributes), trailer.attributes);\n textBuffer.controller.close();\n this.textStreamControllers.delete(trailer.streamId);\n }\n const fileBuffer = this.byteStreamControllers.get(trailer.streamId);\n if (fileBuffer) {\n {\n fileBuffer.info.attributes = Object.assign(Object.assign({}, fileBuffer.info.attributes), trailer.attributes);\n fileBuffer.controller.close();\n this.byteStreamControllers.delete(trailer.streamId);\n }\n }\n }\n /**\n * attempt to select the default devices if the previously selected devices are no longer available after a device change event\n */\n selectDefaultDevices() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c;\n const previousDevices = DeviceManager.getInstance().previousDevices;\n // check for available devices, but don't request permissions in order to avoid prompts for kinds that haven't been used before\n const availableDevices = yield DeviceManager.getInstance().getDevices(undefined, false);\n const browser = getBrowser();\n if ((browser === null || browser === void 0 ? void 0 : browser.name) === 'Chrome' && browser.os !== 'iOS') {\n for (let availableDevice of availableDevices) {\n const previousDevice = previousDevices.find(info => info.deviceId === availableDevice.deviceId);\n if (previousDevice && previousDevice.label !== '' && previousDevice.kind === availableDevice.kind && previousDevice.label !== availableDevice.label) {\n // label has changed on device the same deviceId, indicating that the default device has changed on the OS level\n if (this.getActiveDevice(availableDevice.kind) === 'default') {\n // emit an active device change event only if the selected output device is actually on `default`\n this.emit(RoomEvent.ActiveDeviceChanged, availableDevice.kind, availableDevice.deviceId);\n }\n }\n }\n }\n const kinds = ['audiooutput', 'audioinput', 'videoinput'];\n for (let kind of kinds) {\n const targetSource = kindToSource(kind);\n const targetPublication = this.localParticipant.getTrackPublication(targetSource);\n if (targetPublication && ((_a = targetPublication.track) === null || _a === void 0 ? void 0 : _a.isUserProvided)) {\n // if the track is user provided, we don't want to switch devices on behalf of the user\n continue;\n }\n const devicesOfKind = availableDevices.filter(d => d.kind === kind);\n const activeDevice = this.getActiveDevice(kind);\n if (activeDevice === ((_b = previousDevices.filter(info => info.kind === kind)[0]) === null || _b === void 0 ? void 0 : _b.deviceId)) {\n // in Safari the first device is always the default, so we assume a user on the default device would like to switch to the default once it changes\n // FF doesn't emit an event when the default device changes, so we perform the same best effort and switch to the new device once connected and if it's the first in the array\n if (devicesOfKind.length > 0 && ((_c = devicesOfKind[0]) === null || _c === void 0 ? void 0 : _c.deviceId) !== activeDevice) {\n yield this.switchActiveDevice(kind, devicesOfKind[0].deviceId);\n continue;\n }\n }\n if (kind === 'audioinput' && !isSafariBased() || kind === 'videoinput') {\n // airpods on Safari need special handling for audioinput as the track doesn't end as soon as you take them out\n continue;\n }\n // switch to first available device if previously active device is not available any more\n if (devicesOfKind.length > 0 && !devicesOfKind.find(deviceInfo => deviceInfo.deviceId === this.getActiveDevice(kind)) && (\n // avoid switching audio output on safari without explicit user action as it leads to slowed down audio playback\n kind !== 'audiooutput' || !isSafariBased())) {\n yield this.switchActiveDevice(kind, devicesOfKind[0].deviceId);\n }\n }\n });\n }\n acquireAudioContext() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n if (typeof this.options.webAudioMix !== 'boolean' && this.options.webAudioMix.audioContext) {\n // override audio context with custom audio context if supplied by user\n this.audioContext = this.options.webAudioMix.audioContext;\n } else if (!this.audioContext || this.audioContext.state === 'closed') {\n // by using an AudioContext, it reduces lag on audio elements\n // https://stackoverflow.com/questions/9811429/html5-audio-tag-on-safari-has-a-delay/54119854#54119854\n this.audioContext = (_a = getNewAudioContext()) !== null && _a !== void 0 ? _a : undefined;\n }\n if (this.options.webAudioMix) {\n this.remoteParticipants.forEach(participant => participant.setAudioContext(this.audioContext));\n }\n this.localParticipant.setAudioContext(this.audioContext);\n if (this.audioContext && this.audioContext.state === 'suspended') {\n // for iOS a newly created AudioContext is always in `suspended` state.\n // we try our best to resume the context here, if that doesn't work, we just continue with regular processing\n try {\n yield Promise.race([this.audioContext.resume(), sleep(200)]);\n } catch (e) {\n this.log.warn('Could not resume audio context', Object.assign(Object.assign({}, this.logContext), {\n error: e\n }));\n }\n }\n const newContextIsRunning = ((_b = this.audioContext) === null || _b === void 0 ? void 0 : _b.state) === 'running';\n if (newContextIsRunning !== this.canPlaybackAudio) {\n this.audioEnabled = newContextIsRunning;\n this.emit(RoomEvent.AudioPlaybackStatusChanged, newContextIsRunning);\n }\n });\n }\n createParticipant(identity, info) {\n var _a;\n let participant;\n if (info) {\n participant = RemoteParticipant.fromParticipantInfo(this.engine.client, info, {\n loggerContextCb: () => this.logContext,\n loggerName: this.options.loggerName\n });\n } else {\n participant = new RemoteParticipant(this.engine.client, '', identity, undefined, undefined, undefined, {\n loggerContextCb: () => this.logContext,\n loggerName: this.options.loggerName\n });\n }\n if (this.options.webAudioMix) {\n participant.setAudioContext(this.audioContext);\n }\n if ((_a = this.options.audioOutput) === null || _a === void 0 ? void 0 : _a.deviceId) {\n participant.setAudioOutput(this.options.audioOutput).catch(e => this.log.warn(\"Could not set audio output: \".concat(e.message), this.logContext));\n }\n return participant;\n }\n getOrCreateParticipant(identity, info) {\n if (this.remoteParticipants.has(identity)) {\n const existingParticipant = this.remoteParticipants.get(identity);\n if (info) {\n const wasUpdated = existingParticipant.updateInfo(info);\n if (wasUpdated) {\n this.sidToIdentity.set(info.sid, info.identity);\n }\n }\n return existingParticipant;\n }\n const participant = this.createParticipant(identity, info);\n this.remoteParticipants.set(identity, participant);\n this.sidToIdentity.set(info.sid, info.identity);\n // if we have valid info and the participant wasn't in the map before, we can assume the participant is new\n // firing here to make sure that `ParticipantConnected` fires before the initial track events\n this.emitWhenConnected(RoomEvent.ParticipantConnected, participant);\n // also forward events\n // trackPublished is only fired for tracks added after both local participant\n // and remote participant joined the room\n participant.on(ParticipantEvent.TrackPublished, trackPublication => {\n this.emitWhenConnected(RoomEvent.TrackPublished, trackPublication, participant);\n }).on(ParticipantEvent.TrackSubscribed, (track, publication) => {\n // monitor playback status\n if (track.kind === Track.Kind.Audio) {\n track.on(TrackEvent.AudioPlaybackStarted, this.handleAudioPlaybackStarted);\n track.on(TrackEvent.AudioPlaybackFailed, this.handleAudioPlaybackFailed);\n } else if (track.kind === Track.Kind.Video) {\n track.on(TrackEvent.VideoPlaybackFailed, this.handleVideoPlaybackFailed);\n track.on(TrackEvent.VideoPlaybackStarted, this.handleVideoPlaybackStarted);\n }\n this.emit(RoomEvent.TrackSubscribed, track, publication, participant);\n }).on(ParticipantEvent.TrackUnpublished, publication => {\n this.emit(RoomEvent.TrackUnpublished, publication, participant);\n }).on(ParticipantEvent.TrackUnsubscribed, (track, publication) => {\n this.emit(RoomEvent.TrackUnsubscribed, track, publication, participant);\n }).on(ParticipantEvent.TrackMuted, pub => {\n this.emitWhenConnected(RoomEvent.TrackMuted, pub, participant);\n }).on(ParticipantEvent.TrackUnmuted, pub => {\n this.emitWhenConnected(RoomEvent.TrackUnmuted, pub, participant);\n }).on(ParticipantEvent.ParticipantMetadataChanged, metadata => {\n this.emitWhenConnected(RoomEvent.ParticipantMetadataChanged, metadata, participant);\n }).on(ParticipantEvent.ParticipantNameChanged, name => {\n this.emitWhenConnected(RoomEvent.ParticipantNameChanged, name, participant);\n }).on(ParticipantEvent.AttributesChanged, changedAttributes => {\n this.emitWhenConnected(RoomEvent.ParticipantAttributesChanged, changedAttributes, participant);\n }).on(ParticipantEvent.ConnectionQualityChanged, quality => {\n this.emitWhenConnected(RoomEvent.ConnectionQualityChanged, quality, participant);\n }).on(ParticipantEvent.ParticipantPermissionsChanged, prevPermissions => {\n this.emitWhenConnected(RoomEvent.ParticipantPermissionsChanged, prevPermissions, participant);\n }).on(ParticipantEvent.TrackSubscriptionStatusChanged, (pub, status) => {\n this.emitWhenConnected(RoomEvent.TrackSubscriptionStatusChanged, pub, status, participant);\n }).on(ParticipantEvent.TrackSubscriptionFailed, (trackSid, error) => {\n this.emit(RoomEvent.TrackSubscriptionFailed, trackSid, participant, error);\n }).on(ParticipantEvent.TrackSubscriptionPermissionChanged, (pub, status) => {\n this.emitWhenConnected(RoomEvent.TrackSubscriptionPermissionChanged, pub, status, participant);\n }).on(ParticipantEvent.Active, () => {\n this.emitWhenConnected(RoomEvent.ParticipantActive, participant);\n if (participant.kind === ParticipantInfo_Kind.AGENT) {\n this.localParticipant.setActiveAgent(participant);\n }\n });\n // update info at the end after callbacks have been set up\n if (info) {\n participant.updateInfo(info);\n }\n return participant;\n }\n sendSyncState() {\n const remoteTracks = Array.from(this.remoteParticipants.values()).reduce((acc, participant) => {\n acc.push(...participant.getTrackPublications()); // FIXME would be nice to have this return RemoteTrackPublications directly instead of the type cast\n return acc;\n }, []);\n const localTracks = this.localParticipant.getTrackPublications(); // FIXME would be nice to have this return LocalTrackPublications directly instead of the type cast\n this.engine.sendSyncState(remoteTracks, localTracks);\n }\n /**\n * After resuming, we'll need to notify the server of the current\n * subscription settings.\n */\n updateSubscriptions() {\n for (const p of this.remoteParticipants.values()) {\n for (const pub of p.videoTrackPublications.values()) {\n if (pub.isSubscribed && isRemotePub(pub)) {\n pub.emitTrackUpdate();\n }\n }\n }\n }\n getRemoteParticipantBySid(sid) {\n const identity = this.sidToIdentity.get(sid);\n if (identity) {\n return this.remoteParticipants.get(identity);\n }\n }\n registerConnectionReconcile() {\n this.clearConnectionReconcile();\n let consecutiveFailures = 0;\n this.connectionReconcileInterval = CriticalTimers.setInterval(() => {\n if (\n // ensure we didn't tear it down\n !this.engine ||\n // engine detected close, but Room missed it\n this.engine.isClosed ||\n // transports failed without notifying engine\n !this.engine.verifyTransport()) {\n consecutiveFailures++;\n this.log.warn('detected connection state mismatch', Object.assign(Object.assign({}, this.logContext), {\n numFailures: consecutiveFailures,\n engine: this.engine ? {\n closed: this.engine.isClosed,\n transportsConnected: this.engine.verifyTransport()\n } : undefined\n }));\n if (consecutiveFailures >= 3) {\n this.recreateEngine();\n this.handleDisconnect(this.options.stopLocalTrackOnUnpublish, DisconnectReason.STATE_MISMATCH);\n }\n } else {\n consecutiveFailures = 0;\n }\n }, connectionReconcileFrequency);\n }\n clearConnectionReconcile() {\n if (this.connectionReconcileInterval) {\n CriticalTimers.clearInterval(this.connectionReconcileInterval);\n }\n }\n setAndEmitConnectionState(state) {\n if (state === this.state) {\n // unchanged\n return false;\n }\n this.state = state;\n this.emit(RoomEvent.ConnectionStateChanged, this.state);\n return true;\n }\n emitBufferedEvents() {\n this.bufferedEvents.forEach(_ref3 => {\n let [ev, args] = _ref3;\n this.emit(ev, ...args);\n });\n this.bufferedEvents = [];\n }\n emitWhenConnected(event) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n if (this.state === ConnectionState.Reconnecting || this.isResuming || !this.engine || this.engine.pendingReconnect) {\n // in case the room is reconnecting, buffer the events by firing them later after emitting RoomEvent.Reconnected\n this.bufferedEvents.push([event, args]);\n } else if (this.state === ConnectionState.Connected) {\n return this.emit(event, ...args);\n }\n return false;\n }\n /**\n * Allows to populate a room with simulated participants.\n * No actual connection to a server will be established, all state is\n * @experimental\n */\n simulateParticipants(options) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n const publishOptions = Object.assign({\n audio: true,\n video: true,\n useRealTracks: false\n }, options.publish);\n const participantOptions = Object.assign({\n count: 9,\n audio: false,\n video: true,\n aspectRatios: [1.66, 1.7, 1.3]\n }, options.participants);\n this.handleDisconnect();\n this.roomInfo = new Room$1({\n sid: 'RM_SIMULATED',\n name: 'simulated-room',\n emptyTimeout: 0,\n maxParticipants: 0,\n creationTime: protoInt64.parse(new Date().getTime()),\n metadata: '',\n numParticipants: 1,\n numPublishers: 1,\n turnPassword: '',\n enabledCodecs: [],\n activeRecording: false\n });\n this.localParticipant.updateInfo(new ParticipantInfo({\n identity: 'simulated-local',\n name: 'local-name'\n }));\n this.setupLocalParticipantEvents();\n this.emit(RoomEvent.SignalConnected);\n this.emit(RoomEvent.Connected);\n this.setAndEmitConnectionState(ConnectionState.Connected);\n if (publishOptions.video) {\n const camPub = new LocalTrackPublication(Track.Kind.Video, new TrackInfo({\n source: TrackSource.CAMERA,\n sid: Math.floor(Math.random() * 10000).toString(),\n type: TrackType.AUDIO,\n name: 'video-dummy'\n }), new LocalVideoTrack(publishOptions.useRealTracks ? (yield window.navigator.mediaDevices.getUserMedia({\n video: true\n })).getVideoTracks()[0] : createDummyVideoStreamTrack(160 * ((_a = participantOptions.aspectRatios[0]) !== null && _a !== void 0 ? _a : 1), 160, true, true), undefined, false, {\n loggerName: this.options.loggerName,\n loggerContextCb: () => this.logContext\n }), {\n loggerName: this.options.loggerName,\n loggerContextCb: () => this.logContext\n });\n // @ts-ignore\n this.localParticipant.addTrackPublication(camPub);\n this.localParticipant.emit(ParticipantEvent.LocalTrackPublished, camPub);\n }\n if (publishOptions.audio) {\n const audioPub = new LocalTrackPublication(Track.Kind.Audio, new TrackInfo({\n source: TrackSource.MICROPHONE,\n sid: Math.floor(Math.random() * 10000).toString(),\n type: TrackType.AUDIO\n }), new LocalAudioTrack(publishOptions.useRealTracks ? (yield navigator.mediaDevices.getUserMedia({\n audio: true\n })).getAudioTracks()[0] : getEmptyAudioStreamTrack(), undefined, false, this.audioContext, {\n loggerName: this.options.loggerName,\n loggerContextCb: () => this.logContext\n }), {\n loggerName: this.options.loggerName,\n loggerContextCb: () => this.logContext\n });\n // @ts-ignore\n this.localParticipant.addTrackPublication(audioPub);\n this.localParticipant.emit(ParticipantEvent.LocalTrackPublished, audioPub);\n }\n for (let i = 0; i < participantOptions.count - 1; i += 1) {\n let info = new ParticipantInfo({\n sid: Math.floor(Math.random() * 10000).toString(),\n identity: \"simulated-\".concat(i),\n state: ParticipantInfo_State.ACTIVE,\n tracks: [],\n joinedAt: protoInt64.parse(Date.now())\n });\n const p = this.getOrCreateParticipant(info.identity, info);\n if (participantOptions.video) {\n const dummyVideo = createDummyVideoStreamTrack(160 * ((_b = participantOptions.aspectRatios[i % participantOptions.aspectRatios.length]) !== null && _b !== void 0 ? _b : 1), 160, false, true);\n const videoTrack = new TrackInfo({\n source: TrackSource.CAMERA,\n sid: Math.floor(Math.random() * 10000).toString(),\n type: TrackType.AUDIO\n });\n p.addSubscribedMediaTrack(dummyVideo, videoTrack.sid, new MediaStream([dummyVideo]), new RTCRtpReceiver());\n info.tracks = [...info.tracks, videoTrack];\n }\n if (participantOptions.audio) {\n const dummyTrack = getEmptyAudioStreamTrack();\n const audioTrack = new TrackInfo({\n source: TrackSource.MICROPHONE,\n sid: Math.floor(Math.random() * 10000).toString(),\n type: TrackType.AUDIO\n });\n p.addSubscribedMediaTrack(dummyTrack, audioTrack.sid, new MediaStream([dummyTrack]), new RTCRtpReceiver());\n info.tracks = [...info.tracks, audioTrack];\n }\n p.updateInfo(info);\n }\n });\n }\n // /** @internal */\n emit(event) {\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n // active speaker updates are too spammy\n if (event !== RoomEvent.ActiveSpeakersChanged && event !== RoomEvent.TranscriptionReceived) {\n // only extract logContext from arguments in order to avoid logging the whole object tree\n const minimizedArgs = mapArgs(args).filter(arg => arg !== undefined);\n this.log.debug(\"room event \".concat(event), Object.assign(Object.assign({}, this.logContext), {\n event,\n args: minimizedArgs\n }));\n }\n return super.emit(event, ...args);\n }\n}\nRoom.cleanupRegistry = typeof FinalizationRegistry !== 'undefined' && new FinalizationRegistry(cleanup => {\n cleanup();\n});\nfunction mapArgs(args) {\n return args.map(arg => {\n if (!arg) {\n return;\n }\n if (Array.isArray(arg)) {\n return mapArgs(arg);\n }\n if (typeof arg === 'object') {\n return 'logContext' in arg ? arg.logContext : undefined;\n }\n return arg;\n });\n}\n\n// This file was generated from JSON Schema using quicktype, do not modify it directly.\n// The code generation lives at https://github.com/livekit/attribute-definitions\n//\n// To parse this data:\n//\n// import { Convert, AgentAttributes, TranscriptionAttributes } from \"./file\";\n//\n// const agentAttributes = Convert.toAgentAttributes(json);\n// const transcriptionAttributes = Convert.toTranscriptionAttributes(json);\n// Converts JSON strings to/from your types\nclass Convert {\n static toAgentAttributes(json) {\n return JSON.parse(json);\n }\n static agentAttributesToJson(value) {\n return JSON.stringify(value);\n }\n static toTranscriptionAttributes(json) {\n return JSON.parse(json);\n }\n static transcriptionAttributesToJson(value) {\n return JSON.stringify(value);\n }\n}\n\nvar attributeTypings = /*#__PURE__*/Object.freeze({\n __proto__: null,\n Convert: Convert\n});\n\nvar CheckStatus;\n(function (CheckStatus) {\n CheckStatus[CheckStatus[\"IDLE\"] = 0] = \"IDLE\";\n CheckStatus[CheckStatus[\"RUNNING\"] = 1] = \"RUNNING\";\n CheckStatus[CheckStatus[\"SKIPPED\"] = 2] = \"SKIPPED\";\n CheckStatus[CheckStatus[\"SUCCESS\"] = 3] = \"SUCCESS\";\n CheckStatus[CheckStatus[\"FAILED\"] = 4] = \"FAILED\";\n})(CheckStatus || (CheckStatus = {}));\nclass Checker extends eventsExports.EventEmitter {\n constructor(url, token) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n super();\n this.status = CheckStatus.IDLE;\n this.logs = [];\n this.options = {};\n this.url = url;\n this.token = token;\n this.name = this.constructor.name;\n this.room = new Room(options.roomOptions);\n this.connectOptions = options.connectOptions;\n this.options = options;\n }\n run(onComplete) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.status !== CheckStatus.IDLE) {\n throw Error('check is running already');\n }\n this.setStatus(CheckStatus.RUNNING);\n try {\n yield this.perform();\n } catch (err) {\n if (err instanceof Error) {\n if (this.options.errorsAsWarnings) {\n this.appendWarning(err.message);\n } else {\n this.appendError(err.message);\n }\n }\n }\n yield this.disconnect();\n // sleep for a bit to ensure disconnect\n yield new Promise(resolve => setTimeout(resolve, 500));\n // @ts-ignore\n if (this.status !== CheckStatus.SKIPPED) {\n this.setStatus(this.isSuccess() ? CheckStatus.SUCCESS : CheckStatus.FAILED);\n }\n if (onComplete) {\n onComplete();\n }\n return this.getInfo();\n });\n }\n isSuccess() {\n return !this.logs.some(l => l.level === 'error');\n }\n connect(url) {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.room.state === ConnectionState.Connected) {\n return this.room;\n }\n if (!url) {\n url = this.url;\n }\n yield this.room.connect(url, this.token, this.connectOptions);\n return this.room;\n });\n }\n disconnect() {\n return __awaiter(this, void 0, void 0, function* () {\n if (this.room && this.room.state !== ConnectionState.Disconnected) {\n yield this.room.disconnect();\n // wait for it to go through\n yield new Promise(resolve => setTimeout(resolve, 500));\n }\n });\n }\n skip() {\n this.setStatus(CheckStatus.SKIPPED);\n }\n switchProtocol(protocol) {\n return __awaiter(this, void 0, void 0, function* () {\n let hasReconnecting = false;\n let hasReconnected = false;\n this.room.on(RoomEvent.Reconnecting, () => {\n hasReconnecting = true;\n });\n this.room.once(RoomEvent.Reconnected, () => {\n hasReconnected = true;\n });\n this.room.simulateScenario(\"force-\".concat(protocol));\n yield new Promise(resolve => setTimeout(resolve, 1000));\n if (!hasReconnecting) {\n // no need to wait for reconnection\n return;\n }\n // wait for 10 seconds for reconnection\n const timeout = Date.now() + 10000;\n while (Date.now() < timeout) {\n if (hasReconnected) {\n return;\n }\n yield sleep(100);\n }\n throw new Error(\"Could not reconnect using \".concat(protocol, \" protocol after 10 seconds\"));\n });\n }\n appendMessage(message) {\n this.logs.push({\n level: 'info',\n message\n });\n this.emit('update', this.getInfo());\n }\n appendWarning(message) {\n this.logs.push({\n level: 'warning',\n message\n });\n this.emit('update', this.getInfo());\n }\n appendError(message) {\n this.logs.push({\n level: 'error',\n message\n });\n this.emit('update', this.getInfo());\n }\n setStatus(status) {\n this.status = status;\n this.emit('update', this.getInfo());\n }\n get engine() {\n var _a;\n return (_a = this.room) === null || _a === void 0 ? void 0 : _a.engine;\n }\n getInfo() {\n return {\n logs: this.logs,\n name: this.name,\n status: this.status,\n description: this.description\n };\n }\n}\n\n/**\n * Checks for connections quality to closests Cloud regions and determining the best quality\n */\nclass CloudRegionCheck extends Checker {\n get description() {\n return 'Cloud regions';\n }\n perform() {\n return __awaiter(this, void 0, void 0, function* () {\n const regionProvider = new RegionUrlProvider(this.url, this.token);\n if (!regionProvider.isCloud()) {\n this.skip();\n return;\n }\n const regionStats = [];\n const seenUrls = new Set();\n for (let i = 0; i < 3; i++) {\n const regionUrl = yield regionProvider.getNextBestRegionUrl();\n if (!regionUrl) {\n break;\n }\n if (seenUrls.has(regionUrl)) {\n continue;\n }\n seenUrls.add(regionUrl);\n const stats = yield this.checkCloudRegion(regionUrl);\n this.appendMessage(\"\".concat(stats.region, \" RTT: \").concat(stats.rtt, \"ms, duration: \").concat(stats.duration, \"ms\"));\n regionStats.push(stats);\n }\n regionStats.sort((a, b) => {\n return (a.duration - b.duration) * 0.5 + (a.rtt - b.rtt) * 0.5;\n });\n const bestRegion = regionStats[0];\n this.bestStats = bestRegion;\n this.appendMessage(\"best Cloud region: \".concat(bestRegion.region));\n });\n }\n getInfo() {\n const info = super.getInfo();\n info.data = this.bestStats;\n return info;\n }\n checkCloudRegion(url) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n yield this.connect(url);\n if (this.options.protocol === 'tcp') {\n yield this.switchProtocol('tcp');\n }\n const region = (_a = this.room.serverInfo) === null || _a === void 0 ? void 0 : _a.region;\n if (!region) {\n throw new Error('Region not found');\n }\n const writer = yield this.room.localParticipant.streamText({\n topic: 'test'\n });\n const chunkSize = 1000; // each chunk is about 1000 bytes\n const totalSize = 1000000; // approximately 1MB of data\n const numChunks = totalSize / chunkSize; // will yield 1000 chunks\n const chunkData = 'A'.repeat(chunkSize); // create a string of 1000 'A' characters\n const startTime = Date.now();\n for (let i = 0; i < numChunks; i++) {\n yield writer.write(chunkData);\n }\n yield writer.close();\n const endTime = Date.now();\n const stats = yield (_b = this.room.engine.pcManager) === null || _b === void 0 ? void 0 : _b.publisher.getStats();\n const regionStats = {\n region: region,\n rtt: 10000,\n duration: endTime - startTime\n };\n stats === null || stats === void 0 ? void 0 : stats.forEach(stat => {\n if (stat.type === 'candidate-pair' && stat.nominated) {\n regionStats.rtt = stat.currentRoundTripTime * 1000;\n }\n });\n yield this.disconnect();\n return regionStats;\n });\n }\n}\n\nconst TEST_DURATION = 10000;\nclass ConnectionProtocolCheck extends Checker {\n get description() {\n return 'Connection via UDP vs TCP';\n }\n perform() {\n return __awaiter(this, void 0, void 0, function* () {\n const udpStats = yield this.checkConnectionProtocol('udp');\n const tcpStats = yield this.checkConnectionProtocol('tcp');\n this.bestStats = udpStats;\n // udp should is the better protocol typically. however, we'd prefer TCP when either of these conditions are true:\n // 1. the bandwidth limitation is worse on UDP by 500ms\n // 2. the packet loss is higher on UDP by 1%\n if (udpStats.qualityLimitationDurations.bandwidth - tcpStats.qualityLimitationDurations.bandwidth > 0.5 || (udpStats.packetsLost - tcpStats.packetsLost) / udpStats.packetsSent > 0.01) {\n this.appendMessage('best connection quality via tcp');\n this.bestStats = tcpStats;\n } else {\n this.appendMessage('best connection quality via udp');\n }\n const stats = this.bestStats;\n this.appendMessage(\"upstream bitrate: \".concat((stats.bitrateTotal / stats.count / 1000 / 1000).toFixed(2), \" mbps\"));\n this.appendMessage(\"RTT: \".concat((stats.rttTotal / stats.count * 1000).toFixed(2), \" ms\"));\n this.appendMessage(\"jitter: \".concat((stats.jitterTotal / stats.count * 1000).toFixed(2), \" ms\"));\n if (stats.packetsLost > 0) {\n this.appendWarning(\"packets lost: \".concat((stats.packetsLost / stats.packetsSent * 100).toFixed(2), \"%\"));\n }\n if (stats.qualityLimitationDurations.bandwidth > 1) {\n this.appendWarning(\"bandwidth limited \".concat((stats.qualityLimitationDurations.bandwidth / (TEST_DURATION / 1000) * 100).toFixed(2), \"%\"));\n }\n if (stats.qualityLimitationDurations.cpu > 0) {\n this.appendWarning(\"cpu limited \".concat((stats.qualityLimitationDurations.cpu / (TEST_DURATION / 1000) * 100).toFixed(2), \"%\"));\n }\n });\n }\n getInfo() {\n const info = super.getInfo();\n info.data = this.bestStats;\n return info;\n }\n checkConnectionProtocol(protocol) {\n return __awaiter(this, void 0, void 0, function* () {\n yield this.connect();\n if (protocol === 'tcp') {\n yield this.switchProtocol('tcp');\n } else {\n yield this.switchProtocol('udp');\n }\n // create a canvas with animated content\n const canvas = document.createElement('canvas');\n canvas.width = 1280;\n canvas.height = 720;\n const ctx = canvas.getContext('2d');\n if (!ctx) {\n throw new Error('Could not get canvas context');\n }\n let hue = 0;\n const animate = () => {\n hue = (hue + 1) % 360;\n ctx.fillStyle = \"hsl(\".concat(hue, \", 100%, 50%)\");\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n requestAnimationFrame(animate);\n };\n animate();\n // create video track from canvas\n const stream = canvas.captureStream(30); // 30fps\n const videoTrack = stream.getVideoTracks()[0];\n // publish to room\n const pub = yield this.room.localParticipant.publishTrack(videoTrack, {\n simulcast: false,\n degradationPreference: 'maintain-resolution',\n videoEncoding: {\n maxBitrate: 2000000\n }\n });\n const track = pub.track;\n const protocolStats = {\n protocol,\n packetsLost: 0,\n packetsSent: 0,\n qualityLimitationDurations: {},\n rttTotal: 0,\n jitterTotal: 0,\n bitrateTotal: 0,\n count: 0\n };\n // gather stats once a second\n const interval = setInterval(() => __awaiter(this, void 0, void 0, function* () {\n const stats = yield track.getRTCStatsReport();\n stats === null || stats === void 0 ? void 0 : stats.forEach(stat => {\n if (stat.type === 'outbound-rtp') {\n protocolStats.packetsSent = stat.packetsSent;\n protocolStats.qualityLimitationDurations = stat.qualityLimitationDurations;\n protocolStats.bitrateTotal += stat.targetBitrate;\n protocolStats.count++;\n } else if (stat.type === 'remote-inbound-rtp') {\n protocolStats.packetsLost = stat.packetsLost;\n protocolStats.rttTotal += stat.roundTripTime;\n protocolStats.jitterTotal += stat.jitter;\n }\n });\n }), 1000);\n // wait a bit to gather stats\n yield new Promise(resolve => setTimeout(resolve, TEST_DURATION));\n clearInterval(interval);\n videoTrack.stop();\n canvas.remove();\n yield this.disconnect();\n return protocolStats;\n });\n }\n}\n\nclass PublishAudioCheck extends Checker {\n get description() {\n return 'Can publish audio';\n }\n perform() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const room = yield this.connect();\n const track = yield createLocalAudioTrack();\n const trackIsSilent = yield detectSilence(track, 1000);\n if (trackIsSilent) {\n throw new Error('unable to detect audio from microphone');\n }\n this.appendMessage('detected audio from microphone');\n room.localParticipant.publishTrack(track);\n // wait for a few seconds to publish\n yield new Promise(resolve => setTimeout(resolve, 3000));\n // verify RTC stats that it's publishing\n const stats = yield (_a = track.sender) === null || _a === void 0 ? void 0 : _a.getStats();\n if (!stats) {\n throw new Error('Could not get RTCStats');\n }\n let numPackets = 0;\n stats.forEach(stat => {\n if (stat.type === 'outbound-rtp' && (stat.kind === 'audio' || !stat.kind && stat.mediaType === 'audio')) {\n numPackets = stat.packetsSent;\n }\n });\n if (numPackets === 0) {\n throw new Error('Could not determine packets are sent');\n }\n this.appendMessage(\"published \".concat(numPackets, \" audio packets\"));\n });\n }\n}\n\nclass PublishVideoCheck extends Checker {\n get description() {\n return 'Can publish video';\n }\n perform() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const room = yield this.connect();\n const track = yield createLocalVideoTrack();\n // check if we have video from camera\n yield this.checkForVideo(track.mediaStreamTrack);\n room.localParticipant.publishTrack(track);\n // wait for a few seconds to publish\n yield new Promise(resolve => setTimeout(resolve, 5000));\n // verify RTC stats that it's publishing\n const stats = yield (_a = track.sender) === null || _a === void 0 ? void 0 : _a.getStats();\n if (!stats) {\n throw new Error('Could not get RTCStats');\n }\n let numPackets = 0;\n stats.forEach(stat => {\n if (stat.type === 'outbound-rtp' && (stat.kind === 'video' || !stat.kind && stat.mediaType === 'video')) {\n numPackets += stat.packetsSent;\n }\n });\n if (numPackets === 0) {\n throw new Error('Could not determine packets are sent');\n }\n this.appendMessage(\"published \".concat(numPackets, \" video packets\"));\n });\n }\n checkForVideo(track) {\n return __awaiter(this, void 0, void 0, function* () {\n const stream = new MediaStream();\n stream.addTrack(track.clone());\n // Create video element to check frames\n const video = document.createElement('video');\n video.srcObject = stream;\n video.muted = true;\n yield new Promise(resolve => {\n video.onplay = () => {\n setTimeout(() => {\n var _a, _b, _c, _d;\n const canvas = document.createElement('canvas');\n const settings = track.getSettings();\n const width = (_b = (_a = settings.width) !== null && _a !== void 0 ? _a : video.videoWidth) !== null && _b !== void 0 ? _b : 1280;\n const height = (_d = (_c = settings.height) !== null && _c !== void 0 ? _c : video.videoHeight) !== null && _d !== void 0 ? _d : 720;\n canvas.width = width;\n canvas.height = height;\n const ctx = canvas.getContext('2d');\n // Draw video frame to canvas\n ctx.drawImage(video, 0, 0);\n // Get image data and check if all pixels are black\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\n const data = imageData.data;\n let isAllBlack = true;\n for (let i = 0; i < data.length; i += 4) {\n if (data[i] !== 0 || data[i + 1] !== 0 || data[i + 2] !== 0) {\n isAllBlack = false;\n break;\n }\n }\n if (isAllBlack) {\n this.appendError('camera appears to be producing only black frames');\n } else {\n this.appendMessage('received video frames');\n }\n resolve();\n }, 1000);\n };\n video.play();\n });\n stream.getTracks().forEach(t => t.stop());\n video.remove();\n });\n }\n}\n\nclass ReconnectCheck extends Checker {\n get description() {\n return 'Resuming connection after interruption';\n }\n perform() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const room = yield this.connect();\n let reconnectingTriggered = false;\n let reconnected = false;\n let reconnectResolver;\n const reconnectTimeout = new Promise(resolve => {\n setTimeout(resolve, 5000);\n reconnectResolver = resolve;\n });\n const handleReconnecting = () => {\n reconnectingTriggered = true;\n };\n room.on(RoomEvent.SignalReconnecting, handleReconnecting).on(RoomEvent.Reconnecting, handleReconnecting).on(RoomEvent.Reconnected, () => {\n reconnected = true;\n reconnectResolver(true);\n });\n (_a = room.engine.client.ws) === null || _a === void 0 ? void 0 : _a.close();\n const onClose = room.engine.client.onClose;\n if (onClose) {\n onClose('');\n }\n yield reconnectTimeout;\n if (!reconnectingTriggered) {\n throw new Error('Did not attempt to reconnect');\n } else if (!reconnected || room.state !== ConnectionState.Connected) {\n this.appendWarning('reconnection is only possible in Redis-based configurations');\n throw new Error('Not able to reconnect');\n }\n });\n }\n}\n\nclass TURNCheck extends Checker {\n get description() {\n return 'Can connect via TURN';\n }\n perform() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b;\n const signalClient = new SignalClient();\n const joinRes = yield signalClient.join(this.url, this.token, {\n autoSubscribe: true,\n maxRetries: 0,\n e2eeEnabled: false,\n websocketTimeout: 15000\n });\n let hasTLS = false;\n let hasTURN = false;\n let hasSTUN = false;\n for (let iceServer of joinRes.iceServers) {\n for (let url of iceServer.urls) {\n if (url.startsWith('turn:')) {\n hasTURN = true;\n hasSTUN = true;\n } else if (url.startsWith('turns:')) {\n hasTURN = true;\n hasSTUN = true;\n hasTLS = true;\n }\n if (url.startsWith('stun:')) {\n hasSTUN = true;\n }\n }\n }\n if (!hasSTUN) {\n this.appendWarning('No STUN servers configured on server side.');\n } else if (hasTURN && !hasTLS) {\n this.appendWarning('TURN is configured server side, but TURN/TLS is unavailable.');\n }\n yield signalClient.close();\n if (((_b = (_a = this.connectOptions) === null || _a === void 0 ? void 0 : _a.rtcConfig) === null || _b === void 0 ? void 0 : _b.iceServers) || hasTURN) {\n yield this.room.connect(this.url, this.token, {\n rtcConfig: {\n iceTransportPolicy: 'relay'\n }\n });\n } else {\n this.appendWarning('No TURN servers configured.');\n this.skip();\n yield new Promise(resolve => setTimeout(resolve, 0));\n }\n });\n }\n}\n\nclass WebRTCCheck extends Checker {\n get description() {\n return 'Establishing WebRTC connection';\n }\n perform() {\n return __awaiter(this, void 0, void 0, function* () {\n let hasTcp = false;\n let hasIpv4Udp = false;\n this.room.on(RoomEvent.SignalConnected, () => {\n const prevTrickle = this.room.engine.client.onTrickle;\n this.room.engine.client.onTrickle = (sd, target) => {\n if (sd.candidate) {\n const candidate = new RTCIceCandidate(sd);\n let str = \"\".concat(candidate.protocol, \" \").concat(candidate.address, \":\").concat(candidate.port, \" \").concat(candidate.type);\n if (candidate.address) {\n if (isIPPrivate(candidate.address)) {\n str += ' (private)';\n } else {\n if (candidate.protocol === 'tcp' && candidate.tcpType === 'passive') {\n hasTcp = true;\n str += ' (passive)';\n } else if (candidate.protocol === 'udp') {\n hasIpv4Udp = true;\n }\n }\n }\n this.appendMessage(str);\n }\n if (prevTrickle) {\n prevTrickle(sd, target);\n }\n };\n if (this.room.engine.pcManager) {\n this.room.engine.pcManager.subscriber.onIceCandidateError = ev => {\n if (ev instanceof RTCPeerConnectionIceErrorEvent) {\n this.appendWarning(\"error with ICE candidate: \".concat(ev.errorCode, \" \").concat(ev.errorText, \" \").concat(ev.url));\n }\n };\n }\n });\n try {\n yield this.connect();\n livekitLogger.info('now the room is connected');\n } catch (err) {\n this.appendWarning('ports need to be open on firewall in order to connect.');\n throw err;\n }\n if (!hasTcp) {\n this.appendWarning('Server is not configured for ICE/TCP');\n }\n if (!hasIpv4Udp) {\n this.appendWarning('No public IPv4 UDP candidates were found. Your server is likely not configured correctly');\n }\n });\n }\n}\nfunction isIPPrivate(address) {\n const parts = address.split('.');\n if (parts.length === 4) {\n if (parts[0] === '10') {\n return true;\n } else if (parts[0] === '192' && parts[1] === '168') {\n return true;\n } else if (parts[0] === '172') {\n const second = parseInt(parts[1], 10);\n if (second >= 16 && second <= 31) {\n return true;\n }\n }\n }\n return false;\n}\n\nclass WebSocketCheck extends Checker {\n get description() {\n return 'Connecting to signal connection via WebSocket';\n }\n perform() {\n return __awaiter(this, void 0, void 0, function* () {\n var _a, _b, _c;\n if (this.url.startsWith('ws:') || this.url.startsWith('http:')) {\n this.appendWarning('Server is insecure, clients may block connections to it');\n }\n let signalClient = new SignalClient();\n const joinRes = yield signalClient.join(this.url, this.token, {\n autoSubscribe: true,\n maxRetries: 0,\n e2eeEnabled: false,\n websocketTimeout: 15000\n });\n this.appendMessage(\"Connected to server, version \".concat(joinRes.serverVersion, \".\"));\n if (((_a = joinRes.serverInfo) === null || _a === void 0 ? void 0 : _a.edition) === ServerInfo_Edition.Cloud && ((_b = joinRes.serverInfo) === null || _b === void 0 ? void 0 : _b.region)) {\n this.appendMessage(\"LiveKit Cloud: \".concat((_c = joinRes.serverInfo) === null || _c === void 0 ? void 0 : _c.region));\n }\n yield signalClient.close();\n });\n }\n}\n\nclass ConnectionCheck extends eventsExports.EventEmitter {\n constructor(url, token) {\n let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n super();\n this.options = {};\n this.checkResults = new Map();\n this.url = url;\n this.token = token;\n this.options = options;\n }\n getNextCheckId() {\n const nextId = this.checkResults.size;\n this.checkResults.set(nextId, {\n logs: [],\n status: CheckStatus.IDLE,\n name: '',\n description: ''\n });\n return nextId;\n }\n updateCheck(checkId, info) {\n this.checkResults.set(checkId, info);\n this.emit('checkUpdate', checkId, info);\n }\n isSuccess() {\n return Array.from(this.checkResults.values()).every(r => r.status !== CheckStatus.FAILED);\n }\n getResults() {\n return Array.from(this.checkResults.values());\n }\n createAndRunCheck(check) {\n return __awaiter(this, void 0, void 0, function* () {\n const checkId = this.getNextCheckId();\n const test = new check(this.url, this.token, this.options);\n const handleUpdate = info => {\n this.updateCheck(checkId, info);\n };\n test.on('update', handleUpdate);\n const result = yield test.run();\n test.off('update', handleUpdate);\n return result;\n });\n }\n checkWebsocket() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.createAndRunCheck(WebSocketCheck);\n });\n }\n checkWebRTC() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.createAndRunCheck(WebRTCCheck);\n });\n }\n checkTURN() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.createAndRunCheck(TURNCheck);\n });\n }\n checkReconnect() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.createAndRunCheck(ReconnectCheck);\n });\n }\n checkPublishAudio() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.createAndRunCheck(PublishAudioCheck);\n });\n }\n checkPublishVideo() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.createAndRunCheck(PublishVideoCheck);\n });\n }\n checkConnectionProtocol() {\n return __awaiter(this, void 0, void 0, function* () {\n const info = yield this.createAndRunCheck(ConnectionProtocolCheck);\n if (info.data && 'protocol' in info.data) {\n const stats = info.data;\n this.options.protocol = stats.protocol;\n }\n return info;\n });\n }\n checkCloudRegion() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.createAndRunCheck(CloudRegionCheck);\n });\n }\n}\n\n/**\n * Try to analyze the local track to determine the facing mode of a track.\n *\n * @remarks\n * There is no property supported by all browsers to detect whether a video track originated from a user- or environment-facing camera device.\n * For this reason, we use the `facingMode` property when available, but will fall back on a string-based analysis of the device label to determine the facing mode.\n * If both methods fail, the default facing mode will be used.\n *\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode | MDN docs on facingMode}\n * @experimental\n */\nfunction facingModeFromLocalTrack(localTrack) {\n let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var _a;\n const track = isLocalTrack(localTrack) ? localTrack.mediaStreamTrack : localTrack;\n const trackSettings = track.getSettings();\n let result = {\n facingMode: (_a = options.defaultFacingMode) !== null && _a !== void 0 ? _a : 'user',\n confidence: 'low'\n };\n // 1. Try to get facingMode from track settings.\n if ('facingMode' in trackSettings) {\n const rawFacingMode = trackSettings.facingMode;\n livekitLogger.trace('rawFacingMode', {\n rawFacingMode\n });\n if (rawFacingMode && typeof rawFacingMode === 'string' && isFacingModeValue(rawFacingMode)) {\n result = {\n facingMode: rawFacingMode,\n confidence: 'high'\n };\n }\n }\n // 2. If we don't have a high confidence we try to get the facing mode from the device label.\n if (['low', 'medium'].includes(result.confidence)) {\n livekitLogger.trace(\"Try to get facing mode from device label: (\".concat(track.label, \")\"));\n const labelAnalysisResult = facingModeFromDeviceLabel(track.label);\n if (labelAnalysisResult !== undefined) {\n result = labelAnalysisResult;\n }\n }\n return result;\n}\nconst knownDeviceLabels = new Map([['obs virtual camera', {\n facingMode: 'environment',\n confidence: 'medium'\n}]]);\nconst knownDeviceLabelSections = new Map([['iphone', {\n facingMode: 'environment',\n confidence: 'medium'\n}], ['ipad', {\n facingMode: 'environment',\n confidence: 'medium'\n}]]);\n/**\n * Attempt to analyze the device label to determine the facing mode.\n *\n * @experimental\n */\nfunction facingModeFromDeviceLabel(deviceLabel) {\n var _a;\n const label = deviceLabel.trim().toLowerCase();\n // Empty string is a valid device label but we can't infer anything from it.\n if (label === '') {\n return undefined;\n }\n // Can we match against widely known device labels.\n if (knownDeviceLabels.has(label)) {\n return knownDeviceLabels.get(label);\n }\n // Can we match against sections of the device label.\n return (_a = Array.from(knownDeviceLabelSections.entries()).find(_ref => {\n let [section] = _ref;\n return label.includes(section);\n })) === null || _a === void 0 ? void 0 : _a[1];\n}\nfunction isFacingModeValue(item) {\n const allowedValues = ['user', 'environment', 'left', 'right'];\n return item === undefined || allowedValues.includes(item);\n}\n\nexport { AudioPresets, BackupCodecPolicy, BaseKeyProvider, CheckStatus, Checker, ConnectionCheck, ConnectionError, ConnectionErrorReason, ConnectionQuality, ConnectionState, CriticalTimers, CryptorError, CryptorErrorReason, CryptorEvent, DataPacket_Kind, DefaultReconnectPolicy, DeviceUnsupportedError, DisconnectReason, EncryptionEvent, EngineEvent, ExternalE2EEKeyProvider, KeyHandlerEvent, KeyProviderEvent, LivekitError, LocalAudioTrack, LocalParticipant, LocalTrack, LocalTrackPublication, LocalTrackRecorder, LocalVideoTrack, LogLevel, LoggerNames, MediaDeviceFailure, _ as Mutex, NegotiationError, Participant, ParticipantEvent, ParticipantInfo_Kind as ParticipantKind, PublishDataError, PublishTrackError, RemoteAudioTrack, RemoteParticipant, RemoteTrack, RemoteTrackPublication, RemoteVideoTrack, Room, RoomEvent, RpcError, ScreenSharePresets, SignalRequestError, SubscriptionError, Track, TrackEvent, TrackInvalidError, TrackPublication, TrackType, UnexpectedConnectionState, UnsupportedServer, VideoPreset, VideoPresets, VideoPresets43, VideoQuality, attachToElement, attributeTypings as attributes, compareVersions, createAudioAnalyser, createE2EEKey, createKeyMaterialFromBuffer, createKeyMaterialFromString, createLocalAudioTrack, createLocalScreenTracks, createLocalTracks, createLocalVideoTrack, deriveKeys, detachTrack, facingModeFromDeviceLabel, facingModeFromLocalTrack, getBrowser, getEmptyAudioStreamTrack, getEmptyVideoStreamTrack, getLogger, importKey, isAudioTrack, isBackupCodec, isBrowserSupported, isE2EESupported, isInsertableStreamSupported, isLocalParticipant, isLocalTrack, isRemoteParticipant, isRemoteTrack, isScriptTransformSupported, isVideoFrame, isVideoTrack, needsRbspUnescaping, parseRbsp, protocolVersion, ratchet, setLogExtension, setLogLevel, supportsAV1, supportsAdaptiveStream, supportsDynacast, supportsVP9, version, videoCodecs, writeRbsp };\n//# sourceMappingURL=livekit-client.esm.mjs.map\n","/**\n * LiveKitAnalytics - Advanced analytics engine for voice agent communication\n *\n * This class provides comprehensive real-time analytics for voice agent conversations,\n * collecting and processing WebRTC statistics, performance metrics, audio quality data,\n * and connection health information. It serves as the analytics backbone for monitoring\n * call quality, user engagement, and system performance.\n *\n * Key features:\n * - Real-time WebRTC statistics collection and processing\n * - Connection quality monitoring with automatic quality assessment\n * - Audio level tracking and speaking time analytics\n * - Performance metrics including response times and latency measurements\n * - Periodic analytics updates with configurable intervals\n * - Event-driven architecture for real-time monitoring dashboards\n * - Automatic cleanup and resource management\n *\n * Analytics Categories:\n *\n * **Connection Analytics:**\n * - Network latency and jitter measurements\n * - Packet loss detection and monitoring\n * - Connection quality assessment (excellent/good/poor/lost)\n * - Bandwidth utilization tracking\n * - Connection attempt and reconnection statistics\n *\n * **Audio Analytics:**\n * - Real-time audio level monitoring for user and agent\n * - Speaking time tracking for conversation analysis\n * - Audio dropout detection and counting\n * - Echo cancellation status monitoring\n * - Voice activity detection and timing\n *\n * **Performance Analytics:**\n * - Response time measurements for agent interactions\n * - Call duration tracking with millisecond precision\n * - Connection establishment time monitoring\n * - Reconnection frequency and success rates\n * - Network latency impact on call quality\n *\n * **Usage Patterns:**\n *\n * @example Real-time Quality Monitoring\n * ```typescript\n * const analytics = new LiveKitAnalytics();\n *\n * // Listen for quality changes\n * analytics.on('connectionQualityChanged', ({ quality, metrics }) => {\n * if (quality === 'poor') {\n * showNetworkWarning(metrics);\n * logQualityIssue(metrics);\n * }\n * });\n *\n * // Monitor periodic updates\n * analytics.on('analyticsUpdated', (data) => {\n * updateDashboard({\n * latency: data.connectionStats.latency,\n * audioLevels: data.audioMetrics,\n * callDuration: data.performanceMetrics.callDuration\n * });\n * });\n *\n * // Start collection\n * analytics.setRoom(liveKitRoom);\n * analytics.setConnectionState(true, Date.now());\n * analytics.startAnalyticsCollection();\n * ```\n *\n * @example Analytics Dashboard Integration\n * ```typescript\n * // Get comprehensive analytics snapshot\n * const fullAnalytics = analytics.getCallAnalytics(\n * participants,\n * trackStats,\n * currentVolume,\n * isPaused\n * );\n *\n * // Send to analytics service\n * analyticsService.recordCall({\n * sessionId: generateSessionId(),\n * timestamp: Date.now(),\n * metrics: fullAnalytics,\n * agentId: currentAgentId\n * });\n *\n * // Real-time metrics display\n * const connectionStats = analytics.getConnectionStats();\n * const audioLevels = analytics.getAudioLevels();\n * const performance = analytics.getPerformanceMetrics();\n *\n * updateUI({\n * quality: connectionStats.quality,\n * latency: connectionStats.latency,\n * userSpeaking: audioLevels.userAudioLevel > 0.1,\n * agentSpeaking: audioLevels.agentAudioLevel > 0.1,\n * callDuration: performance.callDuration\n * });\n * ```\n *\n * @example Quality Issue Detection\n * ```typescript\n * // Monitor for quality degradation\n * analytics.on('connectionQualityChanged', ({ quality, metrics }) => {\n * switch (quality) {\n * case 'poor':\n * notifyUser('Network quality is poor. Consider switching networks.');\n * logMetric('quality_degradation', metrics);\n * break;\n * case 'lost':\n * handleConnectionLoss();\n * attemptReconnection();\n * break;\n * }\n * });\n *\n * // Check for high latency\n * const stats = analytics.getConnectionStats();\n * if (stats.latency > 300) {\n * showLatencyWarning(stats.latency);\n * }\n *\n * // Monitor packet loss\n * if (stats.packetLoss > 5) {\n * reportNetworkIssue('high_packet_loss', stats);\n * }\n * ```\n *\n * Technical Implementation:\n * - Uses LiveKit's native WebRTC statistics when available\n * - Implements fallback quality estimation based on ConnectionQuality enum\n * - Collects analytics every 5 seconds (configurable via ANALYTICS_COLLECTION_INTERVAL)\n * - Maintains real-time audio activity tracking with timestamp precision\n * - Provides thread-safe cleanup and resource management\n * - Emits structured events for easy integration with monitoring systems\n */\n\nimport { EventEmitter } from 'events';\nimport { ConnectionQuality, type Participant, type Room } from 'livekit-client';\nimport type {\n AudioLevelsResult,\n AudioMetrics,\n CallAnalyticsResult,\n CallStats,\n ConnectionMetrics,\n ConnectionQualityData,\n ConnectionStatsResult,\n ParticipantData,\n PerformanceMetrics,\n PerformanceMetricsResult,\n TrackStatsResult,\n} from './types';\n\n// Analytics collection configuration constants\n/** Interval in milliseconds for periodic analytics collection */\nconst ANALYTICS_COLLECTION_INTERVAL = 5000;\n/** Audio level value indicating agent is actively speaking */\nconst AGENT_AUDIO_LEVEL_ON = 1.0;\n\n/**\n * LiveKitAnalytics class extending EventEmitter for real-time analytics\n *\n * Provides comprehensive analytics collection and processing for voice agent\n * conversations, including connection quality, audio metrics, and performance data.\n */\nexport class LiveKitAnalytics extends EventEmitter {\n /** Call-level statistics including connection attempts, packet counts, and quality metrics */\n callStats!: CallStats;\n\n /** Network connection metrics including latency, packet loss, and quality ratings */\n connectionMetrics!: ConnectionMetrics;\n\n /** Audio-related metrics for both user and agent including levels and speaking time */\n audioMetrics!: AudioMetrics;\n\n /** Performance metrics including response times, latency, and call duration data */\n performanceMetrics!: PerformanceMetrics;\n\n /** Timer handle for periodic analytics collection, null when not collecting */\n analyticsInterval: NodeJS.Timeout | null = null;\n\n /** Timestamp when agent started speaking for calculating speaking duration */\n lastAgentSpeakStart: number | null = null;\n\n /** Timestamp when user started speaking for calculating speaking duration */\n lastUserSpeakStart: number | null = null;\n\n /** Unix timestamp when the call/session started for duration calculations */\n callStartTime: number | null = null;\n\n /** Reference to the LiveKit room for accessing WebRTC statistics */\n private room: Room | null = null;\n\n /** Current connection state flag for controlling analytics collection */\n private isConnected = false;\n\n /**\n * Creates a new LiveKitAnalytics instance\n *\n * Initializes all metric structures to default values and prepares\n * the analytics system for data collection. The instance is ready\n * to begin collection once a room reference is provided.\n *\n * @example\n * ```typescript\n * const analytics = new LiveKitAnalytics();\n *\n * // Set up event listeners\n * analytics.on('connectionQualityChanged', handleQualityChange);\n * analytics.on('analyticsUpdated', updateDashboard);\n *\n * // Configure for a specific room\n * analytics.setRoom(liveKitRoom);\n * analytics.setConnectionState(true, Date.now());\n * analytics.startAnalyticsCollection();\n * ```\n */\n constructor() {\n super();\n this.#initializeMetrics();\n }\n\n /**\n * Initializes all metric structures to their default values\n *\n * This private method sets up the initial state for all analytics data structures,\n * ensuring consistent baseline values across connection, audio, and performance metrics.\n * Called during construction and cleanup operations.\n *\n * @private\n */\n #initializeMetrics(): void {\n this.callStats = {\n connectionAttempts: 0,\n reconnectionAttempts: 0,\n totalBytesReceived: 0,\n totalBytesSent: 0,\n packetsLost: 0,\n participantCount: 0,\n trackCount: 0,\n audioLevels: [],\n connectionQuality: 'unknown',\n };\n\n this.connectionMetrics = {\n latency: 0,\n packetLoss: 0,\n bandwidth: 0,\n quality: 'unknown',\n jitter: 0,\n };\n\n this.audioMetrics = {\n userAudioLevel: 0,\n agentAudioLevel: 0,\n userSpeakingTime: 0,\n agentSpeakingTime: 0,\n audioDropouts: 0,\n echoCancellationActive: false,\n };\n\n this.performanceMetrics = {\n responseTime: 0,\n networkLatency: 0,\n connectionEstablishedTime: 0,\n reconnectionCount: 0,\n };\n }\n\n /**\n * Sets the LiveKit room reference for analytics data collection\n *\n * Provides the analytics system with access to the LiveKit room instance\n * for collecting WebRTC statistics and monitoring connection quality.\n * This is typically called by the LiveKitManager when a connection is established.\n *\n * @param room - LiveKit room instance or null to clear the reference\n *\n * @example\n * ```typescript\n * const room = new Room();\n * await room.connect(url, token);\n *\n * analytics.setRoom(room); // Enable analytics collection\n * analytics.setRoom(null); // Disable collection\n * ```\n */\n setRoom(room: Room | null): void {\n this.room = room;\n }\n\n /**\n * Updates the connection state and optionally sets the call start time\n *\n * Controls whether analytics collection is active and records when the\n * call session began for accurate duration calculations. The call start\n * time is used for all performance metrics that depend on session duration.\n *\n * @param isConnected - Whether the connection is currently active\n * @param callStartTime - Unix timestamp when the call started (optional)\n *\n * @example\n * ```typescript\n * // Connection established\n * analytics.setConnectionState(true, Date.now());\n *\n * // Connection lost\n * analytics.setConnectionState(false);\n *\n * // Reconnection successful (preserve original start time)\n * analytics.setConnectionState(true);\n * ```\n */\n setConnectionState(\n isConnected: boolean,\n callStartTime: number | null = null\n ): void {\n this.isConnected = isConnected;\n if (callStartTime) {\n this.callStartTime = callStartTime;\n }\n }\n\n /**\n * Updates connection attempt statistics for reliability tracking\n *\n * Tracks the number of initial connection attempts and reconnection\n * attempts for monitoring connection reliability and user experience.\n * These metrics help identify network stability issues.\n *\n * @param connectionAttempts - Total number of initial connection attempts\n * @param reconnectionAttempts - Total number of reconnection attempts\n *\n * @example\n * ```typescript\n * // After initial connection attempt\n * analytics.updateConnectionStats(1, 0);\n *\n * // After reconnection\n * analytics.updateConnectionStats(1, 1);\n *\n * // Multiple reconnection attempts\n * analytics.updateConnectionStats(1, 3);\n * ```\n */\n updateConnectionStats(\n connectionAttempts: number,\n reconnectionAttempts: number\n ): void {\n this.callStats.connectionAttempts = connectionAttempts;\n this.callStats.reconnectionAttempts = reconnectionAttempts;\n this.performanceMetrics.reconnectionCount = reconnectionAttempts;\n }\n\n /**\n * Updates real-time participant and track counts for session monitoring\n *\n * Tracks the current number of participants in the conversation and\n * active audio/video tracks for capacity monitoring and analytics.\n * These counts are updated whenever participants join/leave or tracks change.\n *\n * @param participantCount - Current number of participants in the room\n * @param trackCount - Current number of active tracks (audio/video streams)\n *\n * @example\n * ```typescript\n * // Initial state: user only\n * analytics.updateCounts(1, 0);\n *\n * // Agent joins with audio track\n * analytics.updateCounts(2, 1);\n *\n * // Additional participant joins\n * analytics.updateCounts(3, 2);\n * ```\n */\n updateCounts(participantCount: number, trackCount: number): void {\n this.callStats.participantCount = participantCount;\n this.callStats.trackCount = trackCount;\n }\n\n /**\n * Records the time taken to establish the WebRTC connection\n *\n * Captures the duration from connection initiation to successful establishment\n * for performance monitoring and optimization. This metric helps identify\n * connection setup bottlenecks and network performance issues.\n *\n * @param time - Time in milliseconds to establish the connection\n *\n * @example\n * ```typescript\n * const startTime = Date.now();\n * await room.connect(url, token);\n * const establishTime = Date.now() - startTime;\n *\n * analytics.setConnectionEstablishedTime(establishTime);\n * ```\n */\n setConnectionEstablishedTime(time: number): void {\n this.performanceMetrics.connectionEstablishedTime = time;\n }\n\n /**\n * Begins periodic analytics data collection and event emission\n *\n * Starts a recurring timer that collects WebRTC statistics, processes metrics,\n * and emits analytics updates every 5 seconds. This enables real-time monitoring\n * dashboards and automated quality detection systems. Automatically stops any\n * existing collection before starting new collection.\n *\n * @example\n * ```typescript\n * // Start collection when connection is established\n * analytics.setRoom(room);\n * analytics.setConnectionState(true, Date.now());\n * analytics.startAnalyticsCollection();\n *\n * // Listen for periodic updates\n * analytics.on('analyticsUpdated', (data) => {\n * updateDashboard(data);\n * checkQualityThresholds(data);\n * });\n * ```\n */\n startAnalyticsCollection(): void {\n if (this.analyticsInterval) {\n this.stopAnalyticsCollection();\n }\n\n this.analyticsInterval = setInterval(() => {\n this.#collectAnalytics();\n }, ANALYTICS_COLLECTION_INTERVAL); // Collect analytics every 5 seconds\n }\n\n /**\n * Stops periodic analytics collection and clears the collection timer\n *\n * Terminates the recurring analytics collection, stopping all periodic\n * data gathering and event emission. This is typically called when\n * disconnecting or when analytics are no longer needed.\n *\n * @example\n * ```typescript\n * // Stop collection when disconnecting\n * analytics.stopAnalyticsCollection();\n *\n * // Or stop temporarily for resource conservation\n * if (backgroundMode) {\n * analytics.stopAnalyticsCollection();\n * }\n * ```\n */\n stopAnalyticsCollection(): void {\n if (this.analyticsInterval) {\n clearInterval(this.analyticsInterval);\n this.analyticsInterval = null;\n }\n }\n\n /**\n * Handles connection quality changes\n */\n handleConnectionQualityChanged(\n quality: ConnectionQuality,\n participant: Participant\n ): void {\n // Use native LiveKit ConnectionQuality enum values directly\n const qualityString = this.#mapConnectionQualityToString(quality);\n this.connectionMetrics.quality = qualityString;\n this.callStats.connectionQuality = qualityString;\n\n // Note: LiveKit native connection stats access would go here\n // but specific engine methods are not available in current version\n\n // Use native ConnectionQuality-based estimates only as fallback\n if (\n !this.connectionMetrics.latency ||\n this.connectionMetrics.latency === 0\n ) {\n const qualityMetrics = this.#getQualityMetrics(quality);\n this.connectionMetrics.latency = qualityMetrics.latency;\n this.connectionMetrics.packetLoss = qualityMetrics.packetLoss;\n this.connectionMetrics.bandwidth = qualityMetrics.bandwidth;\n }\n\n const qualityData: ConnectionQualityData = {\n quality,\n participant: participant.identity || 'unknown',\n metrics: {\n latency: this.connectionMetrics.latency,\n packetLoss: this.connectionMetrics.packetLoss,\n quality: qualityString,\n },\n };\n\n this.emit('connectionQualityChanged', qualityData);\n }\n\n /**\n * Handles audio playback status changes\n */\n handleAudioPlaybackChanged(playing: boolean): void {\n // Update speaking time based on playback status\n const currentTime = Date.now();\n if (playing && !this.audioMetrics.agentAudioLevel) {\n this.lastAgentSpeakStart = currentTime;\n this.audioMetrics.agentAudioLevel = AGENT_AUDIO_LEVEL_ON;\n } else if (!playing && this.audioMetrics.agentAudioLevel > 0) {\n if (this.lastAgentSpeakStart) {\n this.audioMetrics.agentSpeakingTime +=\n currentTime - this.lastAgentSpeakStart;\n }\n this.audioMetrics.agentAudioLevel = 0;\n this.lastAgentSpeakStart = null;\n }\n\n this.emit('audioPlaybackChanged', playing);\n }\n\n /**\n * Gets current connection statistics\n */\n getConnectionStats(): ConnectionStatsResult {\n return {\n latency: this.connectionMetrics.latency,\n packetLoss: this.connectionMetrics.packetLoss,\n bandwidth: this.connectionMetrics.bandwidth,\n quality: this.connectionMetrics.quality,\n jitter: this.connectionMetrics.jitter,\n connectionAttempts: this.callStats.connectionAttempts,\n reconnectionAttempts: this.callStats.reconnectionAttempts,\n connectionEstablishedTime:\n this.performanceMetrics.connectionEstablishedTime,\n isConnected: this.isConnected,\n };\n }\n\n /**\n * Gets current audio levels and metrics\n */\n getAudioLevels(): AudioLevelsResult {\n return {\n userAudioLevel: this.audioMetrics.userAudioLevel,\n agentAudioLevel: this.audioMetrics.agentAudioLevel,\n userSpeakingTime: this.audioMetrics.userSpeakingTime,\n agentSpeakingTime: this.audioMetrics.agentSpeakingTime,\n audioDropouts: this.audioMetrics.audioDropouts,\n echoCancellationActive: this.audioMetrics.echoCancellationActive,\n currentUserLevel: this.audioMetrics.userAudioLevel,\n currentAgentLevel: this.audioMetrics.agentAudioLevel,\n };\n }\n\n /**\n * Gets current performance metrics\n */\n getPerformanceMetrics(): PerformanceMetricsResult {\n const callDuration = this.callStartTime\n ? Date.now() - this.callStartTime\n : 0;\n\n return {\n responseTime: this.performanceMetrics.responseTime,\n networkLatency:\n this.performanceMetrics.networkLatency ||\n this.connectionMetrics.latency,\n connectionEstablishedTime:\n this.performanceMetrics.connectionEstablishedTime,\n reconnectionCount: this.performanceMetrics.reconnectionCount,\n callDuration,\n averageResponseTime: this.performanceMetrics.responseTime, // Could be enhanced with actual averaging\n };\n }\n\n /**\n * Gets comprehensive call analytics\n */\n getCallAnalytics(\n participants: ParticipantData[],\n trackStats: TrackStatsResult,\n volume: number,\n isPaused: boolean\n ): CallAnalyticsResult & { callDuration: number } {\n const performanceMetrics = this.getPerformanceMetrics();\n const audioMetrics = this.getAudioLevels();\n\n return {\n connectionStats: this.getConnectionStats(),\n audioMetrics: {\n ...audioMetrics,\n isPaused,\n volume,\n },\n performanceMetrics,\n participants,\n trackStats,\n callStats: this.callStats,\n metadata: {\n callStartTime: this.callStartTime,\n isConnected: this.isConnected,\n isPaused,\n volume,\n },\n callDuration: performanceMetrics.callDuration,\n };\n }\n\n /**\n * Collects analytics data periodically\n */\n #collectAnalytics(): void {\n if (!(this.room && this.isConnected)) {\n return;\n }\n\n try {\n // Use native WebRTC statistics when available\n // Note: Direct engine.getStats() not available in current LiveKit version\n // WebRTC stats processing would be handled through LiveKit's event system\n\n // Update connection quality from LiveKit's native monitoring\n if (this.room?.localParticipant) {\n const quality = this.room.localParticipant.connectionQuality;\n if (quality) {\n const qualityString = this.#mapConnectionQualityToString(quality);\n this.connectionMetrics.quality = qualityString;\n this.callStats.connectionQuality = qualityString;\n }\n }\n\n // Update participant data with latest LiveKit information\n for (const _participant of this.room?.remoteParticipants?.values() ||\n []) {\n // This would be handled by the connection module\n // Just track metadata updates here if needed\n }\n\n // Emit periodic analytics update with call duration\n const performanceMetrics = this.getPerformanceMetrics();\n this.emit('analyticsUpdated', {\n connectionStats: this.getConnectionStats(),\n audioMetrics: this.getAudioLevels(),\n performanceMetrics,\n callDuration: performanceMetrics.callDuration,\n });\n } catch {\n // Ignore analytics collection errors\n }\n }\n\n /**\n * Maps LiveKit ConnectionQuality enum to string\n */\n #mapConnectionQualityToString(quality: ConnectionQuality): string {\n switch (quality) {\n case ConnectionQuality.Excellent:\n return 'excellent';\n case ConnectionQuality.Good:\n return 'good';\n case ConnectionQuality.Poor:\n return 'poor';\n default:\n return 'lost';\n }\n }\n\n /**\n * Gets metrics based on LiveKit ConnectionQuality\n */\n #getQualityMetrics(quality: ConnectionQuality): {\n latency: number;\n packetLoss: number;\n bandwidth: number;\n } {\n switch (quality) {\n case ConnectionQuality.Excellent:\n return { latency: 10, packetLoss: 0, bandwidth: 1_000_000 };\n case ConnectionQuality.Good:\n return { latency: 50, packetLoss: 0.1, bandwidth: 500_000 };\n case ConnectionQuality.Poor:\n return { latency: 200, packetLoss: 1, bandwidth: 100_000 };\n default:\n return { latency: 1000, packetLoss: 10, bandwidth: 0 };\n }\n }\n\n /**\n * Cleans up analytics resources\n */\n cleanup(): void {\n this.stopAnalyticsCollection();\n this.#initializeMetrics();\n this.lastAgentSpeakStart = null;\n this.lastUserSpeakStart = null;\n }\n}\n","/**\n * LiveKitAudioManager - Advanced audio stream management for voice agent communication\n *\n * This class provides comprehensive management of audio streams, tracks, and playback\n * for voice agent conversations. It handles the complex WebRTC audio pipeline including\n * track subscription/unsubscription, HTML audio element management, volume control,\n * and real-time audio activity detection.\n *\n * Key Features:\n * - **Smart Track Management**: Automatic handling of audio track lifecycle\n * - **Dynamic Volume Control**: Real-time volume adjustment across all audio streams\n * - **Audio Activity Detection**: Speaking/listening state detection with events\n * - **Performance Monitoring**: Comprehensive track statistics and analytics\n * - **Robust Error Handling**: Graceful handling of audio playback issues\n * - **Memory Management**: Automatic cleanup of audio resources and DOM elements\n * - **Cross-browser Compatibility**: Works across modern browsers with WebRTC support\n *\n * Audio Pipeline Flow:\n * 1. **Track Subscription**: Incoming audio tracks from voice agents\n * 2. **Element Creation**: HTML audio elements for each track\n * 3. **Volume Application**: Consistent volume across all streams\n * 4. **Activity Monitoring**: Real-time speaking/listening detection\n * 5. **Statistics Collection**: Performance and quality metrics\n * 6. **Cleanup Management**: Proper resource disposal\n *\n * @example Basic Audio Management\n * ```typescript\n * const audioManager = new LiveKitAudioManager();\n *\n * // Set up audio event listeners\n * audioManager.on('trackSubscribed', ({ track, participant }) => {\n * console.log(`Audio track from ${participant} is now playing`);\n * showAudioIndicator(participant);\n * });\n *\n * audioManager.on('trackUnsubscribed', ({ participant }) => {\n * console.log(`Audio track from ${participant} stopped`);\n * hideAudioIndicator(participant);\n * });\n *\n * audioManager.on('speaking', () => {\n * showAgentSpeakingIndicator();\n * });\n *\n * audioManager.on('listening', () => {\n * hideAgentSpeakingIndicator();\n * });\n *\n * // Control volume\n * audioManager.setVolume(0.8);\n * ```\n *\n * @example Volume Control Integration\n * ```typescript\n * // Volume slider integration\n * const volumeSlider = document.getElementById('volume');\n * volumeSlider.addEventListener('input', (e) => {\n * const volume = parseFloat(e.target.value);\n * audioManager.setVolume(volume);\n * });\n *\n * // Listen for volume changes\n * audioManager.on('volumeChanged', (newVolume) => {\n * volumeSlider.value = newVolume.toString();\n * updateVolumeDisplay(newVolume);\n * });\n *\n * // Mute/unmute functionality\n * muteButton.addEventListener('click', () => {\n * const currentVolume = audioManager.volume;\n * audioManager.setVolume(currentVolume > 0 ? 0 : 0.8);\n * });\n * ```\n *\n * @example Audio Statistics Monitoring\n * ```typescript\n * // Monitor audio track statistics\n * const stats = audioManager.getTrackStats();\n * console.log(`Active tracks: ${stats.activeTracks}`);\n * console.log(`Audio elements: ${stats.audioElements}`);\n *\n * // Inspect individual track details\n * stats.trackDetails.forEach(([trackId, data]) => {\n * console.log(`Track ${trackId}:`);\n * console.log(` Participant: ${data.participant}`);\n * console.log(` Source: ${data.source}`);\n * console.log(` Muted: ${data.muted}`);\n * console.log(` Subscription time: ${new Date(data.subscriptionTime)}`);\n * });\n *\n * // Check for audio issues\n * if (stats.activeTracks === 0 && expectedAgentPresent) {\n * console.warn('No active audio tracks - agent may not be speaking');\n * showAudioTroubleshootingHint();\n * }\n * ```\n *\n * @example Conversation Flow Control\n * ```typescript\n * // Pause audio during interruptions\n * phoneRinging.addEventListener('ring', () => {\n * audioManager.pauseAllAudio();\n * showPausedIndicator();\n * });\n *\n * // Resume when ready\n * phoneRinging.addEventListener('end', () => {\n * audioManager.resumeAllAudio();\n * hidePausedIndicator();\n * });\n *\n * // Handle page visibility changes\n * document.addEventListener('visibilitychange', () => {\n * if (document.hidden) {\n * audioManager.pauseAllAudio();\n * } else {\n * audioManager.resumeAllAudio();\n * }\n * });\n * ```\n *\n * @example Error Handling\n * ```typescript\n * audioManager.on('error', (error) => {\n * console.error('Audio error:', error.message);\n *\n * if (error.message.includes('volume')) {\n * showVolumeError();\n * } else if (error.message.includes('track')) {\n * handleTrackError();\n * // Audio manager will automatically retry\n * }\n * });\n *\n * // Monitor for audio playback issues\n * audioManager.on('trackSubscribed', ({ track }) => {\n * // Set up timeout to detect audio playback issues\n * setTimeout(() => {\n * const stats = audioManager.getTrackStats();\n * if (stats.audioElements === 0) {\n * console.warn('Audio elements not created - possible browser restriction');\n * promptUserInteraction();\n * }\n * }, 1000);\n * });\n * ```\n *\n * Technical Implementation:\n * - Uses native HTML5 audio elements for cross-browser compatibility\n * - Implements automatic volume normalization across all tracks\n * - Provides real-time audio activity detection through DOM events\n * - Maintains comprehensive track metadata for analytics\n * - Includes robust error handling for browser audio restrictions\n * - Manages DOM element lifecycle to prevent memory leaks\n */\n\nimport { EventEmitter } from 'events';\nimport {\n type RemoteParticipant,\n type RemoteTrack,\n type RemoteTrackPublication,\n type Room,\n Track,\n} from 'livekit-client';\nimport type {\n MinimalAnalyser,\n MinimalAudioContext,\n MinimalAudioNode,\n TrackStatsData,\n TrackStatsResult,\n TrackSubscriptionData,\n TrackUnsubscriptionData,\n} from './types';\n\n// Audio management configuration constants\n/** Maximum allowed volume level */\nconst MAX_VOLUME = 1.0;\n/** Minimum allowed volume level (muted) */\nconst MIN_VOLUME = 0.0;\n/** Default volume level when value is invalid */\nconst DEFAULT_VOLUME = 0.0;\n/** FFT size for analysers */\nconst ANALYSER_FFT_SIZE = 256;\n/** Max byte value for frequency bins */\nconst BYTE_MAX = 255;\n\n/**\n * LiveKitAudioManager class for comprehensive audio stream management\n *\n * Extends EventEmitter to provide real-time audio event notifications and\n * enable reactive audio management in voice agent applications.\n */\nexport class LiveKitAudioManager extends EventEmitter {\n /** Set of active HTML audio elements currently playing agent audio */\n audioElements: Set<HTMLAudioElement> = new Set();\n\n /** Map of track statistics and metadata for analytics and monitoring */\n trackStats: Map<string, TrackStatsData> = new Map();\n\n /** Current volume level for all audio playback (0.0 to 1.0) */\n volume = 1.0;\n\n /** Reference to LiveKit room for device/mic control (set by manager) */\n private room: Room | null = null;\n\n /** Optional WebAudio context and analysers (reserved for future use) */\n // biome-ignore lint/style/useReadonlyClassProperties: These are reassigned during analyser initialization\n private audioContext: MinimalAudioContext | null = null;\n // biome-ignore lint/style/useReadonlyClassProperties: These are reassigned during analyser initialization\n private inputAnalyser: MinimalAnalyser | null = null;\n // biome-ignore lint/style/useReadonlyClassProperties: These are reassigned during analyser initialization\n private outputAnalyser: MinimalAnalyser | null = null;\n\n /**\n * Provides the LiveKit Room to the audio manager for microphone control.\n */\n setRoom(room: Room | null): void {\n this.room = room;\n }\n\n /**\n * Adjusts the volume level for all active audio streams\n *\n * Sets the playback volume for all currently active audio elements and\n * automatically applies the same volume to any new audio tracks that\n * are subscribed in the future. Volume is normalized to ensure it stays\n * within valid bounds and handles invalid input gracefully.\n *\n * @param volume - Desired volume level (0.0 = muted, 1.0 = full volume)\n *\n * @fires volumeChanged When volume is successfully changed\n * @fires error When volume setting fails\n *\n * @example\n * ```typescript\n * // Set to half volume\n * audioManager.setVolume(0.5);\n *\n * // Mute all audio\n * audioManager.setVolume(0);\n *\n * // Set to maximum volume\n * audioManager.setVolume(1.0);\n *\n * // Listen for volume changes\n * audioManager.on('volumeChanged', (newVolume) => {\n * console.log(`Volume changed to ${newVolume * 100}%`);\n * updateVolumeSlider(newVolume);\n * });\n *\n * // Handle volume errors\n * audioManager.on('error', (error) => {\n * if (error.message.includes('volume')) {\n * console.error('Failed to change volume:', error.message);\n * }\n * });\n * ```\n */\n setVolume(volume: number): void {\n try {\n // Normalize and validate volume input\n const numVolume = Number(volume);\n if (Number.isFinite(numVolume)) {\n this.volume = Math.min(MAX_VOLUME, Math.max(MIN_VOLUME, numVolume));\n } else {\n this.volume = DEFAULT_VOLUME;\n }\n\n // Apply the new volume to all existing audio elements\n for (const audioElement of this.audioElements) {\n if (audioElement && typeof audioElement.volume !== 'undefined') {\n audioElement.volume = this.volume;\n }\n }\n\n // Notify listeners of the volume change\n this.emit('volumeChanged', this.volume);\n } catch (error) {\n this.emit(\n 'error',\n new Error(\n `Failed to set volume: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n }\n\n /**\n * Gets the current output volume level\n *\n * Returns the current volume setting for audio playback (agent voice output).\n * This is the same value set by setVolume() and represents the playback volume\n * for all voice agent audio streams.\n *\n * @returns Current output volume level (0.0 = muted, 1.0 = full volume)\n *\n * @example\n * ```typescript\n * const currentVolume = audioManager.getOutputVolume();\n * console.log(`Current volume: ${Math.round(currentVolume * 100)}%`);\n *\n * // Check if muted\n * if (currentVolume === 0) {\n * console.log('Audio is muted');\n * }\n *\n * // Create volume indicator\n * const volumeBars = Math.round(currentVolume * 5);\n * console.log('Volume: ' + '█'.repeat(volumeBars) + '░'.repeat(5 - volumeBars));\n * ```\n */\n getOutputVolume(): number {\n return this.volume;\n }\n\n /**\n * Gets the current input volume level from the user's microphone\n *\n * Returns the current microphone input level as detected by the audio context.\n * This represents the user's voice input strength and can be used for visual\n * feedback like voice activity indicators or input level meters.\n *\n * Note: This requires an active audio context and microphone stream.\n * Returns 0.0 if no microphone access or audio context is unavailable.\n *\n * @returns Current input volume level (0.0 = no input, 1.0 = maximum input)\n *\n * @example\n * ```typescript\n * // Show user voice activity\n * setInterval(() => {\n * const inputLevel = audioManager.getInputVolume();\n * const percentage = Math.round(inputLevel * 100);\n * updateMicrophoneIndicator(percentage);\n *\n * // Detect if user is speaking\n * if (inputLevel > 0.1) {\n * showUserSpeakingIndicator();\n * } else {\n * hideUserSpeakingIndicator();\n * }\n * }, 100);\n * ```\n */\n getInputVolume(): number {\n try {\n // Lazily initialize input analyser\n if (!this.inputAnalyser) {\n this.#initializeInputAnalyser();\n }\n\n if (!this.inputAnalyser) {\n return MIN_VOLUME;\n }\n\n const binCount = this.inputAnalyser.frequencyBinCount;\n const dataArray = new Uint8Array(binCount);\n this.inputAnalyser.getByteFrequencyData(dataArray);\n if (dataArray.length === 0) {\n return MIN_VOLUME;\n }\n let sum = 0;\n for (const v of dataArray) {\n sum += v;\n }\n const avg = sum / (dataArray.length * BYTE_MAX);\n // Clamp 0..1\n return Math.max(MIN_VOLUME, Math.min(MAX_VOLUME, avg));\n } catch {\n return MIN_VOLUME;\n }\n }\n\n /**\n * Mutes or unmutes the user's microphone\n *\n * Controls the user's microphone input to the voice agent conversation.\n * When muted, the user's voice will not be transmitted to the agent.\n * This is useful for temporary muting during interruptions or background noise.\n *\n * @param muted - True to mute microphone, false to unmute\n *\n * @fires micMuted When microphone is successfully muted\n * @fires micUnmuted When microphone is successfully unmuted\n * @fires error When microphone control fails\n *\n * @example\n * ```typescript\n * // Mute microphone\n * audioManager.setMicMuted(true);\n *\n * // Unmute microphone\n * audioManager.setMicMuted(false);\n *\n * // Toggle microphone state\n * const currentMuted = audioManager.isMicMuted();\n * audioManager.setMicMuted(!currentMuted);\n *\n * // Listen for mute events\n * audioManager.on('micMuted', () => {\n * showMutedIndicator();\n * });\n *\n * audioManager.on('micUnmuted', () => {\n * hideMutedIndicator();\n * });\n * ```\n */\n setMicMuted(muted: boolean): void {\n try {\n // If room is available, control the local participant microphone\n if (this.room?.localParticipant) {\n // LiveKit API: setMicrophoneEnabled(true) means unmuted\n const enable = !muted;\n const maybePromise =\n this.room.localParticipant.setMicrophoneEnabled(enable);\n // Handle promise-returning implementations\n if (\n maybePromise &&\n typeof (maybePromise as Promise<void>).then === 'function'\n ) {\n (maybePromise as Promise<void>)\n .then(() => {\n this.#emitMicEventSafely(\n muted ? 'micMuted' : 'micUnmuted',\n muted\n );\n })\n .catch((error) => {\n this.#emitMicControlError(muted, error);\n });\n return;\n }\n // Synchronous path\n this.#emitMicEventSafely(muted ? 'micMuted' : 'micUnmuted', muted);\n return;\n }\n\n // Fallback: emit events without LiveKit integration\n this.#emitMicEventSafely(muted ? 'micMuted' : 'micUnmuted', muted);\n } catch (error) {\n this.#emitMicControlError(muted, error);\n }\n }\n\n /**\n * Safely emits mic events and converts internal errors into 'error' events.\n * Prevents exceptions from bubbling to callers.\n */\n #emitMicEventSafely(\n eventName: 'micMuted' | 'micUnmuted',\n muted: boolean\n ): void {\n try {\n this.emit(eventName);\n } catch (error) {\n if (this.listenerCount('error') > 0) {\n this.emit(\n 'error',\n new Error(\n `Failed to ${muted ? 'mute' : 'unmute'} microphone: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n }\n }\n\n /**\n * Checks if the user's microphone is currently muted\n *\n * Returns the current mute state of the user's microphone input.\n * This can be used to display the correct microphone status in the UI.\n *\n * @returns True if microphone is muted, false if unmuted\n *\n * @example\n * ```typescript\n * // Update UI based on microphone state\n * const updateMicButton = () => {\n * const isMuted = audioManager.isMicMuted();\n * const micButton = document.getElementById('micButton');\n * micButton.textContent = isMuted ? '🔇' : '🎤';\n * micButton.classList.toggle('muted', isMuted);\n * };\n *\n * // Check microphone state before important actions\n * if (audioManager.isMicMuted()) {\n * showUnmutePrompt('Please unmute to continue conversation');\n * }\n * ```\n */\n isMicMuted(): boolean {\n // Prefer LiveKit local publication mute state when available\n try {\n let publication: { isMuted?: boolean } | undefined;\n const getter = this.room?.localParticipant?.getTrackPublication as\n | ((arg: unknown) => unknown)\n | undefined;\n if (getter) {\n try {\n publication = getter(Track.Source.Microphone) as\n | { isMuted?: boolean }\n | undefined;\n } catch {\n publication = getter('microphone') as\n | { isMuted?: boolean }\n | undefined;\n }\n }\n if (publication && typeof publication.isMuted === 'boolean') {\n return publication.isMuted;\n }\n } catch {\n // Ignore lookup errors and fall back\n }\n // Fallback when state not determinable\n return false;\n }\n\n /** Emits a standardized error for microphone control failures */\n #emitMicControlError(muted: boolean, error: unknown): void {\n if (this.listenerCount('error') > 0) {\n this.emit(\n 'error',\n new Error(\n `Failed to ${muted ? 'mute' : 'unmute'} microphone: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n }\n\n /**\n * Gets the current input frequency data from the user's microphone\n *\n * Returns frequency domain data for the microphone input as a Uint8Array.\n * This can be used to create audio visualizations, voice activity detection,\n * or advanced audio analysis features.\n *\n * Note: This requires an active audio context and microphone stream.\n * Returns empty array if no microphone access or audio context is unavailable.\n *\n * @returns Uint8Array containing frequency data (0-255 per frequency bin)\n *\n * @example\n * ```typescript\n * // Create audio visualizer\n * const canvas = document.getElementById('audioVisualizer');\n * const ctx = canvas.getContext('2d');\n *\n * function drawVisualizer() {\n * const frequencyData = audioManager.getInputByteFrequencyData();\n *\n * ctx.clearRect(0, 0, canvas.width, canvas.height);\n * const barWidth = canvas.width / frequencyData.length;\n *\n * for (let i = 0; i < frequencyData.length; i++) {\n * const barHeight = (frequencyData[i] / 255) * canvas.height;\n * ctx.fillRect(i * barWidth, canvas.height - barHeight, barWidth, barHeight);\n * }\n *\n * requestAnimationFrame(drawVisualizer);\n * }\n * drawVisualizer();\n * ```\n */\n getInputByteFrequencyData(): Uint8Array {\n try {\n if (!this.inputAnalyser) {\n this.#initializeInputAnalyser();\n }\n if (!this.inputAnalyser) {\n return new Uint8Array(0);\n }\n const binCount = this.inputAnalyser.frequencyBinCount;\n const dataArray = new Uint8Array(binCount);\n this.inputAnalyser.getByteFrequencyData(dataArray);\n return dataArray;\n } catch {\n return new Uint8Array(0);\n }\n }\n\n /**\n * Gets the current output frequency data from agent audio\n *\n * Returns frequency domain data for the agent's audio output as a Uint8Array.\n * This can be used to create audio visualizations that show the agent's\n * voice characteristics or for advanced audio processing.\n *\n * Note: This requires active audio playback from the agent.\n * Returns empty array if no agent audio is currently playing.\n *\n * @returns Uint8Array containing frequency data (0-255 per frequency bin)\n *\n * @example\n * ```typescript\n * // Show agent voice characteristics\n * function analyzeAgentVoice() {\n * const frequencyData = audioManager.getOutputByteFrequencyData();\n *\n * if (frequencyData.length > 0) {\n * // Calculate dominant frequency\n * const maxIndex = frequencyData.indexOf(Math.max(...frequencyData));\n * const dominantFreq = (maxIndex / frequencyData.length) * 22050; // Assume 44.1kHz sample rate\n *\n * console.log(`Agent voice dominant frequency: ${dominantFreq}Hz`);\n * updateVoiceCharacteristics(dominantFreq);\n * }\n * }\n *\n * // Analyze during agent speech\n * audioManager.on('speaking', () => {\n * const analysisInterval = setInterval(() => {\n * analyzeAgentVoice();\n * }, 100);\n *\n * audioManager.once('listening', () => {\n * clearInterval(analysisInterval);\n * });\n * });\n * ```\n */\n getOutputByteFrequencyData(): Uint8Array {\n try {\n if (!this.outputAnalyser) {\n this.#initializeOutputAnalyser();\n }\n if (!this.outputAnalyser) {\n return new Uint8Array(0);\n }\n const binCount = this.outputAnalyser.frequencyBinCount;\n const dataArray = new Uint8Array(binCount);\n this.outputAnalyser.getByteFrequencyData(dataArray);\n return dataArray;\n } catch {\n return new Uint8Array(0);\n }\n }\n\n /**\n * Processes new audio track subscriptions from voice agents\n *\n * Handles the complete lifecycle of audio track subscription including HTML\n * audio element creation, volume application, activity monitoring setup,\n * statistics tracking, and DOM management. This method is called automatically\n * by LiveKit when new audio tracks become available.\n *\n * @param track - The LiveKit remote audio track to process\n * @param publication - Track publication metadata from LiveKit\n * @param participant - Participant who owns this audio track\n *\n * @fires trackSubscribed When track is successfully processed and ready for playback\n * @fires speaking When audio playback begins (agent starts talking)\n * @fires listening When audio playback ends (agent stops talking)\n *\n * @example\n * ```typescript\n * // Listen for new audio tracks\n * audioManager.on('trackSubscribed', ({ track, participant, trackStats }) => {\n * console.log(`Audio track from ${participant} is now available`);\n *\n * if (participant.includes('agent')) {\n * showAgentAudioIndicator();\n * logAudioTrackDetails(trackStats);\n * }\n * });\n *\n * // Monitor speaking activity\n * audioManager.on('speaking', () => {\n * console.log('Agent is speaking');\n * showSpeakingAnimation();\n * });\n *\n * audioManager.on('listening', () => {\n * console.log('Agent finished speaking');\n * hideSpeakingAnimation();\n * });\n * ```\n */\n handleTrackSubscribed(\n track: RemoteTrack,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant\n ): void {\n if (track.kind === Track.Kind.Audio) {\n // Track analytics data with native LiveKit information\n this.trackStats.set(\n track.sid || track.mediaStreamTrack?.id || 'unknown',\n {\n trackId: track.sid || track.mediaStreamTrack?.id || 'unknown',\n kind: track.kind,\n participant: participant.identity || 'unknown',\n subscriptionTime: Date.now(),\n publication,\n // Use native LiveKit track source information\n source: this.#getTrackSourceString(publication.source),\n muted: publication.isMuted,\n enabled: publication.isEnabled,\n dimensions: publication.dimensions,\n simulcasted: publication.simulcasted,\n }\n );\n\n // Attach the audio track to an HTML audio element\n const audioElement = track.attach() as HTMLAudioElement;\n if (audioElement) {\n audioElement.volume = this.volume;\n audioElement.autoplay = true;\n\n // Set up audio monitoring\n this.#setupAudioMonitoring(audioElement);\n\n // Store reference to audio element\n this.audioElements.add(audioElement);\n\n // Emit track subscription event\n const subscriptionData: TrackSubscriptionData = {\n track,\n publication,\n participant: participant.identity || 'unknown',\n trackStats: this.trackStats.get(\n track.sid || track.mediaStreamTrack?.id || 'unknown'\n ),\n };\n this.emit('trackSubscribed', subscriptionData);\n\n // Append to document body (hidden) to enable playback\n audioElement.style.display = 'none';\n try {\n document.body.appendChild(audioElement);\n } catch {\n // Ignore DOM attachment errors\n }\n }\n }\n }\n\n /**\n * Processes audio track unsubscription and cleanup\n *\n * Handles the complete cleanup process when audio tracks from voice agents\n * are unsubscribed, including statistics removal, DOM element cleanup,\n * and event notification. This method is called automatically by LiveKit\n * when audio tracks are no longer available.\n *\n * @param track - The LiveKit remote audio track being unsubscribed\n * @param publication - Track publication metadata from LiveKit\n * @param participant - Participant who owns this audio track\n *\n * @fires trackUnsubscribed When track cleanup is completed successfully\n *\n * @example\n * ```typescript\n * // Listen for track unsubscription events\n * audioManager.on('trackUnsubscribed', ({ participant }) => {\n * console.log(`Audio track from ${participant} has been removed`);\n *\n * if (participant.includes('agent')) {\n * hideAgentAudioIndicator();\n * updateAudioTrackCount();\n * }\n * });\n *\n * // Check if any tracks remain active\n * audioManager.on('trackUnsubscribed', () => {\n * const stats = audioManager.getTrackStats();\n * if (stats.activeTracks === 0) {\n * console.log('No active audio tracks remaining');\n * showNoAudioWarning();\n * }\n * });\n * ```\n */\n handleTrackUnsubscribed(\n track: RemoteTrack,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant\n ): void {\n if (track.kind === Track.Kind.Audio) {\n // Remove track analytics data\n this.trackStats.delete(\n track.sid || track.mediaStreamTrack?.id || 'unknown'\n );\n\n // Remove all attached elements\n for (const element of track.detach()) {\n try {\n if (element?.parentNode?.removeChild) {\n element.parentNode.removeChild(element);\n }\n } catch {\n // Ignore DOM removal errors\n }\n\n // Remove element from tracking set\n this.audioElements.delete(element);\n }\n\n // Emit track unsubscription event\n const unsubscriptionData: TrackUnsubscriptionData = {\n track,\n publication,\n participant: participant.identity || 'unknown',\n };\n this.emit('trackUnsubscribed', unsubscriptionData);\n }\n }\n\n /**\n * Pauses playback of all active audio streams\n *\n * Temporarily stops playback of all HTML audio elements currently managed\n * by the audio manager. This is typically used during conversation pauses,\n * interruptions, or when the user needs to temporarily halt audio without\n * ending the entire conversation. Audio can be resumed later using resumeAllAudio().\n *\n * @example\n * ```typescript\n * // Pause during phone call interruption\n * phoneCall.addEventListener('incoming', () => {\n * audioManager.pauseAllAudio();\n * showPausedIndicator('Incoming call - audio paused');\n * });\n *\n * // Pause when user tabs away (optional behavior)\n * document.addEventListener('visibilitychange', () => {\n * if (document.hidden) {\n * audioManager.pauseAllAudio();\n * }\n * });\n *\n * // Pause during recording\n * startRecordingButton.addEventListener('click', () => {\n * audioManager.pauseAllAudio();\n * startUserRecording();\n * });\n *\n * // Manual pause for user control\n * pauseButton.addEventListener('click', () => {\n * audioManager.pauseAllAudio();\n * updatePlayPauseButtonState('paused');\n * });\n * ```\n */\n pauseAllAudio(): void {\n for (const audioElement of this.audioElements) {\n if (audioElement.pause) {\n audioElement.pause();\n }\n }\n }\n\n /**\n * Resumes playback of all paused audio streams\n *\n * Restarts playback of all HTML audio elements that were previously paused\n * by pauseAllAudio(). This method gracefully handles browser audio policies\n * and permission requirements, automatically catching and ignoring play errors\n * that may occur due to user interaction requirements.\n *\n * @example\n * ```typescript\n * // Resume after phone call ends\n * phoneCall.addEventListener('ended', () => {\n * audioManager.resumeAllAudio();\n * hidePausedIndicator();\n * });\n *\n * // Resume when user returns to tab\n * document.addEventListener('visibilitychange', () => {\n * if (!document.hidden) {\n * audioManager.resumeAllAudio();\n * }\n * });\n *\n * // Resume after recording ends\n * stopRecordingButton.addEventListener('click', () => {\n * stopUserRecording();\n * audioManager.resumeAllAudio();\n * });\n *\n * // Manual resume for user control\n * resumeButton.addEventListener('click', () => {\n * audioManager.resumeAllAudio();\n * updatePlayPauseButtonState('playing');\n * });\n *\n * // Handle browser audio policy restrictions\n * userInteractionButton.addEventListener('click', () => {\n * // Browser requires user interaction for audio playback\n * audioManager.resumeAllAudio();\n * });\n * ```\n */\n resumeAllAudio(): void {\n for (const audioElement of this.audioElements) {\n if (audioElement.play) {\n audioElement.play().catch(() => {\n // Ignore audio play errors\n });\n }\n }\n }\n\n /**\n * Retrieves comprehensive statistics about all active audio tracks\n *\n * Provides detailed information about the current state of audio track management,\n * including counts of active tracks, HTML audio elements, and detailed metadata\n * for each track. This method is essential for monitoring audio system health,\n * debugging audio issues, and providing analytics data.\n *\n * @returns Complete track statistics including counts and detailed track information\n *\n * @example Basic Statistics Monitoring\n * ```typescript\n * const stats = audioManager.getTrackStats();\n *\n * // Display basic track information\n * console.log(`Active tracks: ${stats.activeTracks}`);\n * console.log(`Total tracks processed: ${stats.totalTracks}`);\n * console.log(`HTML audio elements: ${stats.audioElements}`);\n *\n * // Update UI indicators\n * updateTrackCountDisplay(stats.activeTracks);\n * updateAudioElementCount(stats.audioElements);\n *\n * // Check system health\n * if (stats.activeTracks === 0 && expectedAgentPresent) {\n * showNoAudioTracksWarning();\n * }\n * ```\n *\n * @example Detailed Track Analysis\n * ```typescript\n * const stats = audioManager.getTrackStats();\n *\n * // Analyze each track in detail\n * stats.trackDetails.forEach(([trackId, trackData]) => {\n * console.log(`\\n--- Track ${trackId} ---`);\n * console.log(`Participant: ${trackData.participant}`);\n * console.log(`Source: ${trackData.source}`);\n * console.log(`Muted: ${trackData.muted}`);\n * console.log(`Enabled: ${trackData.enabled}`);\n * console.log(`Subscription time: ${new Date(trackData.subscriptionTime)}`);\n *\n * if (trackData.dimensions) {\n * console.log(`Dimensions: ${trackData.dimensions.width}x${trackData.dimensions.height}`);\n * }\n *\n * // Check track health\n * if (trackData.muted) {\n * logTrackIssue('muted_track', trackData);\n * }\n * });\n * ```\n *\n * @example Dashboard Integration\n * ```typescript\n * // Real-time dashboard updates\n * setInterval(() => {\n * const stats = audioManager.getTrackStats();\n *\n * updateDashboard({\n * activeAudioTracks: stats.activeTracks,\n * audioElements: stats.audioElements,\n * trackHealth: stats.activeTracks > 0 ? 'healthy' : 'no_audio',\n * lastUpdated: Date.now()\n * });\n * }, 1000);\n *\n * // Alert on track count changes\n * let lastTrackCount = 0;\n * const checkTrackChanges = () => {\n * const stats = audioManager.getTrackStats();\n * if (stats.activeTracks !== lastTrackCount) {\n * console.log(`Track count changed: ${lastTrackCount} → ${stats.activeTracks}`);\n * lastTrackCount = stats.activeTracks;\n *\n * if (stats.activeTracks === 0) {\n * notifyUser('Audio tracks disconnected');\n * }\n * }\n * };\n * ```\n *\n * @example Audio Quality Monitoring\n * ```typescript\n * const stats = audioManager.getTrackStats();\n *\n * // Check for potential audio issues\n * const currentTime = Date.now();\n * const audioIssues = [];\n *\n * stats.trackDetails.forEach(([trackId, data]) => {\n * // Check if track has been muted for too long\n * if (data.muted) {\n * audioIssues.push(`Track ${trackId} is muted`);\n * }\n *\n * // Check if track is old (potential stale connection)\n * const trackAge = currentTime - data.subscriptionTime;\n * if (trackAge > 300000) { // 5 minutes\n * audioIssues.push(`Track ${trackId} is ${Math.round(trackAge/60000)}m old`);\n * }\n * });\n *\n * // Report issues\n * if (audioIssues.length > 0) {\n * console.warn('Audio issues detected:', audioIssues);\n * reportAudioQualityIssues(audioIssues);\n * }\n * ```\n */\n getTrackStats(): TrackStatsResult {\n return {\n totalTracks: this.trackStats.size, // Current active tracks as total\n activeTracks: this.trackStats.size,\n audioElements: this.audioElements.size,\n trackDetails: Array.from(this.trackStats.entries()),\n };\n }\n\n /**\n * Configures real-time audio activity detection for speaking/listening events\n *\n * Sets up event listeners on HTML audio elements to detect when the voice agent\n * starts and stops speaking. This enables real-time conversation flow tracking\n * and UI updates for speaking indicators, conversation analytics, and user experience\n * enhancements. The monitoring uses native HTML5 audio events for accurate detection.\n *\n * @param audioElement - HTML audio element to monitor for speaking activity\n *\n * @private\n *\n * @example Internal Usage (called automatically by handleTrackSubscribed)\n * ```typescript\n * // This method is called internally when new audio tracks are subscribed\n * // It sets up the following event flow:\n *\n * audioElement.addEventListener('play', () => {\n * // Agent starts speaking → emit 'speaking' event\n * });\n *\n * audioElement.addEventListener('pause', () => {\n * // Agent stops speaking → emit 'listening' event\n * });\n *\n * audioElement.addEventListener('ended', () => {\n * // Audio stream ends → emit 'listening' event\n * });\n * ```\n *\n * Technical Implementation:\n * - Tracks speaking state to prevent duplicate event emission\n * - Uses native HTML5 audio events for reliable detection\n * - Automatically handles speaking state transitions\n * - Emits standardized 'speaking' and 'listening' events\n * - Provides foundation for conversation analytics\n */\n #setupAudioMonitoring(audioElement: HTMLAudioElement): void {\n let isCurrentlySpeaking = false;\n\n audioElement.addEventListener('play', () => {\n if (!isCurrentlySpeaking) {\n isCurrentlySpeaking = true;\n this.emit('speaking');\n }\n });\n\n audioElement.addEventListener('pause', () => {\n isCurrentlySpeaking = false;\n this.emit('listening');\n });\n\n audioElement.addEventListener('ended', () => {\n isCurrentlySpeaking = false;\n this.emit('listening');\n });\n }\n\n /** Initializes WebAudio AudioContext if available */\n #ensureAudioContext(): void {\n if (this.audioContext) {\n return;\n }\n const ctorUnknown = (globalThis as Record<string, unknown>).AudioContext;\n const Ctor = (\n typeof ctorUnknown === 'function'\n ? (ctorUnknown as new () => MinimalAudioContext)\n : null\n ) as new () => MinimalAudioContext | null;\n if (!Ctor) {\n return;\n }\n try {\n this.audioContext = new Ctor();\n } catch {\n this.audioContext = null;\n }\n }\n\n /** Initialize analyser for microphone (input) if possible */\n #initializeInputAnalyser(): void {\n try {\n this.#ensureAudioContext();\n if (!this.audioContext) {\n return;\n }\n let publication: unknown = null;\n const getter = this.room?.localParticipant?.getTrackPublication as\n | ((arg: unknown) => unknown)\n | undefined;\n if (getter) {\n try {\n publication = getter(Track.Source.Microphone);\n } catch {\n publication = getter('microphone');\n }\n }\n const mediaTrack = (\n publication as {\n track?: { mediaStreamTrack?: MediaStreamTrack };\n } | null\n )?.track?.mediaStreamTrack;\n if (!mediaTrack) {\n return;\n }\n const stream = new MediaStream([mediaTrack]);\n const source = this.audioContext.createMediaStreamSource(stream);\n const analyser = this.audioContext.createAnalyser();\n analyser.fftSize = ANALYSER_FFT_SIZE;\n {\n const node = source as unknown as MinimalAudioNode;\n if (node && typeof node.connect === 'function') {\n node.connect(analyser);\n }\n }\n this.inputAnalyser = analyser;\n } catch {\n this.inputAnalyser = null;\n }\n }\n\n /** Initialize analyser for first output audio element if possible */\n #initializeOutputAnalyser(): void {\n try {\n this.#ensureAudioContext();\n if (!this.audioContext) {\n return;\n }\n const first = this.audioElements.values().next().value as\n | HTMLAudioElement\n | undefined;\n if (!first) {\n return;\n }\n const source = this.audioContext.createMediaElementSource(first);\n const analyser = this.audioContext.createAnalyser();\n analyser.fftSize = ANALYSER_FFT_SIZE;\n {\n const node = source as unknown as MinimalAudioNode;\n if (node && typeof node.connect === 'function') {\n node.connect(analyser);\n }\n }\n this.outputAnalyser = analyser;\n } catch {\n this.outputAnalyser = null;\n }\n }\n\n /**\n * Converts LiveKit Track.Source enum values to human-readable strings\n *\n * Transforms LiveKit's internal Track.Source enum values into descriptive\n * string representations for logging, analytics, and user interface display.\n * This mapping ensures consistent string representation of track sources\n * across the application.\n *\n * @param source - LiveKit Track.Source enum value\n * @returns Human-readable string representation of the track source\n *\n * @private\n *\n * @example Internal Usage\n * ```typescript\n * // Called internally during track subscription\n * const sourceString = this.#getTrackSourceString(publication.source);\n * // Possible returns: 'microphone', 'camera', 'screen_share', 'screen_share_audio', 'unknown'\n *\n * // Used in track statistics and logging\n * console.log(`Track source: ${sourceString}`);\n * analyticsData.trackSource = sourceString;\n * ```\n *\n * Supported source mappings:\n * - Track.Source.Microphone → 'microphone'\n * - Track.Source.Camera → 'camera'\n * - Track.Source.ScreenShare → 'screen_share'\n * - Track.Source.ScreenShareAudio → 'screen_share_audio'\n * - Unknown sources → 'unknown'\n */\n #getTrackSourceString(source: Track.Source): string {\n // biome-ignore lint/nursery/noUnnecessaryConditions: switch statement is necessary for enum mapping\n switch (source) {\n case Track.Source.Microphone:\n return 'microphone';\n case Track.Source.Camera:\n return 'camera';\n case Track.Source.ScreenShare:\n return 'screen_share';\n case Track.Source.ScreenShareAudio:\n return 'screen_share_audio';\n default:\n return 'unknown';\n }\n }\n\n /**\n * Performs comprehensive cleanup of all audio resources and DOM elements\n *\n * Safely removes all HTML audio elements from the DOM, clears internal data\n * structures, and resets the audio manager to its initial state. This method\n * is essential for preventing memory leaks and ensuring proper resource\n * management when disconnecting or reinitializing the audio system.\n *\n * Cleanup operations performed:\n * - Removes all HTML audio elements from DOM\n * - Clears the audioElements Set\n * - Resets all track statistics and metadata\n * - Gracefully handles DOM manipulation errors\n *\n * @example Manual Cleanup\n * ```typescript\n * // Explicit cleanup when component unmounts\n * useEffect(() => {\n * return () => {\n * audioManager.cleanup();\n * console.log('Audio manager cleaned up');\n * };\n * }, []);\n *\n * // Cleanup before reinitializing with new configuration\n * const reinitializeAudio = () => {\n * audioManager.cleanup();\n * audioManager = new LiveKitAudioManager();\n * setupAudioEventListeners();\n * };\n * ```\n *\n * @example Cleanup Verification\n * ```typescript\n * // Verify cleanup completed successfully\n * audioManager.cleanup();\n *\n * const stats = audioManager.getTrackStats();\n * console.assert(stats.activeTracks === 0, 'All tracks should be cleaned up');\n * console.assert(stats.audioElements === 0, 'All audio elements should be removed');\n * console.assert(audioManager.audioElements.size === 0, 'Audio elements set should be empty');\n * ```\n *\n * @example Error-Safe Cleanup\n * ```typescript\n * // Cleanup is safe to call multiple times\n * audioManager.cleanup(); // First cleanup\n * audioManager.cleanup(); // Safe to call again\n *\n * // Cleanup is safe even if DOM elements are already removed\n * document.body.innerHTML = ''; // Clear all DOM\n * audioManager.cleanup(); // Still safe to call\n * ```\n */\n cleanup(): void {\n // Remove all audio elements\n for (const audioElement of this.audioElements) {\n try {\n if (audioElement?.parentNode?.removeChild) {\n audioElement.parentNode.removeChild(audioElement);\n }\n } catch {\n // Ignore DOM cleanup errors\n }\n }\n this.audioElements.clear();\n\n // Clear track data\n this.trackStats.clear();\n }\n}\n","/**\n * LiveKitConnection - WebRTC connection management for voice agent communication\n *\n * This class manages the core WebRTC connection to LiveKit rooms, handling connection\n * lifecycle, participant management, and real-time communication state. It serves as\n * the foundation for voice agent interactions by providing reliable, scalable WebRTC\n * connectivity with automatic reconnection and comprehensive event handling.\n *\n * Key Features:\n * - **Robust Connection Management**: Automatic connection establishment, monitoring, and cleanup\n * - **Intelligent Reconnection**: Built-in reconnection logic with attempt tracking\n * - **Participant Tracking**: Real-time monitoring of room participants and their metadata\n * - **Connection Quality Optimization**: Adaptive streaming and bandwidth management\n * - **Pause/Resume Functionality**: Microphone control for conversation flow management\n * - **Comprehensive Event System**: Detailed events for connection state changes\n * - **Performance Monitoring**: Connection timing and attempt statistics\n *\n * Connection Lifecycle:\n * 1. **Initialization**: Room setup with optimized WebRTC configuration\n * 2. **Connection**: Secure connection establishment with performance tracking\n * 3. **Monitoring**: Real-time connection quality and participant management\n * 4. **Reconnection**: Automatic recovery from network issues\n * 5. **Cleanup**: Proper resource disposal and state management\n *\n * WebRTC Configuration:\n * - Adaptive streaming for optimal bandwidth usage\n * - Dynacast for efficient bandwidth management\n * - HD video capability (720p) for future video features\n * - Automatic echo cancellation and noise suppression\n *\n * @example Basic Connection Management\n * ```typescript\n * const connection = new LiveKitConnection(\n * 'wss://livekit.example.com',\n * 'jwt_access_token_here'\n * );\n *\n * // Set up event listeners\n * connection.on('connected', () => {\n * console.log('Connected to voice agent room');\n * enableVoiceInterface();\n * });\n *\n * connection.on('disconnected', () => {\n * console.log('Disconnected from room');\n * disableVoiceInterface();\n * });\n *\n * connection.on('reconnecting', () => {\n * showReconnectingIndicator();\n * });\n *\n * // Connect to room\n * await connection.connect();\n * ```\n *\n * @example Participant Management\n * ```typescript\n * connection.on('participantConnected', (participant) => {\n * console.log(`${participant.identity} joined the conversation`);\n *\n * if (participant.identity.includes('agent')) {\n * showAgentStatus('online');\n * enableAgentFeatures();\n * }\n * });\n *\n * connection.on('participantDisconnected', (participant) => {\n * console.log(`${participant.identity} left the conversation`);\n *\n * if (participant.identity.includes('agent')) {\n * showAgentStatus('offline');\n * handleAgentDisconnection();\n * }\n * });\n *\n * // Get current participants\n * const participants = connection.getParticipants();\n * const agentPresent = participants.some(p => p.identity.includes('agent'));\n * ```\n *\n * @example Connection Quality Monitoring\n * ```typescript\n * connection.on('connectionStateChanged', (state) => {\n * switch (state) {\n * case 'connected':\n * hideConnectionWarnings();\n * break;\n * case 'reconnecting':\n * showConnectionIssueWarning();\n * break;\n * case 'disconnected':\n * showConnectionLostError();\n * break;\n * }\n * });\n *\n * // Monitor connection statistics\n * const stats = connection.getConnectionStats();\n * console.log(`Connection attempts: ${stats.connectionAttempts}`);\n * console.log(`Reconnection attempts: ${stats.reconnectionAttempts}`);\n * console.log(`Participants: ${stats.participantCount}`);\n * ```\n *\n * @example Pause/Resume Functionality\n * ```typescript\n * // Pause conversation (mute microphone)\n * pauseButton.addEventListener('click', () => {\n * connection.pause();\n * showPausedIndicator();\n * });\n *\n * // Resume conversation (unmute microphone)\n * resumeButton.addEventListener('click', () => {\n * connection.resume();\n * hidePausedIndicator();\n * });\n *\n * // Listen for pause/resume events\n * connection.on('connectionPaused', () => {\n * updateUIForPausedState();\n * });\n *\n * connection.on('connectionResumed', () => {\n * updateUIForActiveState();\n * });\n * ```\n *\n * @example Error Handling\n * ```typescript\n * connection.on('connectionError', (error) => {\n * console.error('Connection error:', error.message);\n *\n * // Implement retry logic\n * if (error.message.includes('authentication')) {\n * handleAuthenticationError();\n * } else if (error.message.includes('network')) {\n * handleNetworkError();\n * // Automatic reconnection will be attempted\n * }\n * });\n *\n * // Monitor reconnection attempts\n * connection.on('reconnecting', () => {\n * const attempts = connection.getReconnectionAttempts();\n * if (attempts > 3) {\n * suggestNetworkTroubleshooting();\n * }\n * });\n * ```\n *\n * Technical Implementation:\n * - Built on LiveKit's v2.15.4 WebRTC infrastructure\n * - Supports adaptive streaming for bandwidth optimization\n * - Implements connection pre-warming for faster establishment\n * - Provides comprehensive event forwarding from LiveKit room events\n * - Maintains participant metadata and connection timing information\n * - Includes fallback mechanisms for connection reliability\n */\n\nimport { EventEmitter } from 'events';\nimport {\n type ConnectionState,\n type RemoteParticipant,\n Room,\n RoomEvent,\n VideoPresets,\n} from 'livekit-client';\nimport type { ParticipantData } from './types';\n\n/**\n * LiveKitConnection class for managing WebRTC connections to voice agent rooms\n *\n * Extends EventEmitter to provide real-time connection status updates and\n * participant management events for voice agent applications.\n */\nexport class LiveKitConnection extends EventEmitter {\n /** LiveKit room instance for WebRTC communication */\n room: Room | null = null;\n\n /** Current connection status to the LiveKit room */\n isConnected = false;\n\n /** Whether the conversation is currently paused (microphone muted) */\n isPaused = false;\n\n /** Map of active participants in the room with their metadata */\n participants: Map<string, ParticipantData> = new Map();\n\n /** Unix timestamp when the connection/call was initiated */\n callStartTime: number | null = null;\n\n /** LiveKit WebSocket URL for room connection */\n private readonly lkUrl: string;\n\n /** JWT access token for room authentication */\n private readonly accessToken: string;\n\n /** Counter for total connection attempts (including retries) */\n // biome-ignore lint/style/useReadonlyClassProperties: connectionAttempts is incremented in connect()\n private connectionAttempts = 0;\n\n /** Counter for reconnection attempts after initial connection */\n private reconnectionAttempts = 0;\n\n /** Whether we've already emitted a 'connected' event for the current session */\n private hasEmittedConnected = false;\n\n /**\n * Creates a new LiveKitConnection instance\n *\n * Initializes a LiveKit room with optimized WebRTC configuration for\n * voice agent communication, including adaptive streaming and bandwidth\n * management features.\n *\n * @param lkUrl - LiveKit WebSocket URL (e.g., 'wss://livekit.example.com')\n * @param accessToken - JWT token for room authentication and authorization\n *\n * @example\n * ```typescript\n * const connection = new LiveKitConnection(\n * 'wss://rtc.tryhamsa.com',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'\n * );\n *\n * // Connection is ready for use\n * await connection.connect();\n * ```\n */\n constructor(lkUrl: string, accessToken: string) {\n super();\n this.lkUrl = lkUrl;\n this.accessToken = accessToken;\n\n // Initialize LiveKit Room with optimal configuration for voice agents\n this.room = new Room({\n // Enable adaptive streaming for optimal bandwidth usage\n adaptiveStream: true,\n // Enable dynacast for efficient bandwidth management\n dynacast: true,\n // Configure video settings for potential future video features\n videoCaptureDefaults: {\n resolution: VideoPresets.h720.resolution,\n },\n });\n\n // Set up event handlers for room lifecycle management\n this.#setupRoomEventHandlers();\n }\n\n /**\n * Configures comprehensive event handlers for LiveKit room lifecycle management\n *\n * Sets up listeners for all critical room events including connection state changes,\n * participant management, and reconnection handling. These handlers forward events\n * to the LiveKitConnection EventEmitter for external consumption.\n *\n * @private\n */\n #setupRoomEventHandlers(): void {\n if (!this.room) {\n return;\n }\n\n this.room\n .on(RoomEvent.Connected, this.#handleConnected.bind(this))\n .on(RoomEvent.Disconnected, this.#handleDisconnected.bind(this))\n .on(RoomEvent.Reconnecting, this.#handleReconnecting.bind(this))\n .on(RoomEvent.Reconnected, this.#handleReconnected.bind(this))\n .on(\n RoomEvent.ParticipantConnected,\n this.#handleParticipantConnected.bind(this)\n )\n .on(\n RoomEvent.ParticipantDisconnected,\n this.#handleParticipantDisconnected.bind(this)\n )\n .on(\n RoomEvent.ConnectionStateChanged,\n this.#handleConnectionStateChanged.bind(this)\n );\n }\n\n /**\n * Provides access to the underlying LiveKit room instance\n *\n * Exposes the LiveKit room for advanced operations that require direct\n * access to the WebRTC room functionality. Use with caution as direct\n * manipulation may interfere with connection management.\n *\n * @returns LiveKit Room instance or null if not initialized\n *\n * @example\n * ```typescript\n * const room = connection.getRoom();\n * if (room) {\n * // Access advanced LiveKit features\n * console.log('Room name:', room.name);\n * console.log('Local participant:', room.localParticipant?.identity);\n * }\n * ```\n */\n getRoom(): Room | null {\n return this.room;\n }\n\n /**\n * Establishes connection to the LiveKit room with performance optimization\n *\n * Initiates the WebRTC connection process with connection pre-warming for\n * faster establishment times. Tracks connection performance metrics and\n * handles authentication through the provided JWT token.\n *\n * @throws {Error} Connection failures due to network issues, authentication problems, or server unavailability\n *\n * @example\n * ```typescript\n * try {\n * // Set up event listeners first\n * connection.on('connected', () => {\n * console.log('Successfully connected to voice agent');\n * enableVoiceFeatures();\n * });\n *\n * connection.on('connectionError', (error) => {\n * console.error('Connection failed:', error.message);\n * handleConnectionFailure(error);\n * });\n *\n * // Initiate connection\n * await connection.connect();\n * } catch (error) {\n * console.error('Failed to connect:', error);\n * }\n * ```\n *\n * @example Connection Performance Monitoring\n * ```typescript\n * connection.on('connectionEstablished', (timeMs) => {\n * console.log(`Connection established in ${timeMs}ms`);\n *\n * if (timeMs > 5000) {\n * logSlowConnection(timeMs);\n * }\n * });\n *\n * await connection.connect();\n * ```\n */\n async connect(): Promise<void> {\n try {\n // Record call initiation time for performance metrics\n this.callStartTime = Date.now();\n this.connectionAttempts++;\n\n // Pre-warm connection for optimized establishment time\n this.room?.prepareConnection(this.lkUrl, this.accessToken);\n\n // Track connection establishment performance\n const connectionStart = Date.now();\n\n // Establish secure WebRTC connection to LiveKit room\n await this.room?.connect(this.lkUrl, this.accessToken);\n\n // Emit connection timing metrics for performance monitoring\n const connectionTime = Date.now() - connectionStart;\n this.emit('connectionEstablished', connectionTime);\n\n // Mark as connected and emit 'connected' once. In some test environments,\n // RoomEvent.Connected may not fire, so we emit here as a fallback.\n this.isConnected = true;\n if (!this.hasEmittedConnected) {\n this.emit('connected');\n this.hasEmittedConnected = true;\n }\n } catch (error) {\n this.emit(\n 'connectionError',\n new Error(\n `LiveKit connection failed: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n }\n\n /**\n * Force disconnection for testing\n */\n forceDisconnect(): void {\n this.isConnected = false;\n this.emit('disconnected');\n this.#cleanup();\n }\n\n /**\n * Disconnects from the LiveKit room\n */\n async disconnect(): Promise<void> {\n try {\n if (this.room) {\n await this.room.disconnect();\n }\n this.#cleanup();\n } catch (error) {\n this.emit(\n 'connectionError',\n new Error(\n `LiveKit disconnection failed: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n }\n\n /**\n * Pauses the connection by muting local microphone\n */\n pause(): void {\n try {\n this.isPaused = true;\n\n // Mute local microphone\n if (this.room?.localParticipant) {\n this.room.localParticipant.setMicrophoneEnabled(false);\n }\n\n this.emit('connectionPaused');\n } catch (error) {\n this.emit(\n 'connectionError',\n new Error(\n `Failed to pause call: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n }\n\n /**\n * Resumes the connection by unmuting local microphone\n */\n resume(): void {\n try {\n this.isPaused = false;\n\n // Unmute local microphone\n if (this.room?.localParticipant) {\n this.room.localParticipant.setMicrophoneEnabled(true);\n }\n\n this.emit('connectionResumed');\n } catch (error) {\n this.emit(\n 'connectionError',\n new Error(\n `Failed to resume call: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n }\n\n /**\n * Gets connection statistics\n */\n getConnectionStats(): {\n connectionAttempts: number;\n reconnectionAttempts: number;\n isConnected: boolean;\n participantCount: number;\n } {\n return {\n connectionAttempts: this.connectionAttempts,\n reconnectionAttempts: this.reconnectionAttempts,\n isConnected: this.isConnected,\n participantCount: this.participants.size,\n };\n }\n\n /**\n * Gets connection attempts\n */\n getConnectionAttempts(): number {\n return this.connectionAttempts;\n }\n\n /**\n * Gets reconnection attempts\n */\n getReconnectionAttempts(): number {\n return this.reconnectionAttempts;\n }\n\n /**\n * Gets current participants\n */\n getParticipants(): ParticipantData[] {\n return Array.from(this.participants.values());\n }\n\n /**\n * Handles successful room connection\n */\n async #handleConnected(): Promise<void> {\n try {\n this.isConnected = true;\n\n // Enable microphone after connection\n await this.room?.localParticipant?.setMicrophoneEnabled(true);\n\n // Emit 'connected' only once per session\n if (!this.hasEmittedConnected) {\n this.emit('connected');\n this.hasEmittedConnected = true;\n }\n } catch (error) {\n this.emit(\n 'connectionError',\n new Error(\n `Failed to initialize after connection: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n }\n\n /**\n * Handles room disconnection\n */\n #handleDisconnected(): void {\n this.isConnected = false;\n this.emit('disconnected');\n this.#cleanup();\n }\n\n /**\n * Handles reconnection attempts\n */\n #handleReconnecting(): void {\n this.reconnectionAttempts++;\n this.emit('reconnecting');\n }\n\n /**\n * Handles successful reconnection\n */\n #handleReconnected(): void {\n this.isConnected = true;\n this.emit('reconnected');\n }\n\n /**\n * Handles participant connection\n */\n #handleParticipantConnected(participant: RemoteParticipant): void {\n this.participants.set(participant.sid || 'unknown', {\n identity: participant.identity || 'unknown',\n sid: participant.sid || 'unknown',\n connectionTime: Date.now(),\n metadata: participant.metadata,\n });\n this.emit('participantConnected', participant);\n }\n\n /**\n * Handles participant disconnection\n */\n #handleParticipantDisconnected(participant: RemoteParticipant): void {\n this.participants.delete(participant.sid || 'unknown');\n this.emit('participantDisconnected', participant);\n }\n\n /**\n * Handles connection state changes\n */\n #handleConnectionStateChanged(state: ConnectionState): void {\n this.emit('connectionStateChanged', state);\n }\n\n /**\n * Cleans up connection resources\n */\n #cleanup(): void {\n // Clear participant data\n this.participants.clear();\n this.isConnected = false;\n this.isPaused = false;\n this.hasEmittedConnected = false;\n }\n\n /**\n * Public cleanup method for external access\n */\n cleanup(): void {\n this.#cleanup();\n }\n}\n","/**\n * LiveKitToolRegistry - Advanced client-side tool management and RPC system\n *\n * This class provides comprehensive management of client-side tools that voice agents\n * can execute during conversations. It handles tool registration as RPC methods,\n * processes data messages from agents, manages transcription events, and provides\n * local audio stream access for advanced integrations.\n *\n * Key Features:\n * - **Dynamic Tool Registration**: Real-time registration and updating of client-side tools\n * - **RPC Method Management**: Secure execution of agent-requested functions\n * - **Event Processing**: Intelligent parsing and routing of agent messages\n * - **Transcription Handling**: Real-time speech-to-text processing and forwarding\n * - **Audio Stream Integration**: Local microphone stream access for external processing\n * - **Error Resilience**: Robust error handling for tool execution and message processing\n * - **Flexible Tool Definition**: Support for complex tool parameters and return values\n *\n * Tool Architecture:\n * 1. **Tool Definition**: Client defines functions with metadata (name, description, parameters)\n * 2. **Registration**: Tools are registered as LiveKit RPC methods\n * 3. **Agent Calls**: Voice agents invoke tools during conversations\n * 4. **Execution**: Client-side functions execute with provided parameters\n * 5. **Response**: Results are returned to the agent for continued conversation\n *\n * Message Processing Pipeline:\n * 1. **Raw Data Reception**: Binary data from LiveKit room participants\n * 2. **Message Parsing**: JSON decoding and structure validation\n * 3. **Event Classification**: Categorization (answer, transcription, custom)\n * 4. **Event Emission**: Structured events for application consumption\n * 5. **Error Handling**: Graceful handling of malformed or invalid messages\n *\n * @example Basic Tool Registration\n * ```typescript\n * const weatherTool = {\n * function_name: 'getCurrentWeather',\n * description: 'Gets current weather for a location',\n * parameters: [\n * { name: 'location', type: 'string', description: 'City name' }\n * ],\n * required: ['location'],\n * fn: async (location) => {\n * const response = await fetch(`/api/weather?city=${location}`);\n * return response.json();\n * }\n * };\n *\n * const registry = new LiveKitToolRegistry([weatherTool]);\n * registry.setRoom(liveKitRoom);\n *\n * // Tool is now available for agent to call\n * registry.on('toolsRegistered', (count) => {\n * console.log(`${count} tools registered and ready`);\n * });\n * ```\n *\n * @example Advanced Tool with Complex Parameters\n * ```typescript\n * const userDataTool = {\n * function_name: 'getUserProfile',\n * description: 'Retrieves comprehensive user profile data',\n * parameters: [\n * { name: 'userId', type: 'string', description: 'Unique user identifier' },\n * { name: 'includeHistory', type: 'boolean', description: 'Include purchase history' },\n * { name: 'fields', type: 'array', description: 'Specific fields to retrieve' }\n * ],\n * required: ['userId'],\n * fn: async (userId, includeHistory = false, fields = []) => {\n * const profile = await userService.getProfile(userId);\n *\n * if (includeHistory) {\n * profile.purchaseHistory = await orderService.getHistory(userId);\n * }\n *\n * if (fields.length > 0) {\n * return pickFields(profile, fields);\n * }\n *\n * return profile;\n * }\n * };\n *\n * registry.setTools([userDataTool]);\n * ```\n *\n * @example Event Processing and Custom Messages\n * ```typescript\n * const registry = new LiveKitToolRegistry();\n *\n * // Standard agent responses\n * registry.on('answerReceived', (text) => {\n * console.log('Agent said:', text);\n * updateChatInterface(text, 'agent');\n * });\n *\n * // Real-time transcription\n * registry.on('transcriptionReceived', (text) => {\n * console.log('User said:', text);\n * updateChatInterface(text, 'user');\n * });\n *\n * // Custom application events\n * registry.on('customEvent', (eventType, eventData, metadata) => {\n * switch (eventType) {\n * case 'sentiment_analysis':\n * updateSentimentIndicator(eventData.sentiment);\n * break;\n * case 'conversation_summary':\n * displaySummary(eventData.summary);\n * break;\n * case 'agent_thinking':\n * showThinkingIndicator(eventData.status);\n * break;\n * default:\n * logCustomEvent(eventType, eventData, metadata);\n * }\n * });\n *\n * // Raw data access for advanced processing\n * registry.on('dataReceived', (message, participant) => {\n * analyticsService.trackMessage({\n * participant,\n * messageType: message.event,\n * timestamp: Date.now(),\n * content: message\n * });\n * });\n * ```\n *\n * @example Dynamic Tool Management\n * ```typescript\n * const registry = new LiveKitToolRegistry();\n *\n * // Add tools based on user permissions\n * const addUserTools = (userRole) => {\n * const baseToos = [getWeatherTool, getTimeTool];\n *\n * if (userRole === 'admin') {\n * baseTools.push(getUserDataTool, modifySettingsTool);\n * } else if (userRole === 'customer') {\n * baseTools.push(getOrderStatusTool, updateProfileTool);\n * }\n *\n * registry.setTools(baseTools);\n * console.log(`Registered ${baseTools.length} tools for ${userRole}`);\n * };\n *\n * // Update tools when user context changes\n * userAuth.on('roleChanged', (newRole) => {\n * addUserTools(newRole);\n * });\n * ```\n *\n * @example Audio Stream Integration\n * ```typescript\n * registry.on('localAudioStreamAvailable', (stream) => {\n * // Send to external audio processor\n * audioProcessor.setInputStream(stream);\n *\n * // Enable real-time audio analysis\n * const audioAnalyzer = new AudioAnalyzer(stream);\n * audioAnalyzer.on('volumeLevel', (level) => {\n * updateVolumeIndicator(level);\n * });\n *\n * // Record for quality assurance\n * if (recordingEnabled) {\n * mediaRecorder.start(stream);\n * }\n * });\n * ```\n *\n * Technical Implementation:\n * - Uses LiveKit's RPC system for secure tool execution\n * - Implements JSON-based message protocol for structured communication\n * - Provides comprehensive error handling and recovery\n * - Supports dynamic tool registration and deregistration\n * - Maintains tool metadata for debugging and analytics\n * - Includes automatic cleanup and resource management\n */\n\nimport { EventEmitter } from 'events';\nimport { type Room, Track } from 'livekit-client';\nimport type { Tool } from './types';\n\n/**\n * LiveKitToolRegistry class for client-side tool management and RPC handling\n *\n * Extends EventEmitter to provide real-time notifications for tool registration,\n * agent responses, transcriptions, and custom events from voice agents.\n */\nexport class LiveKitToolRegistry extends EventEmitter {\n /** Reference to the LiveKit room for RPC method registration */\n private room: Room | null = null;\n\n /** Array of client-side tools available for agent execution */\n private tools: Tool[] = [];\n\n /**\n * Creates a new LiveKitToolRegistry instance\n *\n * Initializes the tool registry with an optional array of tools that will\n * be available for voice agents to call during conversations. Tools can be\n * added later using setTools() or updated dynamically based on context.\n *\n * @param tools - Initial array of tools to register (optional)\n *\n * @example\n * ```typescript\n * // Initialize with no tools\n * const registry = new LiveKitToolRegistry();\n *\n * // Initialize with predefined tools\n * const registry = new LiveKitToolRegistry([\n * weatherTool,\n * calculatorTool,\n * databaseQueryTool\n * ]);\n *\n * // Tools will be automatically registered when room is set\n * registry.setRoom(liveKitRoom);\n * ```\n */\n constructor(tools: Tool[] = []) {\n super();\n this.tools = tools;\n }\n\n /**\n * Configures the LiveKit room for tool registration and RPC setup\n *\n * Provides the tool registry with access to the LiveKit room instance for\n * registering client-side tools as RPC methods. When a room is set and tools\n * are available, automatic registration occurs immediately. This method is\n * typically called by LiveKitManager during connection establishment.\n *\n * @param room - LiveKit room instance or null to clear the reference\n *\n * @example\n * ```typescript\n * const room = new Room();\n * await room.connect(url, token);\n *\n * // Enable tool registration\n * registry.setRoom(room);\n *\n * // Tools are automatically registered if available\n * registry.on('toolsRegistered', (count) => {\n * console.log(`${count} tools are now available to the agent`);\n * });\n *\n * // Clear room reference when disconnecting\n * registry.setRoom(null);\n * ```\n */\n setRoom(room: Room | null): void {\n this.room = room;\n\n // Register tools when room is available\n if (room && this.tools.length > 0) {\n this.registerTools();\n }\n }\n\n /**\n * Updates the available tools and re-registers them with the room\n *\n * Replaces the current tool array with a new set of tools and automatically\n * re-registers them if a room connection is active. This enables dynamic\n * tool management based on user context, permissions, or conversation state.\n *\n * @param tools - Array of Tool objects to make available to agents\n *\n * @example\n * ```typescript\n * // Initial tool set\n * registry.setTools([weatherTool, timeTool]);\n *\n * // Update based on user authentication\n * user.on('login', (userData) => {\n * if (userData.role === 'admin') {\n * registry.setTools([...baseToos, adminTool, userManagementTool]);\n * } else {\n * registry.setTools([...baseToos, profileTool]);\n * }\n * });\n *\n * // Context-aware tool updates\n * conversation.on('topicChanged', (topic) => {\n * if (topic === 'support') {\n * registry.setTools([...baseToos, ticketTool, knowledgeBaseTool]);\n * } else if (topic === 'sales') {\n * registry.setTools([...baseToos, productTool, pricingTool]);\n * }\n * });\n *\n * // Remove all tools\n * registry.setTools([]);\n * ```\n */\n setTools(tools: Tool[]): void {\n this.tools = Array.isArray(tools) ? tools : [];\n\n // Re-register tools if room is available\n if (this.room) {\n this.registerTools();\n }\n }\n\n /**\n * Registers all tools as RPC methods with the LiveKit room\n *\n * Processes each tool in the tools array and registers it as an RPC method\n * that voice agents can call during conversations. Each tool function is\n * wrapped with error handling and JSON serialization for secure, reliable\n * execution. Registration only occurs when both room and tools are available.\n *\n * @fires toolsRegistered When tools are successfully registered with count\n *\n * @example\n * ```typescript\n * // Manual registration (usually automatic)\n * registry.registerTools();\n *\n * // Listen for registration confirmation\n * registry.on('toolsRegistered', (count) => {\n * console.log(`${count} tools registered successfully`);\n *\n * // Notify agent about available tools\n * sendAgentMessage({\n * type: 'tools_ready',\n * count: count,\n * tools: registry.getTools().map(t => ({\n * name: t.function_name,\n * description: t.description\n * }))\n * });\n * });\n * ```\n *\n * Registration Process:\n * 1. Validates tool structure (function_name, fn)\n * 2. Creates RPC method wrapper with error handling\n * 3. Registers with LiveKit room's local participant\n * 4. Emits toolsRegistered event with count\n * 5. Tools become immediately available for agent calls\n */\n registerTools(): void {\n if (!this.room || this.tools.length === 0) {\n return;\n }\n\n for (const tool of this.tools) {\n if (tool.function_name && typeof tool.fn === 'function') {\n this.room?.registerRpcMethod(tool.function_name, async (data) => {\n try {\n const args = JSON.parse(data.payload || '{}');\n const result = await tool.fn?.(...Object.values(args));\n return JSON.stringify(result);\n } catch (error) {\n return JSON.stringify({\n error: error instanceof Error ? error.message : String(error),\n });\n }\n });\n }\n }\n this.emit('toolsRegistered', this.tools.length);\n }\n\n /**\n * Processes incoming data messages from voice agents and participants\n *\n * Handles binary data received through the LiveKit room, parsing JSON messages\n * and routing them to appropriate event handlers. This method processes various\n * message types including agent responses, transcriptions, and custom events,\n * providing a unified interface for all agent communication.\n *\n * @param payload - Binary data payload received from LiveKit\n * @param participant - Identity of the participant who sent the message\n *\n * @fires answerReceived When agent provides a response\n * @fires transcriptionReceived When speech-to-text data arrives\n * @fires customEvent When custom application events are received\n * @fires dataReceived Raw message data for advanced processing\n *\n * @example\n * ```typescript\n * // This method is called automatically by LiveKitManager\n * // when RoomEvent.DataReceived is triggered\n *\n * // Listen for different message types\n * registry.on('answerReceived', (text) => {\n * console.log('Agent response:', text);\n * displayAgentMessage(text);\n * });\n *\n * registry.on('transcriptionReceived', (text) => {\n * console.log('User transcription:', text);\n * displayUserMessage(text);\n * });\n *\n * registry.on('customEvent', (eventType, data, metadata) => {\n * console.log(`Custom event: ${eventType}`, data);\n *\n * // Handle application-specific events\n * switch (eventType) {\n * case 'agent_thinking':\n * showThinkingIndicator(data.status);\n * break;\n * case 'conversation_summary':\n * updateSummaryPanel(data.summary);\n * break;\n * case 'emotion_detected':\n * updateEmotionIndicator(data.emotion, data.confidence);\n * break;\n * }\n * });\n * ```\n *\n * Supported Message Formats:\n * ```json\n * // Agent response\n * { \"event\": \"answer\", \"content\": \"Hello, how can I help you?\" }\n *\n * // Transcription\n * { \"event\": \"transcription\", \"content\": \"I need help with my order\" }\n *\n * // Custom event\n * { \"event\": \"sentiment_analysis\", \"data\": { \"sentiment\": \"positive\", \"score\": 0.8 } }\n * ```\n */\n handleDataReceived(payload: Uint8Array, participant?: string): void {\n try {\n const message = JSON.parse(new TextDecoder().decode(payload));\n const eventType = message.event;\n const eventData = message.content || message.data || message;\n\n // Emit specific events\n switch (eventType) {\n case 'answer':\n this.emit('answerReceived', eventData);\n break;\n case 'transcription':\n this.emit('transcriptionReceived', eventData);\n break;\n default:\n // Emit custom event for unknown event types\n this.emit('customEvent', eventType, eventData, {\n timestamp: Date.now(),\n participant: participant || 'unknown',\n rawMessage: message,\n });\n break;\n }\n\n // Emit raw data received event\n this.emit('dataReceived', message, participant || 'unknown');\n } catch (_error) {\n // Intentionally ignore errors during data processing\n }\n }\n\n /**\n * Processes real-time transcription data from LiveKit's speech-to-text system\n *\n * Handles transcription segments received from LiveKit's built-in speech recognition,\n * extracting text content and emitting structured transcription events. This method\n * processes both partial and final transcription segments, enabling real-time\n * speech-to-text display and conversation logging.\n *\n * @param transcriptions - Array of transcription segments from LiveKit\n * @param transcriptions[].text - Transcribed text content\n * @param transcriptions[].final - Whether this is a final transcription segment\n *\n * @fires transcriptionReceived When valid text content is extracted\n *\n * @example\n * ```typescript\n * // This method is called automatically by LiveKitManager\n * // when RoomEvent.TranscriptionReceived is triggered\n *\n * // Listen for transcription updates\n * registry.on('transcriptionReceived', (text) => {\n * console.log('Transcription:', text);\n *\n * // Update real-time transcript display\n * updateTranscriptDisplay(text);\n *\n * // Log conversation for analytics\n * conversationLogger.logUserSpeech(text, Date.now());\n *\n * // Trigger intent recognition\n * if (text.length > 10) {\n * intentRecognizer.analyze(text);\n * }\n * });\n *\n * // Handle transcription processing\n * let transcriptBuffer = '';\n * registry.on('transcriptionReceived', (text) => {\n * transcriptBuffer += text + ' ';\n *\n * // Process complete sentences\n * if (text.endsWith('.') || text.endsWith('?') || text.endsWith('!')) {\n * processCompleteSentence(transcriptBuffer.trim());\n * transcriptBuffer = '';\n * }\n * });\n * ```\n *\n * LiveKit Transcription Format:\n * ```typescript\n * [\n * { text: \"Hello\", final: false },\n * { text: \"Hello there\", final: false },\n * { text: \"Hello there, how are you?\", final: true }\n * ]\n * ```\n */\n handleTranscriptionReceived(\n transcriptions: Array<{ text?: string; final?: boolean }>\n ): void {\n try {\n // LiveKit transcriptions come as an array of segments\n // Each segment has properties like text, final, etc.\n for (const segment of transcriptions) {\n if (segment.text) {\n this.emit('transcriptionReceived', segment.text);\n }\n }\n } catch {\n // Ignore transcription processing errors\n }\n }\n\n /**\n * Provides access to the local microphone audio stream for external processing\n *\n * Retrieves the local participant's microphone track and creates a MediaStream\n * for external audio processing applications. This enables advanced integrations\n * such as real-time audio analysis, recording, or additional audio effects\n * processing outside of the LiveKit pipeline.\n *\n * @fires localAudioStreamAvailable When local audio stream is successfully extracted\n *\n * @example\n * ```typescript\n * // Listen for local audio stream availability\n * registry.on('localAudioStreamAvailable', (stream) => {\n * console.log('Local audio stream is available');\n *\n * // Set up real-time audio analysis\n * const audioAnalyzer = new AudioAnalyzer(stream);\n * audioAnalyzer.on('volumeLevel', (level) => {\n * updateVolumeIndicator(level);\n * });\n *\n * // Enable noise gate functionality\n * const noiseGate = new NoiseGate(stream);\n * noiseGate.threshold = -40; // dB\n *\n * // Record conversation for quality assurance\n * if (recordingEnabled) {\n * const mediaRecorder = new MediaRecorder(stream);\n * mediaRecorder.start();\n *\n * mediaRecorder.ondataavailable = (event) => {\n * saveAudioChunk(event.data);\n * };\n * }\n * });\n *\n * // Call after connection is established\n * registry.emitLocalAudioStream();\n * ```\n *\n * @example Audio Processing Pipeline\n * ```typescript\n * registry.on('localAudioStreamAvailable', (stream) => {\n * // Create audio context for advanced processing\n * const audioContext = new AudioContext();\n * const source = audioContext.createMediaStreamSource(stream);\n *\n * // Add audio effects\n * const gainNode = audioContext.createGain();\n * const filterNode = audioContext.createBiquadFilter();\n *\n * // Connect processing chain\n * source.connect(gainNode);\n * gainNode.connect(filterNode);\n * filterNode.connect(audioContext.destination);\n *\n * // Configure effects\n * gainNode.gain.value = 1.2;\n * filterNode.type = 'highpass';\n * filterNode.frequency.value = 80;\n * });\n * ```\n */\n emitLocalAudioStream(): void {\n if (!this.room) {\n return;\n }\n\n // Emit local audio stream availability\n const localAudioTrack = this.room?.localParticipant?.getTrackPublication(\n Track.Source.Microphone\n );\n if (localAudioTrack?.track) {\n // Create a MediaStream from the local audio track\n const stream = new MediaStream([localAudioTrack.track.mediaStreamTrack]);\n this.emit('localAudioStreamAvailable', stream);\n }\n }\n\n /**\n * Returns the count of currently registered tools\n *\n * Provides a simple way to check how many tools are available for agent\n * execution. Useful for validation, debugging, and analytics reporting.\n *\n * @returns Number of tools in the registry\n *\n * @example\n * ```typescript\n * const toolCount = registry.getToolCount();\n * console.log(`${toolCount} tools available`);\n *\n * // Validate tool registration\n * if (toolCount === 0) {\n * console.warn('No tools registered - agent functionality may be limited');\n * }\n *\n * // Update UI indicator\n * updateToolCountDisplay(toolCount);\n *\n * // Analytics tracking\n * analytics.track('tools_registered', { count: toolCount });\n * ```\n */\n getToolCount(): number {\n return this.tools.length;\n }\n\n /**\n * Returns the complete array of registered tools\n *\n * Provides access to all currently registered tools including their metadata,\n * parameters, and function references. Useful for debugging, validation,\n * and dynamic tool management scenarios.\n *\n * @returns Array of Tool objects currently in the registry\n *\n * @example\n * ```typescript\n * const tools = registry.getTools();\n *\n * // List available tools\n * console.log('Available tools:');\n * tools.forEach(tool => {\n * console.log(`- ${tool.function_name}: ${tool.description}`);\n * });\n *\n * // Validate tool configuration\n * const invalidTools = tools.filter(tool => !tool.fn);\n * if (invalidTools.length > 0) {\n * console.error('Tools missing implementation:', invalidTools);\n * }\n *\n * // Create tool documentation\n * const toolDocs = tools.map(tool => ({\n * name: tool.function_name,\n * description: tool.description,\n * parameters: tool.parameters,\n * required: tool.required\n * }));\n *\n * // Send tool capabilities to external system\n * apiService.updateToolCapabilities(toolDocs);\n * ```\n */\n getTools(): Tool[] {\n return this.tools;\n }\n\n /**\n * Performs cleanup of tool registry resources and state\n *\n * Resets the tool registry to its initial state, clearing any cached data\n * and preparing for safe disposal or reinitialization. LiveKit automatically\n * handles RPC method unregistration when the room disconnects, so minimal\n * cleanup is required.\n *\n * @example\n * ```typescript\n * // Cleanup when component unmounts\n * useEffect(() => {\n * return () => {\n * registry.cleanup();\n * };\n * }, []);\n *\n * // Cleanup before reinitializing\n * const reinitializeRegistry = () => {\n * registry.cleanup();\n * registry = new LiveKitToolRegistry(newTools);\n * setupEventListeners();\n * };\n *\n * // Cleanup is safe to call multiple times\n * registry.cleanup();\n * registry.cleanup(); // Safe\n * ```\n */\n cleanup(): void {\n // Tools are automatically unregistered when room disconnects\n // No additional cleanup needed\n }\n}\n","/**\n * LiveKitManager - Main orchestrator for voice agent communication\n *\n * This class serves as the primary interface for managing real-time voice communication\n * with AI agents using LiveKit WebRTC infrastructure. It coordinates four specialized\n * modules to provide a comprehensive voice agent SDK:\n *\n * - Connection Management: Handles room connections, participants, and network state\n * - Analytics Engine: Processes WebRTC statistics and performance metrics\n * - Audio Management: Manages audio tracks, volume control, and quality monitoring\n * - Tool Registry: Handles RPC method registration and client-side tool execution\n *\n * Key features:\n * - Real-time audio streaming with automatic quality adjustment\n * - Comprehensive analytics and monitoring capabilities\n * - Client-side tool integration for extended agent functionality\n * - Automatic reconnection and error recovery\n * - Event-driven architecture for reactive applications\n *\n * @example\n * ```typescript\n * const manager = new LiveKitManager(\n * 'wss://livekit.example.com',\n * 'access_token',\n * [customTool1, customTool2]\n * );\n *\n * manager.on('connected', () => console.log('Connected to voice agent'));\n * manager.on('answerReceived', (text) => console.log('Agent said:', text));\n *\n * await manager.connect();\n * ```\n */\n\nimport { EventEmitter } from 'events';\nimport type {\n ConnectionQuality,\n Participant,\n RemoteParticipant,\n RemoteTrack,\n RemoteTrackPublication,\n Room,\n} from 'livekit-client';\nimport { RoomEvent, Track } from 'livekit-client';\n\nimport { LiveKitAnalytics } from './livekit-analytics';\nimport { LiveKitAudioManager } from './livekit-audio-manager';\nimport { LiveKitConnection } from './livekit-connection';\nimport { LiveKitToolRegistry } from './livekit-tool-registry';\n\nimport type {\n AudioLevelsResult,\n CallAnalyticsResult,\n ConnectionStatsResult,\n ParticipantData,\n PerformanceMetricsResult,\n Tool,\n TrackStatsResult,\n} from './types';\n\n// Re-export types for external consumption\nexport type {\n AudioLevelsResult,\n CallAnalyticsResult,\n ConnectionStatsResult,\n ParticipantData,\n PerformanceMetricsResult,\n TrackStatsData,\n TrackStatsResult,\n} from './types';\n\n/**\n * Main LiveKitManager class that orchestrates voice agent communication\n *\n * This class extends EventEmitter to provide a reactive interface for handling\n * voice agent interactions, real-time analytics, and WebRTC connection management.\n */\nexport default class LiveKitManager extends EventEmitter {\n /** Connection module - manages LiveKit room connections and participants */\n connection: LiveKitConnection;\n\n /** Analytics module - processes WebRTC stats and performance metrics */\n analytics: LiveKitAnalytics;\n\n /** Audio module - manages audio tracks, volume, and quality */\n audioManager: LiveKitAudioManager;\n\n /** Tool registry - handles client-side tool registration and RPC calls */\n toolRegistry: LiveKitToolRegistry;\n\n /** LiveKit WebSocket URL for room connection */\n lkUrl: string;\n\n /** JWT access token for authentication */\n accessToken: string;\n\n /**\n * Creates a new LiveKitManager instance\n *\n * @param lkUrl - LiveKit WebSocket URL (e.g., 'wss://your-livekit.example.com')\n * @param accessToken - JWT token for room access authentication\n * @param tools - Array of client-side tools that agents can call during conversations\n *\n * @example\n * ```typescript\n * const customTool = {\n * function_name: \"getUserData\",\n * description: \"Retrieves user information\",\n * parameters: [{ name: \"userId\", type: \"string\", description: \"User ID\" }],\n * required: [\"userId\"],\n * fn: async (userId: string) => ({ name: \"John\", email: \"john@example.com\" })\n * };\n *\n * const manager = new LiveKitManager(\n * 'wss://livekit.example.com',\n * 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',\n * [customTool]\n * );\n * ```\n */\n constructor(lkUrl: string, accessToken: string, tools: Tool[] = []) {\n super();\n\n this.lkUrl = lkUrl;\n this.accessToken = accessToken;\n\n // Initialize specialized modules with their specific responsibilities\n this.connection = new LiveKitConnection(lkUrl, accessToken);\n this.analytics = new LiveKitAnalytics();\n this.audioManager = new LiveKitAudioManager();\n this.toolRegistry = new LiveKitToolRegistry(tools);\n\n // Establish communication channels between modules\n this.#setupModuleCommunication();\n\n // Configure event forwarding from modules to external consumers\n this.#setupEventForwarding();\n\n // Configure LiveKit room event handlers for WebRTC events\n this.#setupRoomEventHandlers();\n }\n\n /**\n * Establishes connection to the LiveKit room and initializes voice agent communication\n *\n * This method performs the following operations:\n * - Validates connection state to prevent duplicate connections\n * - Updates analytics tracking for connection attempts\n * - Establishes WebRTC connection to the LiveKit room\n * - Triggers module initialization once connected\n *\n * @throws {Error} Connection errors from LiveKit (network issues, authentication failures, etc.)\n *\n * @example\n * ```typescript\n * try {\n * await manager.connect();\n * console.log('Successfully connected to voice agent');\n * } catch (error) {\n * console.error('Failed to connect:', error.message);\n * }\n * ```\n */\n async connect(): Promise<void> {\n if (this.connection.isConnected) {\n // Already connected - silently return to avoid duplicate connections\n return;\n }\n\n // Track connection attempt in analytics before establishing connection\n const currentStats = this.connection.getConnectionStats();\n this.analytics.updateConnectionStats(\n currentStats.connectionAttempts + 1,\n currentStats.reconnectionAttempts\n );\n\n await this.connection.connect();\n }\n\n /**\n * Terminates the connection to the LiveKit room and performs cleanup\n *\n * This method safely disconnects from the voice agent and ensures all resources\n * are properly released, including audio tracks, analytics timers, and event listeners.\n *\n * @example\n * ```typescript\n * await manager.disconnect();\n * console.log('Disconnected from voice agent');\n * ```\n */\n async disconnect(): Promise<void> {\n await this.connection.disconnect();\n // Perform comprehensive cleanup of all modules\n this.cleanup();\n }\n\n /**\n * Pauses the voice conversation, stopping audio transmission and reception\n *\n * This temporarily halts communication with the voice agent while maintaining\n * the underlying connection. Audio playback is paused and microphone input\n * is muted until resume() is called.\n *\n * @example\n * ```typescript\n * manager.pause();\n * console.log('Conversation paused');\n *\n * // Resume later\n * setTimeout(() => manager.resume(), 5000);\n * ```\n */\n pause(): void {\n this.connection.pause();\n this.audioManager.pauseAllAudio();\n }\n\n /**\n * Resumes a paused voice conversation\n *\n * Restores audio transmission and reception, allowing continued communication\n * with the voice agent. This reverses the effects of pause().\n *\n * @example\n * ```typescript\n * manager.resume();\n * console.log('Conversation resumed');\n * ```\n */\n resume(): void {\n this.connection.resume();\n this.audioManager.resumeAllAudio();\n }\n\n /**\n * Adjusts the volume level for audio playback from the voice agent\n *\n * @param volume - Volume level between 0.0 (muted) and 1.0 (full volume)\n *\n * @example\n * ```typescript\n * // Set to half volume\n * manager.setVolume(0.5);\n *\n * // Mute completely\n * manager.setVolume(0);\n *\n * // Full volume\n * manager.setVolume(1.0);\n * ```\n */\n setVolume(volume: number): void {\n this.audioManager.setVolume(volume);\n }\n\n /**\n * Gets the current LiveKit room instance\n *\n * @returns The LiveKit Room object if connected, null otherwise\n *\n * @example\n * ```typescript\n * const room = manager.room;\n * if (room) {\n * console.log('Connected to room:', room.name);\n * console.log('Participants:', room.remoteParticipants.size);\n * }\n * ```\n */\n get room(): Room | null {\n return this.connection.room;\n }\n\n /**\n * Checks if currently connected to the voice agent\n *\n * @returns True if connected to LiveKit room, false otherwise\n *\n * @example\n * ```typescript\n * if (manager.isConnected) {\n * console.log('Ready for voice communication');\n * } else {\n * console.log('Not connected - call connect() first');\n * }\n * ```\n */\n get isConnected(): boolean {\n return this.connection.isConnected;\n }\n\n /**\n * Checks if the conversation is currently paused\n *\n * @returns True if paused, false if active or disconnected\n *\n * @example\n * ```typescript\n * if (manager.isPaused) {\n * console.log('Conversation is paused');\n * showResumeButton();\n * }\n * ```\n */\n get isPaused(): boolean {\n return this.connection.isPaused;\n }\n\n /**\n * Gets the current audio volume level\n *\n * @returns Current volume between 0.0 (muted) and 1.0 (full volume)\n *\n * @example\n * ```typescript\n * const currentVolume = manager.volume;\n * updateVolumeSlider(currentVolume);\n * ```\n */\n get volume(): number {\n return this.audioManager.volume;\n }\n\n /**\n * Gets the set of active HTML audio elements\n *\n * @returns Set of HTMLAudioElement instances currently playing agent audio\n *\n * @example\n * ```typescript\n * const audioElements = manager.audioElements;\n * console.log(`Active audio elements: ${audioElements.size}`);\n * ```\n */\n get audioElements(): Set<HTMLAudioElement> {\n return this.audioManager.audioElements;\n }\n\n /**\n * Gets the array of registered client-side tools\n *\n * @returns Array of Tool objects available for agent execution\n *\n * @example\n * ```typescript\n * const registeredTools = manager.tools;\n * console.log(`Available tools: ${registeredTools.map(t => t.function_name).join(', ')}`);\n * ```\n */\n get tools(): Tool[] {\n return this.toolRegistry.getTools();\n }\n\n /**\n * Gets raw call statistics from the analytics module\n *\n * @returns Internal call statistics object with WebRTC metrics\n * @internal\n */\n get callStats() {\n return this.analytics.callStats;\n }\n\n /**\n * Gets raw connection metrics from the analytics module\n *\n * @returns Internal connection metrics object\n * @internal\n */\n get connectionMetrics() {\n return this.analytics.connectionMetrics;\n }\n\n /**\n * Gets raw audio metrics from the analytics module\n *\n * @returns Internal audio metrics object\n * @internal\n */\n get audioMetrics() {\n return this.analytics.audioMetrics;\n }\n\n /**\n * Gets raw performance metrics from the analytics module\n *\n * @returns Internal performance metrics object\n * @internal\n */\n get performanceMetrics() {\n return this.analytics.performanceMetrics;\n }\n\n /**\n * Gets the analytics collection interval timer\n *\n * @returns NodeJS.Timeout for the analytics interval, or null if not collecting\n * @internal\n */\n get analyticsInterval() {\n return this.analytics.analyticsInterval;\n }\n\n /**\n * Gets the timestamp when the call started\n *\n * @returns Unix timestamp in milliseconds when call began, null if not started\n *\n * @example\n * ```typescript\n * const startTime = manager.callStartTime;\n * if (startTime) {\n * const duration = Date.now() - startTime;\n * console.log(`Call duration: ${Math.floor(duration / 1000)}s`);\n * }\n * ```\n */\n get callStartTime(): number | null {\n return this.analytics.callStartTime || this.connection.callStartTime;\n }\n\n /**\n * Gets the map of active participants in the room\n *\n * @returns Map of participant SIDs to Participant objects\n * @internal Use getParticipants() for structured participant data\n */\n get participants() {\n return this.connection.participants;\n }\n\n /**\n * Gets the raw track statistics map\n *\n * @returns Map of track IDs to track data objects\n * @internal Use getTrackStats() for structured track statistics\n */\n get trackStats() {\n return this.audioManager.trackStats;\n }\n\n // === Public Analytics Methods ===\n\n /**\n * Retrieves current network connection statistics and quality metrics\n *\n * @returns Object containing latency, packet loss, bandwidth, quality rating, and connection counts\n *\n * @example\n * ```typescript\n * const stats = manager.getConnectionStats();\n * console.log(`Latency: ${stats.latency}ms`);\n * console.log(`Packet loss: ${stats.packetLoss}%`);\n * console.log(`Connection quality: ${stats.quality}`);\n *\n * if (stats.quality === 'poor') {\n * showNetworkWarning();\n * }\n * ```\n */\n getConnectionStats(): ConnectionStatsResult {\n return this.analytics.getConnectionStats();\n }\n\n /**\n * Retrieves current audio levels and quality metrics for both user and agent\n *\n * @returns Object containing audio levels, speaking times, quality metrics, pause state, and volume\n *\n * @example\n * ```typescript\n * const audio = manager.getAudioLevels();\n *\n * // Update audio level indicators in UI\n * updateMeterBar('user-audio', audio.userAudioLevel);\n * updateMeterBar('agent-audio', audio.agentAudioLevel);\n *\n * // Show speaking time statistics\n * console.log(`User spoke for ${audio.userSpeakingTime / 1000}s`);\n * console.log(`Agent spoke for ${audio.agentSpeakingTime / 1000}s`);\n * ```\n */\n getAudioLevels(): AudioLevelsResult & { isPaused: boolean; volume: number } {\n const audioLevels = this.analytics.getAudioLevels();\n return {\n ...audioLevels,\n isPaused: this.connection.isPaused,\n volume: this.audioManager.volume,\n };\n }\n\n /**\n * Retrieves current performance metrics including response times and call duration\n *\n * @returns Object containing response times, network latency, call duration, and connection timing\n *\n * @example\n * ```typescript\n * const perf = manager.getPerformanceMetrics();\n *\n * // Monitor response time for agent interactions\n * if (perf.responseTime > 3000) {\n * console.warn('High response time detected:', perf.responseTime + 'ms');\n * }\n *\n * // Display call duration\n * const minutes = Math.floor(perf.callDuration / 60000);\n * const seconds = Math.floor((perf.callDuration % 60000) / 1000);\n * console.log(`Call duration: ${minutes}:${seconds.toString().padStart(2, '0')}`);\n * ```\n */\n getPerformanceMetrics(): PerformanceMetricsResult {\n return this.analytics.getPerformanceMetrics();\n }\n\n /**\n * Retrieves structured information about all participants in the room\n *\n * @returns Array of ParticipantData objects with identity, connection info, and metadata\n *\n * @example\n * ```typescript\n * const participants = manager.getParticipants();\n *\n * participants.forEach(participant => {\n * console.log(`Participant: ${participant.identity}`);\n * console.log(`Connected at: ${new Date(participant.connectionTime)}`);\n *\n * if (participant.metadata) {\n * console.log(`Metadata: ${participant.metadata}`);\n * }\n * });\n *\n * // Find the agent participant\n * const agent = participants.find(p => p.identity.includes('agent'));\n * ```\n */\n getParticipants(): ParticipantData[] {\n return this.connection.getParticipants();\n }\n\n /**\n * Retrieves current audio track statistics and stream information\n *\n * @returns Object containing track counts, audio element info, and detailed track data\n *\n * @example\n * ```typescript\n * const trackStats = manager.getTrackStats();\n *\n * console.log(`Active tracks: ${trackStats.activeTracks}/${trackStats.totalTracks}`);\n * console.log(`Audio elements: ${trackStats.audioElements}`);\n *\n * // Inspect individual tracks\n * trackStats.trackDetails.forEach(([trackId, data]) => {\n * console.log(`Track ${trackId}: ${data.kind} from ${data.participant}`);\n * });\n * ```\n */\n getTrackStats(): TrackStatsResult {\n return this.audioManager.getTrackStats();\n }\n\n /**\n * Retrieves comprehensive analytics combining all metrics into a single snapshot\n *\n * This is the primary method for accessing complete call analytics, combining\n * connection statistics, audio metrics, performance data, participant info,\n * track statistics, and call metadata into a unified result.\n *\n * @returns Complete analytics object with all available metrics and metadata\n *\n * @example\n * ```typescript\n * const analytics = manager.getCallAnalytics();\n *\n * // Log comprehensive call summary\n * console.log('=== Call Analytics ===');\n * console.log(`Duration: ${analytics.performanceMetrics.callDuration}ms`);\n * console.log(`Quality: ${analytics.connectionStats.quality}`);\n * console.log(`Participants: ${analytics.participants.length}`);\n * console.log(`Tracks: ${analytics.trackStats.activeTracks}`);\n *\n * // Send to analytics service\n * analyticsService.recordCall({\n * sessionId: generateSessionId(),\n * timestamp: Date.now(),\n * data: analytics\n * });\n *\n * // Check for quality issues\n * if (analytics.connectionStats.packetLoss > 5) {\n * reportNetworkIssue(analytics.connectionStats);\n * }\n * ```\n */\n getCallAnalytics(): CallAnalyticsResult {\n return this.analytics.getCallAnalytics(\n this.getParticipants(),\n this.getTrackStats(),\n this.audioManager.volume,\n this.connection.isPaused\n );\n }\n\n /**\n * Registers client-side tools that voice agents can call during conversations\n *\n * This method updates the available tools and registers them as RPC methods\n * with the LiveKit room for remote execution by voice agents.\n *\n * @param tools - Optional array of Tool objects to register. If not provided,\n * uses tools from constructor or previously set tools.\n *\n * @example\n * ```typescript\n * const userDataTool = {\n * function_name: \"getUserProfile\",\n * description: \"Retrieves user profile information\",\n * parameters: [\n * { name: \"userId\", type: \"string\", description: \"User ID to lookup\" }\n * ],\n * required: [\"userId\"],\n * fn: async (userId: string) => {\n * const user = await userService.getProfile(userId);\n * return { name: user.name, email: user.email, plan: user.subscription };\n * }\n * };\n *\n * const weatherTool = {\n * function_name: \"getCurrentWeather\",\n * description: \"Gets current weather for a location\",\n * parameters: [\n * { name: \"location\", type: \"string\", description: \"City name\" }\n * ],\n * required: [\"location\"],\n * fn: async (location: string) => {\n * return await weatherAPI.getCurrent(location);\n * }\n * };\n *\n * // Register new tools after connection\n * manager.registerTools([userDataTool, weatherTool]);\n *\n * // Agent can now call these tools during conversation\n * manager.on('answerReceived', (text) => {\n * console.log('Agent response:', text);\n * // Agent might say: \"I found your profile! You're on the premium plan.\"\n * });\n * ```\n */\n registerTools(tools?: Tool[]): void {\n if (tools?.length) {\n this.toolRegistry.setTools(tools);\n }\n\n // Ensure the tool registry has access to the room for RPC registration\n if (this.room) {\n this.toolRegistry.setRoom(this.room);\n }\n\n this.toolRegistry.registerTools();\n }\n\n /**\n * Establishes inter-module communication channels and event coordination\n *\n * This private method sets up the complex event flow between the four specialized\n * modules (connection, analytics, audio, tools) to ensure proper coordination\n * and data sharing throughout the voice agent session lifecycle.\n *\n * Key responsibilities:\n * - Share room references between modules when connection is established\n * - Coordinate analytics collection with connection state changes\n * - Update metrics when participants and tracks change\n * - Ensure proper cleanup when disconnected\n *\n * @private\n */\n #setupModuleCommunication(): void {\n // When connection is established, distribute room reference and initialize modules\n this.connection.on('connected', () => {\n const room = this.connection.room;\n\n // Distribute room reference to modules that need direct access\n this.analytics.setRoom(room);\n this.toolRegistry.setRoom(room);\n this.audioManager.setRoom(room);\n\n // Initialize analytics tracking with connection state and start time\n this.analytics.setConnectionState(true, this.connection.callStartTime);\n\n // Register any tools that were provided during construction\n this.toolRegistry.registerTools();\n\n // Begin periodic analytics data collection\n this.analytics.startAnalyticsCollection();\n\n // Make local audio stream available for external use\n this.toolRegistry.emitLocalAudioStream();\n\n // Setup WebRTC event handlers that require module coordination\n this.#setupRoomEventHandlers();\n });\n\n // Record precise connection establishment timing for performance metrics\n this.connection.on('connectionEstablished', (time: number) => {\n this.analytics.setConnectionEstablishedTime(time);\n });\n\n // Update analytics with successful connection statistics\n this.connection.on('connected', () => {\n const stats = this.connection.getConnectionStats();\n this.analytics.updateConnectionStats(\n stats.connectionAttempts,\n stats.reconnectionAttempts\n );\n });\n\n // Update analytics with reconnection attempt statistics\n this.connection.on('reconnecting', () => {\n const stats = this.connection.getConnectionStats();\n this.analytics.updateConnectionStats(\n stats.connectionAttempts,\n stats.reconnectionAttempts\n );\n });\n\n // Perform comprehensive cleanup when connection is terminated\n this.connection.on('disconnected', () => {\n this.analytics.stopAnalyticsCollection();\n this.analytics.setConnectionState(false);\n this.audioManager.cleanup();\n this.toolRegistry.cleanup();\n this.analytics.cleanup();\n });\n\n // Keep analytics updated with real-time participant and track counts\n this.connection.on('participantConnected', () => {\n this.#updateAnalyticsCounts();\n });\n\n this.connection.on('participantDisconnected', () => {\n this.#updateAnalyticsCounts();\n });\n\n this.audioManager.on('trackSubscribed', () => {\n this.#updateAnalyticsCounts();\n });\n\n this.audioManager.on('trackUnsubscribed', () => {\n this.#updateAnalyticsCounts();\n });\n }\n\n /**\n * Configures event forwarding from specialized modules to external consumers\n *\n * This private method creates a unified event interface by forwarding events\n * from the four specialized modules (connection, analytics, audio, tools) to\n * the main LiveKitManager EventEmitter. This allows external code to listen\n * to all events from a single source while maintaining modular architecture.\n *\n * Event categories forwarded:\n * - Connection events: connected, disconnected, reconnecting, participants\n * - Audio events: track subscriptions, speaking states, volume changes\n * - Analytics events: quality changes, metrics updates, playback status\n * - Tool/Data events: agent responses, transcriptions, custom events, RPC calls\n *\n * @private\n */\n #setupEventForwarding(): void {\n // === Connection Events ===\n // Forward connection lifecycle events for monitoring connection state\n this.connection.on('connected', () => this.emit('connected'));\n this.connection.on('disconnected', () => this.emit('disconnected'));\n this.connection.on('reconnecting', () => this.emit('reconnecting'));\n this.connection.on('reconnected', () => this.emit('reconnected'));\n\n // Forward participant management events for tracking room occupancy\n this.connection.on('participantConnected', (participant) =>\n this.emit('participantConnected', participant)\n );\n this.connection.on('participantDisconnected', (participant) =>\n this.emit('participantDisconnected', participant)\n );\n\n // Forward connection state and error events for external error handling\n this.connection.on('connectionStateChanged', (state) =>\n this.emit('connectionStateChanged', state)\n );\n this.connection.on('connectionError', (error) => {\n if (this.listenerCount('error') > 0) {\n this.emit('error', error);\n }\n });\n\n // === Audio Events ===\n // Forward audio track management events for media stream monitoring\n this.audioManager.on('trackSubscribed', (data) =>\n this.emit('trackSubscribed', data)\n );\n this.audioManager.on('trackUnsubscribed', (data) =>\n this.emit('trackUnsubscribed', data)\n );\n\n // Forward speaking state events for conversation flow tracking\n this.audioManager.on('speaking', () => this.emit('speaking'));\n this.audioManager.on('listening', () => this.emit('listening'));\n\n // Forward volume control events for UI synchronization\n this.audioManager.on('volumeChanged', (volume) =>\n this.emit('volumeChanged', volume)\n );\n this.audioManager.on('error', (error) => {\n if (this.listenerCount('error') > 0) {\n this.emit('error', error);\n }\n });\n\n // === Analytics Events ===\n // Forward real-time quality monitoring events for dashboard updates\n this.analytics.on('connectionQualityChanged', (data) =>\n this.emit('connectionQualityChanged', data)\n );\n this.analytics.on('audioPlaybackChanged', (playing) =>\n this.emit('audioPlaybackChanged', playing)\n );\n\n // Forward periodic analytics updates for comprehensive monitoring\n this.analytics.on('analyticsUpdated', (analytics) =>\n this.emit('analyticsUpdated', analytics)\n );\n\n // === Tool and Data Events ===\n // Forward agent communication events for conversation tracking\n this.toolRegistry.on('answerReceived', (answer) =>\n this.emit('answerReceived', answer)\n );\n this.toolRegistry.on('transcriptionReceived', (transcription) =>\n this.emit('transcriptionReceived', transcription)\n );\n\n // Forward custom agent events for application-specific logic\n this.toolRegistry.on('customEvent', (eventType, eventData, metadata) =>\n this.emit('customEvent', eventType, eventData, metadata)\n );\n\n // Forward raw data events for advanced integrations\n this.toolRegistry.on('dataReceived', (message, participant) =>\n this.emit('dataReceived', message, participant)\n );\n\n // Forward audio stream events for external audio processing\n this.toolRegistry.on('localAudioStreamAvailable', (stream) =>\n this.emit('localAudioStreamAvailable', stream)\n );\n\n // Forward tool registration confirmations for debugging\n this.toolRegistry.on('toolsRegistered', (count) =>\n this.emit('toolsRegistered', count)\n );\n }\n\n /**\n * Configures LiveKit room event handlers that require coordination between modules\n *\n * This private method sets up WebRTC-level event handlers that need to coordinate\n * actions across multiple modules. These handlers respond to low-level LiveKit\n * events and delegate processing to the appropriate specialized modules.\n *\n * Events handled:\n * - TrackSubscribed/Unsubscribed: Audio stream management and analytics updates\n * - DataReceived: Tool execution and custom message processing\n * - TranscriptionReceived: Speech-to-text processing and forwarding\n * - ConnectionQualityChanged: Real-time quality monitoring and analytics\n * - AudioPlaybackStatusChanged: Playback state tracking for analytics\n * - MediaDevicesError: Hardware error handling and reporting\n *\n * @private\n */\n #setupRoomEventHandlers(): void {\n const room = this.connection.room;\n if (!room) {\n return;\n }\n\n // Define WebRTC event handlers with module coordination\n const eventHandlers = [\n [\n RoomEvent.TrackSubscribed,\n (\n track: RemoteTrack,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant\n ) => {\n // Delegate audio track processing to audio manager\n this.audioManager.handleTrackSubscribed(\n track,\n publication,\n participant\n );\n\n // Make remote audio stream available for external audio processing\n if (track.kind === Track.Kind.Audio && track.mediaStreamTrack) {\n const stream = new MediaStream([track.mediaStreamTrack]);\n this.emit('remoteAudioStreamAvailable', stream);\n }\n },\n ],\n [\n RoomEvent.TrackUnsubscribed,\n (\n track: RemoteTrack,\n publication: RemoteTrackPublication,\n participant: RemoteParticipant\n ) => {\n // Delegate audio track cleanup to audio manager\n this.audioManager.handleTrackUnsubscribed(\n track,\n publication,\n participant\n );\n },\n ],\n [\n RoomEvent.DataReceived,\n (payload: Uint8Array, participant?: RemoteParticipant) => {\n // Delegate data processing to tool registry for RPC handling\n this.toolRegistry.handleDataReceived(payload, participant?.identity);\n },\n ],\n [\n RoomEvent.TranscriptionReceived,\n (transcriptions: Array<{ text?: string; final?: boolean }>) => {\n // Delegate transcription processing to tool registry\n this.toolRegistry.handleTranscriptionReceived(transcriptions);\n },\n ],\n [\n RoomEvent.ConnectionQualityChanged,\n (quality: ConnectionQuality, participant: Participant) => {\n // Delegate quality monitoring to analytics module\n this.analytics.handleConnectionQualityChanged(quality, participant);\n },\n ],\n [\n RoomEvent.AudioPlaybackStatusChanged,\n (playing: boolean) => {\n // Delegate playback state tracking to analytics module\n this.analytics.handleAudioPlaybackChanged(playing);\n },\n ],\n [\n RoomEvent.MediaDevicesError,\n (error: Error) => {\n // Forward media device errors for external error handling\n this.emit('mediaDevicesError', error);\n },\n ],\n ];\n\n // Register all event handlers with the LiveKit room\n for (const [event, handler] of eventHandlers) {\n // biome-ignore lint/suspicious/noExplicitAny: Room event handling requires flexible typing for different handler signatures\n room.on(event as any, handler);\n }\n }\n\n /**\n * Updates analytics with current participant and track counts\n *\n * This private helper method synchronizes the analytics module with the current\n * state of participants and tracks, ensuring accurate metrics reporting.\n * Called whenever participants join/leave or tracks are added/removed.\n *\n * @private\n */\n #updateAnalyticsCounts(): void {\n const participantCount = this.connection.participants.size;\n const trackCount = this.audioManager.trackStats.size;\n this.analytics.updateCounts(participantCount, trackCount);\n }\n\n /**\n * Performs comprehensive cleanup of all modules and resources\n *\n * This method ensures all resources are properly released, including:\n * - WebRTC connections and media streams\n * - Audio elements and playback resources\n * - Analytics timers and event listeners\n * - Tool registry and RPC handlers\n *\n * Called automatically on disconnect, but can be called manually for\n * explicit resource management in complex applications.\n *\n * @example\n * ```typescript\n * // Explicit cleanup when component unmounts\n * useEffect(() => {\n * return () => {\n * manager.cleanup();\n * };\n * }, []);\n *\n * // Cleanup before reconnecting with different configuration\n * await manager.disconnect();\n * manager.cleanup();\n *\n * const newManager = new LiveKitManager(newUrl, newToken, newTools);\n * ```\n */\n cleanup(): void {\n this.connection.cleanup();\n this.audioManager.cleanup();\n this.analytics.cleanup();\n this.toolRegistry.cleanup();\n }\n}\n","/**\n * Manages a Screen Wake Lock using the Wake Lock API.\n *\n * This class encapsulates the logic for requesting and releasing a screen\n * wake lock to prevent the device from sleeping during an active call.\n *\n * Usage:\n * import ScreenWakeLock from './ScreenWakeLock';\n * const wakeLockManager = new ScreenWakeLock();\n *\n * To acquire the wake lock:\n * await wakeLockManager.acquire();\n *\n * To release the wake lock:\n * await wakeLockManager.release();\n *\n * Check if the wake lock is active:\n * console.log(wakeLockManager.isActive());\n */\n\n// Type definitions for Screen Wake Lock API\ntype WakeLockSentinel = EventTarget & {\n readonly type: 'screen';\n release(): Promise<void>;\n addEventListener(type: 'release', listener: () => void): void;\n removeEventListener(type: 'release', listener: () => void): void;\n};\n\ntype WakeLock = {\n request(type: 'screen'): Promise<WakeLockSentinel>;\n};\n\n// Type guard to check if navigator has wakeLock\nfunction hasWakeLock(\n nav: Navigator\n): nav is Navigator & { wakeLock: WakeLock } {\n return (\n 'wakeLock' in nav &&\n typeof (nav as { wakeLock?: unknown }).wakeLock === 'object'\n );\n}\n\nexport default class ScreenWakeLock {\n /**\n * The wake lock sentinel that controls the screen wake lock.\n * @private\n */\n private _wakeLock: WakeLockSentinel | null = null;\n\n constructor() {\n this._wakeLock = null;\n }\n\n /**\n * Attempts to acquire a screen wake lock.\n * If the Wake Lock API is not supported, a warning is logged.\n *\n * @returns Promise<void>\n */\n async acquire(): Promise<void> {\n if (hasWakeLock(navigator)) {\n try {\n this._wakeLock = await navigator.wakeLock.request('screen');\n this._wakeLock.addEventListener('release', () => {\n this._wakeLock = null;\n });\n } catch {\n // Ignore wake lock request errors\n }\n } else {\n // Wake lock API not supported\n }\n }\n\n /**\n * Releases the screen wake lock if it is active.\n *\n * @returns Promise<void>\n */\n async release(): Promise<void> {\n if (this._wakeLock !== null) {\n try {\n await this._wakeLock.release();\n this._wakeLock = null;\n } catch {\n // Ignore wake lock release errors\n }\n }\n }\n\n /**\n * Indicates whether the wake lock is currently active.\n *\n * @returns True if the wake lock is active, false otherwise.\n */\n isActive(): boolean {\n return this._wakeLock !== null;\n }\n}\n","import { EventEmitter } from 'events';\nimport LiveKitManager, {\n type AudioLevelsResult,\n type CallAnalyticsResult,\n type ConnectionStatsResult,\n type ParticipantData,\n type PerformanceMetricsResult,\n type TrackStatsResult,\n} from './classes/livekit-manager';\nimport ScreenWakeLock from './classes/screen-wake-lock';\n\n/**\n * Configuration options for the HamsaVoiceAgent constructor\n * Allows customization of API endpoints and other global settings\n */\ntype HamsaVoiceAgentConfig = {\n /** Base URL for the Hamsa API. Defaults to 'https://api.tryhamsa.com' */\n API_URL?: string;\n};\n\n/**\n * Configuration options for starting a voice agent conversation\n *\n * Defines the agent to use, conversation parameters, voice capabilities,\n * and client-side tools that will be available during the conversation.\n */\ntype ConnectionDelays = {\n /** Delay in milliseconds for Android devices */\n android?: number;\n /** Delay in milliseconds for iOS devices */\n ios?: number;\n /** Default delay in milliseconds for other devices */\n default?: number;\n};\n\ntype StartOptions = {\n /** Unique identifier of the voice agent to start (from Hamsa dashboard) */\n agentId: string;\n /**\n * Optional parameters to pass to the agent for conversation customization\n * These can be referenced in agent prompts using {{parameter_name}} syntax\n * @example { userName: \"John\", orderNumber: \"12345\", userTier: \"premium\" }\n */\n params?: Record<string, unknown>;\n /** Whether to enable voice interactions. If false, agent runs in text-only mode */\n voiceEnablement?: boolean;\n /** Array of client-side tools that the agent can call during conversations */\n tools?: Tool[];\n /** Optional user identifier for tracking and analytics */\n userId?: string;\n /** Force headphones usage on iOS devices when available */\n preferHeadphonesForIosDevices?: boolean;\n /** Platform-specific connection delays to prevent audio cutoff */\n connectionDelay?: ConnectionDelays;\n /** Disable wake lock to allow device sleep during conversation */\n disableWakeLock?: boolean;\n};\n\n/**\n * Definition of a client-side tool that can be called by the voice agent\n *\n * Tools allow agents to execute custom functions in the client environment,\n * such as retrieving user data, making API calls, or performing calculations.\n */\ntype Tool = {\n /** Unique name for the function (used by agent to identify the tool) */\n function_name: string;\n /** Clear description of what the function does (helps agent decide when to use it) */\n description: string;\n /** Array of parameters the function accepts */\n parameters?: ToolParameter[];\n /** Array of parameter names that are required for the function */\n required?: string[];\n /** Internal function mapping (used for tool execution) */\n func_map?: Record<string, unknown>;\n};\n\n/**\n * Definition of a parameter for a client-side tool\n * Describes the input that the function expects from the agent\n */\ntype ToolParameter = {\n /** Name of the parameter */\n name: string;\n /** Data type of the parameter (e.g., 'string', 'number', 'boolean') */\n type: string;\n /** Description of what the parameter represents */\n description: string;\n};\n\n/**\n * Internal representation of tools in the LLM/API format\n * Used for communication with the Hamsa backend\n * @private\n */\ntype LLMTool = {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: {\n type: 'object';\n properties: Record<\n string,\n {\n type: string;\n description: string;\n }\n >;\n required: string[];\n };\n func_map?: Record<string, unknown>;\n };\n};\n\n/**\n * Response format for job details from the Hamsa API\n *\n * Returned by getJobDetails() method to check conversation completion\n * status and retrieve additional job metadata.\n */\ntype JobDetails = {\n /** Current status of the job (e.g., 'COMPLETED', 'IN_PROGRESS', 'FAILED') */\n status: string;\n /** Additional job properties that may be returned by the API */\n [key: string]: unknown;\n};\n\n/**\n * HamsaVoiceAgent - Main SDK class for voice agent integration\n *\n * This class provides the primary interface for integrating Hamsa voice agents\n * into web applications. It handles authentication, connection management,\n * conversation lifecycle, analytics, and client-side tool execution.\n *\n * Key features:\n * - Real-time voice communication with AI agents\n * - Comprehensive analytics and quality monitoring\n * - Client-side tool integration for extended functionality\n * - Automatic screen wake lock management during calls\n * - Event-driven architecture for reactive applications\n * - Built-in error handling and reconnection logic\n *\n * @example Basic Usage\n * ```typescript\n * import { HamsaVoiceAgent } from '@hamsa-ai/voice-agents-sdk';\n *\n * const agent = new HamsaVoiceAgent('your_api_key');\n *\n * // Listen for events\n * agent.on('callStarted', () => console.log('Call started'));\n * agent.on('answerReceived', (text) => console.log('Agent said:', text));\n * agent.on('transcriptionReceived', (text) => console.log('User said:', text));\n *\n * // Start conversation\n * await agent.start({\n * agentId: 'your_agent_id',\n * voiceEnablement: true,\n * params: { userName: 'John', context: 'support_inquiry' }\n * });\n * ```\n *\n * @example With Client-side Tools\n * ```typescript\n * const weatherTool = {\n * function_name: 'getCurrentWeather',\n * description: 'Gets current weather for a location',\n * parameters: [\n * { name: 'location', type: 'string', description: 'City name' }\n * ],\n * required: ['location'],\n * fn: async (location) => {\n * const response = await fetch(`/api/weather?city=${location}`);\n * return response.json();\n * }\n * };\n *\n * await agent.start({\n * agentId: 'weather_agent_id',\n * tools: [weatherTool],\n * voiceEnablement: true\n * });\n * ```\n *\n * @example Analytics Monitoring\n * ```typescript\n * // Real-time quality monitoring\n * agent.on('connectionQualityChanged', ({ quality, metrics }) => {\n * if (quality === 'poor') {\n * showNetworkWarning();\n * }\n * });\n *\n * // Periodic analytics updates\n * agent.on('analyticsUpdated', (analytics) => {\n * updateDashboard({\n * duration: analytics.performanceMetrics.callDuration,\n * quality: analytics.connectionStats.quality,\n * latency: analytics.connectionStats.latency\n * });\n * });\n *\n * // Get analytics snapshot anytime\n * const analytics = agent.getCallAnalytics();\n * ```\n */\nclass HamsaVoiceAgent extends EventEmitter {\n /** Default fallback output volume when not connected */\n private static readonly DEFAULT_OUTPUT_VOLUME = 0.0;\n /** Default fallback input volume when not connected */\n private static readonly DEFAULT_INPUT_VOLUME = 0.0;\n /** Internal LiveKit manager instance for WebRTC communication */\n liveKitManager: LiveKitManager | null = null;\n\n /** Hamsa API key for authentication */\n apiKey: string;\n\n /** Base URL for Hamsa API endpoints */\n API_URL: string;\n\n /** Job ID for tracking conversation completion status */\n jobId: string | null = null;\n\n /** Screen wake lock manager to prevent device sleep during calls */\n wakeLockManager: ScreenWakeLock;\n\n /**\n * Creates a new HamsaVoiceAgent instance\n *\n * @param apiKey - Your Hamsa API key (get from https://dashboard.tryhamsa.com)\n * @param config - Optional configuration settings\n * @param config.API_URL - Custom API endpoint URL (defaults to https://api.tryhamsa.com)\n *\n * @example\n * ```typescript\n * // Using default API endpoint\n * const agent = new HamsaVoiceAgent('hamsa_api_key_here');\n *\n * // Using custom API endpoint\n * const agent = new HamsaVoiceAgent('hamsa_api_key_here', {\n * API_URL: 'https://custom-api.example.com'\n * });\n * ```\n *\n * @throws {Error} If apiKey is not provided or invalid\n */\n constructor(\n apiKey: string,\n { API_URL = 'https://api.tryhamsa.com' }: HamsaVoiceAgentConfig = {}\n ) {\n super();\n this.liveKitManager = null;\n this.apiKey = apiKey;\n this.API_URL = API_URL;\n this.jobId = null;\n this.wakeLockManager = new ScreenWakeLock();\n }\n\n /**\n * Adjusts the volume level for voice agent audio playback\n *\n * Controls the volume of the voice agent's speech output. This affects\n * all audio playback from the agent but does not change the user's\n * microphone input level.\n *\n * @param volume - Volume level between 0.0 (muted) and 1.0 (full volume)\n *\n * @example\n * ```typescript\n * // Set to half volume\n * agent.setVolume(0.5);\n *\n * // Mute agent completely\n * agent.setVolume(0);\n *\n * // Full volume\n * agent.setVolume(1.0);\n *\n * // Can be called during active conversation\n * agent.on('callStarted', () => {\n * agent.setVolume(0.8); // Slightly quieter\n * });\n * ```\n */\n setVolume(volume: number): void {\n if (this.liveKitManager) {\n this.liveKitManager.setVolume(volume);\n }\n }\n\n /**\n * Gets the current output volume level\n *\n * Returns the current volume setting for voice agent audio playback.\n * This represents the playback volume for all voice agent audio streams.\n *\n * @returns Current output volume level (0.0 = muted, 1.0 = full volume)\n *\n * @example\n * ```typescript\n * const currentVolume = agent.getOutputVolume();\n * console.log(`Volume: ${Math.round(currentVolume * 100)}%`);\n * ```\n */\n getOutputVolume(): number {\n return (\n this.liveKitManager?.audioManager.getOutputVolume() ??\n HamsaVoiceAgent.DEFAULT_OUTPUT_VOLUME\n );\n }\n\n /**\n * Gets the current input volume level from the user's microphone\n *\n * Returns the current microphone input level for voice activity detection.\n * Can be used to create visual feedback for user speaking indicators.\n *\n * @returns Current input volume level (0.0 = no input, 1.0 = maximum input)\n *\n * @example\n * ```typescript\n * // Create voice activity indicator\n * setInterval(() => {\n * const inputLevel = agent.getInputVolume();\n * updateMicrophoneIndicator(inputLevel);\n * }, 100);\n * ```\n */\n getInputVolume(): number {\n return (\n this.liveKitManager?.audioManager.getInputVolume() ??\n HamsaVoiceAgent.DEFAULT_INPUT_VOLUME\n );\n }\n\n /**\n * Mutes or unmutes the user's microphone\n *\n * Controls the user's microphone input to the voice agent conversation.\n * When muted, the user's voice will not be transmitted to the agent.\n *\n * @param muted - True to mute microphone, false to unmute\n *\n * @example\n * ```typescript\n * // Mute microphone\n * agent.setMicMuted(true);\n *\n * // Toggle microphone\n * const isMuted = agent.isMicMuted();\n * agent.setMicMuted(!isMuted);\n * ```\n */\n setMicMuted(muted: boolean): void {\n if (this.liveKitManager) {\n this.liveKitManager.audioManager.setMicMuted(muted);\n }\n }\n\n /**\n * Checks if the user's microphone is currently muted\n *\n * @returns True if microphone is muted, false if unmuted\n *\n * @example\n * ```typescript\n * if (agent.isMicMuted()) {\n * showUnmutePrompt();\n * }\n * ```\n */\n isMicMuted(): boolean {\n return this.liveKitManager?.audioManager.isMicMuted() ?? false;\n }\n\n /**\n * @internal\n * Notifies the agent about user activity\n *\n * Prevents the agent from interrupting when the user is actively interacting\n * with the interface. The agent will not attempt to speak for at least 2 seconds\n * after user activity is detected.\n *\n * @example\n * ```typescript\n * // Prevent interruptions while user is typing\n * textInput.addEventListener('input', () => {\n * agent.sendUserActivity();\n * });\n *\n * // Prevent interruptions during UI interactions\n * document.addEventListener('click', () => {\n * agent.sendUserActivity();\n * });\n * ```\n */\n sendUserActivity(): void {\n if (this.liveKitManager?.isConnected) {\n // Send user activity signal to prevent agent interruption\n // This could be implemented as a special data message to the agent\n // biome-ignore lint/suspicious/noConsole: Tests assert on this log output\n console.log('User activity detected - preventing agent interruption');\n }\n }\n\n /**\n * @internal\n * Sends a contextual update to the agent\n *\n * Informs the agent about user actions or state changes that are not direct\n * conversation messages but may influence the agent's responses. Unlike regular\n * messages, contextual updates don't trigger the agent to take its turn in\n * the conversation.\n *\n * @param context - Contextual information to send to the agent\n *\n * @example\n * ```typescript\n * // Inform agent about navigation\n * agent.sendContextualUpdate(\"User navigated to checkout page\");\n *\n * // Inform about app state changes\n * agent.sendContextualUpdate(\"User's cart total: $127.50\");\n *\n * // Inform about user preferences\n * agent.sendContextualUpdate(\"User selected dark mode theme\");\n * ```\n */\n sendContextualUpdate(context: string): void {\n if (this.liveKitManager?.isConnected) {\n // Send contextual update without triggering agent response\n // biome-ignore lint/suspicious/noConsole: Tests assert on this log output\n console.log('Sending contextual update:', context);\n // This could be implemented as a special non-conversational message\n }\n }\n\n /**\n * Gets frequency data from the user's microphone input\n *\n * Returns frequency domain data for audio visualization and analysis.\n * Can be used to create voice activity indicators, audio visualizers,\n * or advanced voice processing features.\n *\n * @returns Uint8Array containing frequency data (0-255 per frequency bin)\n *\n * @example\n * ```typescript\n * // Create simple audio visualizer\n * function updateVisualizer() {\n * const frequencyData = agent.getInputByteFrequencyData();\n * const average = frequencyData.reduce((a, b) => a + b) / frequencyData.length;\n * const percentage = Math.round((average / 255) * 100);\n * document.getElementById('micLevel').style.width = `${percentage}%`;\n * }\n * setInterval(updateVisualizer, 50);\n * ```\n */\n getInputByteFrequencyData(): Uint8Array {\n return (\n this.liveKitManager?.audioManager.getInputByteFrequencyData() ??\n new Uint8Array(0)\n );\n }\n\n /**\n * Gets frequency data from the agent's audio output\n *\n * Returns frequency domain data from the agent's voice for analysis\n * and visualization. Useful for creating voice characteristic displays\n * or audio processing features.\n *\n * @returns Uint8Array containing frequency data (0-255 per frequency bin)\n *\n * @example\n * ```typescript\n * // Analyze agent voice characteristics\n * agent.on('speaking', () => {\n * const interval = setInterval(() => {\n * const frequencyData = agent.getOutputByteFrequencyData();\n * const dominantFreq = findDominantFrequency(frequencyData);\n * updateVoiceAnalysis(dominantFreq);\n * }, 100);\n *\n * agent.once('listening', () => clearInterval(interval));\n * });\n * ```\n */\n getOutputByteFrequencyData(): Uint8Array {\n return (\n this.liveKitManager?.audioManager.getOutputByteFrequencyData() ??\n new Uint8Array(0)\n );\n }\n\n /**\n * Initiates a new voice agent conversation\n *\n * This is the primary method for starting interactions with a voice agent.\n * It handles authentication, connection establishment, tool registration,\n * and event forwarding. The method is asynchronous and will emit events\n * to indicate connection status and conversation progress.\n *\n * @param options - Configuration options for the conversation\n * @param options.agentId - Unique identifier of the voice agent (from Hamsa dashboard)\n * @param options.params - Parameters to customize the conversation context\n * @param options.voiceEnablement - Enable voice interactions (default: false for text-only)\n * @param options.tools - Client-side tools available to the agent\n *\n * @throws {Error} Authentication failures, network errors, or invalid configuration\n *\n * @example Basic voice conversation\n * ```typescript\n * try {\n * await agent.start({\n * agentId: 'agent_12345',\n * voiceEnablement: true,\n * params: {\n * userName: 'Alice',\n * userTier: 'premium',\n * sessionContext: 'product_support'\n * }\n * });\n * console.log('Voice agent conversation started');\n * } catch (error) {\n * console.error('Failed to start conversation:', error);\n * }\n * ```\n *\n * @example With custom tools\n * ```typescript\n * const customerDataTool = {\n * function_name: 'getCustomerData',\n * description: 'Retrieves customer account information',\n * parameters: [\n * { name: 'customerId', type: 'string', description: 'Customer ID' }\n * ],\n * required: ['customerId'],\n * fn: async (customerId) => {\n * return await customerAPI.getProfile(customerId);\n * }\n * };\n *\n * await agent.start({\n * agentId: 'support_agent',\n * voiceEnablement: true,\n * tools: [customerDataTool],\n * params: { department: 'billing' }\n * });\n * ```\n *\n * @example Event handling\n * ```typescript\n * // Set up event listeners before starting\n * agent.on('callStarted', () => {\n * console.log('Conversation began');\n * startRecordingMetrics();\n * });\n *\n * agent.on('error', (error) => {\n * console.error('Conversation error:', error);\n * handleConversationError(error);\n * });\n *\n * await agent.start({ agentId: 'my_agent', voiceEnablement: true });\n * ```\n */\n async start({\n agentId,\n params = {},\n voiceEnablement = false,\n tools = [],\n userId: _userId,\n preferHeadphonesForIosDevices: _preferHeadphonesForIosDevices = false,\n connectionDelay: _connectionDelay,\n disableWakeLock: _disableWakeLock = false,\n }: StartOptions): Promise<void> {\n try {\n // Get LiveKit access token\n const accessToken = await this.#initializeLiveKitConversation(\n agentId,\n params,\n voiceEnablement,\n tools\n );\n if (!accessToken) {\n throw new Error('Failed to initialize LiveKit conversation.');\n }\n\n // Create LiveKitManager instance\n this.liveKitManager = new LiveKitManager(\n 'wss://rtc.tryhamsa.com',\n accessToken,\n tools\n );\n\n // Set up event listeners to forward LiveKitManager events\n this.liveKitManager\n .on('error', (error) => this.emit('error', error))\n .on('connected', () => this.emit('start'))\n .on('transcriptionReceived', (transcription) =>\n this.emit('transcriptionReceived', transcription)\n )\n .on('answerReceived', (answer) => this.emit('answerReceived', answer))\n .on('speaking', () => this.emit('speaking'))\n .on('listening', () => this.emit('listening'))\n .on('disconnected', () => this.emit('closed'))\n .on('remoteAudioStreamAvailable', (remoteStream) =>\n this.emit('remoteAudioStreamAvailable', remoteStream)\n )\n .on('localAudioStreamAvailable', (localStream) =>\n this.emit('localAudioStreamAvailable', localStream)\n )\n .on('info', (info) => this.emit('info', info))\n\n // Forward new analytics events\n .on('reconnecting', () => this.emit('reconnecting'))\n .on('reconnected', () => this.emit('reconnected'))\n .on('participantConnected', (participant) =>\n this.emit('participantConnected', participant)\n )\n .on('participantDisconnected', (participant) =>\n this.emit('participantDisconnected', participant)\n )\n .on('connectionQualityChanged', (data) =>\n this.emit('connectionQualityChanged', data)\n )\n .on('connectionStateChanged', (state) =>\n this.emit('connectionStateChanged', state)\n )\n .on('trackSubscribed', (data) => this.emit('trackSubscribed', data))\n .on('trackUnsubscribed', (data) => this.emit('trackUnsubscribed', data))\n .on('audioPlaybackChanged', (playing) =>\n this.emit('audioPlaybackChanged', playing)\n )\n .on('analyticsUpdated', (analytics) =>\n this.emit('analyticsUpdated', analytics)\n )\n .on('customEvent', (eventType, eventData, metadata) =>\n this.emit('customEvent', eventType, eventData, metadata)\n )\n .on('dataReceived', (message, participant) =>\n this.emit('dataReceived', message, participant)\n );\n\n // Connect to LiveKit room\n await this.liveKitManager.connect();\n\n // Acquire the screen wake lock when the call starts\n try {\n await this.wakeLockManager.acquire();\n } catch {\n // Ignore wake lock acquisition errors\n }\n this.emit('callStarted');\n } catch (_e) {\n if (this.listenerCount('error') > 0) {\n this.emit(\n 'error',\n new Error(\n 'Error in starting the call! Make sure you initialized the client with init().'\n )\n );\n }\n }\n }\n\n /**\n * Terminates the current voice agent conversation\n *\n * Safely ends the conversation, disconnects from the WebRTC session,\n * releases system resources (including screen wake lock), and performs\n * cleanup. This method should be called when the conversation is complete.\n *\n * @example\n * ```typescript\n * // End conversation when user clicks hang up\n * hangupButton.addEventListener('click', () => {\n * agent.end();\n * });\n *\n * // End conversation after timeout\n * setTimeout(() => {\n * agent.end();\n * console.log('Conversation ended due to timeout');\n * }, 300000); // 5 minutes\n *\n * // Listen for end event\n * agent.on('callEnded', () => {\n * console.log('Conversation terminated');\n * updateUI('disconnected');\n * saveConversationSummary();\n * });\n * ```\n */\n end(): void {\n try {\n if (this.liveKitManager) {\n this.liveKitManager.disconnect();\n this.emit('callEnded');\n }\n // Release screen wake lock to allow device sleep\n if (this.wakeLockManager?.isActive()) {\n this.wakeLockManager.release().catch((_err) => {\n // Intentionally ignore wake lock release errors\n });\n }\n } catch (_e) {\n if (this.listenerCount('error') > 0) {\n this.emit(\n 'error',\n new Error(\n 'Error in ending the call! Make sure you initialized the client with init().'\n )\n );\n }\n }\n }\n\n /**\n * Temporarily pauses the voice agent conversation\n *\n * Pauses audio transmission and reception while maintaining the underlying\n * connection. The conversation can be resumed later using resume(). This\n * is useful for temporary interruptions without ending the entire session.\n *\n * @example\n * ```typescript\n * // Pause when user needs to take another call\n * pauseButton.addEventListener('click', () => {\n * agent.pause();\n * console.log('Conversation paused');\n * });\n *\n * // Auto-pause after period of silence\n * let silenceTimeout;\n * agent.on('listening', () => {\n * silenceTimeout = setTimeout(() => {\n * agent.pause();\n * showResumePrompt();\n * }, 60000); // 1 minute of silence\n * });\n *\n * agent.on('speaking', () => {\n * clearTimeout(silenceTimeout);\n * });\n *\n * // Listen for pause event\n * agent.on('callPaused', () => {\n * showPausedIndicator();\n * disableMicrophone();\n * });\n * ```\n */\n pause(): void {\n if (this.liveKitManager) {\n this.liveKitManager.pause();\n // Release screen wake lock during pause to allow device sleep\n if (this.wakeLockManager?.isActive()) {\n this.wakeLockManager.release().catch((_err) => {\n // Intentionally ignore wake lock release errors\n });\n }\n this.emit('callPaused');\n }\n }\n\n /**\n * Resumes a paused voice agent conversation\n *\n * Restores audio transmission and reception, continuing the conversation\n * from where it was paused. Re-acquires screen wake lock to prevent\n * device sleep during active conversation.\n *\n * @example\n * ```typescript\n * // Resume when user is ready to continue\n * resumeButton.addEventListener('click', () => {\n * agent.resume();\n * console.log('Conversation resumed');\n * });\n *\n * // Resume automatically after user interaction\n * document.addEventListener('click', () => {\n * if (agent.isPaused) {\n * agent.resume();\n * }\n * });\n *\n * // Listen for resume event\n * agent.on('callResumed', () => {\n * hidePausedIndicator();\n * enableMicrophone();\n * showActiveIndicator();\n * });\n * ```\n */\n resume(): void {\n if (this.liveKitManager) {\n this.liveKitManager.resume();\n // Re-acquire screen wake lock during active conversation\n this.wakeLockManager.acquire().catch((_err) => {\n // Intentionally ignore wake lock acquisition errors\n });\n this.emit('callResumed');\n }\n }\n\n /**\n * Retrieves job details from the Hamsa API using the stored jobId.\n * Implements retry logic with exponential backoff.\n * @param maxRetries - Maximum number of retry attempts.\n * @param initialRetryInterval - Initial delay between retries in milliseconds.\n * @param backoffFactor - Factor by which the retry interval increases each attempt.\n * @returns Job details object.\n */\n async getJobDetails(\n maxRetries = 5,\n initialRetryInterval = 1000,\n backoffFactor = 2\n ): Promise<JobDetails> {\n if (!this.jobId) {\n throw new Error(\n 'Cannot fetch job details: jobId is not set. Start a conversation first.'\n );\n }\n\n const url = `${this.API_URL}/v1/voice-agents/conversation/${this.jobId}`;\n const headers = {\n Authorization: `Token ${this.apiKey}`,\n 'Content-Type': 'application/json',\n };\n const params = new URLSearchParams({ jobId: this.jobId });\n\n let currentInterval = initialRetryInterval;\n\n const fetchJobDetails = async (attempt = 1): Promise<JobDetails> => {\n try {\n const response = await fetch(`${url}?${params.toString()}`, {\n method: 'GET',\n headers,\n });\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `API Error: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n const data = await response.json();\n // Check if the job status is COMPLETED\n if (data.data.status === 'COMPLETED') {\n return data.data;\n }\n throw new Error(`Job status is not COMPLETED: ${data.data.status}`);\n } catch (error) {\n if (attempt < maxRetries) {\n await this.#delay(currentInterval); // Wait before retrying\n currentInterval *= backoffFactor; // Increase the interval\n return fetchJobDetails(attempt + 1);\n }\n throw new Error(\n `Failed to fetch job details after ${maxRetries} attempts: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n };\n\n return await fetchJobDetails();\n }\n\n /**\n * Initializes a LiveKit conversation and gets access token.\n * @private\n * @param voiceAgentId - The voice agent ID.\n * @param params - Additional parameters.\n * @param voiceEnablement - Flag to enable voice features.\n * @param tools - Array of tools/functions to be used.\n * @returns The LiveKit access token or null if failed.\n */\n async #initializeLiveKitConversation(\n voiceAgentId: string,\n params: Record<string, unknown>,\n voiceEnablement: boolean,\n tools: Tool[]\n ): Promise<string | null> {\n const headers = {\n Authorization: `Token ${this.apiKey}`,\n 'Content-Type': 'application/json',\n };\n const llmtools =\n tools?.length > 0 ? this.#convertToolsToLLMTools(tools) : [];\n const body = {\n voiceAgentId,\n params,\n voiceEnablement,\n tools: llmtools,\n };\n\n const requestOptions: RequestInit = {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n redirect: 'follow' as RequestRedirect,\n };\n\n try {\n const response = await fetch(\n `${this.API_URL}/v1/voice-agents/live-kit/conversation-init`,\n requestOptions\n );\n if (!response.ok) {\n const errorText = await response.text();\n throw new Error(\n `API Error: ${response.status} ${response.statusText} - ${errorText}`\n );\n }\n const result = await response.json();\n\n if (result.success && result.data && result.data.liveKitAccessToken) {\n // Store jobId for compatibility with getJobDetails method\n this.jobId = result.data.jobId || result.data.conversationId || null;\n return result.data.liveKitAccessToken;\n }\n throw new Error('Invalid response format from LiveKit conversation init');\n } catch (_error) {\n if (this.listenerCount('error') > 0) {\n this.emit(\n 'error',\n new Error(\n 'Error in initializing the call. Please double-check your API_KEY and ensure you have sufficient funds in your balance.'\n )\n );\n }\n return null;\n }\n }\n\n /**\n * Converts tools to LLMTools format.\n * @private\n * @param tools - Array of tool objects.\n * @returns Array of LLMTool objects.\n */\n #convertToolsToLLMTools(tools: Tool[]): LLMTool[] {\n return tools.map((item) => {\n const llmTool: LLMTool = {\n type: 'function' as const,\n function: {\n name: item.function_name,\n description: item.description,\n parameters: {\n type: 'object',\n properties:\n item.parameters?.reduce(\n (acc, param) => {\n acc[param.name] = {\n type: param.type,\n description: param.description,\n };\n return acc;\n },\n {} as Record<string, { type: string; description: string }>\n ) || {},\n required: item.required || [],\n },\n func_map: item.func_map,\n },\n };\n\n return llmTool;\n });\n }\n\n // === Analytics Methods ===\n\n /**\n * Retrieves current network connection statistics and quality metrics\n *\n * @returns Connection statistics object or null if not connected\n *\n * @example\n * ```typescript\n * const stats = agent.getConnectionStats();\n * if (stats) {\n * console.log(`Latency: ${stats.latency}ms`);\n * console.log(`Quality: ${stats.quality}`);\n * console.log(`Packet Loss: ${stats.packetLoss}%`);\n *\n * // Show network warning for poor quality\n * if (stats.quality === 'poor') {\n * showNetworkWarning(stats);\n * }\n * }\n * ```\n */\n getConnectionStats(): ConnectionStatsResult | null {\n return this.liveKitManager\n ? this.liveKitManager.getConnectionStats()\n : null;\n }\n\n /**\n * Retrieves current audio levels and quality metrics for both user and agent\n *\n * @returns Audio metrics object or null if not connected\n *\n * @example\n * ```typescript\n * const audio = agent.getAudioLevels();\n * if (audio) {\n * // Update UI audio level meters\n * updateAudioMeter('user', audio.userAudioLevel);\n * updateAudioMeter('agent', audio.agentAudioLevel);\n *\n * // Display speaking time statistics\n * const userMinutes = Math.floor(audio.userSpeakingTime / 60000);\n * const agentMinutes = Math.floor(audio.agentSpeakingTime / 60000);\n * console.log(`User spoke for ${userMinutes} minutes`);\n * console.log(`Agent spoke for ${agentMinutes} minutes`);\n * }\n * ```\n */\n getAudioLevels(): AudioLevelsResult | null {\n return this.liveKitManager ? this.liveKitManager.getAudioLevels() : null;\n }\n\n /**\n * Retrieves current performance metrics including response times and call duration\n *\n * @returns Performance metrics object or null if not connected\n *\n * @example\n * ```typescript\n * const perf = agent.getPerformanceMetrics();\n * if (perf) {\n * // Monitor response time for quality assurance\n * if (perf.responseTime > 3000) {\n * console.warn('High response time:', perf.responseTime + 'ms');\n * }\n *\n * // Display call duration\n * const minutes = Math.floor(perf.callDuration / 60000);\n * const seconds = Math.floor((perf.callDuration % 60000) / 1000);\n * updateTimer(`${minutes}:${seconds.toString().padStart(2, '0')}`);\n * }\n * ```\n */\n getPerformanceMetrics(): PerformanceMetricsResult | null {\n return this.liveKitManager\n ? this.liveKitManager.getPerformanceMetrics()\n : null;\n }\n\n /**\n * Retrieves information about all participants in the conversation\n *\n * @returns Array of participant data objects (empty array if not connected)\n *\n * @example\n * ```typescript\n * const participants = agent.getParticipants();\n *\n * participants.forEach(participant => {\n * console.log(`Participant: ${participant.identity}`);\n * console.log(`Connected: ${new Date(participant.connectionTime)}`);\n *\n * // Display participant info in UI\n * if (participant.identity.includes('agent')) {\n * showAgentStatus('connected', participant.metadata);\n * }\n * });\n *\n * // Check if agent is present\n * const hasAgent = participants.some(p => p.identity.includes('agent'));\n * ```\n */\n getParticipants(): ParticipantData[] {\n return this.liveKitManager ? this.liveKitManager.getParticipants() : [];\n }\n\n /**\n * Retrieves current audio track statistics and stream information\n *\n * @returns Track statistics object or null if not connected\n *\n * @example\n * ```typescript\n * const trackStats = agent.getTrackStats();\n * if (trackStats) {\n * console.log(`Active tracks: ${trackStats.activeTracks}/${trackStats.totalTracks}`);\n * console.log(`Audio elements: ${trackStats.audioElements}`);\n *\n * // Check track health\n * if (trackStats.activeTracks === 0) {\n * console.warn('No active audio tracks');\n * showAudioWarning();\n * }\n * }\n * ```\n */\n getTrackStats(): TrackStatsResult | null {\n return this.liveKitManager ? this.liveKitManager.getTrackStats() : null;\n }\n\n /**\n * Retrieves comprehensive analytics combining all metrics into a single snapshot\n *\n * This is the primary method for accessing complete conversation analytics,\n * combining connection statistics, audio metrics, performance data, participant\n * information, and track statistics into a unified result.\n *\n * @returns Complete analytics object or null if not connected\n *\n * @example\n * ```typescript\n * const analytics = agent.getCallAnalytics();\n * if (analytics) {\n * // Log comprehensive conversation summary\n * console.log('=== Conversation Analytics ===');\n * console.log(`Duration: ${analytics.performanceMetrics.callDuration}ms`);\n * console.log(`Quality: ${analytics.connectionStats.quality}`);\n * console.log(`Latency: ${analytics.connectionStats.latency}ms`);\n * console.log(`Participants: ${analytics.participants.length}`);\n *\n * // Send to analytics service\n * analyticsService.recordConversation({\n * sessionId: generateSessionId(),\n * agentId: currentAgentId,\n * timestamp: Date.now(),\n * metrics: analytics\n * });\n *\n * // Check for quality issues\n * if (analytics.connectionStats.packetLoss > 5) {\n * reportNetworkIssue(analytics);\n * }\n * }\n * ```\n */\n getCallAnalytics(): CallAnalyticsResult | null {\n return this.liveKitManager ? this.liveKitManager.getCallAnalytics() : null;\n }\n\n /**\n * Delays execution for a specified amount of time.\n * @private\n * @param ms - Milliseconds to delay.\n * @returns Promise that resolves after the delay.\n */\n #delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n }\n}\n\n// Support both named and default exports\nexport { HamsaVoiceAgent };\nexport default HamsaVoiceAgent;\n"],"names":["__classPrivateFieldGet","receiver","state","kind","f","TypeError","has","call","value","get","SuppressedError","ReflectOwnKeys","R","Reflect","ReflectApply","apply","target","args","Function","prototype","ownKeys","Object","getOwnPropertySymbols","getOwnPropertyNames","concat","NumberIsNaN","Number","isNaN","EventEmitter","init","this","eventsModule","exports","once","emitter","name","Promise","resolve","reject","errorListener","err","removeListener","resolver","slice","arguments","eventTargetAgnosticAddListener","handler","flags","on","addErrorHandlerIfEventEmitter","_events","undefined","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","_getMaxListeners","that","_addListener","type","prepend","m","events","existing","warning","create","newListener","emit","unshift","push","length","warned","w","Error","String","count","console","warn","onceWrapper","fired","wrapFn","_onceWrap","wrapped","bind","_listeners","unwrap","evlistener","arr","ret","Array","i","unwrapListeners","arrayClone","listenerCount","n","copy","addEventListener","wrapListener","arg","removeEventListener","defineProperty","enumerable","set","RangeError","getPrototypeOf","setMaxListeners","getMaxListeners","doError","error","er","message","context","len","listeners","addListener","prependListener","prependOnceListener","list","position","originalListener","shift","index","pop","spliceOne","off","removeAllListeners","key","keys","rawListeners","eventNames","_mergeNamespaces","forEach","e","isArray","k","d","getOwnPropertyDescriptor","freeze","o","s","t","configurable","writable","h","_","constructor","_locking","_locks","isLocked","lock","l","c","then","assert","condition","msg","assertInt32","isInteger","assertUInt32","assertFloat32","isFinite","enumTypeSymbol","Symbol","getEnumType","enumObject","setEnumType","typeName","values","opt","makeEnumType","map","v","no","localName","_opt","names","numbers","normalValues","normalizeEnumValue","findName","findNumber","makeEnum","assign","Message","equals","other","getType","runtime","util","clone","fromBinary","bytes","options","format","bin","makeReadOptions","readMessage","readerFactory","byteLength","fromJson","jsonValue","json","fromJsonString","jsonString","JSON","parse","toBinary","makeWriteOptions","writer","writerFactory","writeMessage","finish","toJson","toJsonString","_a","stringify","prettySpaces","toJSON","emitDefaultValues","varint64read","lowBits","highBits","b","buf","pos","assertBounds","middleByte","varint64write","lo","hi","hasNext","byte","splitBits","hasMoreBits","TWO_PWR_32_DBL","int64FromString","dec","minus","base","add1e6digit","begin","end","digit1e6","negate","newBits","uInt64ToString","toUnsigned","mid","high","digitA","digitB","digitC","Math","floor","toString","decimalFrom1e7WithLeadingZeros","digit1e7","partial","varint32write","varint32read","result","readBytes","protoInt64","dv","DataView","ArrayBuffer","BigInt","getBigInt64","getBigUint64","setBigInt64","setBigUint64","process","env","BUF_BIGINT_DISABLE","MIN","MAX","UMIN","UMAX","zero","supported","bi","uParse","enc","getInt32","uEnc","setInt32","uDec","assertInt64String","test","assertUInt64String","bits","negative","int64ToString","makeInt64Support","ScalarType","LongType","WireType","scalarEquals","a","BYTES","Uint8Array","UINT64","FIXED64","INT64","SFIXED64","SINT64","scalarZeroValue","longType","BOOL","DOUBLE","FLOAT","STRING","isScalarZeroValue","BinaryWriter","textEncoder","stack","TextEncoder","chunks","offset","fork","join","chunk","prev","uint32","raw","tag","fieldNo","int32","bool","string","encode","float","buffer","setFloat32","double","setFloat64","fixed32","setUint32","sfixed32","sint32","sfixed64","view","tc","fixed64","int64","sint64","sign","uint64","BinaryReader","textDecoder","varint64","byteOffset","TextDecoder","wireType","skip","start","Varint","Bit64","Bit32","LengthDelimited","StartGroup","fn","wt","EndGroup","subarray","zze","getUint32","getFloat32","getFloat64","decode","createExtensionContainer","extension","field","container","ext","repeated","default","T","L","fieldWrapper","unwrapField","initExtensionField","encTable","split","decTable","charCodeAt","indexOf","protoBase64","base64Str","es","bytePos","groupPos","p","base64","getExtension","assertExtendee","ufs","unknownFields","filter","uf","filterUnknownFields","listUnknownFields","readField","data","setExtension","readOpt","writeOpt","hasExtension","discardUnknownFields","onUnknownField","writeField","reader","messageType","extendee","find","isFieldSet","oneof","case","req","clearField","implicitPresence","isMessage","every","actualType","wrapField","INT32","UINT32","jsonReadDefaults","ignoreUnknownFields","jsonWriteDefaults","enumAsInteger","useProtoFieldName","makeReadOptions$1","makeWriteOptions$1","tokenNull","tokenIgnoredUnknownEnum","debugJsonValue","readField$1","parentType","targetArray","jsonItem","enumValue","readEnum","readScalar$1","targetMap","jsonMapKey","jsonMapValue","entries","readMapKey","K","V","BIGINT","currentValue","scalarValue","nullAsZeroValue","NaN","POSITIVE_INFINITY","NEGATIVE_INFINITY","trim","FIXED32","SFIXED32","SINT32","long","uLong","encodeURIComponent","canEmitFieldDefaultValue","writeField$1","jsonObj","entryKey","entryValue","writeScalar$1","enumType","writeEnum","jsonArr","val","unknownFieldsSymbol","readDefaults","readUnknownFields","writeDefaults","writeUnknownFields","scalarType","read","readScalar","readScalarLTString","readMessageField","mapKey","mapVal","readMapEntry","delimited","packed","method","scalarTypeInfo","writePacked","item","writeScalar","writeMessageField","writeMapEntry","keyValue","parseInt","toLowerCase","cloneSingularField","toU8Arr","input","InternalFieldList","fields","normalizer","_fields","_normalizer","findJsonName","jsonName","jsonNames","all","byNumber","numbersAsc","sort","byMember","members","localFieldName","protoName","inOneof","protoCamelCase","safeObjectProperty","safeMessageProperty","fieldJsonName","snakeCase","capNext","charAt","toUpperCase","reservedObjectProperties","Set","reservedMessageProperties","fallback","InternalOneofInfo","addField","findField","_lookup","proto3","newFieldList","source","fieldInfos","_b","_c","_d","_e","_f","r","ooname","normalizeFieldInfos","initFields","member","syntax","oneofSeen","Map","registry","typeRegistry","jsonKey","seen","found","findExtension","startsWith","endsWith","substring","findExtensionFor","debug","lengthOrEndTagFieldNo","delimitedMessageEncoding","initPartial","sk","sourceField","mt","va","vb","any","makeMessageType","lastIndexOf","setPrototypeOf","makeExtension","fi","Timestamp","super","seconds","nanos","matches","match","ms","Date","repeat","z","nanosStr","toISOString","replace","toDate","ceil","now","fromDate","date","getTime","MetricsBatch","TimeSeriesMetric","EventMetric","MetricSample","BackupCodecPolicy$1","TrackType","TrackSource","VideoQuality$1","ConnectionQuality$1","ClientConfigSetting","DisconnectReason","ReconnectReason","SubscriptionError","AudioTrackFeature","Room$1","Codec","TimedVersion","ParticipantPermission","ParticipantInfo","ParticipantInfo_State","TrackInfo","ParticipantInfo_Kind","ParticipantInfo_KindDetail","Encryption_Type","SimulcastCodecInfo","VideoLayer","DataPacket","DataPacket_Kind","UserPacket","ActiveSpeakerUpdate","SipDTMF","Transcription","ChatMessage","RpcRequest","RpcAck","RpcResponse","DataStream_Header","DataStream_Chunk","DataStream_Trailer","SpeakerInfo","TranscriptionSegment","RpcError$1","ParticipantTracks","ServerInfo","ServerInfo_Edition","ClientInfo","ClientInfo_SDK","ClientConfiguration","VideoConfiguration","DisabledCodecs","DataStream_OperationType","DataStream_TextHeader","DataStream_ByteHeader","SignalTarget","StreamState","CandidateProtocol","SignalRequest","SessionDescription","TrickleRequest","AddTrackRequest","MuteTrackRequest","UpdateSubscription","UpdateTrackSettings","LeaveRequest","UpdateVideoLayers","SubscriptionPermission","SyncState","SimulateScenario","UpdateParticipantMetadata","Ping","UpdateLocalAudioTrack","UpdateLocalVideoTrack","SignalResponse","JoinResponse","ParticipantUpdate","TrackPublishedResponse","SpeakersChanged","RoomUpdate","ConnectionQualityUpdate","StreamStateUpdate","SubscribedQualityUpdate","SubscriptionPermissionUpdate","TrackUnpublishedResponse","ReconnectResponse","Pong","SubscriptionResponse","RequestResponse","TrackSubscribed","RoomMovedResponse","SimulcastCodec","ICEServer","LeaveRequest_Action","RegionSettings","ConnectionQualityInfo","StreamStateInfo","SubscribedQuality","SubscribedCodec","TrackPermission","DataChannelInfo","DataChannelReceiveState","RegionInfo","RequestResponse_Reason","getDefaultExportFromCjs","x","__esModule","hasOwnProperty","hasRequiredLoglevel","loglevel$1","loglevel","LogLevel","LoggerNames","loglevelExports","module","root","definition","noop","undefinedType","isIE","window","navigator","userAgent","logMethods","_loggersByName","defaultLogger","bindMethod","obj","methodName","traceForIE","log","trace","replaceLoggingMethods","level","getLevel","methodFactory","levels","SILENT","enableLoggingWhenConsoleArrives","defaultMethodFactory","_level","_loggerName","realMethod","Logger","factory","inheritedLevel","defaultLevel","userLevel","self","storageKey","getPersistedLevel","storedLevel","localStorage","ignore","cookie","document","cookieName","location","exec","normalizeLevel","TRACE","DEBUG","INFO","WARN","ERROR","setLevel","persist","levelNum","levelName","persistLevelIfPossible","setDefaultLevel","resetLevel","removeItem","clearPersistedLevel","enableAll","disableAll","rebuild","childName","initialLevel","getLogger","logger","_log","noConflict","getLoggers","livekitLogger","info","workerLogger","maxRetryDelay","DEFAULT_RETRY_DELAYS_IN_MS","__awaiter","thisArg","_arguments","P","generator","fulfilled","step","next","rejected","done","__values","iterator","__asyncValues","asyncIterator","verb","settle","hasRequiredEvents","eventsExports","requireEvents","logDisabled_","deprecationWarnings_","extractVersion","uastring","expr","parseFloat","wrapPeerConnectionEvent","eventNameToWrap","wrapper","RTCPeerConnection","proto","nativeAddEventListener","nativeEventName","cb","wrappedCallback","modifiedEvent","handleEvent","_eventMap","nativeRemoveEventListener","unwrappedCb","delete","size","disableLog","disableWarnings","deprecated","oldMethod","newMethod","isObject","compactObject","reduce","accumulator","isObj","isEmptyObject","walkStats","stats","resultSet","id","filterStats","track","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","logging","shimGetUserMedia$2","browserDetails","mediaDevices","constraintsToChrome_","mandatory","optional","cc","ideal","exact","min","max","oldname_","prefix","oc","mix","advanced","shimConstraints_","constraints","func","version","audio","remap","video","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","enumerateDevices","devices","dev","some","label","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","constraint","constraintName","getUserMedia","onSuccess","onError","webkitGetUserMedia","origGetUserMedia","cs","stream","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack$1","_ontrack","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","getReceivers","event","Event","transceiver","streams","dispatchEvent","shimGetSendersWithDtmf","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","splice","origAddStream","addStream","origRemoveStream","removeStream","RTCRtpSender","origGetSenders","senders","shimSenderReceiverGetStats","RTCRtpReceiver","getStats","origGetReceivers","receivers","srcElement","origGetStats","MediaStreamTrack","shimAddTrackRemoveTrackWithNative","getLocalStreams","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","description","sdp","internalId","externalStream","internalStream","RegExp","RTCSessionDescription","signalingState","oldStream","nativeMethod","methodObj","desc","origSetLocalDescription","setLocalDescription","replaceExternalStreamId","origLocalDescription","streamid","shimPeerConnection$1","webkitRTCPeerConnection","RTCIceCandidate","fixNegotiationNeeded","getConfiguration","sdpSemantics","chromeShim","__proto__","shimGetUserMedia","shimOnTrack","shimPeerConnection","shimGetUserMedia$1","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","localcandidate","remotecandidate","nativeGetStats","selector","onSucc","onErr","stat","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","RTCDataChannel","shimAddTransceiver","origAddTransceiver","addTransceiver","setParametersPromises","sendEncodings","shouldPerformCheck","encodingParam","rid","scaleResolutionDownBy","maxFramerate","params","getParameters","encodings","setParameters","catch","shimGetParameters","origGetParameters","shimCreateOffer","origCreateOffer","createOffer","finally","shimCreateAnswer","origCreateAnswer","createAnswer","firefoxShim","shimGetDisplayMedia","preferredMediaSource","getDisplayMedia","code","mediaSource","shimLocalStreamsAPI","_localStreams","_addTrack","_len","_key","tracks","shimRemoteStreamsAPI","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","addIceCandidate","successCallback","failureCallback","promise","withCallback","candidate","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","iceServers","newIceServers","server","urls","url","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","direction","setDirection","offerToReceiveVideo","videoTransceiver","shimAudioContext","AudioContext","webkitAudioContext","hasRequiredSdp","safariShim","sdp$1","sdpExports","SDPUtils","random","localCName","generateIdentifier","splitLines","blob","line","splitSections","part","getDescription","sections","getMediaSections","matchPrefix","parseCandidate","parts","foundation","component","protocol","priority","ip","address","port","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","writeCandidate","parseIceOptions","parseRtpMap","parsed","payloadType","clockRate","channels","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","j","writeFmtp","parameters","param","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","existingFeedback","writeRtpDescription","caps","maxptime","parseRtpEncodingParameters","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","flows","apt","encParam","codecPayloadType","rtx","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","planB","msidParts","parseSctpDescription","parseMLine","maxSizeLine","maxMessageSize","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","sctp","output","generateSessionId","substr","writeSessionBoilerplate","sessId","sessVer","sessUser","sessionId","getDirection","getKind","isRejected","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","sdpMid","sdpMLineIndex","shimRTCIceCandidateRelayProtocol","relayProtocol","shimMaxMessageSize","_sctp","browser","mLine","sctpInDescription","isFirefox","getRemoteFirefoxVersion","canSendMMS","remoteIsFirefox","canSendMaxMessageSize","getCanSendMaxMessageSize","remoteMMS","getMaxMessageSize","shimSendThrowTypeError","wrapDcSend","dc","origDataChannelSend","send","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","shimConnectionState","completed","checking","iceConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","removeExtmapAllowMixed","_safariVersion","nativeSRD","shimAddIceCandidateNullOrEmpty","nativeAddIceCandidate","shimParameterlessSetLocalDescription","nativeSetLocalDescription","commonShim","shimChrome","shimFirefox","shimSafari","userAgentData","brands","chromium","brand","mozGetUserMedia","isSecureContext","supportsUnifiedPlan","RTCRtpTransceiver","detectBrowser","adapter","browserShim","adapterFactory","E2EE_FLAG","KeyProviderEvent","KeyHandlerEvent","EncryptionEvent","CryptorEvent","ConnectionErrorReason","MediaDeviceFailure","CryptorErrorReason","RoomEvent","ParticipantEvent","EngineEvent","TrackEvent","isE2EESupported","createEncodedStreams","isScriptTransformSupported","RTCRtpScriptTransform","LivekitError","ConnectionError","reason","status","reasonName","DeviceUnsupportedError","TrackInvalidError","UnsupportedServer","UnexpectedConnectionState","NegotiationError","PublishTrackError","SignalRequestError","getFailure","NotFound","PermissionDenied","DeviceInUse","Other","commonVersionIdentifier","getBrowser","force","ua","browsersList","_ref","describe","getMatch","os","osVersion","getOSVersion","exp","CriticalTimers","setTimeout","setInterval","clearTimeout","clearInterval","recycledElements","VideoQuality","Track","mediaTrack","loggerOptions","attachedElements","isMuted","streamState","Active","isInBackground","_currentBitrate","appVisibilityChangedListener","backgroundTimeout","visibilityState","handleAppVisibilityChanged","loggerName","loggerContextCb","_mediaStreamTrack","_mediaStreamID","Source","Unknown","logContext","getLogContextFromTrack","currentBitrate","mediaStreamTrack","mediaStreamID","attach","element","elementType","Kind","Video","addAppVisibilityListener","parentElement","createElement","attachToElement","allMediaStreamTracks","srcObject","hasAudio","tr","play","AudioPlaybackStarted","VideoPlaybackStarted","AudioPlaybackFailed","VideoPlaybackFailed","muted","ElementAttached","detach","detachTrack","recycleElement","ElementDetached","detached","elm","removeAppVisibilityListener","stopMonitor","enable","enabled","disable","monitorInterval","timeSyncHandle","cancelAnimationFrame","updateLoggerOptions","HTMLAudioElement","shouldCache","pause","el","isWeb","mediaStream","existingTracks","et","isSafari","HTMLVideoElement","autoplay","playsInline","isFireFox","StreamState$1","kindToProto","Audio","AUDIO","VIDEO","DATA","kindFromProto","sourceToProto","Camera","CAMERA","Microphone","MICROPHONE","ScreenShare","SCREEN_SHARE","ScreenShareAudio","SCREEN_SHARE_AUDIO","UNKNOWN","sourceFromProto","streamStateFromProto","ACTIVE","PAUSED","Paused","VideoPreset","widthOrOptions","height","width","aspectRatio","encoding","resolution","frameRate","backupCodecs","videoCodecs","isBackupCodec","backup","BackupCodecPolicy","AudioPresets","telephone","speech","music","musicStereo","musicHighQuality","musicHighQualityStereo","VideoPresets","h90","h180","h216","h360","h540","h720","h1080","h1440","h2160","VideoPresets43","h120","h240","h480","ScreenSharePresets","h360fps3","h360fps15","h720fps5","h720fps15","h720fps30","h1080fps15","h1080fps30","original","ddExtensionURI","sleep","duration","supportsTransceiver","supportsAddTrack","isSVCCodec","supportsSetSinkId","isSafariBased","isMobile","mobile","isReactNative","product","isCloud","serverUrl","hostname","getLKReactNativeInfo","global","LiveKitReactNativeGlobal","getReactNativeOs","platform","getDevicePixelRatio","devicePixelRatio","compareVersions","v1","v2","parts1","parts2","p1","p2","roDispatchCallback","entry","handleResize","ioDispatchCallback","handleVisibilityChanged","resizeObserver","getResizeObserver","ResizeObserver","intersectionObserver","getIntersectionObserver","IntersectionObserver","rootMargin","createDummyVideoStreamTrack","paintContent","canvas","ctx","getContext","fillRect","beginPath","arc","PI","closePath","fillStyle","fill","dummyStream","captureStream","dummyTrack","emptyAudioStreamTrack","getEmptyAudioStreamTrack","oscillator","createOscillator","gain","createGain","setValueAtTime","dst","createMediaStreamDestination","connect","Future","isResolved","_isResolved","futureBase","onFinally","unwrapConstraint","toHttpUrl","getDisconnectReasonFromConnectionError","Cancelled","CLIENT_INITIATED","NotAllowed","USER_REJECTED","ServerUnreachable","JOIN_FAILURE","UNKNOWN_REASON","bigIntToNumber","numberToBigInt","isLocalTrack","isLocal","isAudioTrack","isVideoTrack","isLocalVideoTrack","isLocalAudioTrack","isRemoteTrack","isRemotePub","pub","isRemoteVideoTrack","mergeDefaultOptions","audioDefaults","videoDefaults","optionsWithoutProcessor","audioProcessor","videoProcessor","extractProcessorsFromOptions","defaultAudioProcessor","processor","defaultVideoProcessor","clonedOptions","mergeObjectWithoutOverwriting","mainObject","objectToMerge","constraintsForOptions","videoOptions","detectSilence","track_1","timeOffset","getNewAudioContext","analyser","createAnalyser","fftSize","bufferLength","frequencyBinCount","dataArray","createMediaStreamSource","getByteTimeDomainData","someNoise","sample","close","audioContext","latencyHint","body","handleResume","resume","kindToSource","sourceToKind","mimeTypeToVideoCodecString","mimeType","getTrackPublicationInfo","infos","cid","trackInfo","trackID","sid","streamID","streamTrackID","trackSid","isEnabled","trackName","encrypted","isEncrypted","newOptions","structuredClone","areDimensionsSmaller","E2EEManager","onWorkerMessage","ev","EncryptionError","keyProvider","getKeys","keyInfo","postKey","encryptionEnabled","participantIdentity","room","localParticipant","identity","ParticipantEncryptionStatusChanged","participant","getParticipantByIdentity","KeyRatcheted","ratchetResult","keyIndex","onWorkerError","worker","setup","setupEventListeners","keyProviderOptions","getOptions","onmessage","onerror","postMessage","setParticipantCryptorEnabled","postEnable","setSifTrailer","trailer","postSifTrailer","setupEngine","engine","RTPVideoMapUpdate","rtpMap","postRTPMap","TrackPublished","encryption","NONE","ConnectionStateChanged","ConnectionState","Connected","remoteParticipants","trackPublications","TrackUnsubscribed","setupE2EEReceiver","SignalConnected","isE2EEEnabled","LocalSenderCreated","setupE2EESender","SetKey","RatchetRequest","participantId","postRatchetRequest","isPublisher","ReferenceError","enableMsg","remoteId","handleReceiver","handleSender","transform","writableStream","readable","readableStream","receiverStreams","isReuse","senderStreams","defaultId","DeviceManager","_previousDevices","getInstance","instance","previousDevices","getDevices","kind_1","_this","requestPermissions","userMediaPromiseMap","hasDeviceInUse","device","noLabel","isRelevant","permissionsToAcquire","normalizeDeviceId","groupId","defaultDevice","QueueTaskStatus","mediaDeviceKinds","AsyncQueue","pendingTasks","taskMutex","nextTaskIndex","run","task","taskInfo","enqueuedAt","WAITING","unlock","executedAt","RUNNING","COMPLETED","flush","snapshot","from","appendUrlPath","urlObj","path","pathname","ensureTrailingSlash","passThroughQueueSignals","SignalConnectionState","SignalClient","currentState","isDisconnected","DISCONNECTING","DISCONNECTED","isEstablishingConnection","CONNECTING","RECONNECTING","getNextRequestId","_requestId","useJSON","rtt","resetCallbacks","onAnswer","onLeave","onLocalTrackPublished","onLocalTrackUnpublished","onNegotiateRequested","onOffer","onRemoteMuteChanged","onSubscribedQualityUpdate","onTokenRefresh","onTrickle","onClose","Signal","requestQueue","queuedRequests","closingLock","connectionLock","token","opts","abortSignal","reconnect","clearPingInterval","reconnectReason","connectOptions","URLSearchParams","autoSubscribe","deviceModel","browserVersion","adaptiveStream","connection","createConnectionParams","sdk","JS","getClientInfo","rtcUrl","searchParams","URL","toWebsocketUrl","createRtcUrl","validateUrl","abortHandler","wsTimeout","websocketTimeout","aborted","redactedUrl","ws","WebSocket","binaryType","onopen","CONNECTED","handleWSError","resp","fetch","toFixed","text","InternalError","shouldProcessMessage","pingTimeoutDuration","pingTimeout","pingIntervalDuration","pingInterval","timeout","interval","startPingInterval","signalLatency","handleSignalResponse","onclose","wasClean","handleOnClose","updateState","closePromise","CLOSING","race","sendOffer","offer","offerId","offerSdp","sendRequest","toProtoSessionDescription","sendAnswer","answer","answerSdp","sendIceCandidate","candidateInit","sendMuteTrack","sendAddTrack","sendUpdateLocalMetadata","metadata_1","name_1","metadata","_this2","requestId","sendUpdateTrackSettings","settings","sendUpdateSubscription","sub","sendSyncState","sync","sendUpdateVideoLayers","layers","sendUpdateSubscriptionPermissions","allParticipants","trackPermissions","sendSimulateScenario","scenario","sendPing","timestamp","sendUpdateLocalAudioTrack","features","sendLeave","action","DISCONNECT","message_1","_this3","fromQueue","canQueue","canPass","canPassThroughQueue","OPEN","res","pingHandled","sd","fromProtoSessionDescription","onParticipantUpdate","participants","onSpeakersChanged","speakers","onRoomUpdate","onConnectionQuality","onStreamStateUpdate","onSubscriptionPermissionUpdate","onSubscriptionError","lastPingTimestamp","resetPingTimeout","onRequestResponse","onLocalTrackSubscribed","onRoomMoved","msgCase","setReconnected","onCloseCallback","clearPingTimeout","toUTCString","rsd","DataPacketBuffer","_totalSize","getAll","popToSequence","sequence","alignBufferedAmount","bufferedAmount","first","TTLMap","ttl","_map","_lastCleanup","cleanup","expiresAt","clear","callback","asValueMap","valueMap","hasRequiredGrammar","hasRequiredParser","hasRequiredWriter","hasRequiredLib","lib","parser","grammar","requireGrammar","grammar$1","reg","u","rate","subtype","config","sessionConfig","str","raddr","tcptype","generation","dir2","clksrcExt","mediaClockValue","rateNumerator","rateDenominator","requireParser","toIntIfInt","parseReg","content","needsBlank","keyLocation","rawName","attachProperties","validLine","session","rtp","fmtp","paramReducer","acc","parseParams","parseFmtpConfig","parsePayloads","parseRemoteCandidates","candidates","parseImageAttributes","parseSimulcastStreamList","scid","paused","requireWriter","formatRegExp","formatStr","makeLine","defaultOuterOrder","defaultInnerOrder","payloads","outerOrder","innerOrder","libExports","write","requireLib","isImmediate","maxWait","cancel","PCEvents","PCTransport","createPC","ddExtID","latestOfferId","pendingCandidates","restartingIce","renegotiate","trackBitrates","remoteStereoMids","remoteNackMids","negotiate","createAndSendOffer","onconnectionstatechange","oniceconnectionstatechange","onicegatheringstatechange","ondatachannel","onnegotiationneeded","onsignalingstatechange","onicecandidate","ontrack","offerLock","onIceCandidate","onicecandidateerror","onIceCandidateError","onIceConnectionStateChange","onSignalingStatechange","onConnectionStateChange","onDataChannel","onTrack","isICEConnected","remoteDescription","mungedSDP","stereoMids","nackMids","sdpParsed","opusPayload","payload","rtcpFb","extractStereoAndNackAudioFromOffer","trackbr","codecPayload","fmtpFound","attr","maxbr","setMungedSDP","iceRestart","currentSD","ensureIPAddrMatchVersion","ensureAudioNackAndStereo","msid","ensureVideoDDExtensionForSVC","startBitrate","round","createAndSetAnswer","dataChannelDict","transceiverInit","setTrackCodecBitrate","setConfiguration","rtcConfig","canRemoveTrack","getConnectionState","getICEConnectionState","getSignallingState","getLocalDescription","localDescription","getRemoteDescription","getConnectedAddress","selectedCandidatePairId","candidatePairs","selected","selectedID","remoteCandidateId","munged","remote","originalSdp","remoteSdp","maxID","isV6","defaultVideoCodec","publishDefaults","audioPreset","dtx","red","forceStereo","simulcast","screenShareEncoding","stopMicTrackOnMute","videoCodec","backupCodec","preConnectBuffer","autoGainControl","echoCancellation","noiseSuppression","voiceIsolation","roomOptionDefaults","dynacast","stopLocalTrackOnUnpublish","reconnectPolicy","retryDelays","_retryDelays","nextRetryDelayInMs","retryCount","retryDelay","disconnectOnPageLeave","webAudioMix","roomConnectOptionDefaults","maxRetries","peerConnectionTimeout","PCTransportState","PCTransportManager","needsPublisher","isPublisherConnectionRequired","needsSubscriber","isSubscriberConnectionRequired","subscriberPrimary","previousState","connectionStates","requiredTransports","st","FAILED","CLOSED","NEW","onStateChange","publisher","subscriber","PCManager","PUBLISHER","SUBSCRIBER","onPublisherOffer","remoteOfferLock","requirePublisher","require","requireSubscriber","createAndSendPublisherOffer","setPublisherAnswer","triggerIceRestart","createSubscriberAnswerFromOffer","RTCSdpType","updateConfiguration","ensurePCTransportConnection","abortController","transport","ensureTransportConnected","negotiationTimeout","signal","addPublisherTransceiver","addPublisherTrack","createPublisherDataChannel","transports","pcTransport_1","abortController_1","pcTransport","connectTimeout","RpcError","truncateBytes","MAX_MESSAGE_BYTES","MAX_DATA_BYTES","fromProto","toProto","builtIn","ErrorCode","ErrorMessage","APPLICATION_ERROR","CONNECTION_TIMEOUT","RESPONSE_TIMEOUT","RECIPIENT_DISCONNECTED","RESPONSE_PAYLOAD_TOO_LARGE","SEND_FAILED","UNSUPPORTED_METHOD","RECIPIENT_NOT_FOUND","REQUEST_PAYLOAD_TOO_LARGE","UNSUPPORTED_SERVER","UNSUPPORTED_VERSION","maxBytes","low","encoder","monitorFrequency","computeBitrate","currentStats","prevStats","bytesNow","bytesPrev","bytesReceived","bytesSent","isMediaRecorderAvailable","MediaRecorder","RecorderBase","LocalTrackRecorder","dataListener","streamController","onStop","byteStream","ReadableStream","controller","arrayBuffer","byteArray","enqueue","LocalTrack","_sender","_constraints","hasPreConnectBuffer","localTrackRecorder","userProvidedTrack","manuallyStopped","_isUpstreamPaused","handleTrackMuteEvent","debouncedTrackMuteHandler","pauseUpstream","handleTrackUnmuteEvent","resumeUpstream","handleEnded","reacquireTrack","Ended","providedByUser","muteLock","pauseUpstreamLock","processorLock","restartLock","setMediaStreamTrack","getConstraints","dimensions","isUpstreamPaused","isUserProvided","processedTrack","getSourceTrackSettings","newTrack","processorElement","restart","replaceTrack","waitForDimensions","started","dims","setDeviceId","restartTrack","getDeviceId","normalize","mute","setTrackMuted","unmute","userProvidedOrOptions","stopProcessor","otherConstraints","propertyIsEnumerable","__rest","streamConstraints","Restarted","Muted","Unmuted","needsReAcquisition","_super","destroy","UpstreamPaused","UpstreamResumed","getRTCStatsReport","setProcessor","processor_1","showProcessedStreamLocally","processorOptions","TrackProcessorUpdate","getProcessor","_this4","keepElement","remove","startPreConnectBuffer","timeslice","isTypeSupported","autoStopPreConnectBuffer","stopPreConnectBuffer","getPreConnectBuffer","getPreConnectBufferMimeType","LocalAudioTrack","enhancedNoiseCancellation","isKrispNoiseFilterEnabled","stopOnMute","monitorSender","getSenderStats","handleKrispNoiseFilterEnable","AudioTrackFeatureUpdate","TF_ENHANCED_NOISE_CANCELLATION","handleKrispNoiseFilterDisable","checkForSilence","deviceHasChanged","startMonitor","setAudioContext","audioStats","packetsSent","packetsLost","roundTripTime","jitter","trackIsSilent","AudioSilenceDetected","presets169","presets43","presetsScreenShare","defaultSimulcastPresets169","defaultSimulcastPresets43","videoRids","computeVideoEncodings","isScreenShare","videoEncoding","useSimulcast","scalabilityMode","presets","aspect","abs","presetsForResolution","preset","determineAppropriateEncoding","sourceFramerate","sm","ScalabilityMode","spatial","bitratesRatio","suffix","requireScale","isSafariSvcApi","pow","networkPriority","midPreset","sortPresets","screenShareSimulcastLayers","defaultSimulcastLayers","videoSimulcastLayers","lowPreset","encodingsFromPresets","fps","fromPreset","canSetPriority","topFramerate","notifyOnce","aEnc","bEnc","results","temporal","LocalVideoTrack","degradationPreference","setDegradationPreference","simulcastCodecs","isCpuConstrained","optimizeForPerformance","statsMap","qualityLimitationReason","CpuConstrained","totalBitrate","senderLock","isSimulcast","signalClient","e_1","_g","sc","e_1_1","return","e_2","e_2_1","items","vs","frameHeight","frameWidth","framesPerSecond","framesSent","firCount","pliCount","nackCount","qualityLimitationDurations","qualityLimitationResolutionChanges","retransmittedPacketsSent","targetBitrate","setPublishingQuality","maxQuality","qualities","q","LOW","HIGH","quality","setPublishingLayers","e_3","e_3_1","e_4","_h","e_4_1","preference","addSimulcastTrack","simulcastCodecInfo","setSimulcastTrackSender","subscribedCodecs","setPublishingCodecs","codecs_1","codecs_1_1","e_5","currentCodec","newCodecs","setPublishingLayersForSender","e_5_1","isSvc","prioritizePerformance","active","senderEncodings","isSVC","hasChanged","videoQualityForRid","subscribedQuality","maxFrameRate","MEDIUM","videoLayersFromEncodings","svc","bitrate","encodingSM","resRatio","scale","lossyDataChannel","reliableDataChannel","leaveReconnect","PCState","RTCEngine","isClosed","_isClosed","pendingReconnect","reconnectTimeout","fullReconnectOnNext","latestRemoteOfferId","pcState","New","pendingTrackResolvers","reconnectAttempts","reconnectStart","attemptingReconnect","joinAttempts","maxJoinAttempts","shouldFailNext","reliableDataSequence","reliableMessageBuffer","reliableReceivedState","handleDataChannel","reliableDCSub","lossyDCSub","handleDataMessage","dataProcessLock","Blob","dp","participantSid","lastSeq","ActiveSpeakersUpdate","newObj","oldObj","destinationIdentities","applyUserDataCompat","DataPacketReceived","handleDataError","channelKind","currentTarget","maxRetransmits","ErrorEvent","handleBufferedAmountLow","LOSSY","RELIABLE","updateAndEmitDCBufferStatus","handleDisconnect","disconnectReason","disconnect","Disconnected","delay","getNextRetryDelay","elapsedMs","clearReconnectTimeout","regionUrlProvider","updateToken","attemptReconnect","waitForRestarted","onRestarted","onDisconnected","isBufferStatusLow","dcBufferStatus","DCBufferStatusChanged","dataChannelForKind","bufferedAmountLowThreshold","handleBrowserOnLine","client","RR_SIGNAL_DISCONNECTED","Engine","expSignalLatency","registerOnLineListener","updates","update","StreamStateChanged","response","SignalRequestResponse","latestJoinResponse","roomID","pID","signalOpts","setupSignalClientCallbacks","joinResponse","pcManager","configure","fastPublish","clientConfiguration","Closing","deregisterOnLineListener","clearPendingReconnect","cleanupPeerConnections","cleanupClient","dcCleanup","onbufferedamountlow","onclosing","lossyDC","reliableDC","publicationTimeout","Timeout","updateMuteStatus","dataSubscriberReadyState","getConnectedServerAddress","setRegionUrlProvider","provider","makeRTCConfiguration","TransportsCreated","publisherState","subscriberState","publisherConnectionPromise","shouldEmit","RR_SUBSCRIBER_FAILED","RR_PUBLISHER_FAILED","isSignalSevered","isPCSevered","Offline","MediaTrackAdded","serverInfo","createDataChannels","LocalTrackUnpublished","LocalTrackSubscribed","RemoteMute","RoomMoved","leave","regions","setServerReportedRegions","RECONNECT","RESUME","serverResponse","e2eeEnabled","encodedInsertableStreams","rtcIceServers","iceServer","rtcIceServer","credential","forceRelay","ENABLED","iceTransportPolicy","continualGatheringPolicy","ordered","createSender","createTransceiverRTCRtpSender","createRTCRtpSender","createSimulcastSender","simulcastTrack","createSimulcastTransceiverSender","resumeConnection","DISABLED","restartConnection","recoverable","SignalReconnectError","RR_UNKNOWN","regionUrl","Restarting","SignalRestarted","waitForPCReconnected","resetAttempts","nextRegionUrl","getNextBestRegionUrl","Resuming","SignalResumed","lastMessageSeq","resendReliableMessagesForResume","Resumed","waitForPCInitialConnection","Reconnecting","publishRpcResponse","destinationIdentity","packet","sendDataPacket","publishRpcAck","ensurePublisherConnected","waitForBufferStatusLow","onClosing","ensureDataTransportConnected","transportName","needNegotiation","targetChannel","endTime","verifyTransport","AbortController","handleClosed","abort","rtpTypes","maybeCodec","remoteTracks","localTracks","previousAnswer","previousOffer","trackSids","trackSidsDisabled","isDesired","subscription","subscribe","participantTracks","publishTracks","dataChannels","dataChannelsInfo","datachannelReceiveStates","seq","publisherSid","failNext","getInfo","RegionUrlProvider","lastUpdateAt","settingsCacheTime","attemptedRegions","getServerUrl","regionSettings","fetchRegionSettings","regionsLeft","region","attempted","nextRegion","regionSettingsResponse","host","headers","authorization","ok","statusText","BaseStreamReader","_info","totalByteSize","ByteStreamReader","handleChunkReceived","currentProgress","onProgress","getReader","releaseLock","readAll","add","TextStreamReader","totalChunkCount","receivedChunks","chunkIndex","previousChunkAtIndex","decoder","finalString","BaseStreamWriter","defaultWriter","getWriter","TextStreamWriter","ByteStreamWriter","RemoteTrack","setMuted","setMediaStream","onRemoveTrack","playoutDelayHint","setPlayoutDelay","delayInSeconds","getPlayoutDelay","monitorReceiver","registerTimeSyncUpdate","loop","requestAnimationFrame","sources","getSynchronizationSources","rtpTimestamp","TimeSyncUpdate","RemoteAudioTrack","audioOutput","getReceiverStats","webAudioPluginNodes","sinkId","setVolume","volume","gainNode","setTargetAtTime","_setVolume","elementVolume","getVolume","highestVolume","setSinkId","needsNewWebAudioConnection","connectWebAudio","disconnectWebAudio","setWebAudioPlugins","nodes","sourceNode","lastNode","node","destination","receiverStats","concealedSamples","concealmentEvents","silentConcealedSamples","silentConcealmentEvents","totalAudioEnergy","totalSamplesDuration","RemoteVideoTrack","adaptiveStreamSettings","elementInfos","debouncedHandleResize","updateDimensions","isAdaptiveStream","elementInfo","HTMLElementInfo","observeElementInfo","updateVisibility","observe","stopObservingElementInfo","stopElementInfos","stopObserving","detachedElements","stopObservingElement","getDecoderImplementation","decoderImplementation","codecID","codecId","framesDecoded","framesDropped","framesReceived","packetsReceived","lastVisibilityChange","visibilityChangedAt","backgroundPause","pauseVideoInBackground","isPiPMode","pictureInPicture","isVisible","visible","lastVisible","VisibilityChanged","maxWidth","maxHeight","pixelDensity","getPixelDensity","currentElementWidth","currentElementHeight","lastDimensions","VideoDimensionsChanged","isPiP","isIntersecting","onVisibilityChanged","isElementInPiP","onEnterPiP","documentPictureInPicture","onLeavePiP","isElementInViewport","clientWidth","clientHeight","unobserve","pictureInPictureElement","win","viewportWindow","top","offsetTop","left","offsetLeft","offsetWidth","offsetHeight","hidden","display","getComputedStyle","offsetParent","pageYOffset","innerHeight","pageXOffset","innerWidth","TrackPublication","metadataMuted","handleMuted","handleUnmuted","Publication","setTrack","isSubscribed","audioTrack","videoTrack","updateInfo","simulcasted","SubscriptionStatus","PermissionStatus","LocalTrackPublication","ti","handleTrackEnded","handleCpuConstrained","getTrackFeatures","TF_AUTO_GAIN_CONTROL","TF_ECHO_CANCELLATION","TF_NOISE_SUPPRESSION","channelCount","TF_STEREO","TF_NO_DTX","createLocalTracks","attemptExactMatch","internalOptions","retryAudioOptions","retryVideoOptions","mediaPromise","isAudio","trackConstraints","trackOptions","conOrBool","newDeviceId","mediaTrackToLocalTrack","ConnectionQuality","Participant","isAgent","permissions","agent","AGENT","isActive","participantInfo","_kind","_attributes","STANDARD","audioLevel","isSpeaking","_connectionQuality","audioTrackPublications","videoTrackPublications","getTrackPublications","getTrackPublication","getTrackPublicationByName","waitUntilActive","activeFuture","connectionQuality","isCameraEnabled","isMicrophoneEnabled","isScreenShareEnabled","joinedAt","_setName","_setMetadata","_setAttributes","permission","setPermissions","md","changed","prevMetadata","ParticipantMetadataChanged","ParticipantNameChanged","diff","oldValues","newValues","allKeys","diffAttributes","AttributesChanged","prevPermissions","canPublish","canSubscribe","canPublishData","recorder","canPublishSources","canSubscribeMetrics","ParticipantPermissionsChanged","setIsSpeaking","speaking","lastSpokeAt","IsSpeakingChanged","setConnectionQuality","prevQuality","EXCELLENT","Excellent","GOOD","Good","POOR","Poor","LOST","Lost","qualityFromProto","ConnectionQualityChanged","setDisconnected","addTrackPublication","publication","TrackMuted","TrackUnmuted","LocalParticipant","roomRpcHandlers","pendingPublishing","pendingPublishPromises","participantTrackPermissions","allParticipantsAllowedToSubscribe","encryptionType","enabledPublishVideoCodecs","pendingAcks","pendingResponses","handleReconnecting","reconnectFuture","handleReconnected","updateTrackSubscriptionPermissions","handleClosing","signalConnectedFuture","activeAgentFuture","firstActiveAgent","handleSignalConnected","handleSignalRequestResponse","targetRequest","pendingSignalRequests","OK","handleDataPacket","rpcResponse","handleIncomingRpcResponse","rpcAck","handleIncomingRpcAck","allParticipantsAllowed","perms","allTracks","allowAll","allowedTrackSids","trackPermissionToProto","onTrackUnmuted","onTrackMuted","onTrackUpstreamPaused","onTrackUpstreamResumed","onTrackFeatureUpdate","onTrackCpuConstrained","LocalTrackCpuConstrained","handleSubscribedQualityUpdate","roomOptions","newCodecs_1_1","newCodecs_1","publishAdditionalCodecForTrack","handleLocalTrackUnpublished","unpublished","unpublishTrack","currentPermissions","query","onchange","activeDeviceMap","rpcHandlers","lastCameraError","cameraError","lastMicrophoneError","microphoneError","setMetadata","requestMetadataUpdate","setName","setAttributes","startTime","performance","_ref2","setCameraEnabled","publishOptions","setTrackEnabled","setMicrophoneEnabled","setScreenShareEnabled","setE2EEEnabled","GCM","republishAllTracks","republishPromise","pendingTrack","waitForPendingPublicationOfSource","createTracks","createScreenTracks","MediaDevicesError","localTrack","publishPromises","publishTrack","publishedTracks","screenAudioTrack","enableCameraAndMicrophone","mergedOptionsWithProcessors","audioCaptureDefaults","videoCaptureDefaults","AudioStreamAcquired","isSafari17Based","videoConstraints","selfBrowserSurface","surfaceSwitching","systemAudio","preferCurrentTab","screenCaptureToDisplayMediaStreamOptions","screenVideo","contentHint","screenAudio","publishOrRepublishTrack","options_1","isRepublish","defaultConstraints","existingPublication","deviceKind","isStereoInput","isStereo","supportedSafariVersion","isE2EESimulcastSupported","e2ee","publishPromise","waitUntilEngineConnected","publish","hasPermissionsToPublish","getTrackSourceFromProto","_j","_k","publishedTrack","capabilities","getCapabilities","hasAV1","supportsAV1","hasVP9","supportsVP9","mime","audioFeatures","disableDtx","TF_PRECONNECT_BUFFER","stereo","disableRed","backupCodecPolicy","defaultRes","getDefaultDegradationPreference","trackTransceiver","addTrackPromise","negotiateErr","rets","primaryCodecMime","updatedCodec","constrainedTrack","LocalTrackPublished","bufferStreamPromise","agentActiveTimeout","waitUntilActiveAgentPresent","streamBytes","topic","sampleRate","stream_1_1","stream_1","serverRequested","computeTrackBackupEncodings","stopOnUnpublish","getPublicationForTrack","pubLogContext","negotiationNeeded","trackSender","unpublishTracks","restartTracks","localPubs","publishData","data_1","reliable","publishDtmf","digit","sendChatMessage","crypto","randomUUID","attachedFiles","attachments","editChatMessage","editText","originalMessage","editTimestamp","sendText","totalTextLength","fileIds","progresses","handleProgress","progress","totalProgress","streamText","totalSize","attachedStreamIds","file","_sendFile","header","totalLength","contentHeader","replyToStreamId","operationType","UPDATE","CREATE","chunkId","localP","WritableStream","textByteChunk","encoded","splitUtf8","chunkPacket","trailerPacket","onEngineClose","sendFile","writeMutex","subChunk","performRpc","_ref3","_this5","responseTimeout","publishRpcRequest","ackTimeoutId","responseTimeoutId","responsePayload","responseError","registerRpcMethod","unregisterRpcMethod","setTrackSubscriptionPermissions","responseTimeoutMs","handleParticipantDisconnected","pendingIdentity","setEnabledPublishCodecs","mutedOnServer","setActiveAgent","publishPromiseEntry","_ref4","RemoteTrackPublication","allowed","requestedDisabled","handleVisibilityChange","emitTrackUpdate","handleVideoDimensionsChange","videoDimensionsAdaptiveStream","subscribed","setSubscribed","prevStatus","subscriptionStatus","prevPermission","permissionStatus","emitSubscriptionUpdateIfChanged","emitPermissionUpdateIfChanged","Unsubscribed","Subscribed","Desired","Allowed","setEnabled","isManualOperationAllowed","setVideoQuality","requestedMaxQuality","requestedVideoDimensions","setVideoDimensions","setVideoFPS","videoQuality","prevTrack","setAllowed","setSubscriptionError","SubscriptionFailed","prevMetadataMuted","previousStatus","currentStatus","SubscriptionStatusChanged","previousPermissionStatus","SubscriptionPermissionChanged","disabled","minDimensions","maxQualityLayer","UpdateSettings","RemoteParticipant","fromParticipantInfo","pi","rpID","remoteParticipant","volumeMap","TrackSubscriptionPermissionChanged","TrackSubscriptionStatusChanged","previousTrack","TrackSubscriptionFailed","audioPublication","addSubscribedMediaTrack","triesLeft","getTrackPublicationBySid","hasMetadata","validTracks","newTracks","existingTrackOfSource","oldTrack","sendUnpublish","TrackUnpublished","setAudioOutput","promises","Room","activeSpeakers","audioEnabled","isVideoPlaybackBlocked","bufferedEvents","isResuming","byteStreamControllers","textStreamControllers","byteStreamHandlers","textStreamHandlers","unlockDisconnect","disconnectLock","connectFuture","setAndEmitConnectionState","Connecting","connectFn","attemptConnection","nextUrl","recreateEngine","clearConnectionFutures","connectSignal","e2eeManager","serverVersion","serverRegion","roomSid","applyJoinResponse","enabledPublishCodecs","sifTrailer","handleParticipantUpdates","otherParticipants","handleRoomUpdate","maybeCreateEngine","acquireAudioContext","connOptions","setupLocalParticipantEvents","resultingError","onPageLeave","registerConnectionReconcile","args_1","stopTracks","startAudio","elements","audioId","dummyAudioEl","getElementById","append","handleAudioPlaybackStarted","handleAudioPlaybackFailed","startVideo","handleVideoPlaybackStarted","handleVideoPlaybackFailed","handleRestarting","clearConnectionReconcile","handleSignalRestarted","Reconnected","emitBufferedEvents","participantInfos","sidToIdentity","getOrCreateParticipant","handleActiveSpeakersUpdate","seenSids","speaker","getRemoteParticipantBySid","emitWhenConnected","ActiveSpeakersChanged","handleSpeakersChanged","speakerUpdates","lastSpeakers","handleStreamStateUpdate","streamStateUpdate","streamStates","newStreamState","TrackStreamStateChanged","handleSubscriptionPermissionUpdate","handleSubscriptionError","handleUserPacket","handleTranscription","handleSipDtmf","handleChatMessage","handleMetrics","handleStreamHeader","handleStreamChunk","handleStreamTrailer","rpc","handleIncomingRpcRequest","userPacket","DataReceived","SipDTMFReceived","bufferedSegments","_remoteParticipant","transcription","transcribedParticipantIdentity","segments","firstReceivedTimesMap","language","final","firstReceivedTime","lastReceivedTime","extractTranscriptionSegments","transcriptionReceivedTimes","TranscriptionReceived","chatMessage","extractChatMessage","metrics","MetricsReceived","canPlaybackAudio","AudioPlaybackStatusChanged","VideoPlaybackStatusChanged","handleDeviceChange","selectDefaultDevices","MediaDevicesChanged","oldRoom","roomInfo","RoomMetadataChanged","activeRecording","RecordingStatusChanged","handleConnectionQualityUpdate","onLocalParticipantMetadataChanged","onLocalParticipantNameChanged","onLocalAttributesChanged","changedAttributes","ParticipantAttributesChanged","onLocalTrackMuted","onLocalTrackUnmuted","onTrackProcessorUpdate","onPublish","onLocalTrackRestarted","LocalAudioSilenceDetected","ActiveDeviceChanged","onLocalConnectionQualityChanged","onMediaDevicesError","onLocalParticipantPermissionsChanged","onLocalChatMessageSent","switchActiveDevice","setupE2EE","cleanupRegistry","register","registerTextStreamHandler","unregisterTextStreamHandler","registerByteStreamHandler","unregisterByteStreamHandler","callerIdentity","isRecording","getSid","numParticipants","numPublishers","onTrackAdded","SignalReconnecting","updateSubscriptions","subscribedSid","trackPublication","roomMoved","Moved","getLocalDevices","prepareConnection","simulateScenario","postAction","canPlaybackVideo","getActiveDevice","deviceId_1","success","shouldTriggerImmediateDeviceChange","deviceConstraint","prevDeviceId","reconnectedHandler","unpackStreamId","shouldStopTracks","ParticipantDisconnected","streamHeader","streamHandlerCallback","fileBuffer","textBuffer","availableDevices","availableDevice","previousDevice","kinds","targetSource","targetPublication","devicesOfKind","activeDevice","deviceInfo","newContextIsRunning","createParticipant","existingParticipant","ParticipantConnected","ParticipantActive","consecutiveFailures","connectionReconcileInterval","numFailures","closed","transportsConnected","STATE_MISMATCH","_len2","_key2","simulateParticipants","useRealTracks","participantOptions","aspectRatios","emptyTimeout","maxParticipants","creationTime","turnPassword","enabledCodecs","camPub","audioPub","dummyVideo","_len3","_key3","minimizedArgs","mapArgs","CheckStatus","FinalizationRegistry","LiveKitAnalytics","analyticsInterval","lastAgentSpeakStart","lastUserSpeakStart","callStartTime","isConnected","_LiveKitAnalytics_instances","_LiveKitAnalytics_initializeMetrics","setRoom","setConnectionState","updateConnectionStats","connectionAttempts","reconnectionAttempts","callStats","performanceMetrics","reconnectionCount","updateCounts","participantCount","trackCount","setConnectionEstablishedTime","time","connectionEstablishedTime","startAnalyticsCollection","stopAnalyticsCollection","_LiveKitAnalytics_collectAnalytics","handleConnectionQualityChanged","qualityString","_LiveKitAnalytics_mapConnectionQualityToString","connectionMetrics","latency","qualityMetrics","_LiveKitAnalytics_getQualityMetrics","packetLoss","qualityData","handleAudioPlaybackChanged","playing","currentTime","audioMetrics","agentAudioLevel","agentSpeakingTime","getConnectionStats","getAudioLevels","userAudioLevel","userSpeakingTime","audioDropouts","echoCancellationActive","currentUserLevel","currentAgentLevel","getPerformanceMetrics","callDuration","responseTime","networkLatency","averageResponseTime","getCallAnalytics","isPaused","connectionStats","totalBytesReceived","totalBytesSent","audioLevels","_participant","LiveKitAudioManager","audioElements","inputAnalyser","outputAnalyser","numVolume","audioElement","getOutputVolume","getInputVolume","_LiveKitAudioManager_instances","_LiveKitAudioManager_initializeInputAnalyser","binCount","getByteFrequencyData","sum","avg","setMicMuted","maybePromise","_LiveKitAudioManager_emitMicEventSafely","isMicMuted","getter","getInputByteFrequencyData","getOutputByteFrequencyData","_LiveKitAudioManager_initializeOutputAnalyser","handleTrackSubscribed","subscriptionTime","_LiveKitAudioManager_getTrackSourceString","_LiveKitAudioManager_setupAudioMonitoring","subscriptionData","style","appendChild","handleTrackUnsubscribed","parentNode","removeChild","unsubscriptionData","pauseAllAudio","resumeAllAudio","getTrackStats","totalTracks","activeTracks","trackDetails","WeakSet","eventName","_LiveKitAudioManager_emitMicControlError","isCurrentlySpeaking","_LiveKitAudioManager_ensureAudioContext","ctorUnknown","globalThis","Ctor","createMediaElementSource","LiveKitConnection","lkUrl","accessToken","hasEmittedConnected","_LiveKitConnection_instances","_LiveKitConnection_setupRoomEventHandlers","getRoom","connectionStart","connectionTime","forceDisconnect","_LiveKitConnection_cleanup","getConnectionAttempts","getReconnectionAttempts","getParticipants","_LiveKitConnection_handleConnected","_LiveKitConnection_handleDisconnected","_LiveKitConnection_handleReconnecting","_LiveKitConnection_handleReconnected","_LiveKitConnection_handleParticipantConnected","_LiveKitConnection_handleParticipantDisconnected","_LiveKitConnection_handleConnectionStateChanged","async","LiveKitToolRegistry","tools","registerTools","setTools","tool","function_name","handleDataReceived","eventType","eventData","rawMessage","_error","handleTranscriptionReceived","transcriptions","segment","emitLocalAudioStream","localAudioTrack","getToolCount","getTools","LiveKitManager","analytics","audioManager","toolRegistry","_LiveKitManager_instances","_LiveKitManager_setupModuleCommunication","_LiveKitManager_setupEventForwarding","_LiveKitManager_setupRoomEventHandlers","_LiveKitManager_updateAnalyticsCounts","eventHandlers","ScreenWakeLock","_wakeLock","acquire","nav","wakeLock","request","release","HamsaVoiceAgent","apiKey","API_URL","liveKitManager","jobId","wakeLockManager","DEFAULT_OUTPUT_VOLUME","DEFAULT_INPUT_VOLUME","sendUserActivity","sendContextualUpdate","agentId","voiceEnablement","userId","_userId","preferHeadphonesForIosDevices","_preferHeadphonesForIosDevices","connectionDelay","_connectionDelay","disableWakeLock","_disableWakeLock","remoteStream","localStream","_err","getJobDetails","initialRetryInterval","backoffFactor","Authorization","currentInterval","fetchJobDetails","attempt","errorText","_HamsaVoiceAgent_instances","_HamsaVoiceAgent_delay","voiceAgentId","_HamsaVoiceAgent_convertToolsToLLMTools","requestOptions","redirect","liveKitAccessToken","conversationId","function","properties","required","func_map"],"mappings":"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","x_google_ignoreList":[0,1,2]}