{"version":3,"file":"livekit-client.e2ee.worker.mjs","sources":["../node_modules/.pnpm/loglevel@1.9.2/node_modules/loglevel/lib/loglevel.js","../src/logger.ts","../node_modules/.pnpm/@livekit+mutex@1.1.1/node_modules/@livekit/mutex/dist/index.mjs","../src/utils/AsyncQueue.ts","../src/e2ee/constants.ts","../src/room/errors.ts","../src/e2ee/errors.ts","../src/e2ee/events.ts","../src/e2ee/utils.ts","../src/e2ee/worker/DataCryptor.ts","../node_modules/.pnpm/events@3.3.0/node_modules/events/events.js","../src/e2ee/worker/naluUtils.ts","../src/e2ee/worker/sifPayload.ts","../src/e2ee/worker/FrameCryptor.ts","../src/e2ee/worker/ParticipantKeyHandler.ts","../src/e2ee/worker/e2ee.worker.ts"],"sourcesContent":["/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\n(function (root, definition) {\n    \"use strict\";\n    if (typeof define === 'function' && define.amd) {\n        define(definition);\n    } else if (typeof module === 'object' && module.exports) {\n        module.exports = definition();\n    } else {\n        root.log = definition();\n    }\n}(this, function () {\n    \"use strict\";\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) && (\n        /Trident\\/|MSIE /.test(window.navigator.userAgent)\n    );\n\n    var logMethods = [\n        \"trace\",\n        \"debug\",\n        \"info\",\n        \"warn\",\n        \"error\"\n    ];\n\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\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) ?\n                noop :\n                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) ||\n               enableLoggingWhenConsoleArrives.apply(this, arguments);\n    }\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\n      var storageKey = \"loglevel\";\n      if (typeof name === \"string\") {\n        storageKey += \":\" + name;\n      } else if (typeof name === \"symbol\") {\n        storageKey = undefined;\n      }\n\n      function persistLevelIfPossible(levelNum) {\n          var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n\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 =\n                encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n          } catch (ignore) {}\n      }\n\n      function getPersistedLevel() {\n          var storedLevel;\n\n          if (typeof window === undefinedType || !storageKey) return;\n\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(\n                          cookie.slice(location + cookieName.length + 1)\n                      )[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\n          return storedLevel;\n      }\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 =\n                encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n          } catch (ignore) {}\n      }\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\n      self.levels = { \"TRACE\": 0, \"DEBUG\": 1, \"INFO\": 2, \"WARN\": 3,\n          \"ERROR\": 4, \"SILENT\": 5};\n\n      self.methodFactory = factory || defaultMethodFactory;\n\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\n      self.setLevel = function (level, persist) {\n          userLevel = normalizeLevel(level);\n          if (persist !== false) {  // 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\n      self.setDefaultLevel = function (level) {\n          defaultLevel = normalizeLevel(level);\n          if (!getPersistedLevel()) {\n              self.setLevel(level, false);\n          }\n      };\n\n      self.resetLevel = function () {\n          userLevel = null;\n          clearPersistedLevel();\n          replaceLoggingMethods.call(self);\n      };\n\n      self.enableAll = function(persist) {\n          self.setLevel(self.levels.TRACE, persist);\n      };\n\n      self.disableAll = function(persist) {\n          self.setLevel(self.levels.SILENT, persist);\n      };\n\n      self.rebuild = function () {\n          if (defaultLogger !== self) {\n              inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n          }\n          replaceLoggingMethods.call(self);\n\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(\n          defaultLogger ? defaultLogger.getLevel() : \"WARN\"\n      );\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\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\n        var logger = _loggersByName[name];\n        if (!logger) {\n            logger = _loggersByName[name] = new Logger(\n                name,\n                defaultLogger.methodFactory\n            );\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 &&\n               window.log === defaultLogger) {\n            window.log = _log;\n        }\n\n        return defaultLogger;\n    };\n\n    defaultLogger.getLoggers = function getLoggers() {\n        return _loggersByName;\n    };\n\n    // ES6 default export, for compatibility\n    defaultLogger['default'] = defaultLogger;\n\n    return defaultLogger;\n}));\n","import * as log from 'loglevel';\n\nexport enum LogLevel {\n  trace = 0,\n  debug = 1,\n  info = 2,\n  warn = 3,\n  error = 4,\n  silent = 5,\n}\n\nexport enum LoggerNames {\n  Default = 'livekit',\n  Room = 'livekit-room',\n  TokenSource = 'livekit-token-source',\n  Participant = 'livekit-participant',\n  Track = 'livekit-track',\n  Publication = 'livekit-track-publication',\n  Engine = 'livekit-engine',\n  Signal = 'livekit-signal',\n  PCManager = 'livekit-pc-manager',\n  PCTransport = 'livekit-pc-transport',\n  E2EE = 'lk-e2ee',\n  DataTracks = 'livekit-data-tracks',\n}\n\ntype LogLevelString = keyof typeof LogLevel;\n\nexport type StructuredLogger = log.Logger & {\n  trace: (msg: string, context?: object) => void;\n  debug: (msg: string, context?: object) => void;\n  info: (msg: string, context?: object) => void;\n  warn: (msg: string, context?: object) => void;\n  error: (msg: string, context?: object) => void;\n  setDefaultLevel: (level: log.LogLevelDesc) => void;\n  setLevel: (level: log.LogLevelDesc) => void;\n  getLevel: () => number;\n};\n\nlet livekitLogger = log.getLogger('livekit');\nconst livekitLoggers = Object.values(LoggerNames).map((name) => log.getLogger(name));\n\nlivekitLogger.setDefaultLevel(LogLevel.info);\n\nexport default livekitLogger as StructuredLogger;\n\n/**\n * @internal\n */\nexport function getLogger(name: string) {\n  const logger = log.getLogger(name);\n  logger.setDefaultLevel(livekitLogger.getLevel());\n  return logger as StructuredLogger;\n}\n\nexport function setLogLevel(level: LogLevel | LogLevelString, loggerName?: LoggerNames) {\n  if (loggerName) {\n    log.getLogger(loggerName).setLevel(level);\n  } else {\n    for (const logger of livekitLoggers) {\n      logger.setLevel(level);\n    }\n  }\n}\n\nexport type LogExtension = (level: LogLevel, msg: string, context?: object) => void;\n\n/**\n * use this to hook into the logging function to allow sending internal livekit logs to third party services\n * if set, the browser logs will lose their stacktrace information (see https://github.com/pimterry/loglevel#writing-plugins)\n */\nexport function setLogExtension(extension: LogExtension, logger?: StructuredLogger) {\n  const loggers = logger ? [logger] : livekitLoggers;\n\n  loggers.forEach((logR) => {\n    const originalFactory = logR.methodFactory;\n\n    logR.methodFactory = (methodName, configLevel, loggerName) => {\n      const rawMethod = originalFactory(methodName, configLevel, loggerName);\n\n      const logLevel = LogLevel[methodName as LogLevelString];\n      const needLog = logLevel >= configLevel && logLevel < LogLevel.silent;\n\n      return (msg, context?: [msg: string, context: object]) => {\n        if (context) rawMethod(msg, context);\n        else rawMethod(msg);\n        if (needLog) {\n          extension(logLevel, msg, context);\n        }\n      };\n    };\n    logR.setLevel(logR.getLevel());\n  });\n}\n\nexport const workerLogger = log.getLogger('lk-e2ee') as StructuredLogger;\n","var e = Object.defineProperty;\nvar h = (i, s, t) => s in i ? e(i, s, { enumerable: !0, configurable: !0, writable: !0, value: t }) : 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(\n      (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}\nclass n {\n  constructor(s) {\n    o(this, \"_queue\");\n    o(this, \"_limit\");\n    o(this, \"_locks\");\n    this._queue = [], this._limit = s, this._locks = 0;\n  }\n  isLocked() {\n    return this._locks >= this._limit;\n  }\n  async lock() {\n    return this.isLocked() ? new Promise((s) => {\n      this._queue.push(() => {\n        this._locks++, s(this._unlock.bind(this));\n      });\n    }) : (this._locks++, this._unlock.bind(this));\n  }\n  _unlock() {\n    if (this._locks--, this._queue.length && !this.isLocked()) {\n      const s = this._queue.shift();\n      s == null || s();\n    }\n  }\n}\nexport {\n  n as MultiMutex,\n  _ as Mutex\n};\n//# sourceMappingURL=index.mjs.map\n","import { Mutex } from '@livekit/mutex';\n\ntype QueueTask<T> = () => PromiseLike<T>;\n\nenum QueueTaskStatus {\n  'WAITING',\n  'RUNNING',\n  'COMPLETED',\n}\n\ntype QueueTaskInfo = {\n  id: number;\n  enqueuedAt: number;\n  executedAt?: number;\n  status: QueueTaskStatus;\n};\n\nexport class AsyncQueue {\n  private pendingTasks: Map<number, QueueTaskInfo>;\n\n  private taskMutex: Mutex;\n\n  private nextTaskIndex: number;\n\n  constructor() {\n    this.pendingTasks = new Map();\n    this.taskMutex = new Mutex();\n    this.nextTaskIndex = 0;\n  }\n\n  async run<T>(task: QueueTask<T>) {\n    const taskInfo: QueueTaskInfo = {\n      id: this.nextTaskIndex++,\n      enqueuedAt: Date.now(),\n      status: QueueTaskStatus.WAITING,\n    };\n    this.pendingTasks.set(taskInfo.id, taskInfo);\n    const unlock = await this.taskMutex.lock();\n    try {\n      taskInfo.executedAt = Date.now();\n      taskInfo.status = QueueTaskStatus.RUNNING;\n      return await task();\n    } finally {\n      taskInfo.status = QueueTaskStatus.COMPLETED;\n      this.pendingTasks.delete(taskInfo.id);\n      unlock();\n    }\n  }\n\n  async flush() {\n    return this.run(async () => {});\n  }\n\n  snapshot() {\n    return Array.from(this.pendingTasks.values());\n  }\n}\n","import type { KeyProviderOptions } from './types';\n\nexport const ENCRYPTION_ALGORITHM = 'AES-GCM';\n\n// How many consecutive frames can fail decrypting before a particular key gets marked as invalid\nexport const DECRYPTION_FAILURE_TOLERANCE = 10;\n\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\nexport const UNENCRYPTED_BYTES = {\n  key: 10,\n  delta: 3,\n  audio: 1, // frame.type is not set on audio, so this is set manually\n  empty: 0,\n} as const;\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 */\nexport const IV_LENGTH = 12;\n\n// flag set to indicate that e2ee has been setup for sender/receiver;\nexport const E2EE_FLAG = 'lk_e2ee';\n\nexport const SALT = 'LKFrameEncryptionKey';\n\nexport const KEY_PROVIDER_DEFAULTS: KeyProviderOptions = {\n  sharedKey: false,\n  ratchetSalt: SALT,\n  ratchetWindowSize: 8,\n  failureTolerance: DECRYPTION_FAILURE_TOLERANCE,\n  keyringSize: 16,\n  keySize: 128,\n} as const;\n\nexport const MAX_SIF_COUNT = 100;\nexport const MAX_SIF_DURATION = 2000;\n","import { DisconnectReason, RequestResponse_Reason } from '@livekit/protocol';\n\n/** Base error that all LiveKit specific custom errors inherit from. */\nexport class LivekitError extends Error {\n  code: number;\n\n  // More info: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/cause\n  cause?: unknown;\n\n  constructor(code: number, message?: string, options?: { cause?: unknown }) {\n    super(message || 'an error has occurred');\n    this.name = 'LiveKitError';\n    this.code = code;\n\n    if (typeof options?.cause !== 'undefined') {\n      this.cause = options?.cause;\n    }\n  }\n}\n\n/**\n * LiveKit specific error type representing an error with an associated set of reasons.\n * Use this to represent an error with multiple different but contextually related variants.\n * */\nexport abstract class LivekitReasonedError<Reason> extends LivekitError {\n  abstract reason: Reason;\n\n  abstract reasonName: string;\n}\n\nexport class SimulatedError extends LivekitError {\n  readonly name = 'simulated';\n\n  constructor(message = 'Simulated failure') {\n    super(-1, message);\n  }\n}\n\nexport enum ConnectionErrorReason {\n  NotAllowed,\n  ServerUnreachable,\n  InternalError,\n  Cancelled,\n  LeaveRequest,\n  Timeout,\n  WebSocket,\n  ServiceNotFound,\n}\n\ntype NotAllowed = {\n  reason: ConnectionErrorReason.NotAllowed;\n  status: number;\n  context?: unknown;\n};\n\ntype InternalError = {\n  reason: ConnectionErrorReason.InternalError;\n  status: never;\n  context?: { status?: number; statusText?: string };\n};\n\ntype ConnectionTimeout = {\n  reason: ConnectionErrorReason.Timeout;\n  status: never;\n  context: never;\n};\n\ntype LeaveRequest = {\n  reason: ConnectionErrorReason.LeaveRequest;\n  status: never;\n  context: DisconnectReason;\n};\n\ntype Cancelled = {\n  reason: ConnectionErrorReason.Cancelled;\n  status: never;\n  context: never;\n};\n\ntype ServerUnreachable = {\n  reason: ConnectionErrorReason.ServerUnreachable;\n  status?: number;\n  context?: never;\n};\n\ntype WebSocket = {\n  reason: ConnectionErrorReason.WebSocket;\n  status?: number;\n  context?: string;\n};\n\ntype ServiceNotFound = {\n  reason: ConnectionErrorReason.ServiceNotFound;\n  status: never;\n  context: string;\n};\n\ntype ConnectionErrorVariants =\n  | NotAllowed\n  | ConnectionTimeout\n  | LeaveRequest\n  | InternalError\n  | Cancelled\n  | ServerUnreachable\n  | WebSocket\n  | ServiceNotFound;\n\nexport class ConnectionError<\n  Variant extends ConnectionErrorVariants = ConnectionErrorVariants,\n> extends LivekitReasonedError<Variant['reason']> {\n  status?: Variant['status'];\n\n  context: Variant['context'];\n\n  reason: Variant['reason'];\n\n  reasonName: string;\n\n  readonly name = 'ConnectionError';\n\n  protected constructor(\n    message: string,\n    reason: Variant['reason'],\n    status?: Variant['status'],\n    context?: Variant['context'],\n  ) {\n    super(1, message);\n    this.status = status;\n    this.reason = reason;\n    this.context = context;\n    this.reasonName = ConnectionErrorReason[reason];\n  }\n\n  static notAllowed(message: string, status: number, context?: unknown) {\n    return new ConnectionError<NotAllowed>(\n      message,\n      ConnectionErrorReason.NotAllowed,\n      status,\n      context,\n    );\n  }\n\n  static timeout(message: string) {\n    return new ConnectionError<ConnectionTimeout>(message, ConnectionErrorReason.Timeout);\n  }\n\n  static leaveRequest(message: string, context: DisconnectReason) {\n    return new ConnectionError<LeaveRequest>(\n      message,\n      ConnectionErrorReason.LeaveRequest,\n      undefined,\n      context,\n    );\n  }\n\n  static internal(message: string, context?: { status?: number; statusText?: string }) {\n    return new ConnectionError<InternalError>(\n      message,\n      ConnectionErrorReason.InternalError,\n      undefined,\n      context,\n    );\n  }\n\n  static cancelled(message: string) {\n    return new ConnectionError<Cancelled>(message, ConnectionErrorReason.Cancelled);\n  }\n\n  static serverUnreachable(message: string, status?: number) {\n    return new ConnectionError<ServerUnreachable>(\n      message,\n      ConnectionErrorReason.ServerUnreachable,\n      status,\n    );\n  }\n\n  static websocket(message: string, status?: number, reason?: string) {\n    return new ConnectionError<WebSocket>(message, ConnectionErrorReason.WebSocket, status, reason);\n  }\n\n  static serviceNotFound(message: string, serviceName: 'v0-rtc') {\n    return new ConnectionError<ServiceNotFound>(\n      message,\n      ConnectionErrorReason.ServiceNotFound,\n      undefined,\n      serviceName,\n    );\n  }\n}\n\nexport class DeviceUnsupportedError extends LivekitError {\n  readonly name = 'DeviceUnsupportedError';\n\n  constructor(message?: string) {\n    super(21, message ?? 'device is unsupported');\n  }\n}\n\nexport class TrackInvalidError extends LivekitError {\n  readonly name = 'TrackInvalidError';\n\n  constructor(message?: string) {\n    super(20, message ?? 'track is invalid');\n  }\n}\n\nexport class UnsupportedServer extends LivekitError {\n  readonly name = 'UnsupportedServer';\n\n  constructor(message?: string) {\n    super(10, message ?? 'unsupported server');\n  }\n}\n\nexport class UnexpectedConnectionState extends LivekitError {\n  readonly name = 'UnexpectedConnectionState';\n\n  constructor(message?: string) {\n    super(12, message ?? 'unexpected connection state');\n  }\n}\n\nexport class NegotiationError extends LivekitError {\n  readonly name = 'NegotiationError';\n\n  constructor(message?: string) {\n    super(13, message ?? 'unable to negotiate');\n  }\n}\n\nexport class PublishDataError extends LivekitError {\n  readonly name = 'PublishDataError';\n\n  constructor(message?: string) {\n    super(14, message ?? 'unable to publish data');\n  }\n}\n\nexport class PublishTrackError extends LivekitError {\n  readonly name = 'PublishTrackError';\n\n  status: number;\n\n  constructor(message: string, status: number) {\n    super(15, message);\n    this.status = status;\n  }\n}\n\nexport type RequestErrorReason =\n  | Exclude<RequestResponse_Reason, RequestResponse_Reason.OK>\n  | 'TimeoutError';\n\nexport class SignalRequestError extends LivekitReasonedError<RequestErrorReason> {\n  readonly name = 'SignalRequestError';\n\n  reason: RequestErrorReason;\n\n  reasonName: string;\n\n  constructor(message: string, reason: RequestErrorReason) {\n    super(15, message);\n    this.reason = reason;\n    this.reasonName = typeof reason === 'string' ? reason : RequestResponse_Reason[reason];\n  }\n}\n\n// NOTE: matches with https://github.com/livekit/client-sdk-swift/blob/f37bbd260d61e165084962db822c79f995f1a113/Sources/LiveKit/DataStream/StreamError.swift#L17\nexport enum DataStreamErrorReason {\n  // Unable to open a stream with the same ID more than once.\n  AlreadyOpened = 0,\n\n  // Stream closed abnormally by remote participant.\n  AbnormalEnd = 1,\n\n  // Incoming chunk data could not be decoded.\n  DecodeFailed = 2,\n\n  // Read length exceeded total length specified in stream header.\n  LengthExceeded = 3,\n\n  // Read length less than total length specified in stream header.\n  Incomplete = 4,\n\n  // Unable to register a stream handler more than once.\n  HandlerAlreadyRegistered = 7,\n\n  // Encryption type mismatch.\n  EncryptionTypeMismatch = 8,\n}\n\nexport class DataStreamError extends LivekitReasonedError<DataStreamErrorReason> {\n  readonly name = 'DataStreamError';\n\n  reason: DataStreamErrorReason;\n\n  reasonName: string;\n\n  constructor(message: string, reason: DataStreamErrorReason) {\n    super(16, message);\n    this.reason = reason;\n    this.reasonName = DataStreamErrorReason[reason];\n  }\n}\n\nexport class SignalReconnectError extends LivekitError {\n  readonly name = 'SignalReconnectError';\n\n  constructor(message?: string) {\n    super(18, message);\n  }\n}\n\nexport enum MediaDeviceFailure {\n  // user rejected permissions\n  PermissionDenied = 'PermissionDenied',\n  // device is not available\n  NotFound = 'NotFound',\n  // device is in use. On Windows, only a single tab may get access to a device at a time.\n  DeviceInUse = 'DeviceInUse',\n  Other = 'Other',\n}\n\nexport namespace MediaDeviceFailure {\n  export function getFailure(error: any): MediaDeviceFailure | undefined {\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}\n","import { LivekitError } from '../room/errors';\n\nexport enum CryptorErrorReason {\n  InvalidKey = 0,\n  MissingKey = 1,\n  InternalError = 2,\n}\n\nexport class CryptorError extends LivekitError {\n  reason: CryptorErrorReason;\n\n  participantIdentity?: string;\n\n  constructor(\n    message?: string,\n    reason: CryptorErrorReason = CryptorErrorReason.InternalError,\n    participantIdentity?: string,\n  ) {\n    super(40, message);\n    this.reason = reason;\n    this.participantIdentity = participantIdentity;\n  }\n}\n","import type Participant from '../room/participant/Participant';\nimport type { CryptorError } from './errors';\nimport type { KeyInfo, RatchetResult } from './types';\n\nexport enum KeyProviderEvent {\n  SetKey = 'setKey',\n  /** Event for requesting to ratchet the key used to encrypt the stream */\n  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  KeyRatcheted = 'keyRatcheted',\n}\n\nexport type KeyProviderCallbacks = {\n  [KeyProviderEvent.SetKey]: (keyInfo: KeyInfo, updateCurrentKeyIndex: boolean) => void;\n  [KeyProviderEvent.RatchetRequest]: (participantIdentity?: string, keyIndex?: number) => void;\n  [KeyProviderEvent.KeyRatcheted]: (\n    ratchetedResult: RatchetResult,\n    participantIdentity?: string,\n    keyIndex?: number,\n  ) => void;\n};\n\nexport enum 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  KeyRatcheted = 'keyRatcheted',\n}\n\nexport type ParticipantKeyHandlerCallbacks = {\n  [KeyHandlerEvent.KeyRatcheted]: (\n    ratchetResult: RatchetResult,\n    participantIdentity: string,\n    keyIndex?: number,\n  ) => void;\n};\n\nexport enum EncryptionEvent {\n  ParticipantEncryptionStatusChanged = 'participantEncryptionStatusChanged',\n  EncryptionError = 'encryptionError',\n}\n\nexport type E2EEManagerCallbacks = {\n  [EncryptionEvent.ParticipantEncryptionStatusChanged]: (\n    enabled: boolean,\n    participant: Participant,\n  ) => void;\n  [EncryptionEvent.EncryptionError]: (error: Error, participantIdentity?: string) => void;\n};\n\nexport type CryptorCallbacks = {\n  [CryptorEvent.Error]: (error: CryptorError) => void;\n};\n\nexport enum CryptorEvent {\n  Error = 'cryptorError',\n}\n","import { type DataPacket, EncryptedPacketPayload } from '@livekit/protocol';\nimport { ENCRYPTION_ALGORITHM } from './constants';\nimport type { KeyProviderOptions } from './types';\n\nexport function isE2EESupported() {\n  return isInsertableStreamSupported() || isScriptTransformSupported();\n}\n\nexport function isScriptTransformSupported() {\n  // @ts-ignore\n  return typeof window.RTCRtpScriptTransform !== 'undefined';\n}\n\nexport function isInsertableStreamSupported() {\n  return (\n    typeof window.RTCRtpSender !== 'undefined' &&\n    // @ts-ignore\n    typeof window.RTCRtpSender.prototype.createEncodedStreams !== 'undefined'\n  );\n}\n\nexport function isVideoFrame(\n  frame: RTCEncodedAudioFrame | RTCEncodedVideoFrame,\n): frame is RTCEncodedVideoFrame {\n  return 'type' in frame;\n}\n\nexport async function importKey(\n  keyBytes: Uint8Array | ArrayBuffer,\n  algorithm: string | { name: string } = { name: ENCRYPTION_ALGORITHM },\n  usage: 'derive' | 'encrypt' = 'encrypt',\n) {\n  // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey\n  return crypto.subtle.importKey(\n    'raw',\n    keyBytes,\n    algorithm,\n    false,\n    usage === 'derive' ? ['deriveBits', 'deriveKey'] : ['encrypt', 'decrypt'],\n  );\n}\n\nexport async function createKeyMaterialFromString(password: string) {\n  let enc = new TextEncoder();\n\n  const keyMaterial = await crypto.subtle.importKey(\n    'raw',\n    enc.encode(password),\n    {\n      name: 'PBKDF2',\n    },\n    false,\n    ['deriveBits', 'deriveKey'],\n  );\n\n  return keyMaterial;\n}\n\nexport async function createKeyMaterialFromBuffer(cryptoBuffer: ArrayBuffer) {\n  const keyMaterial = await crypto.subtle.importKey('raw', cryptoBuffer, 'HKDF', false, [\n    'deriveBits',\n    'deriveKey',\n  ]);\n\n  return keyMaterial;\n}\n\nfunction getAlgoOptions(algorithmName: string, salt: string) {\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      return {\n        name: 'PBKDF2',\n        salt: encodedSalt,\n        hash: 'SHA-256',\n        iterations: 100000,\n      };\n    }\n    default:\n      throw new Error(`algorithm ${algorithmName} is currently unsupported`);\n  }\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 */\nexport async function deriveKeys(material: CryptoKey, options: KeyProviderOptions) {\n  const algorithmOptions = getAlgoOptions(material.algorithm.name, options.ratchetSalt);\n\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 = await crypto.subtle.deriveKey(\n    algorithmOptions,\n    material,\n    {\n      name: ENCRYPTION_ALGORITHM,\n      length: options.keySize,\n    },\n    false,\n    ['encrypt', 'decrypt'],\n  );\n\n  return { material, encryptionKey };\n}\n\nexport function createE2EEKey(): Uint8Array {\n  return window.crypto.getRandomValues(new Uint8Array(32));\n}\n\n/**\n * Ratchets a key. See\n * https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.5.1\n */\nexport async function ratchet(material: CryptoKey, salt: string): Promise<ArrayBuffer> {\n  const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);\n\n  // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveBits\n  return crypto.subtle.deriveBits(algorithmOptions, material, 256);\n}\n\nexport function needsRbspUnescaping(frameData: Uint8Array) {\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}\n\nexport function parseRbsp(stream: Uint8Array): Uint8Array {\n  const dataOut: number[] = [];\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}\n\nconst kZerosInStartSequence = 2;\nconst kEmulationByte = 3;\n\nexport function writeRbsp(data_in: Uint8Array): Uint8Array {\n  const dataOut: number[] = [];\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\nexport function asEncryptablePacket(packet: DataPacket): EncryptedPacketPayload | undefined {\n  if (\n    packet.value?.case !== 'sipDtmf' &&\n    packet.value?.case !== 'metrics' &&\n    packet.value?.case !== 'speaker' &&\n    packet.value?.case !== 'transcription' &&\n    packet.value?.case !== 'encryptedPacket'\n  ) {\n    return new EncryptedPacketPayload({\n      value: packet.value,\n    });\n  }\n  return undefined;\n}\n","import { workerLogger } from '../../logger';\nimport { ENCRYPTION_ALGORITHM } from '../constants';\nimport { CryptorError, CryptorErrorReason } from '../errors';\nimport type { DecodeRatchetOptions, KeySet, RatchetResult } from '../types';\nimport { deriveKeys } from '../utils';\nimport type { ParticipantKeyHandler } from './ParticipantKeyHandler';\n\nexport class DataCryptor {\n  private static sendCount = 0;\n\n  private static makeIV(timestamp: number) {\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\n    return iv;\n  }\n\n  static async encrypt(\n    data: Uint8Array,\n    keys: ParticipantKeyHandler,\n  ): Promise<{\n    payload: Uint8Array;\n    iv: Uint8Array;\n    keyIndex: number;\n  }> {\n    const iv = DataCryptor.makeIV(performance.now());\n    const keySet = await keys.getKeySet();\n    if (!keySet) {\n      throw new Error('No key set found');\n    }\n\n    const cipherText = await crypto.subtle.encrypt(\n      {\n        name: ENCRYPTION_ALGORITHM,\n        iv,\n      },\n      keySet.encryptionKey,\n      new Uint8Array(data),\n    );\n\n    return {\n      payload: new Uint8Array(cipherText),\n      iv: new Uint8Array(iv),\n      keyIndex: keys.getCurrentKeyIndex(),\n    };\n  }\n\n  static async decrypt(\n    data: Uint8Array,\n    iv: Uint8Array,\n    keys: ParticipantKeyHandler,\n    keyIndex: number = 0,\n    initialMaterial?: KeySet,\n    ratchetOpts: DecodeRatchetOptions = { ratchetCount: 0 },\n  ): Promise<{\n    payload: Uint8Array;\n  }> {\n    const keySet = await keys.getKeySet(keyIndex);\n    if (!keySet) {\n      throw new Error('No key set found');\n    }\n\n    try {\n      const plainText = await crypto.subtle.decrypt(\n        {\n          name: ENCRYPTION_ALGORITHM,\n          iv,\n        },\n        keySet.encryptionKey,\n        new Uint8Array(data),\n      );\n      return {\n        payload: new Uint8Array(plainText),\n      };\n    } catch (error: any) {\n      if (keys.keyProviderOptions.ratchetWindowSize > 0) {\n        if (ratchetOpts.ratchetCount < keys.keyProviderOptions.ratchetWindowSize) {\n          workerLogger.debug(\n            `DataCryptor: ratcheting key attempt ${ratchetOpts.ratchetCount} of ${\n              keys.keyProviderOptions.ratchetWindowSize\n            }, for data packet`,\n          );\n\n          let ratchetedKeySet: KeySet | undefined;\n          let ratchetResult: RatchetResult | undefined;\n          if ((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 = await keys.ratchetKey(keyIndex, false);\n\n            ratchetedKeySet = await deriveKeys(ratchetResult.cryptoKey, keys.keyProviderOptions);\n          }\n\n          const decryptedData = await DataCryptor.decrypt(\n            data,\n            iv,\n            keys,\n            keyIndex,\n            initialMaterial,\n            {\n              ratchetCount: ratchetOpts.ratchetCount + 1,\n              encryptionKey: ratchetedKeySet?.encryptionKey,\n            },\n          );\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 ?? 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\n          workerLogger.warn('DataCryptor: maximum ratchet attempts exceeded');\n          throw new CryptorError(\n            `DataCryptor: valid key missing for participant ${keys.participantIdentity}`,\n            CryptorErrorReason.InvalidKey,\n            keys.participantIdentity,\n          );\n        }\n      } else {\n        throw new CryptorError(\n          `DataCryptor: Decryption failed: ${error.message}`,\n          CryptorErrorReason.InvalidKey,\n          keys.participantIdentity,\n        );\n      }\n    }\n  }\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function errorListener(err) {\n      emitter.removeListener(name, resolver);\n      reject(err);\n    }\n\n    function resolver() {\n      if (typeof emitter.removeListener === 'function') {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n\n    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n    if (name !== 'error') {\n      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n    }\n  });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n  if (typeof emitter.on === 'function') {\n    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n  }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n  if (typeof emitter.on === 'function') {\n    if (flags.once) {\n      emitter.once(name, listener);\n    } else {\n      emitter.on(name, listener);\n    }\n  } else if (typeof emitter.addEventListener === 'function') {\n    // EventTarget does not have `error` event semantics like Node\n    // EventEmitters, we do not listen for `error` events here.\n    emitter.addEventListener(name, function wrapListener(arg) {\n      // IE does not have builtin `{ once: true }` support so we\n      // have to do it manually.\n      if (flags.once) {\n        emitter.removeEventListener(name, wrapListener);\n      }\n      listener(arg);\n    });\n  } else {\n    throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n  }\n}\n","/**\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/**\n * Mask for extracting NALU type from H.264 header byte\n */\nconst kH264NaluTypeMask = 0x1f;\n\n/**\n * H.264 NALU types according to RFC 6184\n */\nenum H264NALUType {\n  /** Coded slice of a non-IDR picture */\n  SLICE_NON_IDR = 1,\n  /** Coded slice data partition A */\n  SLICE_PARTITION_A = 2,\n  /** Coded slice data partition B */\n  SLICE_PARTITION_B = 3,\n  /** Coded slice data partition C */\n  SLICE_PARTITION_C = 4,\n  /** Coded slice of an IDR picture */\n  SLICE_IDR = 5,\n  /** Supplemental enhancement information */\n  SEI = 6,\n  /** Sequence parameter set */\n  SPS = 7,\n  /** Picture parameter set */\n  PPS = 8,\n  /** Access unit delimiter */\n  AUD = 9,\n  /** End of sequence */\n  END_SEQ = 10,\n  /** End of stream */\n  END_STREAM = 11,\n  /** Filler data */\n  FILLER_DATA = 12,\n  /** Sequence parameter set extension */\n  SPS_EXT = 13,\n  /** Prefix NAL unit */\n  PREFIX_NALU = 14,\n  /** Subset sequence parameter set */\n  SUBSET_SPS = 15,\n  /** Depth parameter set */\n  DPS = 16,\n\n  // 17, 18 reserved\n\n  /** Coded slice of an auxiliary coded picture without partitioning */\n  SLICE_AUX = 19,\n  /** Coded slice extension */\n  SLICE_EXT = 20,\n  /** Coded slice extension for a depth view component or a 3D-AVC texture view component */\n  SLICE_LAYER_EXT = 21,\n\n  // 22, 23 reserved\n}\n\n/**\n * H.265/HEVC NALU types according to ITU-T H.265\n */\nenum H265NALUType {\n  /** Coded slice segment of a non-TSA, non-STSA trailing picture */\n  TRAIL_N = 0,\n  /** Coded slice segment of a non-TSA, non-STSA trailing picture */\n  TRAIL_R = 1,\n  /** Coded slice segment of a TSA picture */\n  TSA_N = 2,\n  /** Coded slice segment of a TSA picture */\n  TSA_R = 3,\n  /** Coded slice segment of an STSA picture */\n  STSA_N = 4,\n  /** Coded slice segment of an STSA picture */\n  STSA_R = 5,\n  /** Coded slice segment of a RADL picture */\n  RADL_N = 6,\n  /** Coded slice segment of a RADL picture */\n  RADL_R = 7,\n  /** Coded slice segment of a RASL picture */\n  RASL_N = 8,\n  /** Coded slice segment of a RASL picture */\n  RASL_R = 9,\n\n  // 10-15 reserved\n\n  /** Coded slice segment of a BLA picture */\n  BLA_W_LP = 16,\n  /** Coded slice segment of a BLA picture */\n  BLA_W_RADL = 17,\n  /** Coded slice segment of a BLA picture */\n  BLA_N_LP = 18,\n  /** Coded slice segment of an IDR picture */\n  IDR_W_RADL = 19,\n  /** Coded slice segment of an IDR picture */\n  IDR_N_LP = 20,\n  /** Coded slice segment of a CRA picture */\n  CRA_NUT = 21,\n\n  // 22-31 reserved\n\n  /** Video parameter set */\n  VPS_NUT = 32,\n  /** Sequence parameter set */\n  SPS_NUT = 33,\n  /** Picture parameter set */\n  PPS_NUT = 34,\n  /** Access unit delimiter */\n  AUD_NUT = 35,\n  /** End of sequence */\n  EOS_NUT = 36,\n  /** End of bitstream */\n  EOB_NUT = 37,\n  /** Filler data */\n  FD_NUT = 38,\n  /** Supplemental enhancement information */\n  PREFIX_SEI_NUT = 39,\n  /** Supplemental enhancement information */\n  SUFFIX_SEI_NUT = 40,\n\n  // 41-47 reserved\n  // 48-63 unspecified\n}\n\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: number): H264NALUType {\n  return startByte & kH264NaluTypeMask;\n}\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: number): H265NALUType {\n  // In H.265, NALU type is in bits 1-6 (shifted right by 1)\n  return (firstByte >> 1) & 0x3f;\n}\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: H264NALUType): boolean {\n  return naluType === H264NALUType.SLICE_IDR || naluType === H264NALUType.SLICE_NON_IDR;\n}\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: H265NALUType): boolean {\n  return (\n    // VCL NALUs (Video Coding Layer) - slice segments\n    naluType === H265NALUType.TRAIL_N ||\n    naluType === H265NALUType.TRAIL_R ||\n    naluType === H265NALUType.TSA_N ||\n    naluType === H265NALUType.TSA_R ||\n    naluType === H265NALUType.STSA_N ||\n    naluType === H265NALUType.STSA_R ||\n    naluType === H265NALUType.RADL_N ||\n    naluType === H265NALUType.RADL_R ||\n    naluType === H265NALUType.RASL_N ||\n    naluType === H265NALUType.RASL_R ||\n    naluType === H265NALUType.BLA_W_LP ||\n    naluType === H265NALUType.BLA_W_RADL ||\n    naluType === H265NALUType.BLA_N_LP ||\n    naluType === H265NALUType.IDR_W_RADL ||\n    naluType === H265NALUType.IDR_N_LP ||\n    naluType === H265NALUType.CRA_NUT\n  );\n}\n\n/**\n * Detected codec type from NALU analysis\n */\nexport type DetectedCodec = 'h264' | 'h265' | 'unknown';\n\n/**\n * Result of NALU processing for frame encryption\n */\nexport interface NALUProcessingResult {\n  /** Number of unencrypted bytes at the start of the frame */\n  unencryptedBytes: number;\n  /** Detected codec type */\n  detectedCodec: DetectedCodec;\n  /** Whether this frame requires NALU processing */\n  requiresNALUProcessing: boolean;\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: Uint8Array, naluIndices: number[]): DetectedCodec {\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/**\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(\n  data: Uint8Array,\n  naluIndices: number[],\n  codec: 'h264' | 'h265',\n): number | null {\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/**\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: Uint8Array): number[] {\n  const result: number[] = [];\n  let start = 0,\n    pos = 0,\n    searchLength = stream.length - 3; // Changed to -3 to handle 4-byte start codes\n\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 (\n        pos < searchLength - 1 &&\n        stream[pos] === 0 &&\n        stream[pos + 1] === 0 &&\n        stream[pos + 2] === 0 &&\n        stream[pos + 3] === 1\n      ) {\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\n    if (pos >= searchLength) pos = stream.length;\n\n    // remove trailing zeros from current NALU\n    let end = pos;\n    while (end > start && stream[end - 1] === 0) end--;\n\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\n    // begin new NALU - determine start code length\n    let startCodeLength = 3;\n    if (\n      pos < stream.length - 3 &&\n      stream[pos] === 0 &&\n      stream[pos + 1] === 0 &&\n      stream[pos + 2] === 0 &&\n      stream[pos + 3] === 1\n    ) {\n      startCodeLength = 4;\n    }\n\n    start = pos = pos + startCodeLength;\n  }\n  return result;\n}\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 */\nexport function processNALUsForEncryption(\n  data: Uint8Array,\n  knownCodec?: 'h264' | 'h265',\n): NALUProcessingResult {\n  const naluIndices = findNALUIndices(data);\n  const detectedCodec = knownCodec ?? detectCodecFromNALUs(data, naluIndices);\n\n  if (detectedCodec === 'unknown') {\n    return { unencryptedBytes: 0, detectedCodec, 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\n  return { unencryptedBytes, detectedCodec, requiresNALUProcessing: true };\n}\n","import type { VideoCodec } from '../..';\n\n//  Payload definitions taken from https://github.com/livekit/livekit/blob/master/pkg/sfu/downtrack.go#L104\n\nexport const VP8KeyFrame8x8: Uint8Array = new Uint8Array([\n  0x10, 0x02, 0x00, 0x9d, 0x01, 0x2a, 0x08, 0x00, 0x08, 0x00, 0x00, 0x47, 0x08, 0x85, 0x85, 0x88,\n  0x85, 0x84, 0x88, 0x02, 0x02, 0x00, 0x0c, 0x0d, 0x60, 0x00, 0xfe, 0xff, 0xab, 0x50, 0x80,\n]);\n\nexport const H264KeyFrame2x2SPS: Uint8Array = new Uint8Array([\n  0x67, 0x42, 0xc0, 0x1f, 0x0f, 0xd9, 0x1f, 0x88, 0x88, 0x84, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00,\n  0x00, 0x03, 0x00, 0xc8, 0x3c, 0x60, 0xc9, 0x20,\n]);\n\nexport const H264KeyFrame2x2PPS: Uint8Array = new Uint8Array([0x68, 0x87, 0xcb, 0x83, 0xcb, 0x20]);\n\nexport const H264KeyFrame2x2IDR: Uint8Array = new Uint8Array([\n  0x65, 0x88, 0x84, 0x0a, 0xf2, 0x62, 0x80, 0x00, 0xa7, 0xbe,\n]);\n\nexport const H264KeyFrame2x2: Uint8Array[] = [\n  H264KeyFrame2x2SPS,\n  H264KeyFrame2x2PPS,\n  H264KeyFrame2x2IDR,\n];\n\nexport const OpusSilenceFrame: Uint8Array = new Uint8Array([\n  0xf8, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n]);\n\n/**\n * Create a crypto hash using Web Crypto API for secure comparison operations\n */\nasync function cryptoHash(data: Uint8Array | ArrayBuffer): Promise<string> {\n  const hashBuffer = await crypto.subtle.digest('SHA-256', data);\n  const hashArray = new Uint8Array(hashBuffer);\n  return Array.from(hashArray)\n    .map((b) => b.toString(16).padStart(2, '0'))\n    .join('');\n}\n\n/**\n * Pre-computed SHA-256 hashes for secure comparison operations\n */\nexport const CryptoHashes = {\n  VP8KeyFrame8x8: 'ef0161653d8b2b23aad46624b420af1d03ce48950e9fc85718028f91b50f9219',\n  H264KeyFrame2x2SPS: 'f0a0e09647d891d6d50aa898bce7108090375d0d55e50a2bb21147afee558e44',\n  H264KeyFrame2x2PPS: '61d9665eed71b6d424ae9539330a3bdd5cb386d4d781c808219a6e36750493a7',\n  H264KeyFrame2x2IDR: 'faffc26b68a2fc09096fa20f3351e706398b6f838a7500c8063472c2e476e90d',\n  OpusSilenceFrame: 'aad8d31fc56b2802ca500e58c2fb9d0b29ad71bb7cb52cd6530251eade188988',\n} as const;\n\n/**\n * Check if a byte array matches any of the known SIF payload frame types using secure crypto hashes\n */\nexport async function identifySifPayload(\n  data: Uint8Array | ArrayBuffer,\n): Promise<VideoCodec | 'opus' | null> {\n  const hash = await cryptoHash(data);\n\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","/* eslint-disable @typescript-eslint/no-unused-vars */\n// TODO code inspired by https://github.com/webrtc/samples/blob/gh-pages/src/content/insertable-streams/endtoend-encryption/js/worker.js\nimport { EventEmitter } from 'events';\nimport type TypedEventEmitter from 'typed-emitter';\nimport { workerLogger } from '../../logger';\nimport type { VideoCodec } from '../../room/track/options';\nimport { ENCRYPTION_ALGORITHM, IV_LENGTH, UNENCRYPTED_BYTES } from '../constants';\nimport { CryptorError, CryptorErrorReason } from '../errors';\nimport { type CryptorCallbacks, CryptorEvent } from '../events';\nimport type { DecodeRatchetOptions, KeyProviderOptions, KeySet, RatchetResult } from '../types';\nimport { deriveKeys, isVideoFrame, needsRbspUnescaping, parseRbsp, writeRbsp } from '../utils';\nimport type { ParticipantKeyHandler } from './ParticipantKeyHandler';\nimport { processNALUsForEncryption } from './naluUtils';\nimport { identifySifPayload } from './sifPayload';\n\nexport const encryptionEnabledMap: Map<string, boolean> = new Map();\n\nexport interface FrameCryptorConstructor {\n  new (opts?: unknown): BaseFrameCryptor;\n}\n\nexport interface TransformerInfo {\n  readable: ReadableStream;\n  writable: WritableStream;\n  transformer: TransformStream;\n  trackId: string;\n  symbol: symbol;\n}\n\nexport class BaseFrameCryptor extends (EventEmitter as new () => TypedEventEmitter<CryptorCallbacks>) {\n  protected encodeFunction(\n    encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n    controller: TransformStreamDefaultController,\n  ): Promise<any> {\n    throw Error('not implemented for subclass');\n  }\n\n  protected decodeFunction(\n    encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n    controller: TransformStreamDefaultController,\n  ): Promise<any> {\n    throw Error('not implemented for subclass');\n  }\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 */\nexport class FrameCryptor extends BaseFrameCryptor {\n  private sendCounts: Map<number, number>;\n\n  private participantIdentity: string | undefined;\n\n  private trackId: string | undefined;\n\n  private keys: ParticipantKeyHandler;\n\n  private videoCodec?: VideoCodec;\n\n  private rtpMap: Map<number, VideoCodec>;\n\n  private keyProviderOptions: KeyProviderOptions;\n\n  /**\n   * used for detecting server injected unencrypted frames\n   */\n  private sifTrailer: Uint8Array;\n\n  private detectedCodec?: VideoCodec;\n\n  private currentTransform?: TransformerInfo;\n\n  /**\n   * Throttling mechanism for decryption errors to prevent memory leaks\n   */\n  private lastErrorTimestamp: Map<string, number> = new Map();\n\n  private errorCounts: Map<string, number> = new Map();\n\n  private readonly ERROR_THROTTLE_MS = 1000; // Emit error at most once per second\n\n  private readonly MAX_ERRORS_PER_MINUTE = 5; // Maximum errors to emit per minute per key\n\n  private readonly ERROR_WINDOW_MS = 60000; // 1 minute window\n\n  constructor(opts: {\n    keys: ParticipantKeyHandler;\n    participantIdentity: string;\n    keyProviderOptions: KeyProviderOptions;\n    sifTrailer?: Uint8Array;\n  }) {\n    super();\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 = opts.sifTrailer ?? Uint8Array.from([]);\n  }\n\n  private get logContext() {\n    return {\n      participant: this.participantIdentity,\n      mediaTrackId: this.trackId,\n      fallbackCodec: this.videoCodec,\n    };\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: string, keys: ParticipantKeyHandler) {\n    workerLogger.debug('setting new participant on cryptor', {\n      ...this.logContext,\n      newParticipant: id,\n      hadPreviousParticipant: !!this.participantIdentity,\n    });\n\n    if (this.participantIdentity && this.participantIdentity !== id) {\n      workerLogger.warn('cryptor has already a participant set, cleaning up before switching', {\n        oldParticipant: this.participantIdentity,\n        newParticipant: id,\n        trackId: this.trackId,\n      });\n      // Clean up state from previous participant\n      this.unsetParticipant();\n    }\n\n    this.participantIdentity = id;\n    this.keys = keys;\n  }\n\n  unsetParticipant() {\n    workerLogger.debug('unsetting participant', this.logContext);\n\n    if (this.currentTransform) {\n      this.currentTransform = undefined;\n    }\n\n    this.participantIdentity = undefined;\n    this.lastErrorTimestamp = new Map();\n    this.errorCounts = new Map();\n  }\n\n  isEnabled() {\n    if (this.participantIdentity) {\n      return encryptionEnabledMap.get(this.participantIdentity);\n    } else {\n      return undefined;\n    }\n  }\n\n  getParticipantIdentity() {\n    return this.participantIdentity;\n  }\n\n  getTrackId() {\n    return this.trackId;\n  }\n\n  /**\n   * Update the video codec used by the mediaStreamTrack\n   * @param codec\n   */\n  setVideoCodec(codec: VideoCodec) {\n    this.videoCodec = codec;\n  }\n\n  /**\n   * rtp payload type map used for figuring out codec of payload type when encoding\n   * @param map\n   */\n  setRtpMap(map: Map<number, VideoCodec>) {\n    this.rtpMap = map;\n  }\n\n  setupTransform(\n    operation: 'encode' | 'decode',\n    readable: ReadableStream<RTCEncodedVideoFrame | RTCEncodedAudioFrame>,\n    writable: WritableStream<RTCEncodedVideoFrame | RTCEncodedAudioFrame>,\n    trackId: string,\n    isReuse: boolean,\n    codec?: VideoCodec,\n  ) {\n    if (codec) {\n      workerLogger.info('setting codec on cryptor to', { codec });\n      this.videoCodec = codec;\n    }\n\n    workerLogger.debug('Setting up frame cryptor transform', {\n      operation,\n      passedTrackId: trackId,\n      codec,\n      isReuse,\n      hasCurrentTransform: !!this.currentTransform,\n      ...this.logContext,\n    });\n\n    // Always update trackId, even on reuse\n    this.trackId = trackId;\n\n    // If we're reusing and have an active transform skip setup\n    if (\n      isReuse &&\n      this.currentTransform &&\n      readable === this.currentTransform.readable &&\n      writable === this.currentTransform.writable\n    ) {\n      workerLogger.debug('reusing existing transform', {\n        ...this.logContext,\n        trackId,\n      });\n      return;\n    }\n\n    const symbol = Symbol('transform');\n\n    const transformFn = operation === 'encode' ? this.encodeFunction : this.decodeFunction;\n    const transformStream = new TransformStream({\n      transform: transformFn.bind(this),\n    });\n\n    // Store transform info before starting the pipe\n    this.currentTransform = {\n      readable,\n      writable,\n      transformer: transformStream,\n      trackId,\n      symbol,\n    };\n\n    readable\n      .pipeThrough(transformStream)\n      .pipeTo(writable)\n      .catch((e) => {\n        if (e instanceof TypeError && e.message === 'Destination stream closed') {\n          // this can happen when subscriptions happen in quick successions, but doesn't influence functionality\n          workerLogger.debug('destination stream closed');\n        } else {\n          workerLogger.warn('transform error', { error: e, ...this.logContext });\n          this.emit(\n            CryptorEvent.Error,\n            e instanceof CryptorError\n              ? e\n              : new CryptorError(e.message, undefined, this.participantIdentity),\n          );\n        }\n      })\n      .finally(() => {\n        // Only clear currentTransform if it's still the same one we started\n        if (this.currentTransform?.symbol === symbol) {\n          workerLogger.debug('transform completed', {\n            ...this.logContext,\n            trackId,\n          });\n          this.currentTransform = undefined;\n        }\n      });\n  }\n\n  setSifTrailer(trailer: Uint8Array) {\n    workerLogger.debug('setting SIF trailer', { ...this.logContext, trailer });\n    this.sifTrailer = trailer;\n  }\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  private shouldEmitError(errorKey: string): boolean {\n    const now = Date.now();\n    const lastErrorTime = this.lastErrorTimestamp.get(errorKey) ?? 0;\n    const errorCount = this.errorCounts.get(errorKey) ?? 0;\n\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\n    // Check if we've exceeded the throttle time\n    if (now - lastErrorTime < this.ERROR_THROTTLE_MS) {\n      return false;\n    }\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 ${this.participantIdentity}`, {\n          ...this.logContext,\n          errorKey,\n        });\n        this.errorCounts.set(errorKey, errorCount + 1);\n      }\n      return false;\n    }\n\n    // Update tracking\n    this.lastErrorTimestamp.set(errorKey, now);\n    this.errorCounts.set(errorKey, errorCount + 1);\n    return true;\n  }\n\n  /**\n   * Emits a throttled error to prevent memory leaks from repeated decryption failures\n   * @param error - the CryptorError to emit\n   */\n  private emitThrottledError(error: CryptorError) {\n    const errorKey = `${this.participantIdentity}-${error.reason}-decrypt`;\n\n    if (this.shouldEmitError(errorKey)) {\n      const errorCount = this.errorCounts.get(errorKey) ?? 0;\n      if (errorCount > 1) {\n        workerLogger.debug(`Decryption error (${errorCount} occurrences in window)`, {\n          ...this.logContext,\n          reason: CryptorErrorReason[error.reason],\n        });\n      }\n      this.emit(CryptorEvent.Error, error);\n    }\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  protected async encodeFunction(\n    encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n    controller: TransformStreamDefaultController,\n  ) {\n    if (\n      !this.isEnabled() ||\n      // skip for encryption for empty dtx frames\n      encodedFrame.data.byteLength === 0\n    ) {\n      return controller.enqueue(encodedFrame);\n    }\n    const keySet = this.keys.getKeySet();\n    if (!keySet) {\n      this.emitThrottledError(\n        new CryptorError(\n          `key set not found for ${\n            this.participantIdentity\n          } at index ${this.keys.getCurrentKeyIndex()}`,\n          CryptorErrorReason.MissingKey,\n          this.participantIdentity,\n        ),\n      );\n      return;\n    }\n    const { encryptionKey } = keySet;\n    const keyIndex = this.keys.getCurrentKeyIndex();\n\n    if (encryptionKey) {\n      const iv = this.makeIV(\n        encodedFrame.getMetadata().synchronizationSource ?? -1,\n        encodedFrame.timestamp,\n      );\n      let frameInfo = this.getUnencryptedBytes(encodedFrame);\n\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\n      // Frame trailer contains the R|IV_LENGTH and key index\n      const frameTrailer = new Uint8Array(2);\n\n      frameTrailer[0] = IV_LENGTH;\n      frameTrailer[1] = keyIndex;\n\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 = await crypto.subtle.encrypt(\n          {\n            name: ENCRYPTION_ALGORITHM,\n            iv,\n            additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength),\n          },\n          encryptionKey,\n          new Uint8Array(encodedFrame.data, frameInfo.unencryptedBytes),\n        );\n\n        let newDataWithoutHeader = new Uint8Array(\n          cipherText.byteLength + iv.byteLength + frameTrailer.byteLength,\n        );\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\n        if (frameInfo.requiresNALUProcessing) {\n          newDataWithoutHeader = writeRbsp(newDataWithoutHeader);\n        }\n\n        var newData = new Uint8Array(frameHeader.byteLength + newDataWithoutHeader.byteLength);\n        newData.set(frameHeader);\n        newData.set(newDataWithoutHeader, frameHeader.byteLength);\n\n        encodedFrame.data = newData.buffer;\n\n        return controller.enqueue(encodedFrame);\n      } catch (e: any) {\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(\n        new CryptorError(\n          `encryption key missing for encoding`,\n          CryptorErrorReason.MissingKey,\n          this.participantIdentity,\n        ),\n      );\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  protected async decodeFunction(\n    encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n    controller: TransformStreamDefaultController,\n  ) {\n    if (\n      !this.isEnabled() ||\n      // skip for decryption for empty dtx frames\n      encodedFrame.data.byteLength === 0\n    ) {\n      return controller.enqueue(encodedFrame);\n    }\n\n    if (isFrameServerInjected(encodedFrame.data, this.sifTrailer)) {\n      encodedFrame.data = encodedFrame.data.slice(\n        0,\n        encodedFrame.data.byteLength - this.sifTrailer.byteLength,\n      );\n      if (await 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\n    if (this.keys.hasInvalidKeyAtIndex(keyIndex)) {\n      // drop frame\n      return;\n    }\n\n    if (this.keys.getKeySet(keyIndex)) {\n      try {\n        const decodedFrame = await 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', { error });\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 ${keyIndex}`);\n      this.emitThrottledError(\n        new CryptorError(\n          `missing key at index ${keyIndex} for participant ${this.participantIdentity}`,\n          CryptorErrorReason.MissingKey,\n          this.participantIdentity,\n        ),\n      );\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  private async decryptFrame(\n    encodedFrame: RTCEncodedVideoFrame | RTCEncodedAudioFrame,\n    keyIndex: number,\n    initialMaterial: KeySet | undefined = undefined,\n    ratchetOpts: DecodeRatchetOptions = { ratchetCount: 0 },\n  ): Promise<RTCEncodedVideoFrame | RTCEncodedAudioFrame | undefined> {\n    const keySet = this.keys.getKeySet(keyIndex);\n    if (!ratchetOpts.encryptionKey && !keySet) {\n      throw new TypeError(`no encryption key found for decryption of ${this.participantIdentity}`);\n    }\n    let frameInfo = this.getUnencryptedBytes(encodedFrame);\n\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\n    try {\n      const frameHeader = new Uint8Array(encodedFrame.data, 0, frameInfo.unencryptedBytes);\n      var encryptedData = new Uint8Array(\n        encodedFrame.data,\n        frameHeader.length,\n        encodedFrame.data.byteLength - frameHeader.length,\n      );\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\n      const frameTrailer = new Uint8Array(encodedFrame.data, encodedFrame.data.byteLength - 2, 2);\n\n      const ivLength = frameTrailer[0];\n      const iv = new Uint8Array(\n        encodedFrame.data,\n        encodedFrame.data.byteLength - ivLength - frameTrailer.byteLength,\n        ivLength,\n      );\n\n      const cipherTextStart = frameHeader.byteLength;\n      const cipherTextLength =\n        encodedFrame.data.byteLength -\n        (frameHeader.byteLength + ivLength + frameTrailer.byteLength);\n\n      const plainText = await crypto.subtle.decrypt(\n        {\n          name: ENCRYPTION_ALGORITHM,\n          iv,\n          additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength),\n        },\n        ratchetOpts.encryptionKey ?? keySet!.encryptionKey,\n        new Uint8Array(encodedFrame.data, cipherTextStart, cipherTextLength),\n      );\n\n      const newData = new ArrayBuffer(frameHeader.byteLength + plainText.byteLength);\n      const newUint8 = new Uint8Array(newData);\n\n      newUint8.set(new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength));\n      newUint8.set(new Uint8Array(plainText), frameHeader.byteLength);\n\n      encodedFrame.data = newData;\n\n      return encodedFrame;\n    } catch (error: any) {\n      if (this.keyProviderOptions.ratchetWindowSize > 0) {\n        if (ratchetOpts.ratchetCount < this.keyProviderOptions.ratchetWindowSize) {\n          workerLogger.debug(\n            `ratcheting key attempt ${ratchetOpts.ratchetCount} of ${\n              this.keyProviderOptions.ratchetWindowSize\n            }, for kind ${encodedFrame instanceof RTCEncodedAudioFrame ? 'audio' : 'video'}`,\n          );\n\n          let ratchetedKeySet: KeySet | undefined;\n          let ratchetResult: RatchetResult | undefined;\n          if ((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 = await this.keys.ratchetKey(keyIndex, false);\n\n            ratchetedKeySet = await deriveKeys(ratchetResult.cryptoKey, this.keyProviderOptions);\n          }\n\n          const frame = await this.decryptFrame(encodedFrame, keyIndex, initialMaterial || keySet, {\n            ratchetCount: ratchetOpts.ratchetCount + 1,\n            encryptionKey: 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 ?? 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\n          workerLogger.warn('maximum ratchet attempts exceeded');\n          throw new CryptorError(\n            `valid key missing for participant ${this.participantIdentity}`,\n            CryptorErrorReason.InvalidKey,\n            this.participantIdentity,\n          );\n        }\n      } else {\n        throw new CryptorError(\n          `Decryption failed: ${error.message}`,\n          CryptorErrorReason.InvalidKey,\n          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  private makeIV(synchronizationSource: number, timestamp: number) {\n    const iv = new ArrayBuffer(IV_LENGTH);\n    const ivView = new DataView(iv);\n\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\n    const sendCount = this.sendCounts.get(synchronizationSource) ?? 0;\n\n    ivView.setUint32(0, synchronizationSource);\n    ivView.setUint32(4, timestamp);\n    ivView.setUint32(8, timestamp - (sendCount % 0xffff));\n\n    this.sendCounts.set(synchronizationSource, sendCount + 1);\n\n    return iv;\n  }\n\n  private getUnencryptedBytes(frame: RTCEncodedVideoFrame | RTCEncodedAudioFrame): {\n    unencryptedBytes: number;\n    requiresNALUProcessing: boolean;\n  } {\n    // Handle audio frames\n    if (!isVideoFrame(frame)) {\n      return { unencryptedBytes: UNENCRYPTED_BYTES.audio, requiresNALUProcessing: false };\n    }\n\n    // Detect and track codec changes\n    const detectedCodec = this.getVideoCodec(frame) ?? this.videoCodec;\n    if (detectedCodec !== this.detectedCodec) {\n      workerLogger.debug('detected different codec', {\n        detectedCodec,\n        oldCodec: this.detectedCodec,\n        ...this.logContext,\n      });\n      this.detectedCodec = detectedCodec;\n    }\n\n    // Check for unsupported codecs\n    if (detectedCodec === 'av1') {\n      throw new Error(`${detectedCodec} is not yet supported for end to end encryption`);\n    }\n\n    // Handle VP8/VP9 codecs (no NALU processing needed)\n    if (detectedCodec === 'vp8') {\n      return { unencryptedBytes: UNENCRYPTED_BYTES[frame.type], requiresNALUProcessing: false };\n    }\n    if (detectedCodec === 'vp9') {\n      return { unencryptedBytes: 0, requiresNALUProcessing: false };\n    }\n\n    // Try NALU processing for H.264/H.265 codecs\n    try {\n      const knownCodec =\n        detectedCodec === 'h264' || detectedCodec === 'h265' ? detectedCodec : undefined;\n      const naluResult = processNALUsForEncryption(new Uint8Array(frame.data), knownCodec);\n\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', {\n        error: e,\n        ...this.logContext,\n      });\n    }\n\n    // Fallback to VP8 handling\n    return { unencryptedBytes: UNENCRYPTED_BYTES[frame.type], requiresNALUProcessing: false };\n  }\n\n  /**\n   * inspects frame payloadtype if available and maps it to the codec specified in rtpMap\n   */\n  private getVideoCodec(frame: RTCEncodedVideoFrame): VideoCodec | undefined {\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/**\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 */\nexport function isFrameServerInjected(frameData: ArrayBuffer, trailerBytes: Uint8Array): boolean {\n  if (trailerBytes.byteLength === 0) {\n    return false;\n  }\n  const frameTrailer = new Uint8Array(\n    frameData.slice(frameData.byteLength - trailerBytes.byteLength),\n  );\n  return trailerBytes.every((value, index) => value === frameTrailer[index]);\n}\n","import { EventEmitter } from 'events';\nimport type TypedEventEmitter from 'typed-emitter';\nimport { workerLogger } from '../../logger';\nimport { KeyHandlerEvent, type ParticipantKeyHandlerCallbacks } from '../events';\nimport type { KeyProviderOptions, KeySet, RatchetResult } from '../types';\nimport { deriveKeys, importKey, ratchet } from '../utils';\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/**\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 */\nexport class ParticipantKeyHandler extends (EventEmitter as new () => TypedEventEmitter<ParticipantKeyHandlerCallbacks>) {\n  private currentKeyIndex: number;\n\n  private cryptoKeyRing: Array<KeySet | undefined>;\n\n  private decryptionFailureCounts: Array<number>;\n\n  private ratchetPromiseMap: Map<number, Promise<RatchetResult>>;\n\n  readonly participantIdentity: string;\n\n  /** @internal */\n  readonly keyProviderOptions: KeyProviderOptions;\n\n  /**\n   * true if the current key has not been marked as invalid\n   */\n  get hasValidKey(): boolean {\n    return !this.hasInvalidKeyAtIndex(this.currentKeyIndex);\n  }\n\n  constructor(participantIdentity: string, keyProviderOptions: 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  /**\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: number): boolean {\n    return (\n      this.keyProviderOptions.failureTolerance >= 0 &&\n      this.decryptionFailureCounts[keyIndex] > this.keyProviderOptions.failureTolerance\n    );\n  }\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(keyIndex: number = this.currentKeyIndex): void {\n    if (this.keyProviderOptions.failureTolerance < 0) {\n      return;\n    }\n\n    this.decryptionFailureCounts[keyIndex] += 1;\n\n    if (this.decryptionFailureCounts[keyIndex] > this.keyProviderOptions.failureTolerance) {\n      workerLogger.warn(\n        `key for ${this.participantIdentity} at index ${keyIndex} is being marked as invalid`,\n      );\n    }\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(keyIndex: number = this.currentKeyIndex): void {\n    this.resetKeyStatus(keyIndex);\n  }\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?: number): void {\n    if (keyIndex === undefined) {\n      this.decryptionFailureCounts.fill(0);\n    } else {\n      this.decryptionFailureCounts[keyIndex] = 0;\n    }\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?: number, setKey = true): Promise<RatchetResult> {\n    const currentKeyIndex = keyIndex ?? this.getCurrentKeyIndex();\n\n    const existingPromise = this.ratchetPromiseMap.get(currentKeyIndex);\n    if (typeof existingPromise !== 'undefined') {\n      return existingPromise;\n    }\n    const ratchetPromise = new Promise<RatchetResult>(async (resolve, reject) => {\n      try {\n        const keySet = this.getKeySet(currentKeyIndex);\n        if (!keySet) {\n          throw new TypeError(\n            `Cannot ratchet key without a valid keyset of participant ${this.participantIdentity}`,\n          );\n        }\n        const currentMaterial = keySet.material;\n        const chainKey = await ratchet(currentMaterial, this.keyProviderOptions.ratchetSalt);\n        const newMaterial = await importKey(chainKey, currentMaterial.algorithm.name, 'derive');\n        const ratchetResult: 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          await 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  /**\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  async setKey(material: CryptoKey, keyIndex = 0, updateCurrentKeyIndex = true) {\n    await this.setKeyFromMaterial(material, keyIndex, null, updateCurrentKeyIndex);\n    if (updateCurrentKeyIndex) {\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  async setKeyFromMaterial(\n    material: CryptoKey,\n    keyIndex: number,\n    ratchetedResult: RatchetResult | null = null,\n    updateCurrentKeyIndex = true,\n  ) {\n    const keySet = await deriveKeys(material, this.keyProviderOptions);\n    const newIndex = keyIndex >= 0 ? keyIndex % this.cryptoKeyRing.length : this.currentKeyIndex;\n    workerLogger.debug(`setting new key with index ${keyIndex}`, {\n      usage: material.usages,\n      algorithm: material.algorithm,\n      ratchetSalt: this.keyProviderOptions.ratchetSalt,\n    });\n    this.setKeySet(keySet, newIndex, ratchetedResult);\n    if (newIndex >= 0 && updateCurrentKeyIndex) this.currentKeyIndex = newIndex;\n  }\n\n  setKeySet(keySet: KeySet, keyIndex: number, ratchetedResult: RatchetResult | null = null) {\n    this.cryptoKeyRing[keyIndex % this.cryptoKeyRing.length] = keySet;\n\n    if (ratchetedResult) {\n      this.emit(KeyHandlerEvent.KeyRatcheted, ratchetedResult, this.participantIdentity, keyIndex);\n    }\n  }\n\n  async setCurrentKeyIndex(index: number) {\n    this.currentKeyIndex = index % this.cryptoKeyRing.length;\n    this.resetKeyStatus(index);\n  }\n\n  getCurrentKeyIndex() {\n    return this.currentKeyIndex;\n  }\n\n  /**\n   * returns currently used KeySet or the one at `keyIndex` if provided\n   * @param keyIndex\n   * @returns\n   */\n  getKeySet(keyIndex?: number) {\n    return this.cryptoKeyRing[keyIndex ?? this.currentKeyIndex];\n  }\n}\n","import { workerLogger } from '../../logger';\nimport type { VideoCodec } from '../../room/track/options';\nimport { AsyncQueue } from '../../utils/AsyncQueue';\nimport { KEY_PROVIDER_DEFAULTS } from '../constants';\nimport { CryptorErrorReason } from '../errors';\nimport { CryptorEvent, KeyHandlerEvent } from '../events';\nimport type {\n  DecryptDataResponseMessage,\n  E2EEWorkerMessage,\n  EncryptDataResponseMessage,\n  ErrorMessage,\n  InitAck,\n  KeyProviderOptions,\n  RatchetMessage,\n  RatchetRequestMessage,\n  RatchetResult,\n  ScriptTransformOptions,\n} from '../types';\nimport { DataCryptor } from './DataCryptor';\nimport { FrameCryptor, encryptionEnabledMap } from './FrameCryptor';\nimport { ParticipantKeyHandler } from './ParticipantKeyHandler';\n\nconst participantCryptors: FrameCryptor[] = [];\nconst participantKeys: Map<string, ParticipantKeyHandler> = new Map();\nlet sharedKeyHandler: ParticipantKeyHandler | undefined;\nlet messageQueue = new AsyncQueue();\n\nlet isEncryptionEnabled: boolean = false;\n\nlet useSharedKey: boolean = false;\n\nlet sifTrailer: Uint8Array | undefined;\n\nlet keyProviderOptions: KeyProviderOptions = KEY_PROVIDER_DEFAULTS;\n\nlet rtpMap: Map<number, VideoCodec> = new Map();\n\nworkerLogger.setDefaultLevel('info');\n\nonmessage = (ev) => {\n  messageQueue.run(async () => {\n    const { kind, data }: E2EEWorkerMessage = ev.data;\n\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: InitAck = {\n          kind: 'initAck',\n          data: { enabled: isEncryptionEnabled },\n        };\n        postMessage(ackMsg);\n        break;\n      case 'enable':\n        setEncryptionEnabled(data.enabled, data.participantIdentity);\n        workerLogger.info(\n          `updated e2ee enabled status for ${data.participantIdentity} to ${data.enabled}`,\n        );\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(\n          kind,\n          data.readableStream,\n          data.writableStream,\n          data.trackId,\n          data.isReuse,\n          data.codec,\n        );\n        break;\n      case 'encode':\n        let pubCryptor = getTrackCryptor(data.participantIdentity, data.trackId);\n        pubCryptor.setupTransform(\n          kind,\n          data.readableStream,\n          data.writableStream,\n          data.trackId,\n          data.isReuse,\n          data.codec,\n        );\n        break;\n\n      case 'encryptDataRequest':\n        const {\n          payload: encryptedPayload,\n          iv,\n          keyIndex,\n        } = await DataCryptor.encrypt(\n          data.payload,\n          getParticipantKeyHandler(data.participantIdentity),\n        );\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        } satisfies EncryptDataResponseMessage);\n        break;\n\n      case 'decryptDataRequest':\n        try {\n          const { payload: decryptedPayload } = await DataCryptor.decrypt(\n            data.payload,\n            data.iv,\n            getParticipantKeyHandler(data.participantIdentity),\n            data.keyIndex,\n          );\n          postMessage({\n            kind: 'decryptDataResponse',\n            data: { payload: decryptedPayload, uuid: data.uuid },\n          } satisfies DecryptDataResponseMessage);\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          } satisfies ErrorMessage);\n        }\n        break;\n\n      case 'setKey':\n        if (useSharedKey) {\n          await setSharedKey(data.key, data.keyIndex, data.updateCurrentKeyIndex);\n        } else if (data.participantIdentity) {\n          workerLogger.info(\n            `set participant sender key ${data.participantIdentity} index ${data.keyIndex}`,\n          );\n          await getParticipantKeyHandler(data.participantIdentity).setKey(\n            data.key,\n            data.keyIndex,\n            data.updateCurrentKeyIndex,\n          );\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      default:\n        break;\n    }\n  });\n};\n\nasync function handleRatchetRequest(data: RatchetRequestMessage['data']) {\n  if (useSharedKey) {\n    const keyHandler = getSharedKeyHandler();\n    await keyHandler.ratchetKey(data.keyIndex);\n    keyHandler.resetKeyStatus();\n  } else if (data.participantIdentity) {\n    const keyHandler = getParticipantKeyHandler(data.participantIdentity);\n    await keyHandler.ratchetKey(data.keyIndex);\n    keyHandler.resetKeyStatus();\n  } else {\n    workerLogger.error(\n      'no participant Id was provided for ratchet request and shared key usage is disabled',\n    );\n  }\n}\n\nfunction getTrackCryptor(participantIdentity: string, trackId: string) {\n  let cryptors = participantCryptors.filter((c) => c.getTrackId() === trackId);\n  if (cryptors.length > 1) {\n    const debugInfo = cryptors\n      .map((c) => {\n        return { participant: c.getParticipantIdentity() };\n      })\n      .join(',');\n    workerLogger.error(\n      `Found multiple cryptors for the same trackID ${trackId}. target participant: ${participantIdentity} `,\n      { participants: debugInfo },\n    );\n  }\n  let cryptor = cryptors[0];\n  if (!cryptor) {\n    workerLogger.info('creating new cryptor for', { participantIdentity, trackId });\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\n  return cryptor;\n}\n\nfunction getParticipantKeyHandler(participantIdentity: string) {\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}\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}\n\nfunction unsetCryptorParticipant(trackId: string, participantIdentity: string) {\n  const cryptors = participantCryptors.filter(\n    (c) => c.getParticipantIdentity() === participantIdentity && c.getTrackId() === trackId,\n  );\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', { trackId, participantIdentity });\n  } else {\n    cryptor.unsetParticipant();\n  }\n}\n\nfunction setEncryptionEnabled(enable: boolean, participantIdentity: string) {\n  workerLogger.debug(`setting encryption enabled for all tracks of ${participantIdentity}`, {\n    enable,\n  });\n  encryptionEnabledMap.set(participantIdentity, enable);\n}\n\nasync function setSharedKey(key: CryptoKey, index?: number, updateCurrentKeyIndex?: boolean) {\n  workerLogger.info('set shared key', { index });\n  await getSharedKeyHandler().setKey(key, index, updateCurrentKeyIndex);\n}\n\nfunction setupCryptorErrorEvents(cryptor: FrameCryptor) {\n  cryptor.on(CryptorEvent.Error, (error) => {\n    const msg: ErrorMessage = {\n      kind: 'error',\n      data: {\n        error: new Error(`${CryptorErrorReason[error.reason]}: ${error.message}`),\n        participantIdentity: error.participantIdentity,\n      },\n    };\n    postMessage(msg);\n  });\n}\n\nfunction emitRatchetedKeys(\n  ratchetResult: RatchetResult,\n  participantIdentity: string,\n  keyIndex?: number,\n) {\n  const msg: RatchetMessage = {\n    kind: `ratchetKey`,\n    data: {\n      participantIdentity,\n      keyIndex,\n      ratchetResult,\n    },\n  };\n  postMessage(msg);\n}\n\nfunction handleSifTrailer(trailer: Uint8Array) {\n  sifTrailer = trailer;\n  participantCryptors.forEach((c) => {\n    c.setSifTrailer(trailer);\n  });\n}\n\n// Operations using RTCRtpScriptTransform.\n// @ts-ignore\nif (self.RTCTransformEvent) {\n  // @ts-ignore\n  self.onrtctransform = (event: RTCTransformEvent) => {\n    // @ts-ignore\n    const transformer = event.transformer;\n    const { kind, participantIdentity, trackId, codec } =\n      transformer.options as ScriptTransformOptions;\n    messageQueue.run(async () => {\n      const cryptor = getTrackCryptor(participantIdentity, trackId);\n      workerLogger.debug('onrtctransform setup', { participantIdentity, trackId, codec });\n      cryptor.setupTransform(\n        kind,\n        transformer.readable,\n        transformer.writable,\n        trackId,\n        false,\n        codec,\n      );\n    });\n  };\n}\n"],"names":["root","definition","module","exports","log","this","noop","undefinedType","isIE","window","navigator","test","userAgent","logMethods","_loggersByName","defaultLogger","bindMethod","obj","methodName","method","bind","Function","prototype","call","e","apply","arguments","traceForIE","console","trace","realMethod","undefined","replaceLoggingMethods","level","getLevel","i","length","methodFactory","name","debug","levels","SILENT","enableLoggingWhenConsoleArrives","defaultMethodFactory","_level","_loggerName","Logger","factory","self","inheritedLevel","defaultLevel","userLevel","storageKey","persistLevelIfPossible","levelNum","levelName","toUpperCase","localStorage","ignore","document","cookie","encodeURIComponent","getPersistedLevel","storedLevel","cookieName","location","indexOf","exec","slice","clearPersistedLevel","removeItem","normalizeLevel","input","TypeError","setLevel","persist","setDefaultLevel","resetLevel","enableAll","TRACE","disableAll","rebuild","childName","initialLevel","getLogger","logger","_log","noConflict","getLoggers","LogLevel","LoggerNames","livekitLogger","Object","values","map","info","workerLogger","_","constructor","o","_locking","Promise","resolve","_locks","isLocked","lock","s","t","l","unlockNext","c","then","QueueTaskStatus","AsyncQueue","pendingTasks","Map","taskMutex","Mutex","nextTaskIndex","run","task","taskInfo","id","enqueuedAt","Date","now","status","WAITING","set","unlock","executedAt","RUNNING","COMPLETED","delete","flush","__awaiter","snapshot","Array","from","ENCRYPTION_ALGORITHM","DECRYPTION_FAILURE_TOLERANCE","UNENCRYPTED_BYTES","key","delta","audio","empty","IV_LENGTH","SALT","KEY_PROVIDER_DEFAULTS","sharedKey","ratchetSalt","ratchetWindowSize","failureTolerance","keyringSize","keySize","LivekitError","Error","code","message","options","cause","ConnectionErrorReason","DataStreamErrorReason","MediaDeviceFailure","getFailure","error","NotFound","PermissionDenied","DeviceInUse","Other","CryptorErrorReason","CryptorError","reason","InternalError","participantIdentity","KeyProviderEvent","KeyHandlerEvent","EncryptionEvent","CryptorEvent","isVideoFrame","frame","importKey","keyBytes_1","keyBytes","algorithm","usage","crypto","subtle","getAlgoOptions","algorithmName","salt","textEncoder","TextEncoder","encodedSalt","encode","hash","ArrayBuffer","iterations","concat","deriveKeys","material","algorithmOptions","encryptionKey","deriveKey","ratchet","deriveBits","needsRbspUnescaping","frameData","parseRbsp","stream","dataOut","push","Uint8Array","kZerosInStartSequence","kEmulationByte","writeRbsp","data_in","numConsecutiveZeros","byte","DataCryptor","makeIV","timestamp","iv","ivView","DataView","randomBytes","getRandomValues","Uint32Array","setUint32","sendCount","encrypt","data","keys","performance","keySet","getKeySet","cipherText","payload","keyIndex","getCurrentKeyIndex","decrypt","data_1","iv_1","keys_1","initialMaterial","ratchetOpts","ratchetCount","plainText","keyProviderOptions","ratchetedKeySet","ratchetResult","ratchetKey","cryptoKey","decryptedData","setKeySet","setCurrentKeyIndex","warn","InvalidKey","R","Reflect","ReflectApply","target","receiver","args","ReflectOwnKeys","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","ProcessEmitWarning","warning","NumberIsNaN","Number","isNaN","value","EventEmitter","init","eventsModule","once","_events","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","listener","defineProperty","enumerable","get","arg","RangeError","getPrototypeOf","create","setMaxListeners","n","_getMaxListeners","that","getMaxListeners","emit","type","doError","events","er","err","context","handler","len","listeners","arrayClone","_addListener","prepend","m","existing","newListener","unshift","warned","w","String","emitter","count","addListener","on","prependListener","onceWrapper","fired","removeListener","wrapFn","_onceWrap","state","wrapped","prependOnceListener","list","position","originalListener","shift","spliceOne","off","removeAllListeners","_listeners","unwrap","evlistener","unwrapListeners","rawListeners","listenerCount","eventNames","arr","copy","index","pop","ret","reject","errorListener","resolver","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","flags","addEventListener","wrapListener","removeEventListener","kH264NaluTypeMask","H264NALUType","H265NALUType","parseH264NALUType","startByte","parseH265NALUType","firstByte","isH264SliceNALU","naluType","SLICE_IDR","SLICE_NON_IDR","isH265SliceNALU","TRAIL_N","TRAIL_R","TSA_N","TSA_R","STSA_N","STSA_R","RADL_N","RADL_R","RASL_N","RASL_R","BLA_W_LP","BLA_W_RADL","BLA_N_LP","IDR_W_RADL","IDR_N_LP","CRA_NUT","detectCodecFromNALUs","naluIndices","naluIndex","findSliceNALUUnencryptedBytes","codec","findNALUIndices","result","start","pos","searchLength","end","startCodeLength","processNALUsForEncryption","knownCodec","detectedCodec","unencryptedBytes","requiresNALUProcessing","cryptoHash","hashBuffer","digest","hashArray","b","toString","padStart","join","CryptoHashes","VP8KeyFrame8x8","H264KeyFrame2x2SPS","H264KeyFrame2x2PPS","H264KeyFrame2x2IDR","OpusSilenceFrame","identifySifPayload","encryptionEnabledMap","BaseFrameCryptor","encodeFunction","encodedFrame","controller","decodeFunction","FrameCryptor","opts","lastErrorTimestamp","errorCounts","ERROR_THROTTLE_MS","MAX_ERRORS_PER_MINUTE","ERROR_WINDOW_MS","sendCounts","rtpMap","sifTrailer","_a","logContext","participant","mediaTrackId","trackId","fallbackCodec","videoCodec","setParticipant","newParticipant","hadPreviousParticipant","oldParticipant","unsetParticipant","currentTransform","isEnabled","getParticipantIdentity","getTrackId","setVideoCodec","setRtpMap","setupTransform","operation","readable","writable","isReuse","assign","passedTrackId","hasCurrentTransform","symbol","Symbol","transformFn","transformStream","TransformStream","transform","transformer","pipeThrough","pipeTo","catch","finally","setSifTrailer","trailer","shouldEmitError","errorKey","lastErrorTime","errorCount","_b","emitThrottledError","byteLength","enqueue","MissingKey","getMetadata","synchronizationSource","frameInfo","getUnencryptedBytes","frameHeader","frameTrailer","additionalData","newDataWithoutHeader","newData","buffer","isFrameServerInjected","hasInvalidKeyAtIndex","decodedFrame","decryptFrame","decryptionSuccess","hasValidKey","decryptionFailure","encodedFrame_1","keyIndex_1","_this","encryptedData","newUint8","ivLength","cipherTextStart","cipherTextLength","RTCEncodedAudioFrame","has","Math","floor","random","getVideoCodec","oldCodec","naluResult","size","payloadType","trailerBytes","every","ParticipantKeyHandler","currentKeyIndex","cryptoKeyRing","fill","decryptionFailureCounts","ratchetPromiseMap","resetKeyStatus","setKey","existingPromise","ratchetPromise","currentMaterial","chainKey","newMaterial","setKeyFromMaterial","material_1","updateCurrentKeyIndex","_this2","ratchetedResult","newIndex","usages","KeyRatcheted","participantCryptors","participantKeys","sharedKeyHandler","messageQueue","isEncryptionEnabled","useSharedKey","onmessage","ev","kind","loglevel","ackMsg","enabled","postMessage","setEncryptionEnabled","cryptor","getTrackCryptor","readableStream","writableStream","pubCryptor","encryptedPayload","getParticipantKeyHandler","original","encrypted","uuid","decryptedPayload","setSharedKey","unsetCryptorParticipant","forEach","cr","handleRatchetRequest","handleSifTrailer","keyHandler","getSharedKeyHandler","cryptors","filter","debugInfo","participants","setupCryptorErrorEvents","emitRatchetedKeys","enable","msg","RTCTransformEvent","onrtctransform","event"],"mappings":"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","x_google_ignoreList":[0,2,10]}