@sableclient/sable-call-embedded 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/LICENSE-AGPL-3.0 +661 -0
  2. package/LICENSE-COMMERCIAL +6 -0
  3. package/README.md +14 -0
  4. package/dist/assets/IndexedDBWorker-Dgn5IQFp.js +25 -0
  5. package/dist/assets/IndexedDBWorker-Dgn5IQFp.js.map +1 -0
  6. package/dist/assets/baduntss-Ca1ZuBEK.ogg +0 -0
  7. package/dist/assets/baduntss-DOe0oFuS.mp3 +0 -0
  8. package/dist/assets/call_declined-1jWRbd4p.mp3 +0 -0
  9. package/dist/assets/call_declined-C6gHsCGH.ogg +0 -0
  10. package/dist/assets/call_timeout-BCxXxRD8.mp3 +0 -0
  11. package/dist/assets/call_timeout-DPKAj6sz.ogg +0 -0
  12. package/dist/assets/cat-4r_NkDcK.ogg +0 -0
  13. package/dist/assets/cat-Dd8bv_2W.mp3 +0 -0
  14. package/dist/assets/clap-AxCMZLTd.ogg +0 -0
  15. package/dist/assets/clap-Dxm5qGyl.mp3 +0 -0
  16. package/dist/assets/crickets-CcwrRdbq.mp3 +0 -0
  17. package/dist/assets/crickets-DUJdcuUa.ogg +0 -0
  18. package/dist/assets/cs-app-Du_5mVg3.json +236 -0
  19. package/dist/assets/da-app-BBz-lePm.json +236 -0
  20. package/dist/assets/de-app-DjOuqT-j.json +237 -0
  21. package/dist/assets/deer-91r1Gyrx.mp3 +0 -0
  22. package/dist/assets/deer-DPSlVch4.ogg +0 -0
  23. package/dist/assets/dog-BoQdnF-w.mp3 +0 -0
  24. package/dist/assets/dog-CxIWtkNX.ogg +0 -0
  25. package/dist/assets/el-app-BBr3LLTK.json +122 -0
  26. package/dist/assets/en-app-D4wTuGKD.json +261 -0
  27. package/dist/assets/es-app-Q3c7lmEj.json +88 -0
  28. package/dist/assets/et-app-DLvuR7m2.json +234 -0
  29. package/dist/assets/fi-app-tnO3DMdi.json +224 -0
  30. package/dist/assets/fr-app-BxTYbDfK.json +111 -0
  31. package/dist/assets/generic-BBbS3Wph.ogg +0 -0
  32. package/dist/assets/generic-BFeSb6fL.mp3 +0 -0
  33. package/dist/assets/id-app-BEz8ptLJ.json +223 -0
  34. package/dist/assets/inconsolata-latin-400-normal-DTZQ6lD6.woff2 +0 -0
  35. package/dist/assets/inconsolata-latin-400-normal-HYADljCo.woff +0 -0
  36. package/dist/assets/inconsolata-latin-700-normal-ByjKuJjN.woff2 +0 -0
  37. package/dist/assets/inconsolata-latin-700-normal-DzgUY3Rl.woff +0 -0
  38. package/dist/assets/inconsolata-latin-ext-400-normal-BaHVOdFB.woff2 +0 -0
  39. package/dist/assets/inconsolata-latin-ext-400-normal-yvPjCxxx.woff +0 -0
  40. package/dist/assets/inconsolata-latin-ext-700-normal-D0Kpgs_9.woff2 +0 -0
  41. package/dist/assets/inconsolata-latin-ext-700-normal-Dlt-daqV.woff +0 -0
  42. package/dist/assets/inconsolata-vietnamese-400-normal-ByiM2lek.woff +0 -0
  43. package/dist/assets/inconsolata-vietnamese-400-normal-DfC_iMic.woff2 +0 -0
  44. package/dist/assets/inconsolata-vietnamese-700-normal-DLCFFAUf.woff +0 -0
  45. package/dist/assets/inconsolata-vietnamese-700-normal-DuasYmn8.woff2 +0 -0
  46. package/dist/assets/index-BOka8551.js +4 -0
  47. package/dist/assets/index-BOka8551.js.map +1 -0
  48. package/dist/assets/index-BxK4r5m1.css +1 -0
  49. package/dist/assets/index-CSLbyoDR.js +3 -0
  50. package/dist/assets/index-CSLbyoDR.js.map +1 -0
  51. package/dist/assets/index-zdC0P6j0.js +300 -0
  52. package/dist/assets/index-zdC0P6j0.js.map +1 -0
  53. package/dist/assets/inter-cyrillic-400-normal-HOLc17fK.woff +0 -0
  54. package/dist/assets/inter-cyrillic-400-normal-obahsSVq.woff2 +0 -0
  55. package/dist/assets/inter-cyrillic-500-normal-BasfLYem.woff2 +0 -0
  56. package/dist/assets/inter-cyrillic-500-normal-CxZf_p3X.woff +0 -0
  57. package/dist/assets/inter-cyrillic-600-normal-4D_pXhcN.woff +0 -0
  58. package/dist/assets/inter-cyrillic-600-normal-CWCymEST.woff2 +0 -0
  59. package/dist/assets/inter-cyrillic-700-normal-CjBOestx.woff2 +0 -0
  60. package/dist/assets/inter-cyrillic-700-normal-DrXBdSj3.woff +0 -0
  61. package/dist/assets/inter-cyrillic-ext-400-normal-BQZuk6qB.woff2 +0 -0
  62. package/dist/assets/inter-cyrillic-ext-400-normal-DQukG94-.woff +0 -0
  63. package/dist/assets/inter-cyrillic-ext-500-normal-B0yAr1jD.woff2 +0 -0
  64. package/dist/assets/inter-cyrillic-ext-500-normal-BmqWE9Dz.woff +0 -0
  65. package/dist/assets/inter-cyrillic-ext-600-normal-Bcila6Z-.woff +0 -0
  66. package/dist/assets/inter-cyrillic-ext-600-normal-Dfes3d0z.woff2 +0 -0
  67. package/dist/assets/inter-cyrillic-ext-700-normal-BjwYoWNd.woff2 +0 -0
  68. package/dist/assets/inter-cyrillic-ext-700-normal-LO58E6JB.woff +0 -0
  69. package/dist/assets/inter-greek-400-normal-B4URO6DV.woff2 +0 -0
  70. package/dist/assets/inter-greek-400-normal-q2sYcFCs.woff +0 -0
  71. package/dist/assets/inter-greek-500-normal-BIZE56-Y.woff2 +0 -0
  72. package/dist/assets/inter-greek-500-normal-Xzm54t5V.woff +0 -0
  73. package/dist/assets/inter-greek-600-normal-BZpKdvQh.woff +0 -0
  74. package/dist/assets/inter-greek-600-normal-plRanbMR.woff2 +0 -0
  75. package/dist/assets/inter-greek-700-normal-BUv2fZ6O.woff +0 -0
  76. package/dist/assets/inter-greek-700-normal-C3JjAnD8.woff2 +0 -0
  77. package/dist/assets/inter-greek-ext-400-normal-DGGRlc-M.woff2 +0 -0
  78. package/dist/assets/inter-greek-ext-400-normal-KugGGMne.woff +0 -0
  79. package/dist/assets/inter-greek-ext-500-normal-2j5mBUwD.woff +0 -0
  80. package/dist/assets/inter-greek-ext-500-normal-C4iEst2y.woff2 +0 -0
  81. package/dist/assets/inter-greek-ext-600-normal-B8X0CLgF.woff +0 -0
  82. package/dist/assets/inter-greek-ext-600-normal-DRtmH8MT.woff2 +0 -0
  83. package/dist/assets/inter-greek-ext-700-normal-BoQ6DsYi.woff +0 -0
  84. package/dist/assets/inter-greek-ext-700-normal-qfdV9bQt.woff2 +0 -0
  85. package/dist/assets/inter-latin-400-normal-C38fXH4l.woff2 +0 -0
  86. package/dist/assets/inter-latin-400-normal-CyCys3Eg.woff +0 -0
  87. package/dist/assets/inter-latin-500-normal-BL9OpVg8.woff +0 -0
  88. package/dist/assets/inter-latin-500-normal-Cerq10X2.woff2 +0 -0
  89. package/dist/assets/inter-latin-600-normal-CiBQ2DWP.woff +0 -0
  90. package/dist/assets/inter-latin-600-normal-LgqL8muc.woff2 +0 -0
  91. package/dist/assets/inter-latin-700-normal-BLAVimhd.woff +0 -0
  92. package/dist/assets/inter-latin-700-normal-Yt3aPRUw.woff2 +0 -0
  93. package/dist/assets/inter-latin-ext-400-normal-77YHD8bZ.woff +0 -0
  94. package/dist/assets/inter-latin-ext-400-normal-C1nco2VV.woff2 +0 -0
  95. package/dist/assets/inter-latin-ext-500-normal-BxGbmqWO.woff +0 -0
  96. package/dist/assets/inter-latin-ext-500-normal-CV4jyFjo.woff2 +0 -0
  97. package/dist/assets/inter-latin-ext-600-normal-CIVaiw4L.woff +0 -0
  98. package/dist/assets/inter-latin-ext-600-normal-D2bJ5OIk.woff2 +0 -0
  99. package/dist/assets/inter-latin-ext-700-normal-Ca8adRJv.woff2 +0 -0
  100. package/dist/assets/inter-latin-ext-700-normal-TidjK2hL.woff +0 -0
  101. package/dist/assets/inter-vietnamese-400-normal-Bbgyi5SW.woff +0 -0
  102. package/dist/assets/inter-vietnamese-400-normal-DMkecbls.woff2 +0 -0
  103. package/dist/assets/inter-vietnamese-500-normal-DOriooB6.woff2 +0 -0
  104. package/dist/assets/inter-vietnamese-500-normal-mJboJaSs.woff +0 -0
  105. package/dist/assets/inter-vietnamese-600-normal-BuLX-rYi.woff +0 -0
  106. package/dist/assets/inter-vietnamese-600-normal-Cc8MFFhd.woff2 +0 -0
  107. package/dist/assets/inter-vietnamese-700-normal-BZaoP0fm.woff +0 -0
  108. package/dist/assets/inter-vietnamese-700-normal-DlLaEgI2.woff2 +0 -0
  109. package/dist/assets/it-app-Cik25Qgd.json +215 -0
  110. package/dist/assets/ja-app-Cp_00ujI.json +123 -0
  111. package/dist/assets/join_call-DlMV9nHk.ogg +0 -0
  112. package/dist/assets/join_call-dEJCP2wD.mp3 +0 -0
  113. package/dist/assets/left_call-BbqmRgnC.mp3 +0 -0
  114. package/dist/assets/left_call-C7NMl6WI.ogg +0 -0
  115. package/dist/assets/lightbulb-BIeJtAR_.ogg +0 -0
  116. package/dist/assets/lightbulb-BrnY00qi.mp3 +0 -0
  117. package/dist/assets/livekit-client.e2ee.worker-Bmrtztct.js.map +1 -0
  118. package/dist/assets/lv-app-D-ZV3Ytk.json +222 -0
  119. package/dist/assets/matrix-sdk-crypto-wasm-BsWSMcLv.js +3 -0
  120. package/dist/assets/matrix-sdk-crypto-wasm-BsWSMcLv.js.map +1 -0
  121. package/dist/assets/matrix_sdk_crypto_wasm_bg-DU_51VO6.wasm +0 -0
  122. package/dist/assets/pako.esm-Cf42LiW4.js +2 -0
  123. package/dist/assets/pako.esm-Cf42LiW4.js.map +1 -0
  124. package/dist/assets/party-BZPeTgC3.mp3 +0 -0
  125. package/dist/assets/party-D7rIOhAQ.ogg +0 -0
  126. package/dist/assets/pl-app-CUkXVSZk.json +221 -0
  127. package/dist/assets/polyfill-force-DGhxcQMk.js +3 -0
  128. package/dist/assets/polyfill-force-DGhxcQMk.js.map +1 -0
  129. package/dist/assets/polyfill-force-DSyAwg73.js +2 -0
  130. package/dist/assets/polyfill-force-DSyAwg73.js.map +1 -0
  131. package/dist/assets/raise_hand-Bzqn65WB.mp3 +0 -0
  132. package/dist/assets/raise_hand-CUbxEnt9.ogg +0 -0
  133. package/dist/assets/ringtone-B-nJXbbw.ogg +0 -0
  134. package/dist/assets/ringtone-B2csBdU4.mp3 +0 -0
  135. package/dist/assets/ro-app-CdYgKCOW.json +206 -0
  136. package/dist/assets/rock-BVCJXNC-.ogg +0 -0
  137. package/dist/assets/rock-CHdnB31m.mp3 +0 -0
  138. package/dist/assets/ru-app-CIijOjFj.json +229 -0
  139. package/dist/assets/screen_share_started-DH3qxml5.mp3 +0 -0
  140. package/dist/assets/screen_share_started-IZDL-kAw.ogg +0 -0
  141. package/dist/assets/selfie_segmenter-DF05sdL4.tflite +0 -0
  142. package/dist/assets/sk-app-DaVEeQWZ.json +230 -0
  143. package/dist/assets/spa-DBidebYi.js +2 -0
  144. package/dist/assets/spa-DBidebYi.js.map +1 -0
  145. package/dist/assets/sv-app-DHLBEOTp.json +236 -0
  146. package/dist/assets/tr-app-Dk--6BpP.json +209 -0
  147. package/dist/assets/uk-app-DZD01h76.json +222 -0
  148. package/dist/assets/vision_wasm_internal-B105rqk5.js +2 -0
  149. package/dist/assets/vision_wasm_internal-cvmXinav.wasm +0 -0
  150. package/dist/assets/wave-Bzf1LSMH.mp3 +0 -0
  151. package/dist/assets/wave-FiiOzicp.ogg +0 -0
  152. package/dist/assets/zh-Hans-app-BY5jJGyr.json +133 -0
  153. package/dist/assets/zh-Hant-app-BV1LKS_j.json +114 -0
  154. package/dist/config.json +1 -0
  155. package/dist/index.html +1 -0
  156. package/package.json +14 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"livekit-client.e2ee.worker-Bmrtztct.js","sources":["../node_modules/livekit-client/dist/livekit-client.e2ee.worker.mjs"],"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\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\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 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[\"TokenSource\"] = \"livekit-token-source\";\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');\nObject.values(LoggerNames).map(name => loglevelExports.getLogger(name));\nlivekitLogger.setDefaultLevel(LogLevel.info);\nconst workerLogger = loglevelExports.getLogger('lk-e2ee');\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\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\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// We copy the first bytes of the VP8 payload unencrypted.\n// For keyframes this is 10 bytes, for non-keyframes (delta) 3. See\n// https://tools.ietf.org/html/rfc6386#section-9.1\n// This allows the bridge to continue detecting keyframes (only one byte needed in the JVB)\n// and is also a bit easier for the VP8 decoder (i.e. it generates funny garbage pictures\n// instead of being unable to decode).\n// This is a bit for show and we might want to reduce to 1 unconditionally in the final version.\n//\n// For audio (where frame.type is not set) we do not encrypt the opus TOC byte:\n// https://tools.ietf.org/html/rfc6716#section-3.1\nconst UNENCRYPTED_BYTES = {\n key: 10,\n delta: 3,\n audio: 1,\n // frame.type is not set on audio, so this is set manually\n empty: 0\n};\n/* We use a 12 byte bit IV. This is signalled in plain together with the\n packet. See https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt#parameters */\nconst IV_LENGTH = 12;\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\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 = {}));\n// NOTE: matches with https://github.com/livekit/client-sdk-swift/blob/f37bbd260d61e165084962db822c79f995f1a113/Sources/LiveKit/DataStream/StreamError.swift#L17\nvar DataStreamErrorReason;\n(function (DataStreamErrorReason) {\n // Unable to open a stream with the same ID more than once.\n DataStreamErrorReason[DataStreamErrorReason[\"AlreadyOpened\"] = 0] = \"AlreadyOpened\";\n // Stream closed abnormally by remote participant.\n DataStreamErrorReason[DataStreamErrorReason[\"AbnormalEnd\"] = 1] = \"AbnormalEnd\";\n // Incoming chunk data could not be decoded.\n DataStreamErrorReason[DataStreamErrorReason[\"DecodeFailed\"] = 2] = \"DecodeFailed\";\n // Read length exceeded total length specified in stream header.\n DataStreamErrorReason[DataStreamErrorReason[\"LengthExceeded\"] = 3] = \"LengthExceeded\";\n // Read length less than total length specified in stream header.\n DataStreamErrorReason[DataStreamErrorReason[\"Incomplete\"] = 4] = \"Incomplete\";\n // Unable to register a stream handler more than once.\n DataStreamErrorReason[DataStreamErrorReason[\"HandlerAlreadyRegistered\"] = 7] = \"HandlerAlreadyRegistered\";\n // Encryption type mismatch.\n DataStreamErrorReason[DataStreamErrorReason[\"EncryptionTypeMismatch\"] = 8] = \"EncryptionTypeMismatch\";\n})(DataStreamErrorReason || (DataStreamErrorReason = {}));\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\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 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 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}\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\nclass DataCryptor {\n static makeIV(timestamp) {\n const iv = new ArrayBuffer(12);\n const ivView = new DataView(iv);\n const randomBytes = crypto.getRandomValues(new Uint32Array(1));\n ivView.setUint32(0, randomBytes[0]);\n ivView.setUint32(4, timestamp);\n ivView.setUint32(8, timestamp - DataCryptor.sendCount % 0xffff);\n DataCryptor.sendCount++;\n return iv;\n }\n static encrypt(data, keys) {\n return __awaiter(this, void 0, void 0, function* () {\n const iv = DataCryptor.makeIV(performance.now());\n const keySet = yield keys.getKeySet();\n if (!keySet) {\n throw new Error('No key set found');\n }\n const cipherText = yield crypto.subtle.encrypt({\n name: ENCRYPTION_ALGORITHM,\n iv\n }, keySet.encryptionKey, new Uint8Array(data));\n return {\n payload: new Uint8Array(cipherText),\n iv: new Uint8Array(iv),\n keyIndex: keys.getCurrentKeyIndex()\n };\n });\n }\n static decrypt(data_1, iv_1, keys_1) {\n return __awaiter(this, arguments, void 0, function (data, iv, keys) {\n let keyIndex = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;\n let initialMaterial = arguments.length > 4 ? arguments[4] : undefined;\n let ratchetOpts = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : {\n ratchetCount: 0\n };\n return function* () {\n const keySet = yield keys.getKeySet(keyIndex);\n if (!keySet) {\n throw new Error('No key set found');\n }\n try {\n const plainText = yield crypto.subtle.decrypt({\n name: ENCRYPTION_ALGORITHM,\n iv\n }, keySet.encryptionKey, new Uint8Array(data));\n return {\n payload: new Uint8Array(plainText)\n };\n } catch (error) {\n if (keys.keyProviderOptions.ratchetWindowSize > 0) {\n if (ratchetOpts.ratchetCount < keys.keyProviderOptions.ratchetWindowSize) {\n workerLogger.debug(\"DataCryptor: ratcheting key attempt \".concat(ratchetOpts.ratchetCount, \" of \").concat(keys.keyProviderOptions.ratchetWindowSize, \", for data packet\"));\n let ratchetedKeySet;\n let ratchetResult;\n if ((initialMaterial !== null && initialMaterial !== void 0 ? initialMaterial : keySet) === keys.getKeySet(keyIndex)) {\n // only ratchet if the currently set key is still the same as the one used to decrypt this frame\n // if not, it might be that a different frame has already ratcheted and we try with that one first\n ratchetResult = yield keys.ratchetKey(keyIndex, false);\n ratchetedKeySet = yield deriveKeys(ratchetResult.cryptoKey, keys.keyProviderOptions.ratchetSalt);\n }\n const decryptedData = yield DataCryptor.decrypt(data, iv, keys, keyIndex, initialMaterial, {\n ratchetCount: ratchetOpts.ratchetCount + 1,\n encryptionKey: ratchetedKeySet === null || ratchetedKeySet === void 0 ? void 0 : ratchetedKeySet.encryptionKey\n });\n if (decryptedData && ratchetedKeySet) {\n // before updating the keys, make sure that the keySet used for this frame is still the same as the currently set key\n // if it's not, a new key might have been set already, which we don't want to override\n if ((initialMaterial !== null && initialMaterial !== void 0 ? initialMaterial : keySet) === keys.getKeySet(keyIndex)) {\n keys.setKeySet(ratchetedKeySet, keyIndex, ratchetResult);\n // decryption was successful, set the new key index to reflect the ratcheted key set\n keys.setCurrentKeyIndex(keyIndex);\n }\n }\n return decryptedData;\n } else {\n /**\n * Because we only set a new key once decryption has been successful,\n * we can be sure that we don't need to reset the key to the initial material at this point\n * as the key has not been updated on the keyHandler instance\n */\n workerLogger.warn('DataCryptor: maximum ratchet attempts exceeded');\n throw new CryptorError(\"DataCryptor: valid key missing for participant \".concat(keys.participantIdentity), CryptorErrorReason.InvalidKey, keys.participantIdentity);\n }\n } else {\n throw new CryptorError(\"DataCryptor: Decryption failed: \".concat(error.message), CryptorErrorReason.InvalidKey, keys.participantIdentity);\n }\n }\n }();\n });\n }\n}\nDataCryptor.sendCount = 0;\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 * NALU (Network Abstraction Layer Unit) utilities for H.264 and H.265 video processing\n * Contains functions for parsing and working with NALUs in video frames\n */\n/**\n * Mask for extracting NALU type from H.264 header byte\n */\nconst kH264NaluTypeMask = 0x1f;\n/**\n * H.264 NALU types according to RFC 6184\n */\nvar H264NALUType;\n(function (H264NALUType) {\n /** Coded slice of a non-IDR picture */\n H264NALUType[H264NALUType[\"SLICE_NON_IDR\"] = 1] = \"SLICE_NON_IDR\";\n /** Coded slice data partition A */\n H264NALUType[H264NALUType[\"SLICE_PARTITION_A\"] = 2] = \"SLICE_PARTITION_A\";\n /** Coded slice data partition B */\n H264NALUType[H264NALUType[\"SLICE_PARTITION_B\"] = 3] = \"SLICE_PARTITION_B\";\n /** Coded slice data partition C */\n H264NALUType[H264NALUType[\"SLICE_PARTITION_C\"] = 4] = \"SLICE_PARTITION_C\";\n /** Coded slice of an IDR picture */\n H264NALUType[H264NALUType[\"SLICE_IDR\"] = 5] = \"SLICE_IDR\";\n /** Supplemental enhancement information */\n H264NALUType[H264NALUType[\"SEI\"] = 6] = \"SEI\";\n /** Sequence parameter set */\n H264NALUType[H264NALUType[\"SPS\"] = 7] = \"SPS\";\n /** Picture parameter set */\n H264NALUType[H264NALUType[\"PPS\"] = 8] = \"PPS\";\n /** Access unit delimiter */\n H264NALUType[H264NALUType[\"AUD\"] = 9] = \"AUD\";\n /** End of sequence */\n H264NALUType[H264NALUType[\"END_SEQ\"] = 10] = \"END_SEQ\";\n /** End of stream */\n H264NALUType[H264NALUType[\"END_STREAM\"] = 11] = \"END_STREAM\";\n /** Filler data */\n H264NALUType[H264NALUType[\"FILLER_DATA\"] = 12] = \"FILLER_DATA\";\n /** Sequence parameter set extension */\n H264NALUType[H264NALUType[\"SPS_EXT\"] = 13] = \"SPS_EXT\";\n /** Prefix NAL unit */\n H264NALUType[H264NALUType[\"PREFIX_NALU\"] = 14] = \"PREFIX_NALU\";\n /** Subset sequence parameter set */\n H264NALUType[H264NALUType[\"SUBSET_SPS\"] = 15] = \"SUBSET_SPS\";\n /** Depth parameter set */\n H264NALUType[H264NALUType[\"DPS\"] = 16] = \"DPS\";\n // 17, 18 reserved\n /** Coded slice of an auxiliary coded picture without partitioning */\n H264NALUType[H264NALUType[\"SLICE_AUX\"] = 19] = \"SLICE_AUX\";\n /** Coded slice extension */\n H264NALUType[H264NALUType[\"SLICE_EXT\"] = 20] = \"SLICE_EXT\";\n /** Coded slice extension for a depth view component or a 3D-AVC texture view component */\n H264NALUType[H264NALUType[\"SLICE_LAYER_EXT\"] = 21] = \"SLICE_LAYER_EXT\";\n // 22, 23 reserved\n})(H264NALUType || (H264NALUType = {}));\n/**\n * H.265/HEVC NALU types according to ITU-T H.265\n */\nvar H265NALUType;\n(function (H265NALUType) {\n /** Coded slice segment of a non-TSA, non-STSA trailing picture */\n H265NALUType[H265NALUType[\"TRAIL_N\"] = 0] = \"TRAIL_N\";\n /** Coded slice segment of a non-TSA, non-STSA trailing picture */\n H265NALUType[H265NALUType[\"TRAIL_R\"] = 1] = \"TRAIL_R\";\n /** Coded slice segment of a TSA picture */\n H265NALUType[H265NALUType[\"TSA_N\"] = 2] = \"TSA_N\";\n /** Coded slice segment of a TSA picture */\n H265NALUType[H265NALUType[\"TSA_R\"] = 3] = \"TSA_R\";\n /** Coded slice segment of an STSA picture */\n H265NALUType[H265NALUType[\"STSA_N\"] = 4] = \"STSA_N\";\n /** Coded slice segment of an STSA picture */\n H265NALUType[H265NALUType[\"STSA_R\"] = 5] = \"STSA_R\";\n /** Coded slice segment of a RADL picture */\n H265NALUType[H265NALUType[\"RADL_N\"] = 6] = \"RADL_N\";\n /** Coded slice segment of a RADL picture */\n H265NALUType[H265NALUType[\"RADL_R\"] = 7] = \"RADL_R\";\n /** Coded slice segment of a RASL picture */\n H265NALUType[H265NALUType[\"RASL_N\"] = 8] = \"RASL_N\";\n /** Coded slice segment of a RASL picture */\n H265NALUType[H265NALUType[\"RASL_R\"] = 9] = \"RASL_R\";\n // 10-15 reserved\n /** Coded slice segment of a BLA picture */\n H265NALUType[H265NALUType[\"BLA_W_LP\"] = 16] = \"BLA_W_LP\";\n /** Coded slice segment of a BLA picture */\n H265NALUType[H265NALUType[\"BLA_W_RADL\"] = 17] = \"BLA_W_RADL\";\n /** Coded slice segment of a BLA picture */\n H265NALUType[H265NALUType[\"BLA_N_LP\"] = 18] = \"BLA_N_LP\";\n /** Coded slice segment of an IDR picture */\n H265NALUType[H265NALUType[\"IDR_W_RADL\"] = 19] = \"IDR_W_RADL\";\n /** Coded slice segment of an IDR picture */\n H265NALUType[H265NALUType[\"IDR_N_LP\"] = 20] = \"IDR_N_LP\";\n /** Coded slice segment of a CRA picture */\n H265NALUType[H265NALUType[\"CRA_NUT\"] = 21] = \"CRA_NUT\";\n // 22-31 reserved\n /** Video parameter set */\n H265NALUType[H265NALUType[\"VPS_NUT\"] = 32] = \"VPS_NUT\";\n /** Sequence parameter set */\n H265NALUType[H265NALUType[\"SPS_NUT\"] = 33] = \"SPS_NUT\";\n /** Picture parameter set */\n H265NALUType[H265NALUType[\"PPS_NUT\"] = 34] = \"PPS_NUT\";\n /** Access unit delimiter */\n H265NALUType[H265NALUType[\"AUD_NUT\"] = 35] = \"AUD_NUT\";\n /** End of sequence */\n H265NALUType[H265NALUType[\"EOS_NUT\"] = 36] = \"EOS_NUT\";\n /** End of bitstream */\n H265NALUType[H265NALUType[\"EOB_NUT\"] = 37] = \"EOB_NUT\";\n /** Filler data */\n H265NALUType[H265NALUType[\"FD_NUT\"] = 38] = \"FD_NUT\";\n /** Supplemental enhancement information */\n H265NALUType[H265NALUType[\"PREFIX_SEI_NUT\"] = 39] = \"PREFIX_SEI_NUT\";\n /** Supplemental enhancement information */\n H265NALUType[H265NALUType[\"SUFFIX_SEI_NUT\"] = 40] = \"SUFFIX_SEI_NUT\";\n // 41-47 reserved\n // 48-63 unspecified\n})(H265NALUType || (H265NALUType = {}));\n/**\n * Parse H.264 NALU type from the first byte of a NALU\n * @param startByte First byte of the NALU\n * @returns H.264 NALU type\n */\nfunction parseH264NALUType(startByte) {\n return startByte & kH264NaluTypeMask;\n}\n/**\n * Parse H.265 NALU type from the first byte of a NALU\n * @param firstByte First byte of the NALU\n * @returns H.265 NALU type\n */\nfunction parseH265NALUType(firstByte) {\n // In H.265, NALU type is in bits 1-6 (shifted right by 1)\n return firstByte >> 1 & 0x3f;\n}\n/**\n * Check if H.264 NALU type is a slice (IDR or non-IDR)\n * @param naluType H.264 NALU type\n * @returns True if the NALU is a slice\n */\nfunction isH264SliceNALU(naluType) {\n return naluType === H264NALUType.SLICE_IDR || naluType === H264NALUType.SLICE_NON_IDR;\n}\n/**\n * Check if H.265 NALU type is a slice\n * @param naluType H.265 NALU type\n * @returns True if the NALU is a slice\n */\nfunction isH265SliceNALU(naluType) {\n return (\n // VCL NALUs (Video Coding Layer) - slice segments\n naluType === H265NALUType.TRAIL_N || naluType === H265NALUType.TRAIL_R || naluType === H265NALUType.TSA_N || naluType === H265NALUType.TSA_R || naluType === H265NALUType.STSA_N || naluType === H265NALUType.STSA_R || naluType === H265NALUType.RADL_N || naluType === H265NALUType.RADL_R || naluType === H265NALUType.RASL_N || naluType === H265NALUType.RASL_R || naluType === H265NALUType.BLA_W_LP || naluType === H265NALUType.BLA_W_RADL || naluType === H265NALUType.BLA_N_LP || naluType === H265NALUType.IDR_W_RADL || naluType === H265NALUType.IDR_N_LP || naluType === H265NALUType.CRA_NUT\n );\n}\n/**\n * Detect codec type by examining NALU types in the data\n * @param data Frame data\n * @param naluIndices Indices where NALUs start\n * @returns Detected codec type\n */\nfunction detectCodecFromNALUs(data, naluIndices) {\n for (const naluIndex of naluIndices) {\n if (isH264SliceNALU(parseH264NALUType(data[naluIndex]))) return 'h264';\n if (isH265SliceNALU(parseH265NALUType(data[naluIndex]))) return 'h265';\n }\n return 'unknown';\n}\n/**\n * Find the first slice NALU and return the number of unencrypted bytes\n * @param data Frame data\n * @param naluIndices Indices where NALUs start\n * @param codec Codec type to use for parsing\n * @returns Number of unencrypted bytes (index + 2) or null if no slice found\n */\nfunction findSliceNALUUnencryptedBytes(data, naluIndices, codec) {\n for (const index of naluIndices) {\n if (codec === 'h265') {\n const type = parseH265NALUType(data[index]);\n if (isH265SliceNALU(type)) {\n return index + 2;\n }\n } else {\n const type = parseH264NALUType(data[index]);\n if (isH264SliceNALU(type)) {\n return index + 2;\n }\n }\n }\n return null;\n}\n/**\n * Find all NALU start indices in a byte stream\n * Supports both H.264 and H.265 with 3-byte and 4-byte start codes\n *\n * This function slices the NALUs present in the supplied buffer, assuming it is already byte-aligned.\n * Code adapted from https://github.com/medooze/h264-frame-parser/blob/main/lib/NalUnits.ts to return indices only\n *\n * @param stream Byte stream containing NALUs\n * @returns Array of indices where NALUs start (after the start code)\n */\nfunction findNALUIndices(stream) {\n const result = [];\n let start = 0,\n pos = 0,\n searchLength = stream.length - 3; // Changed to -3 to handle 4-byte start codes\n while (pos < searchLength) {\n // skip until end of current NALU - check for both 3-byte and 4-byte start codes\n while (pos < searchLength) {\n // Check for 4-byte start code: 0x00 0x00 0x00 0x01\n if (pos < searchLength - 1 && stream[pos] === 0 && stream[pos + 1] === 0 && stream[pos + 2] === 0 && stream[pos + 3] === 1) {\n break;\n }\n // Check for 3-byte start code: 0x00 0x00 0x01\n if (stream[pos] === 0 && stream[pos + 1] === 0 && stream[pos + 2] === 1) {\n break;\n }\n pos++;\n }\n if (pos >= searchLength) pos = stream.length;\n // remove trailing zeros from current NALU\n let end = pos;\n while (end > start && stream[end - 1] === 0) end--;\n // save current NALU\n if (start === 0) {\n if (end !== start) throw TypeError('byte stream contains leading data');\n } else {\n result.push(start);\n }\n // begin new NALU - determine start code length\n let startCodeLength = 3;\n if (pos < stream.length - 3 && stream[pos] === 0 && stream[pos + 1] === 0 && stream[pos + 2] === 0 && stream[pos + 3] === 1) {\n startCodeLength = 4;\n }\n start = pos = pos + startCodeLength;\n }\n return result;\n}\n/**\n * Process NALU data for frame encryption, detecting codec and finding unencrypted bytes\n * @param data Frame data\n * @param knownCodec Known codec from other sources (optional)\n * @returns NALU processing result\n */\nfunction processNALUsForEncryption(data, knownCodec) {\n const naluIndices = findNALUIndices(data);\n const detectedCodec = knownCodec !== null && knownCodec !== void 0 ? knownCodec : detectCodecFromNALUs(data, naluIndices);\n if (detectedCodec === 'unknown') {\n return {\n unencryptedBytes: 0,\n detectedCodec,\n requiresNALUProcessing: false\n };\n }\n const unencryptedBytes = findSliceNALUUnencryptedBytes(data, naluIndices, detectedCodec);\n if (unencryptedBytes === null) {\n throw new TypeError('Could not find NALU');\n }\n return {\n unencryptedBytes,\n detectedCodec,\n requiresNALUProcessing: true\n };\n}\n\n/**\n * Create a crypto hash using Web Crypto API for secure comparison operations\n */\nfunction cryptoHash(data) {\n return __awaiter(this, void 0, void 0, function* () {\n const hashBuffer = yield crypto.subtle.digest('SHA-256', data);\n const hashArray = new Uint8Array(hashBuffer);\n return Array.from(hashArray).map(b => b.toString(16).padStart(2, '0')).join('');\n });\n}\n/**\n * Pre-computed SHA-256 hashes for secure comparison operations\n */\nconst CryptoHashes = {\n VP8KeyFrame8x8: 'ef0161653d8b2b23aad46624b420af1d03ce48950e9fc85718028f91b50f9219',\n H264KeyFrame2x2SPS: 'f0a0e09647d891d6d50aa898bce7108090375d0d55e50a2bb21147afee558e44',\n H264KeyFrame2x2PPS: '61d9665eed71b6d424ae9539330a3bdd5cb386d4d781c808219a6e36750493a7',\n H264KeyFrame2x2IDR: 'faffc26b68a2fc09096fa20f3351e706398b6f838a7500c8063472c2e476e90d',\n OpusSilenceFrame: 'aad8d31fc56b2802ca500e58c2fb9d0b29ad71bb7cb52cd6530251eade188988'\n};\n/**\n * Check if a byte array matches any of the known SIF payload frame types using secure crypto hashes\n */\nfunction identifySifPayload(data) {\n return __awaiter(this, void 0, void 0, function* () {\n const hash = yield cryptoHash(data);\n switch (hash) {\n case CryptoHashes.VP8KeyFrame8x8:\n return 'vp8';\n case CryptoHashes.H264KeyFrame2x2SPS:\n return 'h264';\n case CryptoHashes.H264KeyFrame2x2PPS:\n return 'h264';\n case CryptoHashes.H264KeyFrame2x2IDR:\n return 'h264';\n case CryptoHashes.OpusSilenceFrame:\n return 'opus';\n default:\n return null;\n }\n });\n}\n\nconst encryptionEnabledMap = new Map();\nclass BaseFrameCryptor extends eventsExports.EventEmitter {\n encodeFunction(encodedFrame, controller) {\n throw Error('not implemented for subclass');\n }\n decodeFunction(encodedFrame, controller) {\n throw Error('not implemented for subclass');\n }\n}\n/**\n * Cryptor is responsible for en-/decrypting media frames.\n * Each Cryptor instance is responsible for en-/decrypting a single mediaStreamTrack.\n */\nclass FrameCryptor extends BaseFrameCryptor {\n constructor(opts) {\n var _a;\n super();\n this.isTransformActive = false;\n /**\n * Throttling mechanism for decryption errors to prevent memory leaks\n */\n this.lastErrorTimestamp = new Map();\n this.errorCounts = new Map();\n this.ERROR_THROTTLE_MS = 1000; // Emit error at most once per second\n this.MAX_ERRORS_PER_MINUTE = 5; // Maximum errors to emit per minute per key\n this.ERROR_WINDOW_MS = 60000; // 1 minute window\n this.sendCounts = new Map();\n this.keys = opts.keys;\n this.participantIdentity = opts.participantIdentity;\n this.rtpMap = new Map();\n this.keyProviderOptions = opts.keyProviderOptions;\n this.sifTrailer = (_a = opts.sifTrailer) !== null && _a !== void 0 ? _a : Uint8Array.from([]);\n }\n get logContext() {\n return {\n participant: this.participantIdentity,\n mediaTrackId: this.trackId,\n fallbackCodec: this.videoCodec\n };\n }\n /**\n * Assign a different participant to the cryptor.\n * useful for transceiver re-use\n * @param id\n * @param keys\n */\n setParticipant(id, keys) {\n workerLogger.debug('setting new participant on cryptor', Object.assign(Object.assign({}, this.logContext), {\n participant: id\n }));\n if (this.participantIdentity) {\n workerLogger.error('cryptor has already a participant set, participant should have been unset before', Object.assign({}, this.logContext));\n }\n this.participantIdentity = id;\n this.keys = keys;\n }\n unsetParticipant() {\n workerLogger.debug('unsetting participant', this.logContext);\n this.participantIdentity = undefined;\n this.lastErrorTimestamp = new Map();\n this.errorCounts = new Map();\n }\n isEnabled() {\n if (this.participantIdentity) {\n return encryptionEnabledMap.get(this.participantIdentity);\n } else {\n return undefined;\n }\n }\n getParticipantIdentity() {\n return this.participantIdentity;\n }\n getTrackId() {\n return this.trackId;\n }\n /**\n * Update the video codec used by the mediaStreamTrack\n * @param codec\n */\n setVideoCodec(codec) {\n this.videoCodec = codec;\n }\n /**\n * rtp payload type map used for figuring out codec of payload type when encoding\n * @param map\n */\n setRtpMap(map) {\n this.rtpMap = map;\n }\n setupTransform(operation, readable, writable, trackId, isReuse, codec) {\n if (codec) {\n workerLogger.info('setting codec on cryptor to', {\n codec\n });\n this.videoCodec = codec;\n }\n workerLogger.debug('Setting up frame cryptor transform', Object.assign({\n operation,\n passedTrackId: trackId,\n codec\n }, this.logContext));\n if (isReuse && this.isTransformActive) {\n workerLogger.debug('reuse transform', Object.assign({}, this.logContext));\n return;\n }\n const transformFn = operation === 'encode' ? this.encodeFunction : this.decodeFunction;\n const transformStream = new TransformStream({\n transform: transformFn.bind(this)\n });\n this.isTransformActive = true;\n readable.pipeThrough(transformStream).pipeTo(writable).catch(e => {\n workerLogger.warn(e);\n this.emit(CryptorEvent.Error, e instanceof CryptorError ? e : new CryptorError(e.message, undefined, this.participantIdentity));\n }).finally(() => {\n this.isTransformActive = false;\n });\n this.trackId = trackId;\n }\n setSifTrailer(trailer) {\n workerLogger.debug('setting SIF trailer', Object.assign(Object.assign({}, this.logContext), {\n trailer\n }));\n this.sifTrailer = trailer;\n }\n /**\n * Checks if we should emit an error based on throttling rules to prevent memory leaks\n * @param errorKey - unique key identifying the error context\n * @returns true if the error should be emitted, false otherwise\n */\n shouldEmitError(errorKey) {\n var _a, _b;\n const now = Date.now();\n const lastErrorTime = (_a = this.lastErrorTimestamp.get(errorKey)) !== null && _a !== void 0 ? _a : 0;\n const errorCount = (_b = this.errorCounts.get(errorKey)) !== null && _b !== void 0 ? _b : 0;\n // Reset count if we're in a new time window\n if (now - lastErrorTime > this.ERROR_WINDOW_MS) {\n this.errorCounts.set(errorKey, 0);\n this.lastErrorTimestamp.set(errorKey, now);\n return true;\n }\n // Check if we've exceeded the throttle time\n if (now - lastErrorTime < this.ERROR_THROTTLE_MS) {\n return false;\n }\n // Check if we've exceeded the max errors per window\n if (errorCount >= this.MAX_ERRORS_PER_MINUTE) {\n // Only log a warning once when hitting the limit\n if (errorCount === this.MAX_ERRORS_PER_MINUTE) {\n workerLogger.warn(\"Suppressing further decryption errors for \".concat(this.participantIdentity), Object.assign(Object.assign({}, this.logContext), {\n errorKey\n }));\n this.errorCounts.set(errorKey, errorCount + 1);\n }\n return false;\n }\n // Update tracking\n this.lastErrorTimestamp.set(errorKey, now);\n this.errorCounts.set(errorKey, errorCount + 1);\n return true;\n }\n /**\n * Emits a throttled error to prevent memory leaks from repeated decryption failures\n * @param error - the CryptorError to emit\n */\n emitThrottledError(error) {\n var _a;\n const errorKey = \"\".concat(this.participantIdentity, \"-\").concat(error.reason, \"-decrypt\");\n if (this.shouldEmitError(errorKey)) {\n const errorCount = (_a = this.errorCounts.get(errorKey)) !== null && _a !== void 0 ? _a : 0;\n if (errorCount > 1) {\n workerLogger.debug(\"Decryption error (\".concat(errorCount, \" occurrences in window)\"), Object.assign(Object.assign({}, this.logContext), {\n reason: CryptorErrorReason[error.reason]\n }));\n }\n this.emit(CryptorEvent.Error, error);\n }\n }\n /**\n * Function that will be injected in a stream and will encrypt the given encoded frames.\n *\n * @param {RTCEncodedVideoFrame|RTCEncodedAudioFrame} encodedFrame - Encoded video frame.\n * @param {TransformStreamDefaultController} controller - TransportStreamController.\n *\n * The VP8 payload descriptor described in\n * https://tools.ietf.org/html/rfc7741#section-4.2\n * is part of the RTP packet and not part of the frame and is not controllable by us.\n * This is fine as the SFU keeps having access to it for routing.\n *\n * The encrypted frame is formed as follows:\n * 1) Find unencrypted byte length, depending on the codec, frame type and kind.\n * 2) Form the GCM IV for the frame as described above.\n * 3) Encrypt the rest of the frame using AES-GCM.\n * 4) Allocate space for the encrypted frame.\n * 5) Copy the unencrypted bytes to the start of the encrypted frame.\n * 6) Append the ciphertext to the encrypted frame.\n * 7) Append the IV.\n * 8) Append a single byte for the key identifier.\n * 9) Enqueue the encrypted frame for sending.\n */\n encodeFunction(encodedFrame, controller) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (!this.isEnabled() ||\n // skip for encryption for empty dtx frames\n encodedFrame.data.byteLength === 0) {\n return controller.enqueue(encodedFrame);\n }\n const keySet = this.keys.getKeySet();\n if (!keySet) {\n this.emitThrottledError(new CryptorError(\"key set not found for \".concat(this.participantIdentity, \" at index \").concat(this.keys.getCurrentKeyIndex()), CryptorErrorReason.MissingKey, this.participantIdentity));\n return;\n }\n const {\n encryptionKey\n } = keySet;\n const keyIndex = this.keys.getCurrentKeyIndex();\n if (encryptionKey) {\n const iv = this.makeIV((_a = encodedFrame.getMetadata().synchronizationSource) !== null && _a !== void 0 ? _a : -1, encodedFrame.timestamp);\n let frameInfo = this.getUnencryptedBytes(encodedFrame);\n // Thіs is not encrypted and contains the VP8 payload descriptor or the Opus TOC byte.\n const frameHeader = new Uint8Array(encodedFrame.data, 0, frameInfo.unencryptedBytes);\n // Frame trailer contains the R|IV_LENGTH and key index\n const frameTrailer = new Uint8Array(2);\n frameTrailer[0] = IV_LENGTH;\n frameTrailer[1] = keyIndex;\n // Construct frame trailer. Similar to the frame header described in\n // https://tools.ietf.org/html/draft-omara-sframe-00#section-4.2\n // but we put it at the end.\n //\n // ---------+-------------------------+-+---------+----\n // payload |IV...(length = IV_LENGTH)|R|IV_LENGTH|KID |\n // ---------+-------------------------+-+---------+----\n try {\n const cipherText = yield crypto.subtle.encrypt({\n name: ENCRYPTION_ALGORITHM,\n iv,\n additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength)\n }, encryptionKey, new Uint8Array(encodedFrame.data, frameInfo.unencryptedBytes));\n let newDataWithoutHeader = new Uint8Array(cipherText.byteLength + iv.byteLength + frameTrailer.byteLength);\n newDataWithoutHeader.set(new Uint8Array(cipherText)); // add ciphertext.\n newDataWithoutHeader.set(new Uint8Array(iv), cipherText.byteLength); // append IV.\n newDataWithoutHeader.set(frameTrailer, cipherText.byteLength + iv.byteLength); // append frame trailer.\n if (frameInfo.requiresNALUProcessing) {\n newDataWithoutHeader = writeRbsp(newDataWithoutHeader);\n }\n var newData = new Uint8Array(frameHeader.byteLength + newDataWithoutHeader.byteLength);\n newData.set(frameHeader);\n newData.set(newDataWithoutHeader, frameHeader.byteLength);\n encodedFrame.data = newData.buffer;\n return controller.enqueue(encodedFrame);\n } catch (e) {\n // TODO: surface this to the app.\n workerLogger.error(e);\n }\n } else {\n workerLogger.debug('failed to encrypt, emitting error', this.logContext);\n this.emitThrottledError(new CryptorError(\"encryption key missing for encoding\", CryptorErrorReason.MissingKey, this.participantIdentity));\n }\n });\n }\n /**\n * Function that will be injected in a stream and will decrypt the given encoded frames.\n *\n * @param {RTCEncodedVideoFrame|RTCEncodedAudioFrame} encodedFrame - Encoded video frame.\n * @param {TransformStreamDefaultController} controller - TransportStreamController.\n */\n decodeFunction(encodedFrame, controller) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.isEnabled() ||\n // skip for decryption for empty dtx frames\n encodedFrame.data.byteLength === 0) {\n return controller.enqueue(encodedFrame);\n }\n if (isFrameServerInjected(encodedFrame.data, this.sifTrailer)) {\n encodedFrame.data = encodedFrame.data.slice(0, encodedFrame.data.byteLength - this.sifTrailer.byteLength);\n if (yield identifySifPayload(encodedFrame.data)) {\n workerLogger.debug('enqueue SIF', this.logContext);\n return controller.enqueue(encodedFrame);\n } else {\n workerLogger.warn('Unexpected SIF frame payload, dropping frame', this.logContext);\n return;\n }\n }\n const data = new Uint8Array(encodedFrame.data);\n const keyIndex = data[encodedFrame.data.byteLength - 1];\n if (this.keys.hasInvalidKeyAtIndex(keyIndex)) {\n // drop frame\n return;\n }\n if (this.keys.getKeySet(keyIndex)) {\n try {\n const decodedFrame = yield this.decryptFrame(encodedFrame, keyIndex);\n this.keys.decryptionSuccess(keyIndex);\n if (decodedFrame) {\n return controller.enqueue(decodedFrame);\n }\n } catch (error) {\n if (error instanceof CryptorError && error.reason === CryptorErrorReason.InvalidKey) {\n // emit an error if the key handler thinks we have a valid key\n if (this.keys.hasValidKey) {\n this.emitThrottledError(error);\n this.keys.decryptionFailure(keyIndex);\n }\n } else {\n workerLogger.warn('decoding frame failed', {\n error\n });\n }\n }\n } else {\n // emit an error if the key index is out of bounds but the key handler thinks we still have a valid key\n workerLogger.warn(\"skipping decryption due to missing key at index \".concat(keyIndex));\n this.emitThrottledError(new CryptorError(\"missing key at index \".concat(keyIndex, \" for participant \").concat(this.participantIdentity), CryptorErrorReason.MissingKey, this.participantIdentity));\n this.keys.decryptionFailure(keyIndex);\n }\n });\n }\n /**\n * Function that will decrypt the given encoded frame. If the decryption fails, it will\n * ratchet the key for up to RATCHET_WINDOW_SIZE times.\n */\n decryptFrame(encodedFrame_1, keyIndex_1) {\n return __awaiter(this, arguments, void 0, function (encodedFrame, keyIndex) {\n var _this = this;\n let initialMaterial = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;\n let ratchetOpts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {\n ratchetCount: 0\n };\n return function* () {\n var _a;\n const keySet = _this.keys.getKeySet(keyIndex);\n if (!ratchetOpts.encryptionKey && !keySet) {\n throw new TypeError(\"no encryption key found for decryption of \".concat(_this.participantIdentity));\n }\n let frameInfo = _this.getUnencryptedBytes(encodedFrame);\n // Construct frame trailer. Similar to the frame header described in\n // https://tools.ietf.org/html/draft-omara-sframe-00#section-4.2\n // but we put it at the end.\n //\n // ---------+-------------------------+-+---------+----\n // payload |IV...(length = IV_LENGTH)|R|IV_LENGTH|KID |\n // ---------+-------------------------+-+---------+----\n try {\n const frameHeader = new Uint8Array(encodedFrame.data, 0, frameInfo.unencryptedBytes);\n var encryptedData = new Uint8Array(encodedFrame.data, frameHeader.length, encodedFrame.data.byteLength - frameHeader.length);\n if (frameInfo.requiresNALUProcessing && needsRbspUnescaping(encryptedData)) {\n encryptedData = parseRbsp(encryptedData);\n const newUint8 = new Uint8Array(frameHeader.byteLength + encryptedData.byteLength);\n newUint8.set(frameHeader);\n newUint8.set(encryptedData, frameHeader.byteLength);\n encodedFrame.data = newUint8.buffer;\n }\n const frameTrailer = new Uint8Array(encodedFrame.data, encodedFrame.data.byteLength - 2, 2);\n const ivLength = frameTrailer[0];\n const iv = new Uint8Array(encodedFrame.data, encodedFrame.data.byteLength - ivLength - frameTrailer.byteLength, ivLength);\n const cipherTextStart = frameHeader.byteLength;\n const cipherTextLength = encodedFrame.data.byteLength - (frameHeader.byteLength + ivLength + frameTrailer.byteLength);\n const plainText = yield crypto.subtle.decrypt({\n name: ENCRYPTION_ALGORITHM,\n iv,\n additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength)\n }, (_a = ratchetOpts.encryptionKey) !== null && _a !== void 0 ? _a : keySet.encryptionKey, new Uint8Array(encodedFrame.data, cipherTextStart, cipherTextLength));\n const newData = new ArrayBuffer(frameHeader.byteLength + plainText.byteLength);\n const newUint8 = new Uint8Array(newData);\n newUint8.set(new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength));\n newUint8.set(new Uint8Array(plainText), frameHeader.byteLength);\n encodedFrame.data = newData;\n return encodedFrame;\n } catch (error) {\n if (_this.keyProviderOptions.ratchetWindowSize > 0) {\n if (ratchetOpts.ratchetCount < _this.keyProviderOptions.ratchetWindowSize) {\n workerLogger.debug(\"ratcheting key attempt \".concat(ratchetOpts.ratchetCount, \" of \").concat(_this.keyProviderOptions.ratchetWindowSize, \", for kind \").concat(encodedFrame instanceof RTCEncodedAudioFrame ? 'audio' : 'video'));\n let ratchetedKeySet;\n let ratchetResult;\n if ((initialMaterial !== null && initialMaterial !== void 0 ? initialMaterial : keySet) === _this.keys.getKeySet(keyIndex)) {\n // only ratchet if the currently set key is still the same as the one used to decrypt this frame\n // if not, it might be that a different frame has already ratcheted and we try with that one first\n ratchetResult = yield _this.keys.ratchetKey(keyIndex, false);\n ratchetedKeySet = yield deriveKeys(ratchetResult.cryptoKey, _this.keyProviderOptions.ratchetSalt);\n }\n const frame = yield _this.decryptFrame(encodedFrame, keyIndex, initialMaterial || keySet, {\n ratchetCount: ratchetOpts.ratchetCount + 1,\n encryptionKey: ratchetedKeySet === null || ratchetedKeySet === void 0 ? void 0 : ratchetedKeySet.encryptionKey\n });\n if (frame && ratchetedKeySet) {\n // before updating the keys, make sure that the keySet used for this frame is still the same as the currently set key\n // if it's not, a new key might have been set already, which we don't want to override\n if ((initialMaterial !== null && initialMaterial !== void 0 ? initialMaterial : keySet) === _this.keys.getKeySet(keyIndex)) {\n _this.keys.setKeySet(ratchetedKeySet, keyIndex, ratchetResult);\n // decryption was successful, set the new key index to reflect the ratcheted key set\n _this.keys.setCurrentKeyIndex(keyIndex);\n }\n }\n return frame;\n } else {\n /**\n * Because we only set a new key once decryption has been successful,\n * we can be sure that we don't need to reset the key to the initial material at this point\n * as the key has not been updated on the keyHandler instance\n */\n workerLogger.warn('maximum ratchet attempts exceeded');\n throw new CryptorError(\"valid key missing for participant \".concat(_this.participantIdentity), CryptorErrorReason.InvalidKey, _this.participantIdentity);\n }\n } else {\n throw new CryptorError(\"Decryption failed: \".concat(error.message), CryptorErrorReason.InvalidKey, _this.participantIdentity);\n }\n }\n }();\n });\n }\n /**\n * Construct the IV used for AES-GCM and sent (in plain) with the packet similar to\n * https://tools.ietf.org/html/rfc7714#section-8.1\n * It concatenates\n * - the 32 bit synchronization source (SSRC) given on the encoded frame,\n * - the 32 bit rtp timestamp given on the encoded frame,\n * - a send counter that is specific to the SSRC. Starts at a random number.\n * The send counter is essentially the pictureId but we currently have to implement this ourselves.\n * There is no XOR with a salt. Note that this IV leaks the SSRC to the receiver but since this is\n * randomly generated and SFUs may not rewrite this is considered acceptable.\n * The SSRC is used to allow demultiplexing multiple streams with the same key, as described in\n * https://tools.ietf.org/html/rfc3711#section-4.1.1\n * The RTP timestamp is 32 bits and advances by the codec clock rate (90khz for video, 48khz for\n * opus audio) every second. For video it rolls over roughly every 13 hours.\n * The send counter will advance at the frame rate (30fps for video, 50fps for 20ms opus audio)\n * every second. It will take a long time to roll over.\n *\n * See also https://developer.mozilla.org/en-US/docs/Web/API/AesGcmParams\n */\n makeIV(synchronizationSource, timestamp) {\n var _a;\n const iv = new ArrayBuffer(IV_LENGTH);\n const ivView = new DataView(iv);\n // having to keep our own send count (similar to a picture id) is not ideal.\n if (!this.sendCounts.has(synchronizationSource)) {\n // Initialize with a random offset, similar to the RTP sequence number.\n this.sendCounts.set(synchronizationSource, Math.floor(Math.random() * 0xffff));\n }\n const sendCount = (_a = this.sendCounts.get(synchronizationSource)) !== null && _a !== void 0 ? _a : 0;\n ivView.setUint32(0, synchronizationSource);\n ivView.setUint32(4, timestamp);\n ivView.setUint32(8, timestamp - sendCount % 0xffff);\n this.sendCounts.set(synchronizationSource, sendCount + 1);\n return iv;\n }\n getUnencryptedBytes(frame) {\n var _a;\n // Handle audio frames\n if (!isVideoFrame(frame)) {\n return {\n unencryptedBytes: UNENCRYPTED_BYTES.audio,\n requiresNALUProcessing: false\n };\n }\n // Detect and track codec changes\n const detectedCodec = (_a = this.getVideoCodec(frame)) !== null && _a !== void 0 ? _a : this.videoCodec;\n if (detectedCodec !== this.detectedCodec) {\n workerLogger.debug('detected different codec', Object.assign({\n detectedCodec,\n oldCodec: this.detectedCodec\n }, this.logContext));\n this.detectedCodec = detectedCodec;\n }\n // Check for unsupported codecs\n if (detectedCodec === 'av1') {\n throw new Error(\"\".concat(detectedCodec, \" is not yet supported for end to end encryption\"));\n }\n // Handle VP8/VP9 codecs (no NALU processing needed)\n if (detectedCodec === 'vp8') {\n return {\n unencryptedBytes: UNENCRYPTED_BYTES[frame.type],\n requiresNALUProcessing: false\n };\n }\n if (detectedCodec === 'vp9') {\n return {\n unencryptedBytes: 0,\n requiresNALUProcessing: false\n };\n }\n // Try NALU processing for H.264/H.265 codecs\n try {\n const knownCodec = detectedCodec === 'h264' || detectedCodec === 'h265' ? detectedCodec : undefined;\n const naluResult = processNALUsForEncryption(new Uint8Array(frame.data), knownCodec);\n if (naluResult.requiresNALUProcessing) {\n return {\n unencryptedBytes: naluResult.unencryptedBytes,\n requiresNALUProcessing: true\n };\n }\n } catch (e) {\n workerLogger.debug('NALU processing failed, falling back to VP8 handling', Object.assign({\n error: e\n }, this.logContext));\n }\n // Fallback to VP8 handling\n return {\n unencryptedBytes: UNENCRYPTED_BYTES[frame.type],\n requiresNALUProcessing: false\n };\n }\n /**\n * inspects frame payloadtype if available and maps it to the codec specified in rtpMap\n */\n getVideoCodec(frame) {\n if (this.rtpMap.size === 0) {\n return undefined;\n }\n const payloadType = frame.getMetadata().payloadType;\n const codec = payloadType ? this.rtpMap.get(payloadType) : undefined;\n return codec;\n }\n}\n/**\n * we use a magic frame trailer to detect whether a frame is injected\n * by the livekit server and thus to be treated as unencrypted\n * @internal\n */\nfunction isFrameServerInjected(frameData, trailerBytes) {\n if (trailerBytes.byteLength === 0) {\n return false;\n }\n const frameTrailer = new Uint8Array(frameData.slice(frameData.byteLength - trailerBytes.byteLength));\n return trailerBytes.every((value, index) => value === frameTrailer[index]);\n}\n\n// TODO ParticipantKeyHandlers currently don't get destroyed on participant disconnect\n// we could do this by having a separate worker message on participant disconnected.\n/**\n * ParticipantKeyHandler is responsible for providing a cryptor instance with the\n * en-/decryption key of a participant. It assumes that all tracks of a specific participant\n * are encrypted with the same key.\n * Additionally it exposes a method to ratchet a key which can be used by the cryptor either automatically\n * if decryption fails or can be triggered manually on both sender and receiver side.\n *\n */\nclass ParticipantKeyHandler extends eventsExports.EventEmitter {\n /**\n * true if the current key has not been marked as invalid\n */\n get hasValidKey() {\n return !this.hasInvalidKeyAtIndex(this.currentKeyIndex);\n }\n constructor(participantIdentity, keyProviderOptions) {\n super();\n this.currentKeyIndex = 0;\n if (keyProviderOptions.keyringSize < 1 || keyProviderOptions.keyringSize > 256) {\n throw new TypeError('Keyring size needs to be between 1 and 256');\n }\n this.cryptoKeyRing = new Array(keyProviderOptions.keyringSize).fill(undefined);\n this.decryptionFailureCounts = new Array(keyProviderOptions.keyringSize).fill(0);\n this.keyProviderOptions = keyProviderOptions;\n this.ratchetPromiseMap = new Map();\n this.participantIdentity = participantIdentity;\n }\n /**\n * Returns true if the key at the given index is marked as invalid.\n *\n * @param keyIndex the index of the key\n */\n hasInvalidKeyAtIndex(keyIndex) {\n return this.keyProviderOptions.failureTolerance >= 0 && this.decryptionFailureCounts[keyIndex] > this.keyProviderOptions.failureTolerance;\n }\n /**\n * Informs the key handler that a decryption failure occurred for an encryption key.\n * @internal\n * @param keyIndex the key index for which the failure occurred. Defaults to the current key index.\n */\n decryptionFailure() {\n let keyIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.currentKeyIndex;\n if (this.keyProviderOptions.failureTolerance < 0) {\n return;\n }\n this.decryptionFailureCounts[keyIndex] += 1;\n if (this.decryptionFailureCounts[keyIndex] > this.keyProviderOptions.failureTolerance) {\n workerLogger.warn(\"key for \".concat(this.participantIdentity, \" at index \").concat(keyIndex, \" is being marked as invalid\"));\n }\n }\n /**\n * Informs the key handler that a frame was successfully decrypted using an encryption key.\n * @internal\n * @param keyIndex the key index for which the success occurred. Defaults to the current key index.\n */\n decryptionSuccess() {\n let keyIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.currentKeyIndex;\n this.resetKeyStatus(keyIndex);\n }\n /**\n * Call this after user initiated ratchet or a new key has been set in order to make sure to mark potentially\n * invalid keys as valid again\n *\n * @param keyIndex the index of the key. Defaults to the current key index.\n */\n resetKeyStatus(keyIndex) {\n if (keyIndex === undefined) {\n this.decryptionFailureCounts.fill(0);\n } else {\n this.decryptionFailureCounts[keyIndex] = 0;\n }\n }\n /**\n * Ratchets the current key (or the one at keyIndex if provided) and\n * returns the ratcheted material\n * if `setKey` is true (default), it will also set the ratcheted key directly on the crypto key ring\n * @param keyIndex\n * @param setKey\n */\n ratchetKey(keyIndex) {\n let setKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n const currentKeyIndex = keyIndex !== null && keyIndex !== void 0 ? keyIndex : this.getCurrentKeyIndex();\n const existingPromise = this.ratchetPromiseMap.get(currentKeyIndex);\n if (typeof existingPromise !== 'undefined') {\n return existingPromise;\n }\n const ratchetPromise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n try {\n const keySet = this.getKeySet(currentKeyIndex);\n if (!keySet) {\n throw new TypeError(\"Cannot ratchet key without a valid keyset of participant \".concat(this.participantIdentity));\n }\n const currentMaterial = keySet.material;\n const chainKey = yield ratchet(currentMaterial, this.keyProviderOptions.ratchetSalt);\n const newMaterial = yield importKey(chainKey, currentMaterial.algorithm.name, 'derive');\n const ratchetResult = {\n chainKey,\n cryptoKey: newMaterial\n };\n if (setKey) {\n // Set the new key and emit a ratchet event with the ratcheted chain key\n yield this.setKeyFromMaterial(newMaterial, currentKeyIndex, ratchetResult);\n }\n resolve(ratchetResult);\n } catch (e) {\n reject(e);\n } finally {\n this.ratchetPromiseMap.delete(currentKeyIndex);\n }\n }));\n this.ratchetPromiseMap.set(currentKeyIndex, ratchetPromise);\n return ratchetPromise;\n }\n /**\n * takes in a key material with `deriveBits` and `deriveKey` set as key usages\n * and derives encryption keys from the material and sets it on the key ring buffer\n * together with the material\n * also resets the valid key property and updates the currentKeyIndex\n */\n setKey(material_1) {\n return __awaiter(this, arguments, void 0, function (material) {\n var _this = this;\n let keyIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n return function* () {\n yield _this.setKeyFromMaterial(material, keyIndex);\n _this.resetKeyStatus(keyIndex);\n }();\n });\n }\n /**\n * takes in a key material with `deriveBits` and `deriveKey` set as key usages\n * and derives encryption keys from the material and sets it on the key ring buffers\n * together with the material\n * also updates the currentKeyIndex\n */\n setKeyFromMaterial(material_1, keyIndex_1) {\n return __awaiter(this, arguments, void 0, function (material, keyIndex) {\n var _this2 = this;\n let ratchetedResult = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n return function* () {\n const keySet = yield deriveKeys(material, _this2.keyProviderOptions.ratchetSalt);\n const newIndex = keyIndex >= 0 ? keyIndex % _this2.cryptoKeyRing.length : _this2.currentKeyIndex;\n workerLogger.debug(\"setting new key with index \".concat(keyIndex), {\n usage: material.usages,\n algorithm: material.algorithm,\n ratchetSalt: _this2.keyProviderOptions.ratchetSalt\n });\n _this2.setKeySet(keySet, newIndex, ratchetedResult);\n if (newIndex >= 0) _this2.currentKeyIndex = newIndex;\n }();\n });\n }\n setKeySet(keySet, keyIndex) {\n let ratchetedResult = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n this.cryptoKeyRing[keyIndex % this.cryptoKeyRing.length] = keySet;\n if (ratchetedResult) {\n this.emit(KeyHandlerEvent.KeyRatcheted, ratchetedResult, this.participantIdentity, keyIndex);\n }\n }\n setCurrentKeyIndex(index) {\n return __awaiter(this, void 0, void 0, function* () {\n this.currentKeyIndex = index % this.cryptoKeyRing.length;\n this.resetKeyStatus(index);\n });\n }\n getCurrentKeyIndex() {\n return this.currentKeyIndex;\n }\n /**\n * returns currently used KeySet or the one at `keyIndex` if provided\n * @param keyIndex\n * @returns\n */\n getKeySet(keyIndex) {\n return this.cryptoKeyRing[keyIndex !== null && keyIndex !== void 0 ? keyIndex : this.currentKeyIndex];\n }\n}\n\nconst participantCryptors = [];\nconst participantKeys = new Map();\nlet sharedKeyHandler;\nlet messageQueue = new AsyncQueue();\nlet isEncryptionEnabled = false;\nlet useSharedKey = false;\nlet sifTrailer;\nlet keyProviderOptions = KEY_PROVIDER_DEFAULTS;\nlet rtpMap = new Map();\nworkerLogger.setDefaultLevel('info');\nonmessage = ev => {\n messageQueue.run(() => __awaiter(void 0, void 0, void 0, function* () {\n const {\n kind,\n data\n } = ev.data;\n switch (kind) {\n case 'init':\n workerLogger.setLevel(data.loglevel);\n workerLogger.info('worker initialized');\n keyProviderOptions = data.keyProviderOptions;\n useSharedKey = !!data.keyProviderOptions.sharedKey;\n // acknowledge init successful\n const ackMsg = {\n kind: 'initAck',\n data: {\n enabled: isEncryptionEnabled\n }\n };\n postMessage(ackMsg);\n break;\n case 'enable':\n setEncryptionEnabled(data.enabled, data.participantIdentity);\n workerLogger.info(\"updated e2ee enabled status for \".concat(data.participantIdentity, \" to \").concat(data.enabled));\n // acknowledge enable call successful\n postMessage(ev.data);\n break;\n case 'decode':\n let cryptor = getTrackCryptor(data.participantIdentity, data.trackId);\n cryptor.setupTransform(kind, data.readableStream, data.writableStream, data.trackId, data.isReuse, data.codec);\n break;\n case 'encode':\n let pubCryptor = getTrackCryptor(data.participantIdentity, data.trackId);\n pubCryptor.setupTransform(kind, data.readableStream, data.writableStream, data.trackId, data.isReuse, data.codec);\n break;\n case 'encryptDataRequest':\n const {\n payload: encryptedPayload,\n iv,\n keyIndex\n } = yield DataCryptor.encrypt(data.payload, getParticipantKeyHandler(data.participantIdentity));\n console.log('encrypted payload', {\n original: data.payload,\n encrypted: encryptedPayload,\n iv\n });\n postMessage({\n kind: 'encryptDataResponse',\n data: {\n payload: encryptedPayload,\n iv,\n keyIndex,\n uuid: data.uuid\n }\n });\n break;\n case 'decryptDataRequest':\n try {\n const {\n payload: decryptedPayload\n } = yield DataCryptor.decrypt(data.payload, data.iv, getParticipantKeyHandler(data.participantIdentity), data.keyIndex);\n postMessage({\n kind: 'decryptDataResponse',\n data: {\n payload: decryptedPayload,\n uuid: data.uuid\n }\n });\n } catch (error) {\n // Send error back to main thread with uuid so it can reject the corresponding promise\n workerLogger.error('DataCryptor decryption failed', {\n error,\n participantIdentity: data.participantIdentity,\n uuid: data.uuid\n });\n postMessage({\n kind: 'error',\n data: {\n error: error instanceof Error ? error : new Error(String(error)),\n uuid: data.uuid // Include uuid to match with the pending request\n }\n });\n }\n break;\n case 'setKey':\n if (useSharedKey) {\n yield setSharedKey(data.key, data.keyIndex);\n } else if (data.participantIdentity) {\n workerLogger.info(\"set participant sender key \".concat(data.participantIdentity, \" index \").concat(data.keyIndex));\n yield getParticipantKeyHandler(data.participantIdentity).setKey(data.key, data.keyIndex);\n } else {\n workerLogger.error('no participant Id was provided and shared key usage is disabled');\n }\n break;\n case 'removeTransform':\n unsetCryptorParticipant(data.trackId, data.participantIdentity);\n break;\n case 'updateCodec':\n getTrackCryptor(data.participantIdentity, data.trackId).setVideoCodec(data.codec);\n workerLogger.info('updated codec', {\n participantIdentity: data.participantIdentity,\n trackId: data.trackId,\n codec: data.codec\n });\n break;\n case 'setRTPMap':\n // this is only used for the local participant\n rtpMap = data.map;\n participantCryptors.forEach(cr => {\n if (cr.getParticipantIdentity() === data.participantIdentity) {\n cr.setRtpMap(data.map);\n }\n });\n break;\n case 'ratchetRequest':\n handleRatchetRequest(data);\n break;\n case 'setSifTrailer':\n handleSifTrailer(data.trailer);\n break;\n }\n }));\n};\nfunction handleRatchetRequest(data) {\n return __awaiter(this, void 0, void 0, function* () {\n if (useSharedKey) {\n const keyHandler = getSharedKeyHandler();\n yield keyHandler.ratchetKey(data.keyIndex);\n keyHandler.resetKeyStatus();\n } else if (data.participantIdentity) {\n const keyHandler = getParticipantKeyHandler(data.participantIdentity);\n yield keyHandler.ratchetKey(data.keyIndex);\n keyHandler.resetKeyStatus();\n } else {\n workerLogger.error('no participant Id was provided for ratchet request and shared key usage is disabled');\n }\n });\n}\nfunction getTrackCryptor(participantIdentity, trackId) {\n let cryptors = participantCryptors.filter(c => c.getTrackId() === trackId);\n if (cryptors.length > 1) {\n const debugInfo = cryptors.map(c => {\n return {\n participant: c.getParticipantIdentity()\n };\n }).join(',');\n workerLogger.error(\"Found multiple cryptors for the same trackID \".concat(trackId, \". target participant: \").concat(participantIdentity, \" \"), {\n participants: debugInfo\n });\n }\n let cryptor = cryptors[0];\n if (!cryptor) {\n workerLogger.info('creating new cryptor for', {\n participantIdentity,\n trackId\n });\n if (!keyProviderOptions) {\n throw Error('Missing keyProvider options');\n }\n cryptor = new FrameCryptor({\n participantIdentity,\n keys: getParticipantKeyHandler(participantIdentity),\n keyProviderOptions,\n sifTrailer\n });\n cryptor.setRtpMap(rtpMap);\n setupCryptorErrorEvents(cryptor);\n participantCryptors.push(cryptor);\n } else if (participantIdentity !== cryptor.getParticipantIdentity()) {\n // assign new participant id to track cryptor and pass in correct key handler\n cryptor.setParticipant(participantIdentity, getParticipantKeyHandler(participantIdentity));\n }\n return cryptor;\n}\nfunction getParticipantKeyHandler(participantIdentity) {\n if (useSharedKey) {\n return getSharedKeyHandler();\n }\n let keys = participantKeys.get(participantIdentity);\n if (!keys) {\n keys = new ParticipantKeyHandler(participantIdentity, keyProviderOptions);\n keys.on(KeyHandlerEvent.KeyRatcheted, emitRatchetedKeys);\n participantKeys.set(participantIdentity, keys);\n }\n return keys;\n}\nfunction getSharedKeyHandler() {\n if (!sharedKeyHandler) {\n workerLogger.debug('creating new shared key handler');\n sharedKeyHandler = new ParticipantKeyHandler('shared-key', keyProviderOptions);\n }\n return sharedKeyHandler;\n}\nfunction unsetCryptorParticipant(trackId, participantIdentity) {\n const cryptors = participantCryptors.filter(c => c.getParticipantIdentity() === participantIdentity && c.getTrackId() === trackId);\n if (cryptors.length > 1) {\n workerLogger.error('Found multiple cryptors for the same participant and trackID combination', {\n trackId,\n participantIdentity\n });\n }\n const cryptor = cryptors[0];\n if (!cryptor) {\n workerLogger.warn('Could not unset participant on cryptor', {\n trackId,\n participantIdentity\n });\n } else {\n cryptor.unsetParticipant();\n }\n}\nfunction setEncryptionEnabled(enable, participantIdentity) {\n workerLogger.debug(\"setting encryption enabled for all tracks of \".concat(participantIdentity), {\n enable\n });\n encryptionEnabledMap.set(participantIdentity, enable);\n}\nfunction setSharedKey(key, index) {\n return __awaiter(this, void 0, void 0, function* () {\n workerLogger.info('set shared key', {\n index\n });\n yield getSharedKeyHandler().setKey(key, index);\n });\n}\nfunction setupCryptorErrorEvents(cryptor) {\n cryptor.on(CryptorEvent.Error, error => {\n const msg = {\n kind: 'error',\n data: {\n error: new Error(\"\".concat(CryptorErrorReason[error.reason], \": \").concat(error.message)),\n participantIdentity: error.participantIdentity\n }\n };\n postMessage(msg);\n });\n}\nfunction emitRatchetedKeys(ratchetResult, participantIdentity, keyIndex) {\n const msg = {\n kind: \"ratchetKey\",\n data: {\n participantIdentity,\n keyIndex,\n ratchetResult\n }\n };\n postMessage(msg);\n}\nfunction handleSifTrailer(trailer) {\n sifTrailer = trailer;\n participantCryptors.forEach(c => {\n c.setSifTrailer(trailer);\n });\n}\n// Operations using RTCRtpScriptTransform.\n// @ts-ignore\nif (self.RTCTransformEvent) {\n workerLogger.debug('setup transform event');\n // @ts-ignore\n self.onrtctransform = event => {\n // @ts-ignore\n const transformer = event.transformer;\n workerLogger.debug('transformer', transformer);\n const {\n kind,\n participantIdentity,\n trackId,\n codec\n } = transformer.options;\n const cryptor = getTrackCryptor(participantIdentity, trackId);\n workerLogger.debug('transform', {\n codec\n });\n cryptor.setupTransform(kind, transformer.readable, transformer.writable, trackId, false, codec);\n };\n}\n//# sourceMappingURL=livekit-client.e2ee.worker.mjs.map\n"],"names":["__awaiter","thisArg","_arguments","P","generator","adopt","value","resolve","reject","fulfilled","step","e","rejected","result","loglevel$1","loglevel","hasRequiredLoglevel","requireLoglevel","module","root","definition","noop","undefinedType","isIE","logMethods","_loggersByName","defaultLogger","bindMethod","obj","methodName","method","traceForIE","realMethod","replaceLoggingMethods","level","i","enableLoggingWhenConsoleArrives","defaultMethodFactory","_level","_loggerName","Logger","name","factory","self","inheritedLevel","defaultLevel","userLevel","storageKey","persistLevelIfPossible","levelNum","levelName","getPersistedLevel","storedLevel","cookie","cookieName","location","clearPersistedLevel","normalizeLevel","input","persist","childName","initialLevel","logger","_log","loglevelExports","LogLevel","LoggerNames","livekitLogger","workerLogger","h","s","t","o","_","l","c","QueueTaskStatus","AsyncQueue","task","taskInfo","unlock","ENCRYPTION_ALGORITHM","DECRYPTION_FAILURE_TOLERANCE","UNENCRYPTED_BYTES","IV_LENGTH","SALT","KEY_PROVIDER_DEFAULTS","LivekitError","code","message","ConnectionErrorReason","DataStreamErrorReason","MediaDeviceFailure","getFailure","error","CryptorErrorReason","CryptorError","reason","participantIdentity","KeyProviderEvent","KeyHandlerEvent","EncryptionEvent","CryptorEvent","isVideoFrame","frame","importKey","keyBytes_1","keyBytes","algorithm","usage","getAlgoOptions","algorithmName","salt","encodedSalt","deriveKeys","material","algorithmOptions","encryptionKey","ratchet","needsRbspUnescaping","frameData","parseRbsp","stream","dataOut","length","kZerosInStartSequence","kEmulationByte","writeRbsp","data_in","numConsecutiveZeros","byte","DataCryptor","timestamp","iv","ivView","randomBytes","data","keys","keySet","cipherText","data_1","iv_1","keys_1","keyIndex","initialMaterial","ratchetOpts","plainText","ratchetedKeySet","ratchetResult","decryptedData","events","hasRequiredEvents","requireEvents","R","ReflectApply","target","receiver","args","ReflectOwnKeys","ProcessEmitWarning","warning","NumberIsNaN","EventEmitter","once","defaultMaxListeners","checkListener","listener","arg","n","_getMaxListeners","that","type","doError","er","err","handler","len","listeners","arrayClone","_addListener","prepend","m","existing","onceWrapper","_onceWrap","state","wrapped","list","position","originalListener","spliceOne","key","_listeners","unwrap","evlistener","unwrapListeners","emitter","listenerCount","arr","copy","index","ret","errorListener","resolver","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","flags","wrapListener","eventsExports","kH264NaluTypeMask","H264NALUType","H265NALUType","parseH264NALUType","startByte","parseH265NALUType","firstByte","isH264SliceNALU","naluType","isH265SliceNALU","detectCodecFromNALUs","naluIndices","naluIndex","findSliceNALUUnencryptedBytes","codec","findNALUIndices","start","pos","searchLength","end","startCodeLength","processNALUsForEncryption","knownCodec","detectedCodec","unencryptedBytes","cryptoHash","hashBuffer","hashArray","b","CryptoHashes","identifySifPayload","encryptionEnabledMap","BaseFrameCryptor","encodedFrame","controller","FrameCryptor","opts","_a","id","map","operation","readable","writable","trackId","isReuse","transformFn","transformStream","trailer","errorKey","_b","now","lastErrorTime","errorCount","frameInfo","frameHeader","frameTrailer","newDataWithoutHeader","newData","isFrameServerInjected","decodedFrame","encodedFrame_1","keyIndex_1","_this","encryptedData","newUint8","ivLength","cipherTextStart","cipherTextLength","synchronizationSource","sendCount","naluResult","payloadType","trailerBytes","ParticipantKeyHandler","keyProviderOptions","setKey","currentKeyIndex","existingPromise","ratchetPromise","currentMaterial","chainKey","newMaterial","material_1","_this2","ratchetedResult","newIndex","participantCryptors","participantKeys","sharedKeyHandler","messageQueue","isEncryptionEnabled","useSharedKey","sifTrailer","rtpMap","ev","kind","setEncryptionEnabled","getTrackCryptor","encryptedPayload","getParticipantKeyHandler","decryptedPayload","setSharedKey","unsetCryptorParticipant","cr","handleRatchetRequest","handleSifTrailer","keyHandler","getSharedKeyHandler","cryptors","debugInfo","cryptor","setupCryptorErrorEvents","emitRatchetedKeys","enable","msg","event","transformer"],"mappings":"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","x_google_ignoreList":[0]}
@@ -0,0 +1,222 @@
1
+ {
2
+ "a11y": {
3
+ "user_menu": "Lietotāja izvēlne"
4
+ },
5
+ "action": {
6
+ "close": "Aizvērt",
7
+ "copy_link": "Kopēt saiti",
8
+ "edit": "Labot",
9
+ "go": "Aiziet",
10
+ "invite": "Uzaicināt",
11
+ "lower_hand": "Nolaist roku",
12
+ "no": "Nē",
13
+ "pick_reaction": "Reaģēt",
14
+ "raise_hand": "Pacelt roku",
15
+ "register": "Reģistrēties",
16
+ "remove": "Noņemt",
17
+ "show_less": "Rādīt mazāk",
18
+ "show_more": "Rādīt vairāk",
19
+ "sign_in": "Pieteikties",
20
+ "sign_out": "Atteikties",
21
+ "submit": "Iesniegt",
22
+ "upload_file": "Augšupielādēt failu"
23
+ },
24
+ "analytics_notice": "Piedaloties šajā beta versijā, jūs piekrītat anonīmu datu vākšanai, ko mēs izmantojam produkta uzlabošanai. Plašāku informāciju par to, kādus datus mēs izsekojam, varat atrast mūsu <2>konfidencialitātes politikā</2> un mūsu <6>sīkfailu politikā</6>.",
25
+ "app_selection_modal": {
26
+ "continue_in_browser": "Turpināt pārlūkprogrammā",
27
+ "open_in_app": "Atvērt lietotnē",
28
+ "text": "Gatavs pievienoties?",
29
+ "title": "Izvēlies lietotni"
30
+ },
31
+ "call_ended_view": {
32
+ "create_account_button": "Izveidot kontu",
33
+ "create_account_prompt": "<0>Kādēļ nepabeigt ar paroles iestatīšanu, lai paturētu savu kontu?</0><1>Būs iespējams paturēt savu vārdu un iestatīt attēlu izmantošanai turpmākajos zvanos</1>",
34
+ "feedback_done": "<0>Paldies par atsauksmi!</0>",
35
+ "feedback_prompt": "<0>Mums patiktu saņemt Tavu atsauksmi, lai mēs varētu uzlabot Tavu pieredzi.</0>",
36
+ "headline": "{{displayName}}, Tavs zvans ir beidzies.",
37
+ "not_now_button": "Ne tagad, atgriezties sākuma ekrānā",
38
+ "reconnect_button": "Atkārtoti savienoties",
39
+ "survey_prompt": "Kā Tev veicās?"
40
+ },
41
+ "call_name": "Zvana nosaukums",
42
+ "common": {
43
+ "analytics": "Analītika",
44
+ "audio": "Skaņa",
45
+ "avatar": "Attēls",
46
+ "back": "Atpakaļ",
47
+ "display_name": "Attēlojamais vārds",
48
+ "encrypted": "Šifrēts",
49
+ "home": "Sākums",
50
+ "loading": "Lādējas…",
51
+ "next": "Nākamais",
52
+ "options": "Opcijas",
53
+ "password": "Parole",
54
+ "preferences": "Iestatījumi",
55
+ "profile": "Profils",
56
+ "reaction": "Reakcija",
57
+ "reactions": "Reakcijas",
58
+ "settings": "Iestatījumi",
59
+ "unencrypted": "Nav šifrēts",
60
+ "username": "Lietotājvārds",
61
+ "video": "Video"
62
+ },
63
+ "developer_mode": {
64
+ "crypto_version": "Crypto versija: {{version}}",
65
+ "debug_tile_layout_label": "Vietu izkārtojuma atkļūdošana",
66
+ "device_id": "Ierīces ID: {{id}}",
67
+ "duplicate_tiles_label": "Papildu vietu kopiju skaits vienam dalībniekam",
68
+ "environment_variables": "Vides mainīgie",
69
+ "hostname": "Saimniekdatora nosaukums: {{hostname}}",
70
+ "livekit_server_info": "LiveKit Server informācija",
71
+ "livekit_sfu": "LiveKit SFU: {{url}}",
72
+ "matrix_id": "Matrix ID: {{id}}",
73
+ "show_connection_stats": "Rādīt savienojuma statistiku",
74
+ "show_non_member_tiles": "Rādīt vietu medijiem no ne-dalībniekiem",
75
+ "url_params": "URL parametri",
76
+ "use_new_membership_manager": "Izmantojiet jauno zvana MembershipManager versiju"
77
+ },
78
+ "disconnected_banner": "Ir zaudēts savienojums ar serveri.",
79
+ "error": {
80
+ "call_is_not_supported": "Zvans netiek atbalstīts",
81
+ "call_not_found": "Zvans nav atrasts",
82
+ "call_not_found_description": "<0>Šķiet, ka šī saite nepieder nevienam esošam zvaniem. Pārbaudiet, vai jums ir pareizā saite, vai <1> izveidojiet jaunu</1>. </0>",
83
+ "connection_lost": "Savienojums zaudēts",
84
+ "connection_lost_description": "Jūs tikāt atvienots no zvana.",
85
+ "e2ee_unsupported": "Nesaderīgs pārlūks",
86
+ "e2ee_unsupported_description": "Jūsu tīmekļa pārlūkprogramma neatbalsta encrypted zvanus. Atbalstītās pārlūkprogrammas ir Chrome, Safari un Firefox 117+.",
87
+ "generic": "Kaut kas nogāja greizi",
88
+ "generic_description": "Atkļūdošanas žurnālu iesniegšana palīdzēs mums izsekot problēmu.",
89
+ "insufficient_capacity": "Nepietiekama jauda",
90
+ "insufficient_capacity_description": "Serveris ir sasniedzis maksimālo ietilpību, un jūs šobrīd nevarat pievienoties zvanam. Mēģiniet vēlreiz vēlāk vai sazinieties ar servera administratoru, ja problēma joprojām pastāv.",
91
+ "matrix_rtc_focus_missing": "Serveris nav konfigurēts darbam ar{{brand}}. Lūdzu, sazinieties ar sava servera administratoru (Domēns: {{domain}}, Kļūdas kods: {{ errorCode }}).",
92
+ "open_elsewhere": "Atvērts citā cilnē",
93
+ "open_elsewhere_description": "{{brand}} ir atvērts citā cilnē. Ja tas neizklausās pareizi, mēģiniet atkārtoti ielādēt lapu.",
94
+ "unexpected_ec_error": "Negaidīta kļūda (<0>kļūdas kods: </0> <1> {{ errorCode }}</1>). Lūdzu, sazinieties ar servera administratoru."
95
+ },
96
+ "group_call_loader": {
97
+ "banned_body": "Jums ir liegta ieeja šajā istabā.",
98
+ "banned_heading": "Aizliegts",
99
+ "call_ended_body": "Jūs esat noņemts no zvana.",
100
+ "call_ended_heading": "Zvans beidzies",
101
+ "knock_reject_body": "Jūsu pieteikums pievienoties tika noraidīts.",
102
+ "knock_reject_heading": "Piekļuve liegta",
103
+ "reason": "Iemesls: {{reason}}"
104
+ },
105
+ "hangup_button_label": "Beigt zvanu",
106
+ "header_label": "Element Call sākums",
107
+ "header_participants_label": "Dalībnieki",
108
+ "invite_modal": {
109
+ "link_copied_toast": "Saite nokopēta",
110
+ "title": "Uzaicināt uz šo zvanu"
111
+ },
112
+ "join_existing_call_modal": {
113
+ "join_button": "Jā, pievienoties zvanam",
114
+ "text": "Šis zvans jau pastāv. Vai vēlies pievienoties?",
115
+ "title": "Pievienoties esošam zvanam?"
116
+ },
117
+ "layout_grid_label": "Režģis",
118
+ "layout_spotlight_label": "Starmešu gaisma",
119
+ "lobby": {
120
+ "ask_to_join": "Pieprasīt pievienoties zvanam",
121
+ "join_as_guest": "Pievienojies kā viesis",
122
+ "join_button": "Pievienoties zvanam",
123
+ "leave_button": "Atpakaļ uz jaunākajiem",
124
+ "waiting_for_invite": "Pieprasījums nosūtīts! Gaida atļauju pievienoties..."
125
+ },
126
+ "log_in": "Pieslēgties",
127
+ "logging_in": "Piesakās…",
128
+ "login_auth_links": "<0>Izveidot kontu</0> vai <2>Piekļūt kā viesim</2>",
129
+ "login_auth_links_prompt": "Vēl neesi reģistrējies?",
130
+ "login_subheading": "Lai turpinātu uz Element",
131
+ "login_title": "Pieteikties",
132
+ "microphone_off": "Mikrofons izslēgts",
133
+ "microphone_on": "Mikrofons ieslēgts",
134
+ "mute_microphone_button_label": "Izslēgt mikrofonu",
135
+ "participant_count_zero": "{{count, number}}",
136
+ "participant_count_one": "{{count, number}}",
137
+ "participant_count_other": "{{count, number}}",
138
+ "qr_code": "QR kods",
139
+ "rageshake_button_error_caption": "Atkārtoti mēģināt žurnāla ierakstu nosūtīšanu",
140
+ "rageshake_request_modal": {
141
+ "body": "Citam lietotājam šajā zvanā ir sarežģījumi. Lai labāk atklātu šīs nepilnības, mēs gribētu iegūt atkļūdošanas žurnālu.",
142
+ "title": "Atkļūdošanas žurnāla pieprasījums"
143
+ },
144
+ "rageshake_send_logs": "Nosūtīt atkļūdošanas žurnāla ierakstus",
145
+ "rageshake_sending": "Nosūta…",
146
+ "rageshake_sending_logs": "Nosūta atkļūdošanas žurnāla ierakstus…",
147
+ "rageshake_sent": "Paldies!",
148
+ "recaptcha_dismissed": "ReCaptcha atmesta",
149
+ "recaptcha_not_loaded": "ReCaptcha nav ielādēta",
150
+ "recaptcha_ssla_caption": "Šo vietni aizsargā ReCAPTCHA un tiek piemēroti Google <2>konfidencialitātes politika</2> un <6>Pakalpojuma noteikumi</6>.<9></9>Noklikšķinot uz \"Reģistrēties\", jūs piekrītat mūsu <12>Programmatūras un pakalpojumu licences līgumam (SSLA)</12>",
151
+ "register": {
152
+ "passwords_must_match": "Parolēm ir jāsakrīt",
153
+ "registering": "Reģistrē…"
154
+ },
155
+ "register_auth_links": "<0>Jau ir konts?</0><1><0>Pieteikties</0> vai <2>Piekļūt kā viesim</2></1>",
156
+ "register_confirm_password_label": "Apstiprināt paroli",
157
+ "register_heading": "Izveido kontu",
158
+ "return_home_button": "Atgriezties sākuma ekrānā",
159
+ "room_auth_view_continue_button": "Turpināt",
160
+ "room_auth_view_ssla_caption": "Noklikšķinot uz “Pievienoties zvanam tūlīt”, jūs piekrītat mūsu <2> programmatūras un pakalpojumu licences līgumam (SSLA) </2>",
161
+ "screenshare_button_label": "Kopīgot ekrānu",
162
+ "settings": {
163
+ "audio_tab": {
164
+ "effect_volume_description": "Pielāgojiet skaļumu, kurā tiek atskaņotas reakcijas un paceltas rokas skaņas.",
165
+ "effect_volume_label": "Skaņas efektu skaļums"
166
+ },
167
+ "developer_tab_title": "Izstrādātājs",
168
+ "devices": {
169
+ "camera": "Kamera",
170
+ "camera_numbered": "Kamera {{n}}",
171
+ "default": "Noklusējums",
172
+ "default_named": "Noklusējums <2> ({{name}} )</2>",
173
+ "microphone": "Mikrofons",
174
+ "microphone_numbered": "Mikrofons {{n}}",
175
+ "speaker": "Skaļrunis",
176
+ "speaker_numbered": "Skaļrunis {{n}}"
177
+ },
178
+ "feedback_tab_body": "Ja tiek piedzīvoti sarežģījumi vai vienkārši ir vēlme sniegt kādu atsauksmi, lūgums zemāk nosūtīt mums īsu aprakstu.",
179
+ "feedback_tab_description_label": "Tava atsauksme",
180
+ "feedback_tab_h4": "Iesniegt atsauksmi",
181
+ "feedback_tab_send_logs_label": "Iekļaut atkļūdošanas žurnāla ierakstus",
182
+ "feedback_tab_thank_you": "Paldies, mēs saņēmām atsauksmi!",
183
+ "feedback_tab_title": "Atsauksmes",
184
+ "opt_in_description": "<0></0><1></1>Savu piekrišanu var atsaukt ar atzīmes noņemšanu no šīs rūtiņas. Ja pašreiz atrodies zvanā, šis iestatījums stāsies spēkā zvana beigās.",
185
+ "preferences_tab": {
186
+ "developer_mode_label": "Izstrādātāja režīms",
187
+ "developer_mode_label_description": "Iespējot izstrādātāja režīmu un rādīt cilni izstrādātāja iestatījumi.",
188
+ "introduction": "Šeit varat konfigurēt papildu opcijas, lai uzlabotu pieredzi.",
189
+ "reactions_play_sound_description": "Atskaņojiet skaņas efektu, kad kāds sūta reakciju uz zvanu.",
190
+ "reactions_play_sound_label": "Atskaņojiet reakcijas skaņas",
191
+ "reactions_show_description": "Rādīt animāciju, kad kāds nosūta reakciju.",
192
+ "reactions_show_label": "Rādīt reakcijas",
193
+ "show_hand_raised_timer_description": "Rādīt taimeri, kad dalībnieks paceļ roku",
194
+ "show_hand_raised_timer_label": "Rādīt rokas pacelšanas ilgumu"
195
+ }
196
+ },
197
+ "star_rating_input_label_zero": "{{count}} zvaigznes",
198
+ "star_rating_input_label_one": "{{count}} zvaigzne",
199
+ "star_rating_input_label_other": "{{count}} zvaigznes",
200
+ "start_new_call": "Sākt jaunu zvanu",
201
+ "start_video_button_label": "Sākt video",
202
+ "stop_screenshare_button_label": "Kopīgo ekrānu",
203
+ "stop_video_button_label": "Apturēt video",
204
+ "submitting": "Iesniedz…",
205
+ "switch_camera": "Pārslēgt kameru",
206
+ "unauthenticated_view_body": "Vēl neesi reģistrējies? <2>Izveidot kontu</2>",
207
+ "unauthenticated_view_login_button": "Pieteikties kontā",
208
+ "unauthenticated_view_ssla_caption": "Noklikšķinot uz \"Aiziet\", jūs piekrītat mūsu <2>Programmatūras un pakalpojumu licences līgumam (SSLA)</2>",
209
+ "unmute_microphone_button_label": "Ieslēgt mikrofonu",
210
+ "version": "{{productName}} versija: {{version}}",
211
+ "video_tile": {
212
+ "always_show": "Vienmēr rādīt",
213
+ "camera_starting": "Video ielāde...",
214
+ "change_fit_contain": "Pielāgot rāmim",
215
+ "collapse": "Sakļaut",
216
+ "expand": "Izvērst",
217
+ "mute_for_me": "Klusums man",
218
+ "muted_for_me": "Man izslēgts",
219
+ "volume": "Skaļums",
220
+ "waiting_for_media": "Gaida medijus..."
221
+ }
222
+ }