@element-hq/element-call-embedded 0.12.2 → 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/IndexedDBWorker-whz4J8_U.js.map +1 -1
- package/dist/assets/{cs-app-v58LOBvt.json → cs-app-UZ1pMWyL.json} +3 -0
- package/dist/assets/{da-app-9paXotmH.json → da-app-DSbSkTzs.json} +7 -0
- package/dist/assets/{de-app-DoDe9FNi.json → de-app-B6MLDOze.json} +8 -1
- package/dist/assets/{en-app-DpvT44u_.json → en-app-DaCwFDsK.json} +7 -1
- package/dist/assets/{et-app-DBPtMBtN.json → et-app-Cj5_u8vn.json} +10 -1
- package/dist/assets/index-DFx3IDNt.css +1 -0
- package/dist/assets/index-Ddc-CPx6.js +340 -0
- package/dist/assets/{index-BQv1OC6W.js.map → index-Ddc-CPx6.js.map} +1 -1
- package/dist/assets/index-Eue9riTL.js +9 -0
- package/dist/assets/index-Eue9riTL.js.map +1 -0
- package/dist/assets/{index-BQ3oe8uL.js → index-c2AmD9NW.js} +2 -2
- package/dist/assets/{index-BQ3oe8uL.js.map → index-c2AmD9NW.js.map} +1 -1
- package/dist/assets/livekit-client.e2ee.worker-B0tndz1T.js +2 -0
- package/dist/assets/livekit-client.e2ee.worker-B0tndz1T.js.map +1 -0
- package/dist/assets/{polyfill-force-C-Pa3wDT.js → polyfill-force-B_r5dj-0.js} +2 -2
- package/dist/assets/{polyfill-force-C-Pa3wDT.js.map → polyfill-force-B_r5dj-0.js.map} +1 -1
- package/dist/assets/{polyfill-force-CzShxH5l.js → polyfill-force-b99I59uR.js} +2 -2
- package/dist/assets/{polyfill-force-CzShxH5l.js.map → polyfill-force-b99I59uR.js.map} +1 -1
- package/dist/assets/{ru-app-Bz0WyIJI.json → ru-app-C1ONMB5H.json} +4 -0
- package/dist/assets/{sk-app-Bv2npyK0.json → sk-app-qoyo64LS.json} +10 -1
- package/dist/assets/{spa-_3kkJMwV.js → spa-D6CqwIUD.js} +2 -2
- package/dist/assets/{spa-_3kkJMwV.js.map → spa-D6CqwIUD.js.map} +1 -1
- package/dist/assets/{sv-app-BvdrRKW-.json → sv-app-DvykXtJ4.json} +7 -0
- package/dist/config.json +1 -1
- package/dist/index.html +1 -1
- package/package.json +1 -1
- package/dist/assets/index-BQv1OC6W.js +0 -340
- package/dist/assets/index-BtY3MdEn.css +0 -1
- package/dist/assets/index-W4jTSiQP.js +0 -9
- package/dist/assets/index-W4jTSiQP.js.map +0 -1
- package/dist/assets/livekit-client.e2ee.worker-D7jue42X.js +0 -2
- package/dist/assets/livekit-client.e2ee.worker-D7jue42X.js.map +0 -1
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
(function(){"use strict";function C(e,t,n,r){function a(i){return i instanceof n?i:new n(function(l){l(i)})}return new(n||(n=Promise))(function(i,l){function w(b){try{_(r.next(b))}catch(S){l(S)}}function m(b){try{_(r.throw(b))}catch(S){l(S)}}function _(b){b.done?i(b.value):a(b.value).then(w,m)}_((r=r.apply(e,t||[])).next())})}typeof SuppressedError=="function"&&SuppressedError;var B={exports:{}},we=B.exports,ee;function me(){return ee||(ee=1,function(e){(function(t,n){e.exports?e.exports=n():t.log=n()})(we,function(){var t=function(){},n="undefined",r=typeof window!==n&&typeof window.navigator!==n&&/Trident\/|MSIE /.test(window.navigator.userAgent),a=["trace","debug","info","warn","error"],i={},l=null;function w(g,L){var f=g[L];if(typeof f.bind=="function")return f.bind(g);try{return Function.prototype.bind.call(f,g)}catch{return function(){return Function.prototype.apply.apply(f,[g,arguments])}}}function m(){console.log&&(console.log.apply?console.log.apply(console,arguments):Function.prototype.apply.apply(console.log,[console,arguments])),console.trace&&console.trace()}function _(g){return g==="debug"&&(g="log"),typeof console===n?!1:g==="trace"&&r?m:console[g]!==void 0?w(console,g):console.log!==void 0?w(console,"log"):t}function b(){for(var g=this.getLevel(),L=0;L<a.length;L++){var f=a[L];this[f]=L<g?t:this.methodFactory(f,g,this.name)}if(this.log=this.debug,typeof console===n&&g<this.levels.SILENT)return"No console available for logging"}function S(g){return function(){typeof console!==n&&(b.call(this),this[g].apply(this,arguments))}}function I(g,L,f){return _(g)||S.apply(this,arguments)}function E(g,L){var f=this,R,P,o,s="loglevel";typeof g=="string"?s+=":"+g:typeof g=="symbol"&&(s=void 0);function c(y){var k=(a[y]||"silent").toUpperCase();if(!(typeof window===n||!s)){try{window.localStorage[s]=k;return}catch{}try{window.document.cookie=encodeURIComponent(s)+"="+k+";"}catch{}}}function u(){var y;if(!(typeof window===n||!s)){try{y=window.localStorage[s]}catch{}if(typeof y===n)try{var k=window.document.cookie,A=encodeURIComponent(s),X=k.indexOf(A+"=");X!==-1&&(y=/^([^;]+)/.exec(k.slice(X+A.length+1))[1])}catch{}return f.levels[y]===void 0&&(y=void 0),y}}function d(){if(!(typeof window===n||!s)){try{window.localStorage.removeItem(s)}catch{}try{window.document.cookie=encodeURIComponent(s)+"=; expires=Thu, 01 Jan 1970 00:00:00 UTC"}catch{}}}function v(y){var k=y;if(typeof k=="string"&&f.levels[k.toUpperCase()]!==void 0&&(k=f.levels[k.toUpperCase()]),typeof k=="number"&&k>=0&&k<=f.levels.SILENT)return k;throw new TypeError("log.setLevel() called with invalid level: "+y)}f.name=g,f.levels={TRACE:0,DEBUG:1,INFO:2,WARN:3,ERROR:4,SILENT:5},f.methodFactory=L||I,f.getLevel=function(){return o??P??R},f.setLevel=function(y,k){return o=v(y),k!==!1&&c(o),b.call(f)},f.setDefaultLevel=function(y){P=v(y),u()||f.setLevel(y,!1)},f.resetLevel=function(){o=null,d(),b.call(f)},f.enableAll=function(y){f.setLevel(f.levels.TRACE,y)},f.disableAll=function(y){f.setLevel(f.levels.SILENT,y)},f.rebuild=function(){if(l!==f&&(R=v(l.getLevel())),b.call(f),l===f)for(var y in i)i[y].rebuild()},R=v(l?l.getLevel():"WARN");var h=u();h!=null&&(o=v(h)),b.call(f)}l=new E,l.getLogger=function(L){if(typeof L!="symbol"&&typeof L!="string"||L==="")throw new TypeError("You must supply a name when creating a logger.");var f=i[L];return f||(f=i[L]=new E(L,l.methodFactory)),f};var K=typeof window!==n?window.log:void 0;return l.noConflict=function(){return typeof window!==n&&window.log===l&&(window.log=K),l},l.getLoggers=function(){return i},l.default=l,l})}(B)),B.exports}var z=me(),Y;(function(e){e[e.trace=0]="trace",e[e.debug=1]="debug",e[e.info=2]="info",e[e.warn=3]="warn",e[e.error=4]="error",e[e.silent=5]="silent"})(Y||(Y={}));var Z;(function(e){e.Default="livekit",e.Room="livekit-room",e.Participant="livekit-participant",e.Track="livekit-track",e.Publication="livekit-track-publication",e.Engine="livekit-engine",e.Signal="livekit-signal",e.PCManager="livekit-pc-manager",e.PCTransport="livekit-pc-transport",e.E2EE="lk-e2ee"})(Z||(Z={}));let Ie=z.getLogger("livekit");Object.values(Z).map(e=>z.getLogger(e)),Ie.setDefaultLevel(Y.info);const p=z.getLogger("lk-e2ee");var be=Object.defineProperty,Ee=(e,t,n)=>t in e?be(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,te=(e,t,n)=>Ee(e,typeof t!="symbol"?t+"":t,n);class Se{constructor(){te(this,"_locking"),te(this,"_locks"),this._locking=Promise.resolve(),this._locks=0}isLocked(){return this._locks>0}lock(){this._locks+=1;let t;const n=new Promise(a=>t=()=>{this._locks-=1,a()}),r=this._locking.then(()=>t);return this._locking=this._locking.then(()=>n),r}}var D;(function(e){e[e.WAITING=0]="WAITING",e[e.RUNNING=1]="RUNNING",e[e.COMPLETED=2]="COMPLETED"})(D||(D={}));class ke{constructor(){this.pendingTasks=new Map,this.taskMutex=new Se,this.nextTaskIndex=0}run(t){return C(this,void 0,void 0,function*(){const n={id:this.nextTaskIndex++,enqueuedAt:Date.now(),status:D.WAITING};this.pendingTasks.set(n.id,n);const r=yield this.taskMutex.lock();try{return n.executedAt=Date.now(),n.status=D.RUNNING,yield t()}finally{n.status=D.COMPLETED,this.pendingTasks.delete(n.id),r()}})}flush(){return C(this,void 0,void 0,function*(){return this.run(()=>C(this,void 0,void 0,function*(){}))})}snapshot(){return Array.from(this.pendingTasks.values())}}const N="AES-GCM",_e=10,J={key:10,delta:3,audio:1,empty:0},ne=12,Le={sharedKey:!1,ratchetSalt:"LKFrameEncryptionKey",ratchetWindowSize:8,failureTolerance:_e,keyringSize:16},Ce=100,re=2e3;class Ke extends Error{constructor(t,n){super(n||"an error has occured"),this.name="LiveKitError",this.code=t}}var ie;(function(e){e[e.NotAllowed=0]="NotAllowed",e[e.ServerUnreachable=1]="ServerUnreachable",e[e.InternalError=2]="InternalError",e[e.Cancelled=3]="Cancelled",e[e.LeaveRequest=4]="LeaveRequest"})(ie||(ie={}));var q;(function(e){e.PermissionDenied="PermissionDenied",e.NotFound="NotFound",e.DeviceInUse="DeviceInUse",e.Other="Other"})(q||(q={})),function(e){function t(n){if(n&&"name"in n)return n.name==="NotFoundError"||n.name==="DevicesNotFoundError"?e.NotFound:n.name==="NotAllowedError"||n.name==="PermissionDeniedError"?e.PermissionDenied:n.name==="NotReadableError"||n.name==="TrackStartError"?e.DeviceInUse:e.Other}e.getFailure=t}(q||(q={}));var x;(function(e){e[e.InvalidKey=0]="InvalidKey",e[e.MissingKey=1]="MissingKey",e[e.InternalError=2]="InternalError"})(x||(x={}));class T extends Ke{constructor(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:x.InternalError,r=arguments.length>2?arguments[2]:void 0;super(40,t),this.reason=n,this.participantIdentity=r}}var se;(function(e){e.SetKey="setKey",e.RatchetRequest="ratchetRequest",e.KeyRatcheted="keyRatcheted"})(se||(se={}));var j;(function(e){e.KeyRatcheted="keyRatcheted"})(j||(j={}));var oe;(function(e){e.ParticipantEncryptionStatusChanged="participantEncryptionStatusChanged",e.EncryptionError="encryptionError"})(oe||(oe={}));var O;(function(e){e.Error="cryptorError"})(O||(O={}));var H={exports:{}},ae;function xe(){if(ae)return H.exports;ae=1;var e=typeof Reflect=="object"?Reflect:null,t=e&&typeof e.apply=="function"?e.apply:function(s,c,u){return Function.prototype.apply.call(s,c,u)},n;e&&typeof e.ownKeys=="function"?n=e.ownKeys:Object.getOwnPropertySymbols?n=function(s){return Object.getOwnPropertyNames(s).concat(Object.getOwnPropertySymbols(s))}:n=function(s){return Object.getOwnPropertyNames(s)};function r(o){console&&console.warn&&console.warn(o)}var a=Number.isNaN||function(s){return s!==s};function i(){i.init.call(this)}H.exports=i,H.exports.once=f,i.EventEmitter=i,i.prototype._events=void 0,i.prototype._eventsCount=0,i.prototype._maxListeners=void 0;var l=10;function w(o){if(typeof o!="function")throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof o)}Object.defineProperty(i,"defaultMaxListeners",{enumerable:!0,get:function(){return l},set:function(o){if(typeof o!="number"||o<0||a(o))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+o+".");l=o}}),i.init=function(){(this._events===void 0||this._events===Object.getPrototypeOf(this)._events)&&(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},i.prototype.setMaxListeners=function(s){if(typeof s!="number"||s<0||a(s))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+s+".");return this._maxListeners=s,this};function m(o){return o._maxListeners===void 0?i.defaultMaxListeners:o._maxListeners}i.prototype.getMaxListeners=function(){return m(this)},i.prototype.emit=function(s){for(var c=[],u=1;u<arguments.length;u++)c.push(arguments[u]);var d=s==="error",v=this._events;if(v!==void 0)d=d&&v.error===void 0;else if(!d)return!1;if(d){var h;if(c.length>0&&(h=c[0]),h instanceof Error)throw h;var y=new Error("Unhandled error."+(h?" ("+h.message+")":""));throw y.context=h,y}var k=v[s];if(k===void 0)return!1;if(typeof k=="function")t(k,this,c);else for(var A=k.length,X=K(k,A),u=0;u<A;++u)t(X[u],this,c);return!0};function _(o,s,c,u){var d,v,h;if(w(c),v=o._events,v===void 0?(v=o._events=Object.create(null),o._eventsCount=0):(v.newListener!==void 0&&(o.emit("newListener",s,c.listener?c.listener:c),v=o._events),h=v[s]),h===void 0)h=v[s]=c,++o._eventsCount;else if(typeof h=="function"?h=v[s]=u?[c,h]:[h,c]:u?h.unshift(c):h.push(c),d=m(o),d>0&&h.length>d&&!h.warned){h.warned=!0;var y=new Error("Possible EventEmitter memory leak detected. "+h.length+" "+String(s)+" listeners added. Use emitter.setMaxListeners() to increase limit");y.name="MaxListenersExceededWarning",y.emitter=o,y.type=s,y.count=h.length,r(y)}return o}i.prototype.addListener=function(s,c){return _(this,s,c,!1)},i.prototype.on=i.prototype.addListener,i.prototype.prependListener=function(s,c){return _(this,s,c,!0)};function b(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,arguments.length===0?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function S(o,s,c){var u={fired:!1,wrapFn:void 0,target:o,type:s,listener:c},d=b.bind(u);return d.listener=c,u.wrapFn=d,d}i.prototype.once=function(s,c){return w(c),this.on(s,S(this,s,c)),this},i.prototype.prependOnceListener=function(s,c){return w(c),this.prependListener(s,S(this,s,c)),this},i.prototype.removeListener=function(s,c){var u,d,v,h,y;if(w(c),d=this._events,d===void 0)return this;if(u=d[s],u===void 0)return this;if(u===c||u.listener===c)--this._eventsCount===0?this._events=Object.create(null):(delete d[s],d.removeListener&&this.emit("removeListener",s,u.listener||c));else if(typeof u!="function"){for(v=-1,h=u.length-1;h>=0;h--)if(u[h]===c||u[h].listener===c){y=u[h].listener,v=h;break}if(v<0)return this;v===0?u.shift():g(u,v),u.length===1&&(d[s]=u[0]),d.removeListener!==void 0&&this.emit("removeListener",s,y||c)}return this},i.prototype.off=i.prototype.removeListener,i.prototype.removeAllListeners=function(s){var c,u,d;if(u=this._events,u===void 0)return this;if(u.removeListener===void 0)return arguments.length===0?(this._events=Object.create(null),this._eventsCount=0):u[s]!==void 0&&(--this._eventsCount===0?this._events=Object.create(null):delete u[s]),this;if(arguments.length===0){var v=Object.keys(u),h;for(d=0;d<v.length;++d)h=v[d],h!=="removeListener"&&this.removeAllListeners(h);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if(c=u[s],typeof c=="function")this.removeListener(s,c);else if(c!==void 0)for(d=c.length-1;d>=0;d--)this.removeListener(s,c[d]);return this};function I(o,s,c){var u=o._events;if(u===void 0)return[];var d=u[s];return d===void 0?[]:typeof d=="function"?c?[d.listener||d]:[d]:c?L(d):K(d,d.length)}i.prototype.listeners=function(s){return I(this,s,!0)},i.prototype.rawListeners=function(s){return I(this,s,!1)},i.listenerCount=function(o,s){return typeof o.listenerCount=="function"?o.listenerCount(s):E.call(o,s)},i.prototype.listenerCount=E;function E(o){var s=this._events;if(s!==void 0){var c=s[o];if(typeof c=="function")return 1;if(c!==void 0)return c.length}return 0}i.prototype.eventNames=function(){return this._eventsCount>0?n(this._events):[]};function K(o,s){for(var c=new Array(s),u=0;u<s;++u)c[u]=o[u];return c}function g(o,s){for(;s+1<o.length;s++)o[s]=o[s+1];o.pop()}function L(o){for(var s=new Array(o.length),c=0;c<s.length;++c)s[c]=o[c].listener||o[c];return s}function f(o,s){return new Promise(function(c,u){function d(h){o.removeListener(s,v),u(h)}function v(){typeof o.removeListener=="function"&&o.removeListener("error",d),c([].slice.call(arguments))}P(o,s,v,{once:!0}),s!=="error"&&R(o,d,{once:!0})})}function R(o,s,c){typeof o.on=="function"&&P(o,"error",s,c)}function P(o,s,c,u){if(typeof o.on=="function")u.once?o.once(s,c):o.on(s,c);else if(typeof o.addEventListener=="function")o.addEventListener(s,function d(v){u.once&&o.removeEventListener(s,d),c(v)});else throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof o)}return H.exports}var ce=xe();function Re(e){return"type"in e}function Pe(e){return C(this,arguments,void 0,function(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{name:N},r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:"encrypt";return function*(){return crypto.subtle.importKey("raw",t,n,!1,r==="derive"?["deriveBits","deriveKey"]:["encrypt","decrypt"])}()})}function ue(e,t){const r=new TextEncoder().encode(t);switch(e){case"HKDF":return{name:"HKDF",salt:r,hash:"SHA-256",info:new ArrayBuffer(128)};case"PBKDF2":return{name:"PBKDF2",salt:r,hash:"SHA-256",iterations:1e5};default:throw new Error("algorithm ".concat(e," is currently unsupported"))}}function le(e,t){return C(this,void 0,void 0,function*(){const n=ue(e.algorithm.name,t),r=yield crypto.subtle.deriveKey(n,e,{name:N,length:128},!1,["encrypt","decrypt"]);return{material:e,encryptionKey:r}})}function Te(e,t){return C(this,void 0,void 0,function*(){const n=ue(e.algorithm.name,t);return crypto.subtle.deriveBits(n,e,256)})}function Oe(e){for(var t=0;t<e.length-3;t++)if(e[t]==0&&e[t+1]==0&&e[t+2]==3)return!0;return!1}function Ae(e){const t=[];for(var n=e.length,r=0;r<e.length;)n-r>=3&&!e[r]&&!e[r+1]&&e[r+2]==3?(t.push(e[r++]),t.push(e[r++]),r++):t.push(e[r++]);return new Uint8Array(t)}const Me=2,de=3;function De(e){const t=[];for(var n=0,r=0;r<e.length;++r){var a=e[r];a<=de&&n>=Me&&(t.push(de),n=0),t.push(a),a==0?++n:n=0}return new Uint8Array(t)}class Fe{constructor(){this.consecutiveSifCount=0,this.lastSifReceivedAt=0,this.userFramesSinceSif=0}recordSif(){var t;this.consecutiveSifCount+=1,(t=this.sifSequenceStartedAt)!==null&&t!==void 0||(this.sifSequenceStartedAt=Date.now()),this.lastSifReceivedAt=Date.now()}recordUserFrame(){this.sifSequenceStartedAt!==void 0&&(this.userFramesSinceSif+=1,(this.userFramesSinceSif>this.consecutiveSifCount||Date.now()-this.lastSifReceivedAt>re)&&this.reset())}isSifAllowed(){return this.consecutiveSifCount<Ce&&(this.sifSequenceStartedAt===void 0||Date.now()-this.sifSequenceStartedAt<re)}reset(){this.userFramesSinceSif=0,this.consecutiveSifCount=0,this.sifSequenceStartedAt=void 0}}const fe=new Map;class Ue extends ce.EventEmitter{encodeFunction(t,n){throw Error("not implemented for subclass")}decodeFunction(t,n){throw Error("not implemented for subclass")}}class Be extends Ue{constructor(t){var n;super(),this.sendCounts=new Map,this.keys=t.keys,this.participantIdentity=t.participantIdentity,this.rtpMap=new Map,this.keyProviderOptions=t.keyProviderOptions,this.sifTrailer=(n=t.sifTrailer)!==null&&n!==void 0?n:Uint8Array.from([]),this.sifGuard=new Fe}get logContext(){return{participant:this.participantIdentity,mediaTrackId:this.trackId,fallbackCodec:this.videoCodec}}setParticipant(t,n){p.debug("setting new participant on cryptor",Object.assign(Object.assign({},this.logContext),{participant:t})),this.participantIdentity&&p.error("cryptor has already a participant set, participant should have been unset before",Object.assign({},this.logContext)),this.participantIdentity=t,this.keys=n,this.sifGuard.reset()}unsetParticipant(){p.debug("unsetting participant",this.logContext),this.participantIdentity=void 0}isEnabled(){if(this.participantIdentity)return fe.get(this.participantIdentity)}getParticipantIdentity(){return this.participantIdentity}getTrackId(){return this.trackId}setVideoCodec(t){this.videoCodec=t}setRtpMap(t){this.rtpMap=t}setupTransform(t,n,r,a,i){i&&(p.info("setting codec on cryptor to",{codec:i}),this.videoCodec=i),p.debug("Setting up frame cryptor transform",Object.assign({operation:t,passedTrackId:a,codec:i},this.logContext));const l=t==="encode"?this.encodeFunction:this.decodeFunction,w=new TransformStream({transform:l.bind(this)});n.pipeThrough(w).pipeTo(r).catch(m=>{p.warn(m),this.emit(O.Error,m instanceof T?m:new T(m.message,void 0,this.participantIdentity))}),this.trackId=a}setSifTrailer(t){p.debug("setting SIF trailer",Object.assign(Object.assign({},this.logContext),{trailer:t})),this.sifTrailer=t}encodeFunction(t,n){return C(this,void 0,void 0,function*(){var r;if(!this.isEnabled()||t.data.byteLength===0)return n.enqueue(t);const a=this.keys.getKeySet();if(!a){this.emit(O.Error,new T("key set not found for ".concat(this.participantIdentity," at index ").concat(this.keys.getCurrentKeyIndex()),x.MissingKey,this.participantIdentity));return}const{encryptionKey:i}=a,l=this.keys.getCurrentKeyIndex();if(i){const m=this.makeIV((r=t.getMetadata().synchronizationSource)!==null&&r!==void 0?r:-1,t.timestamp);let _=this.getUnencryptedBytes(t);const b=new Uint8Array(t.data,0,_.unencryptedBytes),S=new Uint8Array(2);S[0]=ne,S[1]=l;try{const I=yield crypto.subtle.encrypt({name:N,iv:m,additionalData:new Uint8Array(t.data,0,b.byteLength)},i,new Uint8Array(t.data,_.unencryptedBytes));let E=new Uint8Array(I.byteLength+m.byteLength+S.byteLength);E.set(new Uint8Array(I)),E.set(new Uint8Array(m),I.byteLength),E.set(S,I.byteLength+m.byteLength),_.isH264&&(E=De(E));var w=new Uint8Array(b.byteLength+E.byteLength);return w.set(b),w.set(E,b.byteLength),t.data=w.buffer,n.enqueue(t)}catch(I){p.error(I)}}else p.debug("failed to encrypt, emitting error",this.logContext),this.emit(O.Error,new T("encryption key missing for encoding",x.MissingKey,this.participantIdentity))})}decodeFunction(t,n){return C(this,void 0,void 0,function*(){if(!this.isEnabled()||t.data.byteLength===0)return p.debug("skipping empty frame",this.logContext),this.sifGuard.recordUserFrame(),n.enqueue(t);if(je(t.data,this.sifTrailer)){if(p.debug("enqueue SIF",this.logContext),this.sifGuard.recordSif(),this.sifGuard.isSifAllowed())return t.data=t.data.slice(0,t.data.byteLength-this.sifTrailer.byteLength),n.enqueue(t);p.warn("SIF limit reached, dropping frame");return}else this.sifGuard.recordUserFrame();const a=new Uint8Array(t.data)[t.data.byteLength-1];if(!this.keys.hasInvalidKeyAtIndex(a))if(this.keys.getKeySet(a))try{const i=yield this.decryptFrame(t,a);if(this.keys.decryptionSuccess(a),i)return n.enqueue(i)}catch(i){i instanceof T&&i.reason===x.InvalidKey?this.keys.hasValidKey&&(this.emit(O.Error,i),this.keys.decryptionFailure(a)):p.warn("decoding frame failed",{error:i})}else p.warn("skipping decryption due to missing key at index ".concat(a)),this.emit(O.Error,new T("missing key at index ".concat(a," for participant ").concat(this.participantIdentity),x.MissingKey,this.participantIdentity)),this.keys.decryptionFailure(a)})}decryptFrame(t,n){return C(this,arguments,void 0,function(r,a){var i=this;let l=arguments.length>2&&arguments[2]!==void 0?arguments[2]:void 0,w=arguments.length>3&&arguments[3]!==void 0?arguments[3]:{ratchetCount:0};return function*(){var m;const _=i.keys.getKeySet(a);if(!w.encryptionKey&&!_)throw new TypeError("no encryption key found for decryption of ".concat(i.participantIdentity));let b=i.getUnencryptedBytes(r);try{const I=new Uint8Array(r.data,0,b.unencryptedBytes);var S=new Uint8Array(r.data,I.length,r.data.byteLength-I.length);if(b.isH264&&Oe(S)){S=Ae(S);const s=new Uint8Array(I.byteLength+S.byteLength);s.set(I),s.set(S,I.byteLength),r.data=s.buffer}const E=new Uint8Array(r.data,r.data.byteLength-2,2),K=E[0],g=new Uint8Array(r.data,r.data.byteLength-K-E.byteLength,K),L=I.byteLength,f=r.data.byteLength-(I.byteLength+K+E.byteLength),R=yield crypto.subtle.decrypt({name:N,iv:g,additionalData:new Uint8Array(r.data,0,I.byteLength)},(m=w.encryptionKey)!==null&&m!==void 0?m:_.encryptionKey,new Uint8Array(r.data,L,f)),P=new ArrayBuffer(I.byteLength+R.byteLength),o=new Uint8Array(P);return o.set(new Uint8Array(r.data,0,I.byteLength)),o.set(new Uint8Array(R),I.byteLength),r.data=P,r}catch(I){if(i.keyProviderOptions.ratchetWindowSize>0)if(w.ratchetCount<i.keyProviderOptions.ratchetWindowSize){p.debug("ratcheting key attempt ".concat(w.ratchetCount," of ").concat(i.keyProviderOptions.ratchetWindowSize,", for kind ").concat(r instanceof RTCEncodedAudioFrame?"audio":"video"));let E,K;(l??_)===i.keys.getKeySet(a)&&(K=yield i.keys.ratchetKey(a,!1),E=yield le(K.cryptoKey,i.keyProviderOptions.ratchetSalt));const g=yield i.decryptFrame(r,a,l||_,{ratchetCount:w.ratchetCount+1,encryptionKey:E==null?void 0:E.encryptionKey});return g&&E&&(l??_)===i.keys.getKeySet(a)&&(i.keys.setKeySet(E,a,K),i.keys.setCurrentKeyIndex(a)),g}else throw p.warn("maximum ratchet attempts exceeded"),new T("valid key missing for participant ".concat(i.participantIdentity),x.InvalidKey,i.participantIdentity);else throw new T("Decryption failed: ".concat(I.message),x.InvalidKey,i.participantIdentity)}}()})}makeIV(t,n){var r;const a=new ArrayBuffer(ne),i=new DataView(a);this.sendCounts.has(t)||this.sendCounts.set(t,Math.floor(Math.random()*65535));const l=(r=this.sendCounts.get(t))!==null&&r!==void 0?r:0;return i.setUint32(0,t),i.setUint32(4,n),i.setUint32(8,n-l%65535),this.sendCounts.set(t,l+1),a}getUnencryptedBytes(t){var n,r={unencryptedBytes:0,isH264:!1};if(Re(t)){let a=(n=this.getVideoCodec(t))!==null&&n!==void 0?n:this.videoCodec;if(a!==this.detectedCodec&&(p.debug("detected different codec",Object.assign({detectedCodec:a,oldCodec:this.detectedCodec},this.logContext)),this.detectedCodec=a),a==="av1")throw new Error("".concat(a," is not yet supported for end to end encryption"));if(a==="vp8")r.unencryptedBytes=J[t.type];else if(a==="vp9")return r.unencryptedBytes=0,r;const i=new Uint8Array(t.data);try{const l=Ne(i);if(r.isH264=a==="h264"||l.some(w=>[M.SLICE_IDR,M.SLICE_NON_IDR].includes(he(i[w]))),r.isH264){for(const w of l)switch(he(i[w])){case M.SLICE_IDR:case M.SLICE_NON_IDR:return r.unencryptedBytes=w+2,r;default:break}throw new TypeError("Could not find NALU")}}catch{}return r.unencryptedBytes=J[t.type],r}else return r.unencryptedBytes=J.audio,r}getVideoCodec(t){if(this.rtpMap.size===0)return;const n=t.getMetadata().payloadType;return n?this.rtpMap.get(n):void 0}}function Ne(e){const t=[];let n=0,r=0,a=e.length-2;for(;r<a;){for(;r<a&&!(e[r]===0&&e[r+1]===0&&e[r+2]===1);)r++;r>=a&&(r=e.length);let i=r;for(;i>n&&e[i-1]===0;)i--;if(n===0){if(i!==n)throw TypeError("byte stream contains leading data")}else t.push(n);n=r=r+3}return t}function he(e){return e&qe}const qe=31;var M;(function(e){e[e.SLICE_NON_IDR=1]="SLICE_NON_IDR",e[e.SLICE_PARTITION_A=2]="SLICE_PARTITION_A",e[e.SLICE_PARTITION_B=3]="SLICE_PARTITION_B",e[e.SLICE_PARTITION_C=4]="SLICE_PARTITION_C",e[e.SLICE_IDR=5]="SLICE_IDR",e[e.SEI=6]="SEI",e[e.SPS=7]="SPS",e[e.PPS=8]="PPS",e[e.AUD=9]="AUD",e[e.END_SEQ=10]="END_SEQ",e[e.END_STREAM=11]="END_STREAM",e[e.FILLER_DATA=12]="FILLER_DATA",e[e.SPS_EXT=13]="SPS_EXT",e[e.PREFIX_NALU=14]="PREFIX_NALU",e[e.SUBSET_SPS=15]="SUBSET_SPS",e[e.DPS=16]="DPS",e[e.SLICE_AUX=19]="SLICE_AUX",e[e.SLICE_EXT=20]="SLICE_EXT",e[e.SLICE_LAYER_EXT=21]="SLICE_LAYER_EXT"})(M||(M={}));function je(e,t){if(t.byteLength===0)return!1;const n=new Uint8Array(e.slice(e.byteLength-t.byteLength));return t.every((r,a)=>r===n[a])}class pe extends ce.EventEmitter{get hasValidKey(){return!this.hasInvalidKeyAtIndex(this.currentKeyIndex)}constructor(t,n){if(super(),this.currentKeyIndex=0,n.keyringSize<1||n.keyringSize>256)throw new TypeError("Keyring size needs to be between 1 and 256");this.cryptoKeyRing=new Array(n.keyringSize).fill(void 0),this.decryptionFailureCounts=new Array(n.keyringSize).fill(0),this.keyProviderOptions=n,this.ratchetPromiseMap=new Map,this.participantIdentity=t}hasInvalidKeyAtIndex(t){return this.keyProviderOptions.failureTolerance>=0&&this.decryptionFailureCounts[t]>this.keyProviderOptions.failureTolerance}decryptionFailure(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.currentKeyIndex;this.keyProviderOptions.failureTolerance<0||(this.decryptionFailureCounts[t]+=1,this.decryptionFailureCounts[t]>this.keyProviderOptions.failureTolerance&&p.warn("key for ".concat(this.participantIdentity," at index ").concat(t," is being marked as invalid")))}decryptionSuccess(){let t=arguments.length>0&&arguments[0]!==void 0?arguments[0]:this.currentKeyIndex;this.resetKeyStatus(t)}resetKeyStatus(t){t===void 0?this.decryptionFailureCounts.fill(0):this.decryptionFailureCounts[t]=0}ratchetKey(t){let n=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!0;const r=t??this.getCurrentKeyIndex(),a=this.ratchetPromiseMap.get(r);if(typeof a<"u")return a;const i=new Promise((l,w)=>C(this,void 0,void 0,function*(){try{const m=this.getKeySet(r);if(!m)throw new TypeError("Cannot ratchet key without a valid keyset of participant ".concat(this.participantIdentity));const _=m.material,b=yield Te(_,this.keyProviderOptions.ratchetSalt),S=yield Pe(b,_.algorithm.name,"derive"),I={chainKey:b,cryptoKey:S};n&&(yield this.setKeyFromMaterial(S,r,I)),l(I)}catch(m){w(m)}finally{this.ratchetPromiseMap.delete(r)}}));return this.ratchetPromiseMap.set(r,i),i}setKey(t){return C(this,arguments,void 0,function(n){var r=this;let a=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0;return function*(){yield r.setKeyFromMaterial(n,a),r.resetKeyStatus(a)}()})}setKeyFromMaterial(t,n){return C(this,arguments,void 0,function(r,a){var i=this;let l=arguments.length>2&&arguments[2]!==void 0?arguments[2]:null;return function*(){const w=yield le(r,i.keyProviderOptions.ratchetSalt),m=a>=0?a%i.cryptoKeyRing.length:i.currentKeyIndex;p.debug("setting new key with index ".concat(a),{usage:r.usages,algorithm:r.algorithm,ratchetSalt:i.keyProviderOptions.ratchetSalt}),i.setKeySet(w,m,l),m>=0&&(i.currentKeyIndex=m)}()})}setKeySet(t,n){let r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:null;this.cryptoKeyRing[n%this.cryptoKeyRing.length]=t,r&&this.emit(j.KeyRatcheted,r,this.participantIdentity,n)}setCurrentKeyIndex(t){return C(this,void 0,void 0,function*(){this.currentKeyIndex=t%this.cryptoKeyRing.length,this.resetKeyStatus(t)})}getCurrentKeyIndex(){return this.currentKeyIndex}getKeySet(t){return this.cryptoKeyRing[t??this.currentKeyIndex]}}const F=[],ye=new Map;let $,He=new ke,Ge=!1,G=!1,ge,U=Le,ve=new Map;p.setDefaultLevel("info"),onmessage=e=>{He.run(()=>C(void 0,void 0,void 0,function*(){const{kind:t,data:n}=e.data;switch(t){case"init":p.setLevel(n.loglevel),p.info("worker initialized"),U=n.keyProviderOptions,G=!!n.keyProviderOptions.sharedKey,postMessage({kind:"initAck",data:{enabled:Ge}});break;case"enable":Xe(n.enabled,n.participantIdentity),p.info("updated e2ee enabled status for ".concat(n.participantIdentity," to ").concat(n.enabled)),postMessage(e.data);break;case"decode":W(n.participantIdentity,n.trackId).setupTransform(t,n.readableStream,n.writableStream,n.trackId,n.codec);break;case"encode":W(n.participantIdentity,n.trackId).setupTransform(t,n.readableStream,n.writableStream,n.trackId,n.codec);break;case"setKey":G?yield ze(n.key,n.keyIndex):n.participantIdentity?(p.info("set participant sender key ".concat(n.participantIdentity," index ").concat(n.keyIndex)),yield V(n.participantIdentity).setKey(n.key,n.keyIndex)):p.error("no participant Id was provided and shared key usage is disabled");break;case"removeTransform":Ve(n.trackId,n.participantIdentity);break;case"updateCodec":W(n.participantIdentity,n.trackId).setVideoCodec(n.codec);break;case"setRTPMap":ve=n.map,F.forEach(l=>{l.getParticipantIdentity()===n.participantIdentity&&l.setRtpMap(n.map)});break;case"ratchetRequest":We(n);break;case"setSifTrailer":Je(n.trailer);break}}))};function We(e){return C(this,void 0,void 0,function*(){if(G){const t=Q();yield t.ratchetKey(e.keyIndex),t.resetKeyStatus()}else if(e.participantIdentity){const t=V(e.participantIdentity);yield t.ratchetKey(e.keyIndex),t.resetKeyStatus()}else p.error("no participant Id was provided for ratchet request and shared key usage is disabled")})}function W(e,t){let n=F.filter(a=>a.getTrackId()===t);if(n.length>1){const a=n.map(i=>({participant:i.getParticipantIdentity()})).join(",");p.error("Found multiple cryptors for the same trackID ".concat(t,". target participant: ").concat(e," "),{participants:a})}let r=n[0];if(r)e!==r.getParticipantIdentity()&&r.setParticipant(e,V(e));else{if(p.info("creating new cryptor for",{participantIdentity:e}),!U)throw Error("Missing keyProvider options");r=new Be({participantIdentity:e,keys:V(e),keyProviderOptions:U,sifTrailer:ge}),r.setRtpMap(ve),Ye(r),F.push(r)}return r}function V(e){if(G)return Q();let t=ye.get(e);return t||(t=new pe(e,U),t.on(j.KeyRatcheted,Ze),ye.set(e,t)),t}function Q(){return $||(p.debug("creating new shared key handler"),$=new pe("shared-key",U)),$}function Ve(e,t){const n=F.filter(a=>a.getParticipantIdentity()===t&&a.getTrackId()===e);n.length>1&&p.error("Found multiple cryptors for the same participant and trackID combination",{trackId:e,participantIdentity:t});const r=n[0];r?r.unsetParticipant():p.warn("Could not unset participant on cryptor",{trackId:e,participantIdentity:t})}function Xe(e,t){p.debug("setting encryption enabled for all tracks of ".concat(t),{enable:e}),fe.set(t,e)}function ze(e,t){return C(this,void 0,void 0,function*(){p.info("set shared key",{index:t}),yield Q().setKey(e,t)})}function Ye(e){e.on(O.Error,t=>{const n={kind:"error",data:{error:new Error("".concat(x[t.reason],": ").concat(t.message))}};postMessage(n)})}function Ze(e,t,n){postMessage({kind:"ratchetKey",data:{participantIdentity:t,keyIndex:n,ratchetResult:e}})}function Je(e){ge=e,F.forEach(t=>{t.setSifTrailer(e)})}self.RTCTransformEvent&&(p.debug("setup transform event"),self.onrtctransform=e=>{const t=e.transformer;p.debug("transformer",t),t.handled=!0;const{kind:n,participantIdentity:r,trackId:a,codec:i}=t.options,l=W(r,a);p.debug("transform",{codec:i}),l.setupTransform(n,t.readable,t.writable,a,i)})})();
|
|
2
|
-
//# sourceMappingURL=livekit-client.e2ee.worker-D7jue42X.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"livekit-client.e2ee.worker-D7jue42X.js","sources":["../node_modules/livekit-client/dist/livekit-client.e2ee.worker.mjs"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\nvar loglevel$1 = {exports: {}};\n\n/*\n* loglevel - https://github.com/pimterry/loglevel\n*\n* Copyright (c) 2013 Tim Perry\n* Licensed under the MIT license.\n*/\nvar loglevel = loglevel$1.exports;\nvar hasRequiredLoglevel;\nfunction requireLoglevel() {\n if (hasRequiredLoglevel) return loglevel$1.exports;\n hasRequiredLoglevel = 1;\n (function (module) {\n (function (root, definition) {\n\n if (module.exports) {\n module.exports = definition();\n } else {\n root.log = definition();\n }\n })(loglevel, function () {\n\n // Slightly dubious tricks to cut down minimized file size\n var noop = function () {};\n var undefinedType = \"undefined\";\n var isIE = typeof window !== undefinedType && typeof window.navigator !== undefinedType && /Trident\\/|MSIE /.test(window.navigator.userAgent);\n var logMethods = [\"trace\", \"debug\", \"info\", \"warn\", \"error\"];\n var _loggersByName = {};\n var defaultLogger = null;\n\n // Cross-browser bind equivalent that works at least back to IE6\n function bindMethod(obj, methodName) {\n var method = obj[methodName];\n if (typeof method.bind === 'function') {\n return method.bind(obj);\n } else {\n try {\n return Function.prototype.bind.call(method, obj);\n } catch (e) {\n // Missing bind shim or IE8 + Modernizr, fallback to wrapping\n return function () {\n return Function.prototype.apply.apply(method, [obj, arguments]);\n };\n }\n }\n }\n\n // Trace() doesn't print the message in IE, so for that case we need to wrap it\n function traceForIE() {\n if (console.log) {\n if (console.log.apply) {\n console.log.apply(console, arguments);\n } else {\n // In old IE, native console methods themselves don't have apply().\n Function.prototype.apply.apply(console.log, [console, arguments]);\n }\n }\n if (console.trace) console.trace();\n }\n\n // Build the best logging method possible for this env\n // Wherever possible we want to bind, not wrap, to preserve stack traces\n function realMethod(methodName) {\n if (methodName === 'debug') {\n methodName = 'log';\n }\n if (typeof console === undefinedType) {\n return false; // No method possible, for now - fixed later by enableLoggingWhenConsoleArrives\n } else if (methodName === 'trace' && isIE) {\n return traceForIE;\n } else if (console[methodName] !== undefined) {\n return bindMethod(console, methodName);\n } else if (console.log !== undefined) {\n return bindMethod(console, 'log');\n } else {\n return noop;\n }\n }\n\n // These private functions always need `this` to be set properly\n\n function replaceLoggingMethods() {\n /*jshint validthis:true */\n var level = this.getLevel();\n\n // Replace the actual methods.\n for (var i = 0; i < logMethods.length; i++) {\n var methodName = logMethods[i];\n this[methodName] = i < level ? noop : this.methodFactory(methodName, level, this.name);\n }\n\n // Define log.log as an alias for log.debug\n this.log = this.debug;\n\n // Return any important warnings.\n if (typeof console === undefinedType && level < this.levels.SILENT) {\n return \"No console available for logging\";\n }\n }\n\n // In old IE versions, the console isn't present until you first open it.\n // We build realMethod() replacements here that regenerate logging methods\n function enableLoggingWhenConsoleArrives(methodName) {\n return function () {\n if (typeof console !== undefinedType) {\n replaceLoggingMethods.call(this);\n this[methodName].apply(this, arguments);\n }\n };\n }\n\n // By default, we use closely bound real methods wherever possible, and\n // otherwise we wait for a console to appear, and then try again.\n function defaultMethodFactory(methodName, _level, _loggerName) {\n /*jshint validthis:true */\n return realMethod(methodName) || enableLoggingWhenConsoleArrives.apply(this, arguments);\n }\n function Logger(name, factory) {\n // Private instance variables.\n var self = this;\n /**\n * The level inherited from a parent logger (or a global default). We\n * cache this here rather than delegating to the parent so that it stays\n * in sync with the actual logging methods that we have installed (the\n * parent could change levels but we might not have rebuilt the loggers\n * in this child yet).\n * @type {number}\n */\n var inheritedLevel;\n /**\n * The default level for this logger, if any. If set, this overrides\n * `inheritedLevel`.\n * @type {number|null}\n */\n var defaultLevel;\n /**\n * A user-specific level for this logger. If set, this overrides\n * `defaultLevel`.\n * @type {number|null}\n */\n var userLevel;\n var storageKey = \"loglevel\";\n if (typeof name === \"string\") {\n storageKey += \":\" + name;\n } else if (typeof name === \"symbol\") {\n storageKey = undefined;\n }\n function persistLevelIfPossible(levelNum) {\n var levelName = (logMethods[levelNum] || 'silent').toUpperCase();\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage[storageKey] = levelName;\n return;\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie = encodeURIComponent(storageKey) + \"=\" + levelName + \";\";\n } catch (ignore) {}\n }\n function getPersistedLevel() {\n var storedLevel;\n if (typeof window === undefinedType || !storageKey) return;\n try {\n storedLevel = window.localStorage[storageKey];\n } catch (ignore) {}\n\n // Fallback to cookies if local storage gives us nothing\n if (typeof storedLevel === undefinedType) {\n try {\n var cookie = window.document.cookie;\n var cookieName = encodeURIComponent(storageKey);\n var location = cookie.indexOf(cookieName + \"=\");\n if (location !== -1) {\n storedLevel = /^([^;]+)/.exec(cookie.slice(location + cookieName.length + 1))[1];\n }\n } catch (ignore) {}\n }\n\n // If the stored level is not valid, treat it as if nothing was stored.\n if (self.levels[storedLevel] === undefined) {\n storedLevel = undefined;\n }\n return storedLevel;\n }\n function clearPersistedLevel() {\n if (typeof window === undefinedType || !storageKey) return;\n\n // Use localStorage if available\n try {\n window.localStorage.removeItem(storageKey);\n } catch (ignore) {}\n\n // Use session cookie as fallback\n try {\n window.document.cookie = encodeURIComponent(storageKey) + \"=; expires=Thu, 01 Jan 1970 00:00:00 UTC\";\n } catch (ignore) {}\n }\n function normalizeLevel(input) {\n var level = input;\n if (typeof level === \"string\" && self.levels[level.toUpperCase()] !== undefined) {\n level = self.levels[level.toUpperCase()];\n }\n if (typeof level === \"number\" && level >= 0 && level <= self.levels.SILENT) {\n return level;\n } else {\n throw new TypeError(\"log.setLevel() called with invalid level: \" + input);\n }\n }\n\n /*\n *\n * Public logger API - see https://github.com/pimterry/loglevel for details\n *\n */\n\n self.name = name;\n self.levels = {\n \"TRACE\": 0,\n \"DEBUG\": 1,\n \"INFO\": 2,\n \"WARN\": 3,\n \"ERROR\": 4,\n \"SILENT\": 5\n };\n self.methodFactory = factory || defaultMethodFactory;\n self.getLevel = function () {\n if (userLevel != null) {\n return userLevel;\n } else if (defaultLevel != null) {\n return defaultLevel;\n } else {\n return inheritedLevel;\n }\n };\n self.setLevel = function (level, persist) {\n userLevel = normalizeLevel(level);\n if (persist !== false) {\n // defaults to true\n persistLevelIfPossible(userLevel);\n }\n\n // NOTE: in v2, this should call rebuild(), which updates children.\n return replaceLoggingMethods.call(self);\n };\n self.setDefaultLevel = function (level) {\n defaultLevel = normalizeLevel(level);\n if (!getPersistedLevel()) {\n self.setLevel(level, false);\n }\n };\n self.resetLevel = function () {\n userLevel = null;\n clearPersistedLevel();\n replaceLoggingMethods.call(self);\n };\n self.enableAll = function (persist) {\n self.setLevel(self.levels.TRACE, persist);\n };\n self.disableAll = function (persist) {\n self.setLevel(self.levels.SILENT, persist);\n };\n self.rebuild = function () {\n if (defaultLogger !== self) {\n inheritedLevel = normalizeLevel(defaultLogger.getLevel());\n }\n replaceLoggingMethods.call(self);\n if (defaultLogger === self) {\n for (var childName in _loggersByName) {\n _loggersByName[childName].rebuild();\n }\n }\n };\n\n // Initialize all the internal levels.\n inheritedLevel = normalizeLevel(defaultLogger ? defaultLogger.getLevel() : \"WARN\");\n var initialLevel = getPersistedLevel();\n if (initialLevel != null) {\n userLevel = normalizeLevel(initialLevel);\n }\n replaceLoggingMethods.call(self);\n }\n\n /*\n *\n * Top-level API\n *\n */\n\n defaultLogger = new Logger();\n defaultLogger.getLogger = function getLogger(name) {\n if (typeof name !== \"symbol\" && typeof name !== \"string\" || name === \"\") {\n throw new TypeError(\"You must supply a name when creating a logger.\");\n }\n var logger = _loggersByName[name];\n if (!logger) {\n logger = _loggersByName[name] = new Logger(name, defaultLogger.methodFactory);\n }\n return logger;\n };\n\n // Grab the current global log variable in case of overwrite\n var _log = typeof window !== undefinedType ? window.log : undefined;\n defaultLogger.noConflict = function () {\n if (typeof window !== undefinedType && window.log === defaultLogger) {\n window.log = _log;\n }\n return defaultLogger;\n };\n defaultLogger.getLoggers = function getLoggers() {\n return _loggersByName;\n };\n\n // ES6 default export, for compatibility\n defaultLogger['default'] = defaultLogger;\n return defaultLogger;\n });\n })(loglevel$1);\n return loglevel$1.exports;\n}\n\nvar loglevelExports = requireLoglevel();\n\nvar LogLevel;\n(function (LogLevel) {\n LogLevel[LogLevel[\"trace\"] = 0] = \"trace\";\n LogLevel[LogLevel[\"debug\"] = 1] = \"debug\";\n LogLevel[LogLevel[\"info\"] = 2] = \"info\";\n LogLevel[LogLevel[\"warn\"] = 3] = \"warn\";\n LogLevel[LogLevel[\"error\"] = 4] = \"error\";\n LogLevel[LogLevel[\"silent\"] = 5] = \"silent\";\n})(LogLevel || (LogLevel = {}));\nvar LoggerNames;\n(function (LoggerNames) {\n LoggerNames[\"Default\"] = \"livekit\";\n LoggerNames[\"Room\"] = \"livekit-room\";\n LoggerNames[\"Participant\"] = \"livekit-participant\";\n LoggerNames[\"Track\"] = \"livekit-track\";\n LoggerNames[\"Publication\"] = \"livekit-track-publication\";\n LoggerNames[\"Engine\"] = \"livekit-engine\";\n LoggerNames[\"Signal\"] = \"livekit-signal\";\n LoggerNames[\"PCManager\"] = \"livekit-pc-manager\";\n LoggerNames[\"PCTransport\"] = \"livekit-pc-transport\";\n LoggerNames[\"E2EE\"] = \"lk-e2ee\";\n})(LoggerNames || (LoggerNames = {}));\nlet livekitLogger = loglevelExports.getLogger('livekit');\nObject.values(LoggerNames).map(name => loglevelExports.getLogger(name));\nlivekitLogger.setDefaultLevel(LogLevel.info);\nconst workerLogger = loglevelExports.getLogger('lk-e2ee');\n\nvar e = Object.defineProperty;\nvar h = (i, s, t) => s in i ? e(i, s, {\n enumerable: true,\n configurable: true,\n writable: true,\n value: t\n}) : i[s] = t;\nvar o = (i, s, t) => h(i, typeof s != \"symbol\" ? s + \"\" : s, t);\nclass _ {\n constructor() {\n o(this, \"_locking\");\n o(this, \"_locks\");\n this._locking = Promise.resolve(), this._locks = 0;\n }\n isLocked() {\n return this._locks > 0;\n }\n lock() {\n this._locks += 1;\n let s;\n const t = new Promise(l => s = () => {\n this._locks -= 1, l();\n }),\n c = this._locking.then(() => s);\n return this._locking = this._locking.then(() => t), c;\n }\n}\n\nvar QueueTaskStatus;\n(function (QueueTaskStatus) {\n QueueTaskStatus[QueueTaskStatus[\"WAITING\"] = 0] = \"WAITING\";\n QueueTaskStatus[QueueTaskStatus[\"RUNNING\"] = 1] = \"RUNNING\";\n QueueTaskStatus[QueueTaskStatus[\"COMPLETED\"] = 2] = \"COMPLETED\";\n})(QueueTaskStatus || (QueueTaskStatus = {}));\nclass AsyncQueue {\n constructor() {\n this.pendingTasks = new Map();\n this.taskMutex = new _();\n this.nextTaskIndex = 0;\n }\n run(task) {\n return __awaiter(this, void 0, void 0, function* () {\n const taskInfo = {\n id: this.nextTaskIndex++,\n enqueuedAt: Date.now(),\n status: QueueTaskStatus.WAITING\n };\n this.pendingTasks.set(taskInfo.id, taskInfo);\n const unlock = yield this.taskMutex.lock();\n try {\n taskInfo.executedAt = Date.now();\n taskInfo.status = QueueTaskStatus.RUNNING;\n return yield task();\n } finally {\n taskInfo.status = QueueTaskStatus.COMPLETED;\n this.pendingTasks.delete(taskInfo.id);\n unlock();\n }\n });\n }\n flush() {\n return __awaiter(this, void 0, void 0, function* () {\n return this.run(() => __awaiter(this, void 0, void 0, function* () {}));\n });\n }\n snapshot() {\n return Array.from(this.pendingTasks.values());\n }\n}\n\nconst ENCRYPTION_ALGORITHM = 'AES-GCM';\n// How many consecutive frames can fail decrypting before a particular key gets marked as invalid\nconst DECRYPTION_FAILURE_TOLERANCE = 10;\n// We copy the first bytes of the VP8 payload unencrypted.\n// For keyframes this is 10 bytes, for non-keyframes (delta) 3. See\n// https://tools.ietf.org/html/rfc6386#section-9.1\n// This allows the bridge to continue detecting keyframes (only one byte needed in the JVB)\n// and is also a bit easier for the VP8 decoder (i.e. it generates funny garbage pictures\n// instead of being unable to decode).\n// This is a bit for show and we might want to reduce to 1 unconditionally in the final version.\n//\n// For audio (where frame.type is not set) we do not encrypt the opus TOC byte:\n// https://tools.ietf.org/html/rfc6716#section-3.1\nconst UNENCRYPTED_BYTES = {\n key: 10,\n delta: 3,\n audio: 1,\n // frame.type is not set on audio, so this is set manually\n empty: 0\n};\n/* We use a 12 byte bit IV. This is signalled in plain together with the\n packet. See https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/encrypt#parameters */\nconst IV_LENGTH = 12;\nconst SALT = 'LKFrameEncryptionKey';\nconst KEY_PROVIDER_DEFAULTS = {\n sharedKey: false,\n ratchetSalt: SALT,\n ratchetWindowSize: 8,\n failureTolerance: DECRYPTION_FAILURE_TOLERANCE,\n keyringSize: 16\n};\nconst MAX_SIF_COUNT = 100;\nconst MAX_SIF_DURATION = 2000;\n\nclass LivekitError extends Error {\n constructor(code, message) {\n super(message || 'an error has occured');\n this.name = 'LiveKitError';\n this.code = code;\n }\n}\nvar ConnectionErrorReason;\n(function (ConnectionErrorReason) {\n ConnectionErrorReason[ConnectionErrorReason[\"NotAllowed\"] = 0] = \"NotAllowed\";\n ConnectionErrorReason[ConnectionErrorReason[\"ServerUnreachable\"] = 1] = \"ServerUnreachable\";\n ConnectionErrorReason[ConnectionErrorReason[\"InternalError\"] = 2] = \"InternalError\";\n ConnectionErrorReason[ConnectionErrorReason[\"Cancelled\"] = 3] = \"Cancelled\";\n ConnectionErrorReason[ConnectionErrorReason[\"LeaveRequest\"] = 4] = \"LeaveRequest\";\n})(ConnectionErrorReason || (ConnectionErrorReason = {}));\nvar MediaDeviceFailure;\n(function (MediaDeviceFailure) {\n // user rejected permissions\n MediaDeviceFailure[\"PermissionDenied\"] = \"PermissionDenied\";\n // device is not available\n MediaDeviceFailure[\"NotFound\"] = \"NotFound\";\n // device is in use. On Windows, only a single tab may get access to a device at a time.\n MediaDeviceFailure[\"DeviceInUse\"] = \"DeviceInUse\";\n MediaDeviceFailure[\"Other\"] = \"Other\";\n})(MediaDeviceFailure || (MediaDeviceFailure = {}));\n(function (MediaDeviceFailure) {\n function getFailure(error) {\n if (error && 'name' in error) {\n if (error.name === 'NotFoundError' || error.name === 'DevicesNotFoundError') {\n return MediaDeviceFailure.NotFound;\n }\n if (error.name === 'NotAllowedError' || error.name === 'PermissionDeniedError') {\n return MediaDeviceFailure.PermissionDenied;\n }\n if (error.name === 'NotReadableError' || error.name === 'TrackStartError') {\n return MediaDeviceFailure.DeviceInUse;\n }\n return MediaDeviceFailure.Other;\n }\n }\n MediaDeviceFailure.getFailure = getFailure;\n})(MediaDeviceFailure || (MediaDeviceFailure = {}));\n\nvar CryptorErrorReason;\n(function (CryptorErrorReason) {\n CryptorErrorReason[CryptorErrorReason[\"InvalidKey\"] = 0] = \"InvalidKey\";\n CryptorErrorReason[CryptorErrorReason[\"MissingKey\"] = 1] = \"MissingKey\";\n CryptorErrorReason[CryptorErrorReason[\"InternalError\"] = 2] = \"InternalError\";\n})(CryptorErrorReason || (CryptorErrorReason = {}));\nclass CryptorError extends LivekitError {\n constructor(message) {\n let reason = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : CryptorErrorReason.InternalError;\n let participantIdentity = arguments.length > 2 ? arguments[2] : undefined;\n super(40, message);\n this.reason = reason;\n this.participantIdentity = participantIdentity;\n }\n}\n\nvar KeyProviderEvent;\n(function (KeyProviderEvent) {\n KeyProviderEvent[\"SetKey\"] = \"setKey\";\n /** Event for requesting to ratchet the key used to encrypt the stream */\n KeyProviderEvent[\"RatchetRequest\"] = \"ratchetRequest\";\n /** Emitted when a key is ratcheted. Could be after auto-ratcheting on decryption failure or\n * following a `RatchetRequest`, will contain the ratcheted key material */\n KeyProviderEvent[\"KeyRatcheted\"] = \"keyRatcheted\";\n})(KeyProviderEvent || (KeyProviderEvent = {}));\nvar KeyHandlerEvent;\n(function (KeyHandlerEvent) {\n /** Emitted when a key has been ratcheted. Is emitted when any key has been ratcheted\n * i.e. when the FrameCryptor tried to ratchet when decryption is failing */\n KeyHandlerEvent[\"KeyRatcheted\"] = \"keyRatcheted\";\n})(KeyHandlerEvent || (KeyHandlerEvent = {}));\nvar EncryptionEvent;\n(function (EncryptionEvent) {\n EncryptionEvent[\"ParticipantEncryptionStatusChanged\"] = \"participantEncryptionStatusChanged\";\n EncryptionEvent[\"EncryptionError\"] = \"encryptionError\";\n})(EncryptionEvent || (EncryptionEvent = {}));\nvar CryptorEvent;\n(function (CryptorEvent) {\n CryptorEvent[\"Error\"] = \"cryptorError\";\n})(CryptorEvent || (CryptorEvent = {}));\n\nvar events = {exports: {}};\n\nvar hasRequiredEvents;\nfunction requireEvents() {\n if (hasRequiredEvents) return events.exports;\n hasRequiredEvents = 1;\n var R = typeof Reflect === 'object' ? Reflect : null;\n var ReflectApply = R && typeof R.apply === 'function' ? R.apply : function ReflectApply(target, receiver, args) {\n return Function.prototype.apply.call(target, receiver, args);\n };\n var ReflectOwnKeys;\n if (R && typeof R.ownKeys === 'function') {\n ReflectOwnKeys = R.ownKeys;\n } else if (Object.getOwnPropertySymbols) {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target).concat(Object.getOwnPropertySymbols(target));\n };\n } else {\n ReflectOwnKeys = function ReflectOwnKeys(target) {\n return Object.getOwnPropertyNames(target);\n };\n }\n function ProcessEmitWarning(warning) {\n if (console && console.warn) console.warn(warning);\n }\n var NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n return value !== value;\n };\n function EventEmitter() {\n EventEmitter.init.call(this);\n }\n events.exports = EventEmitter;\n events.exports.once = once;\n\n // Backwards-compat with node 0.10.x\n EventEmitter.EventEmitter = EventEmitter;\n EventEmitter.prototype._events = undefined;\n EventEmitter.prototype._eventsCount = 0;\n EventEmitter.prototype._maxListeners = undefined;\n\n // By default EventEmitters will print a warning if more than 10 listeners are\n // added to it. This is a useful default which helps finding memory leaks.\n var defaultMaxListeners = 10;\n function checkListener(listener) {\n if (typeof listener !== 'function') {\n throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n }\n }\n Object.defineProperty(EventEmitter, 'defaultMaxListeners', {\n enumerable: true,\n get: function () {\n return defaultMaxListeners;\n },\n set: function (arg) {\n if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n }\n defaultMaxListeners = arg;\n }\n });\n EventEmitter.init = function () {\n if (this._events === undefined || this._events === Object.getPrototypeOf(this)._events) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n }\n this._maxListeners = this._maxListeners || undefined;\n };\n\n // Obviously not all Emitters should be limited to 10. This function allows\n // that to be increased. Set to zero for unlimited.\n EventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n }\n this._maxListeners = n;\n return this;\n };\n function _getMaxListeners(that) {\n if (that._maxListeners === undefined) return EventEmitter.defaultMaxListeners;\n return that._maxListeners;\n }\n EventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n return _getMaxListeners(this);\n };\n EventEmitter.prototype.emit = function emit(type) {\n var args = [];\n for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n var doError = type === 'error';\n var events = this._events;\n if (events !== undefined) doError = doError && events.error === undefined;else if (!doError) return false;\n\n // If there is no 'error' event listener then throw.\n if (doError) {\n var er;\n if (args.length > 0) er = args[0];\n if (er instanceof Error) {\n // Note: The comments on the `throw` lines are intentional, they show\n // up in Node's output if this results in an unhandled exception.\n throw er; // Unhandled 'error' event\n }\n // At least give some kind of context to the user\n var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n err.context = er;\n throw err; // Unhandled 'error' event\n }\n var handler = events[type];\n if (handler === undefined) return false;\n if (typeof handler === 'function') {\n ReflectApply(handler, this, args);\n } else {\n var len = handler.length;\n var listeners = arrayClone(handler, len);\n for (var i = 0; i < len; ++i) ReflectApply(listeners[i], this, args);\n }\n return true;\n };\n function _addListener(target, type, listener, prepend) {\n var m;\n var events;\n var existing;\n checkListener(listener);\n events = target._events;\n if (events === undefined) {\n events = target._events = Object.create(null);\n target._eventsCount = 0;\n } else {\n // To avoid recursion in the case that type === \"newListener\"! Before\n // adding it to the listeners, first emit \"newListener\".\n if (events.newListener !== undefined) {\n target.emit('newListener', type, listener.listener ? listener.listener : listener);\n\n // Re-assign `events` because a newListener handler could have caused the\n // this._events to be assigned to a new object\n events = target._events;\n }\n existing = events[type];\n }\n if (existing === undefined) {\n // Optimize the case of one listener. Don't need the extra array object.\n existing = events[type] = listener;\n ++target._eventsCount;\n } else {\n if (typeof existing === 'function') {\n // Adding the second element, need to change to array.\n existing = events[type] = prepend ? [listener, existing] : [existing, listener];\n // If we've already got an array, just append.\n } else if (prepend) {\n existing.unshift(listener);\n } else {\n existing.push(listener);\n }\n\n // Check for listener leak\n m = _getMaxListeners(target);\n if (m > 0 && existing.length > m && !existing.warned) {\n existing.warned = true;\n // No error code for this since it is a Warning\n // eslint-disable-next-line no-restricted-syntax\n var w = new Error('Possible EventEmitter memory leak detected. ' + existing.length + ' ' + String(type) + ' listeners ' + 'added. Use emitter.setMaxListeners() to ' + 'increase limit');\n w.name = 'MaxListenersExceededWarning';\n w.emitter = target;\n w.type = type;\n w.count = existing.length;\n ProcessEmitWarning(w);\n }\n }\n return target;\n }\n EventEmitter.prototype.addListener = function addListener(type, listener) {\n return _addListener(this, type, listener, false);\n };\n EventEmitter.prototype.on = EventEmitter.prototype.addListener;\n EventEmitter.prototype.prependListener = function prependListener(type, listener) {\n return _addListener(this, type, listener, true);\n };\n function onceWrapper() {\n if (!this.fired) {\n this.target.removeListener(this.type, this.wrapFn);\n this.fired = true;\n if (arguments.length === 0) return this.listener.call(this.target);\n return this.listener.apply(this.target, arguments);\n }\n }\n function _onceWrap(target, type, listener) {\n var state = {\n fired: false,\n wrapFn: undefined,\n target: target,\n type: type,\n listener: listener\n };\n var wrapped = onceWrapper.bind(state);\n wrapped.listener = listener;\n state.wrapFn = wrapped;\n return wrapped;\n }\n EventEmitter.prototype.once = function once(type, listener) {\n checkListener(listener);\n this.on(type, _onceWrap(this, type, listener));\n return this;\n };\n EventEmitter.prototype.prependOnceListener = function prependOnceListener(type, listener) {\n checkListener(listener);\n this.prependListener(type, _onceWrap(this, type, listener));\n return this;\n };\n\n // Emits a 'removeListener' event if and only if the listener was removed.\n EventEmitter.prototype.removeListener = function removeListener(type, listener) {\n var list, events, position, i, originalListener;\n checkListener(listener);\n events = this._events;\n if (events === undefined) return this;\n list = events[type];\n if (list === undefined) return this;\n if (list === listener || list.listener === listener) {\n if (--this._eventsCount === 0) this._events = Object.create(null);else {\n delete events[type];\n if (events.removeListener) this.emit('removeListener', type, list.listener || listener);\n }\n } else if (typeof list !== 'function') {\n position = -1;\n for (i = list.length - 1; i >= 0; i--) {\n if (list[i] === listener || list[i].listener === listener) {\n originalListener = list[i].listener;\n position = i;\n break;\n }\n }\n if (position < 0) return this;\n if (position === 0) list.shift();else {\n spliceOne(list, position);\n }\n if (list.length === 1) events[type] = list[0];\n if (events.removeListener !== undefined) this.emit('removeListener', type, originalListener || listener);\n }\n return this;\n };\n EventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n EventEmitter.prototype.removeAllListeners = function removeAllListeners(type) {\n var listeners, events, i;\n events = this._events;\n if (events === undefined) return this;\n\n // not listening for removeListener, no need to emit\n if (events.removeListener === undefined) {\n if (arguments.length === 0) {\n this._events = Object.create(null);\n this._eventsCount = 0;\n } else if (events[type] !== undefined) {\n if (--this._eventsCount === 0) this._events = Object.create(null);else delete events[type];\n }\n return this;\n }\n\n // emit removeListener for all listeners on all events\n if (arguments.length === 0) {\n var keys = Object.keys(events);\n var key;\n for (i = 0; i < keys.length; ++i) {\n key = keys[i];\n if (key === 'removeListener') continue;\n this.removeAllListeners(key);\n }\n this.removeAllListeners('removeListener');\n this._events = Object.create(null);\n this._eventsCount = 0;\n return this;\n }\n listeners = events[type];\n if (typeof listeners === 'function') {\n this.removeListener(type, listeners);\n } else if (listeners !== undefined) {\n // LIFO order\n for (i = listeners.length - 1; i >= 0; i--) {\n this.removeListener(type, listeners[i]);\n }\n }\n return this;\n };\n function _listeners(target, type, unwrap) {\n var events = target._events;\n if (events === undefined) return [];\n var evlistener = events[type];\n if (evlistener === undefined) return [];\n if (typeof evlistener === 'function') return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n return unwrap ? unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n }\n EventEmitter.prototype.listeners = function listeners(type) {\n return _listeners(this, type, true);\n };\n EventEmitter.prototype.rawListeners = function rawListeners(type) {\n return _listeners(this, type, false);\n };\n EventEmitter.listenerCount = function (emitter, type) {\n if (typeof emitter.listenerCount === 'function') {\n return emitter.listenerCount(type);\n } else {\n return listenerCount.call(emitter, type);\n }\n };\n EventEmitter.prototype.listenerCount = listenerCount;\n function listenerCount(type) {\n var events = this._events;\n if (events !== undefined) {\n var evlistener = events[type];\n if (typeof evlistener === 'function') {\n return 1;\n } else if (evlistener !== undefined) {\n return evlistener.length;\n }\n }\n return 0;\n }\n EventEmitter.prototype.eventNames = function eventNames() {\n return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n };\n function arrayClone(arr, n) {\n var copy = new Array(n);\n for (var i = 0; i < n; ++i) copy[i] = arr[i];\n return copy;\n }\n function spliceOne(list, index) {\n for (; index + 1 < list.length; index++) list[index] = list[index + 1];\n list.pop();\n }\n function unwrapListeners(arr) {\n var ret = new Array(arr.length);\n for (var i = 0; i < ret.length; ++i) {\n ret[i] = arr[i].listener || arr[i];\n }\n return ret;\n }\n function once(emitter, name) {\n return new Promise(function (resolve, reject) {\n function errorListener(err) {\n emitter.removeListener(name, resolver);\n reject(err);\n }\n function resolver() {\n if (typeof emitter.removeListener === 'function') {\n emitter.removeListener('error', errorListener);\n }\n resolve([].slice.call(arguments));\n }\n eventTargetAgnosticAddListener(emitter, name, resolver, {\n once: true\n });\n if (name !== 'error') {\n addErrorHandlerIfEventEmitter(emitter, errorListener, {\n once: true\n });\n }\n });\n }\n function addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n if (typeof emitter.on === 'function') {\n eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n }\n }\n function eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n if (typeof emitter.on === 'function') {\n if (flags.once) {\n emitter.once(name, listener);\n } else {\n emitter.on(name, listener);\n }\n } else if (typeof emitter.addEventListener === 'function') {\n // EventTarget does not have `error` event semantics like Node\n // EventEmitters, we do not listen for `error` events here.\n emitter.addEventListener(name, function wrapListener(arg) {\n // IE does not have builtin `{ once: true }` support so we\n // have to do it manually.\n if (flags.once) {\n emitter.removeEventListener(name, wrapListener);\n }\n listener(arg);\n });\n } else {\n throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n }\n }\n return events.exports;\n}\n\nvar eventsExports = requireEvents();\n\nfunction isVideoFrame(frame) {\n return 'type' in frame;\n}\nfunction importKey(keyBytes_1) {\n return __awaiter(this, arguments, void 0, function (keyBytes) {\n let algorithm = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n name: ENCRYPTION_ALGORITHM\n };\n let usage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'encrypt';\n return function* () {\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/importKey\n return crypto.subtle.importKey('raw', keyBytes, algorithm, false, usage === 'derive' ? ['deriveBits', 'deriveKey'] : ['encrypt', 'decrypt']);\n }();\n });\n}\nfunction getAlgoOptions(algorithmName, salt) {\n const textEncoder = new TextEncoder();\n const encodedSalt = textEncoder.encode(salt);\n switch (algorithmName) {\n case 'HKDF':\n return {\n name: 'HKDF',\n salt: encodedSalt,\n hash: 'SHA-256',\n info: new ArrayBuffer(128)\n };\n case 'PBKDF2':\n {\n return {\n name: 'PBKDF2',\n salt: encodedSalt,\n hash: 'SHA-256',\n iterations: 100000\n };\n }\n default:\n throw new Error(\"algorithm \".concat(algorithmName, \" is currently unsupported\"));\n }\n}\n/**\n * Derives a set of keys from the master key.\n * See https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.1\n */\nfunction deriveKeys(material, salt) {\n return __awaiter(this, void 0, void 0, function* () {\n const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveKey#HKDF\n // https://developer.mozilla.org/en-US/docs/Web/API/HkdfParams\n const encryptionKey = yield crypto.subtle.deriveKey(algorithmOptions, material, {\n name: ENCRYPTION_ALGORITHM,\n length: 128\n }, false, ['encrypt', 'decrypt']);\n return {\n material,\n encryptionKey\n };\n });\n}\n/**\n * Ratchets a key. See\n * https://tools.ietf.org/html/draft-omara-sframe-00#section-4.3.5.1\n */\nfunction ratchet(material, salt) {\n return __awaiter(this, void 0, void 0, function* () {\n const algorithmOptions = getAlgoOptions(material.algorithm.name, salt);\n // https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/deriveBits\n return crypto.subtle.deriveBits(algorithmOptions, material, 256);\n });\n}\nfunction needsRbspUnescaping(frameData) {\n for (var i = 0; i < frameData.length - 3; i++) {\n if (frameData[i] == 0 && frameData[i + 1] == 0 && frameData[i + 2] == 3) return true;\n }\n return false;\n}\nfunction parseRbsp(stream) {\n const dataOut = [];\n var length = stream.length;\n for (var i = 0; i < stream.length;) {\n // Be careful about over/underflow here. byte_length_ - 3 can underflow, and\n // i + 3 can overflow, but byte_length_ - i can't, because i < byte_length_\n // above, and that expression will produce the number of bytes left in\n // the stream including the byte at i.\n if (length - i >= 3 && !stream[i] && !stream[i + 1] && stream[i + 2] == 3) {\n // Two rbsp bytes.\n dataOut.push(stream[i++]);\n dataOut.push(stream[i++]);\n // Skip the emulation byte.\n i++;\n } else {\n // Single rbsp byte.\n dataOut.push(stream[i++]);\n }\n }\n return new Uint8Array(dataOut);\n}\nconst kZerosInStartSequence = 2;\nconst kEmulationByte = 3;\nfunction writeRbsp(data_in) {\n const dataOut = [];\n var numConsecutiveZeros = 0;\n for (var i = 0; i < data_in.length; ++i) {\n var byte = data_in[i];\n if (byte <= kEmulationByte && numConsecutiveZeros >= kZerosInStartSequence) {\n // Need to escape.\n dataOut.push(kEmulationByte);\n numConsecutiveZeros = 0;\n }\n dataOut.push(byte);\n if (byte == 0) {\n ++numConsecutiveZeros;\n } else {\n numConsecutiveZeros = 0;\n }\n }\n return new Uint8Array(dataOut);\n}\n\nclass SifGuard {\n constructor() {\n this.consecutiveSifCount = 0;\n this.lastSifReceivedAt = 0;\n this.userFramesSinceSif = 0;\n }\n recordSif() {\n var _a;\n this.consecutiveSifCount += 1;\n (_a = this.sifSequenceStartedAt) !== null && _a !== void 0 ? _a : this.sifSequenceStartedAt = Date.now();\n this.lastSifReceivedAt = Date.now();\n }\n recordUserFrame() {\n if (this.sifSequenceStartedAt === undefined) {\n return;\n } else {\n this.userFramesSinceSif += 1;\n }\n if (\n // reset if we received more user frames than SIFs\n this.userFramesSinceSif > this.consecutiveSifCount ||\n // also reset if we got a new user frame and the latest SIF frame hasn't been updated in a while\n Date.now() - this.lastSifReceivedAt > MAX_SIF_DURATION) {\n this.reset();\n }\n }\n isSifAllowed() {\n return this.consecutiveSifCount < MAX_SIF_COUNT && (this.sifSequenceStartedAt === undefined || Date.now() - this.sifSequenceStartedAt < MAX_SIF_DURATION);\n }\n reset() {\n this.userFramesSinceSif = 0;\n this.consecutiveSifCount = 0;\n this.sifSequenceStartedAt = undefined;\n }\n}\n\nconst encryptionEnabledMap = new Map();\nclass BaseFrameCryptor extends eventsExports.EventEmitter {\n encodeFunction(encodedFrame, controller) {\n throw Error('not implemented for subclass');\n }\n decodeFunction(encodedFrame, controller) {\n throw Error('not implemented for subclass');\n }\n}\n/**\n * Cryptor is responsible for en-/decrypting media frames.\n * Each Cryptor instance is responsible for en-/decrypting a single mediaStreamTrack.\n */\nclass FrameCryptor extends BaseFrameCryptor {\n constructor(opts) {\n var _a;\n super();\n this.sendCounts = new Map();\n this.keys = opts.keys;\n this.participantIdentity = opts.participantIdentity;\n this.rtpMap = new Map();\n this.keyProviderOptions = opts.keyProviderOptions;\n this.sifTrailer = (_a = opts.sifTrailer) !== null && _a !== void 0 ? _a : Uint8Array.from([]);\n this.sifGuard = new SifGuard();\n }\n get logContext() {\n return {\n participant: this.participantIdentity,\n mediaTrackId: this.trackId,\n fallbackCodec: this.videoCodec\n };\n }\n /**\n * Assign a different participant to the cryptor.\n * useful for transceiver re-use\n * @param id\n * @param keys\n */\n setParticipant(id, keys) {\n workerLogger.debug('setting new participant on cryptor', Object.assign(Object.assign({}, this.logContext), {\n participant: id\n }));\n if (this.participantIdentity) {\n workerLogger.error('cryptor has already a participant set, participant should have been unset before', Object.assign({}, this.logContext));\n }\n this.participantIdentity = id;\n this.keys = keys;\n this.sifGuard.reset();\n }\n unsetParticipant() {\n workerLogger.debug('unsetting participant', this.logContext);\n this.participantIdentity = undefined;\n }\n isEnabled() {\n if (this.participantIdentity) {\n return encryptionEnabledMap.get(this.participantIdentity);\n } else {\n return undefined;\n }\n }\n getParticipantIdentity() {\n return this.participantIdentity;\n }\n getTrackId() {\n return this.trackId;\n }\n /**\n * Update the video codec used by the mediaStreamTrack\n * @param codec\n */\n setVideoCodec(codec) {\n this.videoCodec = codec;\n }\n /**\n * rtp payload type map used for figuring out codec of payload type when encoding\n * @param map\n */\n setRtpMap(map) {\n this.rtpMap = map;\n }\n setupTransform(operation, readable, writable, trackId, codec) {\n if (codec) {\n workerLogger.info('setting codec on cryptor to', {\n codec\n });\n this.videoCodec = codec;\n }\n workerLogger.debug('Setting up frame cryptor transform', Object.assign({\n operation,\n passedTrackId: trackId,\n codec\n }, this.logContext));\n const transformFn = operation === 'encode' ? this.encodeFunction : this.decodeFunction;\n const transformStream = new TransformStream({\n transform: transformFn.bind(this)\n });\n readable.pipeThrough(transformStream).pipeTo(writable).catch(e => {\n workerLogger.warn(e);\n this.emit(CryptorEvent.Error, e instanceof CryptorError ? e : new CryptorError(e.message, undefined, this.participantIdentity));\n });\n this.trackId = trackId;\n }\n setSifTrailer(trailer) {\n workerLogger.debug('setting SIF trailer', Object.assign(Object.assign({}, this.logContext), {\n trailer\n }));\n this.sifTrailer = trailer;\n }\n /**\n * Function that will be injected in a stream and will encrypt the given encoded frames.\n *\n * @param {RTCEncodedVideoFrame|RTCEncodedAudioFrame} encodedFrame - Encoded video frame.\n * @param {TransformStreamDefaultController} controller - TransportStreamController.\n *\n * The VP8 payload descriptor described in\n * https://tools.ietf.org/html/rfc7741#section-4.2\n * is part of the RTP packet and not part of the frame and is not controllable by us.\n * This is fine as the SFU keeps having access to it for routing.\n *\n * The encrypted frame is formed as follows:\n * 1) Find unencrypted byte length, depending on the codec, frame type and kind.\n * 2) Form the GCM IV for the frame as described above.\n * 3) Encrypt the rest of the frame using AES-GCM.\n * 4) Allocate space for the encrypted frame.\n * 5) Copy the unencrypted bytes to the start of the encrypted frame.\n * 6) Append the ciphertext to the encrypted frame.\n * 7) Append the IV.\n * 8) Append a single byte for the key identifier.\n * 9) Enqueue the encrypted frame for sending.\n */\n encodeFunction(encodedFrame, controller) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n if (!this.isEnabled() ||\n // skip for encryption for empty dtx frames\n encodedFrame.data.byteLength === 0) {\n return controller.enqueue(encodedFrame);\n }\n const keySet = this.keys.getKeySet();\n if (!keySet) {\n this.emit(CryptorEvent.Error, new CryptorError(\"key set not found for \".concat(this.participantIdentity, \" at index \").concat(this.keys.getCurrentKeyIndex()), CryptorErrorReason.MissingKey, this.participantIdentity));\n return;\n }\n const {\n encryptionKey\n } = keySet;\n const keyIndex = this.keys.getCurrentKeyIndex();\n if (encryptionKey) {\n const iv = this.makeIV((_a = encodedFrame.getMetadata().synchronizationSource) !== null && _a !== void 0 ? _a : -1, encodedFrame.timestamp);\n let frameInfo = this.getUnencryptedBytes(encodedFrame);\n // Thіs is not encrypted and contains the VP8 payload descriptor or the Opus TOC byte.\n const frameHeader = new Uint8Array(encodedFrame.data, 0, frameInfo.unencryptedBytes);\n // Frame trailer contains the R|IV_LENGTH and key index\n const frameTrailer = new Uint8Array(2);\n frameTrailer[0] = IV_LENGTH;\n frameTrailer[1] = keyIndex;\n // Construct frame trailer. Similar to the frame header described in\n // https://tools.ietf.org/html/draft-omara-sframe-00#section-4.2\n // but we put it at the end.\n //\n // ---------+-------------------------+-+---------+----\n // payload |IV...(length = IV_LENGTH)|R|IV_LENGTH|KID |\n // ---------+-------------------------+-+---------+----\n try {\n const cipherText = yield crypto.subtle.encrypt({\n name: ENCRYPTION_ALGORITHM,\n iv,\n additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength)\n }, encryptionKey, new Uint8Array(encodedFrame.data, frameInfo.unencryptedBytes));\n let newDataWithoutHeader = new Uint8Array(cipherText.byteLength + iv.byteLength + frameTrailer.byteLength);\n newDataWithoutHeader.set(new Uint8Array(cipherText)); // add ciphertext.\n newDataWithoutHeader.set(new Uint8Array(iv), cipherText.byteLength); // append IV.\n newDataWithoutHeader.set(frameTrailer, cipherText.byteLength + iv.byteLength); // append frame trailer.\n if (frameInfo.isH264) {\n newDataWithoutHeader = writeRbsp(newDataWithoutHeader);\n }\n var newData = new Uint8Array(frameHeader.byteLength + newDataWithoutHeader.byteLength);\n newData.set(frameHeader);\n newData.set(newDataWithoutHeader, frameHeader.byteLength);\n encodedFrame.data = newData.buffer;\n return controller.enqueue(encodedFrame);\n } catch (e) {\n // TODO: surface this to the app.\n workerLogger.error(e);\n }\n } else {\n workerLogger.debug('failed to encrypt, emitting error', this.logContext);\n this.emit(CryptorEvent.Error, new CryptorError(\"encryption key missing for encoding\", CryptorErrorReason.MissingKey, this.participantIdentity));\n }\n });\n }\n /**\n * Function that will be injected in a stream and will decrypt the given encoded frames.\n *\n * @param {RTCEncodedVideoFrame|RTCEncodedAudioFrame} encodedFrame - Encoded video frame.\n * @param {TransformStreamDefaultController} controller - TransportStreamController.\n */\n decodeFunction(encodedFrame, controller) {\n return __awaiter(this, void 0, void 0, function* () {\n if (!this.isEnabled() ||\n // skip for decryption for empty dtx frames\n encodedFrame.data.byteLength === 0) {\n workerLogger.debug('skipping empty frame', this.logContext);\n this.sifGuard.recordUserFrame();\n return controller.enqueue(encodedFrame);\n }\n if (isFrameServerInjected(encodedFrame.data, this.sifTrailer)) {\n workerLogger.debug('enqueue SIF', this.logContext);\n this.sifGuard.recordSif();\n if (this.sifGuard.isSifAllowed()) {\n encodedFrame.data = encodedFrame.data.slice(0, encodedFrame.data.byteLength - this.sifTrailer.byteLength);\n return controller.enqueue(encodedFrame);\n } else {\n workerLogger.warn('SIF limit reached, dropping frame');\n return;\n }\n } else {\n this.sifGuard.recordUserFrame();\n }\n const data = new Uint8Array(encodedFrame.data);\n const keyIndex = data[encodedFrame.data.byteLength - 1];\n if (this.keys.hasInvalidKeyAtIndex(keyIndex)) {\n // drop frame\n return;\n }\n if (this.keys.getKeySet(keyIndex)) {\n try {\n const decodedFrame = yield this.decryptFrame(encodedFrame, keyIndex);\n this.keys.decryptionSuccess(keyIndex);\n if (decodedFrame) {\n return controller.enqueue(decodedFrame);\n }\n } catch (error) {\n if (error instanceof CryptorError && error.reason === CryptorErrorReason.InvalidKey) {\n // emit an error if the key handler thinks we have a valid key\n if (this.keys.hasValidKey) {\n this.emit(CryptorEvent.Error, error);\n this.keys.decryptionFailure(keyIndex);\n }\n } else {\n workerLogger.warn('decoding frame failed', {\n error\n });\n }\n }\n } else {\n // emit an error if the key index is out of bounds but the key handler thinks we still have a valid key\n workerLogger.warn(\"skipping decryption due to missing key at index \".concat(keyIndex));\n this.emit(CryptorEvent.Error, new CryptorError(\"missing key at index \".concat(keyIndex, \" for participant \").concat(this.participantIdentity), CryptorErrorReason.MissingKey, this.participantIdentity));\n this.keys.decryptionFailure(keyIndex);\n }\n });\n }\n /**\n * Function that will decrypt the given encoded frame. If the decryption fails, it will\n * ratchet the key for up to RATCHET_WINDOW_SIZE times.\n */\n decryptFrame(encodedFrame_1, keyIndex_1) {\n return __awaiter(this, arguments, void 0, function (encodedFrame, keyIndex) {\n var _this = this;\n let initialMaterial = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;\n let ratchetOpts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {\n ratchetCount: 0\n };\n return function* () {\n var _a;\n const keySet = _this.keys.getKeySet(keyIndex);\n if (!ratchetOpts.encryptionKey && !keySet) {\n throw new TypeError(\"no encryption key found for decryption of \".concat(_this.participantIdentity));\n }\n let frameInfo = _this.getUnencryptedBytes(encodedFrame);\n // Construct frame trailer. Similar to the frame header described in\n // https://tools.ietf.org/html/draft-omara-sframe-00#section-4.2\n // but we put it at the end.\n //\n // ---------+-------------------------+-+---------+----\n // payload |IV...(length = IV_LENGTH)|R|IV_LENGTH|KID |\n // ---------+-------------------------+-+---------+----\n try {\n const frameHeader = new Uint8Array(encodedFrame.data, 0, frameInfo.unencryptedBytes);\n var encryptedData = new Uint8Array(encodedFrame.data, frameHeader.length, encodedFrame.data.byteLength - frameHeader.length);\n if (frameInfo.isH264 && needsRbspUnescaping(encryptedData)) {\n encryptedData = parseRbsp(encryptedData);\n const newUint8 = new Uint8Array(frameHeader.byteLength + encryptedData.byteLength);\n newUint8.set(frameHeader);\n newUint8.set(encryptedData, frameHeader.byteLength);\n encodedFrame.data = newUint8.buffer;\n }\n const frameTrailer = new Uint8Array(encodedFrame.data, encodedFrame.data.byteLength - 2, 2);\n const ivLength = frameTrailer[0];\n const iv = new Uint8Array(encodedFrame.data, encodedFrame.data.byteLength - ivLength - frameTrailer.byteLength, ivLength);\n const cipherTextStart = frameHeader.byteLength;\n const cipherTextLength = encodedFrame.data.byteLength - (frameHeader.byteLength + ivLength + frameTrailer.byteLength);\n const plainText = yield crypto.subtle.decrypt({\n name: ENCRYPTION_ALGORITHM,\n iv,\n additionalData: new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength)\n }, (_a = ratchetOpts.encryptionKey) !== null && _a !== void 0 ? _a : keySet.encryptionKey, new Uint8Array(encodedFrame.data, cipherTextStart, cipherTextLength));\n const newData = new ArrayBuffer(frameHeader.byteLength + plainText.byteLength);\n const newUint8 = new Uint8Array(newData);\n newUint8.set(new Uint8Array(encodedFrame.data, 0, frameHeader.byteLength));\n newUint8.set(new Uint8Array(plainText), frameHeader.byteLength);\n encodedFrame.data = newData;\n return encodedFrame;\n } catch (error) {\n if (_this.keyProviderOptions.ratchetWindowSize > 0) {\n if (ratchetOpts.ratchetCount < _this.keyProviderOptions.ratchetWindowSize) {\n workerLogger.debug(\"ratcheting key attempt \".concat(ratchetOpts.ratchetCount, \" of \").concat(_this.keyProviderOptions.ratchetWindowSize, \", for kind \").concat(encodedFrame instanceof RTCEncodedAudioFrame ? 'audio' : 'video'));\n let ratchetedKeySet;\n let ratchetResult;\n if ((initialMaterial !== null && initialMaterial !== void 0 ? initialMaterial : keySet) === _this.keys.getKeySet(keyIndex)) {\n // only ratchet if the currently set key is still the same as the one used to decrypt this frame\n // if not, it might be that a different frame has already ratcheted and we try with that one first\n ratchetResult = yield _this.keys.ratchetKey(keyIndex, false);\n ratchetedKeySet = yield deriveKeys(ratchetResult.cryptoKey, _this.keyProviderOptions.ratchetSalt);\n }\n const frame = yield _this.decryptFrame(encodedFrame, keyIndex, initialMaterial || keySet, {\n ratchetCount: ratchetOpts.ratchetCount + 1,\n encryptionKey: ratchetedKeySet === null || ratchetedKeySet === void 0 ? void 0 : ratchetedKeySet.encryptionKey\n });\n if (frame && ratchetedKeySet) {\n // before updating the keys, make sure that the keySet used for this frame is still the same as the currently set key\n // if it's not, a new key might have been set already, which we don't want to override\n if ((initialMaterial !== null && initialMaterial !== void 0 ? initialMaterial : keySet) === _this.keys.getKeySet(keyIndex)) {\n _this.keys.setKeySet(ratchetedKeySet, keyIndex, ratchetResult);\n // decryption was successful, set the new key index to reflect the ratcheted key set\n _this.keys.setCurrentKeyIndex(keyIndex);\n }\n }\n return frame;\n } else {\n /**\n * Because we only set a new key once decryption has been successful,\n * we can be sure that we don't need to reset the key to the initial material at this point\n * as the key has not been updated on the keyHandler instance\n */\n workerLogger.warn('maximum ratchet attempts exceeded');\n throw new CryptorError(\"valid key missing for participant \".concat(_this.participantIdentity), CryptorErrorReason.InvalidKey, _this.participantIdentity);\n }\n } else {\n throw new CryptorError(\"Decryption failed: \".concat(error.message), CryptorErrorReason.InvalidKey, _this.participantIdentity);\n }\n }\n }();\n });\n }\n /**\n * Construct the IV used for AES-GCM and sent (in plain) with the packet similar to\n * https://tools.ietf.org/html/rfc7714#section-8.1\n * It concatenates\n * - the 32 bit synchronization source (SSRC) given on the encoded frame,\n * - the 32 bit rtp timestamp given on the encoded frame,\n * - a send counter that is specific to the SSRC. Starts at a random number.\n * The send counter is essentially the pictureId but we currently have to implement this ourselves.\n * There is no XOR with a salt. Note that this IV leaks the SSRC to the receiver but since this is\n * randomly generated and SFUs may not rewrite this is considered acceptable.\n * The SSRC is used to allow demultiplexing multiple streams with the same key, as described in\n * https://tools.ietf.org/html/rfc3711#section-4.1.1\n * The RTP timestamp is 32 bits and advances by the codec clock rate (90khz for video, 48khz for\n * opus audio) every second. For video it rolls over roughly every 13 hours.\n * The send counter will advance at the frame rate (30fps for video, 50fps for 20ms opus audio)\n * every second. It will take a long time to roll over.\n *\n * See also https://developer.mozilla.org/en-US/docs/Web/API/AesGcmParams\n */\n makeIV(synchronizationSource, timestamp) {\n var _a;\n const iv = new ArrayBuffer(IV_LENGTH);\n const ivView = new DataView(iv);\n // having to keep our own send count (similar to a picture id) is not ideal.\n if (!this.sendCounts.has(synchronizationSource)) {\n // Initialize with a random offset, similar to the RTP sequence number.\n this.sendCounts.set(synchronizationSource, Math.floor(Math.random() * 0xffff));\n }\n const sendCount = (_a = this.sendCounts.get(synchronizationSource)) !== null && _a !== void 0 ? _a : 0;\n ivView.setUint32(0, synchronizationSource);\n ivView.setUint32(4, timestamp);\n ivView.setUint32(8, timestamp - sendCount % 0xffff);\n this.sendCounts.set(synchronizationSource, sendCount + 1);\n return iv;\n }\n getUnencryptedBytes(frame) {\n var _a;\n var frameInfo = {\n unencryptedBytes: 0,\n isH264: false\n };\n if (isVideoFrame(frame)) {\n let detectedCodec = (_a = this.getVideoCodec(frame)) !== null && _a !== void 0 ? _a : this.videoCodec;\n if (detectedCodec !== this.detectedCodec) {\n workerLogger.debug('detected different codec', Object.assign({\n detectedCodec,\n oldCodec: this.detectedCodec\n }, this.logContext));\n this.detectedCodec = detectedCodec;\n }\n if (detectedCodec === 'av1') {\n throw new Error(\"\".concat(detectedCodec, \" is not yet supported for end to end encryption\"));\n }\n if (detectedCodec === 'vp8') {\n frameInfo.unencryptedBytes = UNENCRYPTED_BYTES[frame.type];\n } else if (detectedCodec === 'vp9') {\n frameInfo.unencryptedBytes = 0;\n return frameInfo;\n }\n const data = new Uint8Array(frame.data);\n try {\n const naluIndices = findNALUIndices(data);\n // if the detected codec is undefined we test whether it _looks_ like a h264 frame as a best guess\n frameInfo.isH264 = detectedCodec === 'h264' || naluIndices.some(naluIndex => [NALUType.SLICE_IDR, NALUType.SLICE_NON_IDR].includes(parseNALUType(data[naluIndex])));\n if (frameInfo.isH264) {\n for (const index of naluIndices) {\n let type = parseNALUType(data[index]);\n switch (type) {\n case NALUType.SLICE_IDR:\n case NALUType.SLICE_NON_IDR:\n frameInfo.unencryptedBytes = index + 2;\n return frameInfo;\n default:\n break;\n }\n }\n throw new TypeError('Could not find NALU');\n }\n } catch (e) {\n // no op, we just continue and fallback to vp8\n }\n frameInfo.unencryptedBytes = UNENCRYPTED_BYTES[frame.type];\n return frameInfo;\n } else {\n frameInfo.unencryptedBytes = UNENCRYPTED_BYTES.audio;\n return frameInfo;\n }\n }\n /**\n * inspects frame payloadtype if available and maps it to the codec specified in rtpMap\n */\n getVideoCodec(frame) {\n if (this.rtpMap.size === 0) {\n return undefined;\n }\n const payloadType = frame.getMetadata().payloadType;\n const codec = payloadType ? this.rtpMap.get(payloadType) : undefined;\n return codec;\n }\n}\n/**\n * Slice 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 */\nfunction findNALUIndices(stream) {\n const result = [];\n let start = 0,\n pos = 0,\n searchLength = stream.length - 2;\n while (pos < searchLength) {\n // skip until end of current NALU\n while (pos < searchLength && !(stream[pos] === 0 && stream[pos + 1] === 0 && stream[pos + 2] === 1)) pos++;\n if (pos >= searchLength) pos = stream.length;\n // remove trailing zeros from current NALU\n let end = pos;\n while (end > start && stream[end - 1] === 0) end--;\n // save current NALU\n if (start === 0) {\n if (end !== start) throw TypeError('byte stream contains leading data');\n } else {\n result.push(start);\n }\n // begin new NALU\n start = pos = pos + 3;\n }\n return result;\n}\nfunction parseNALUType(startByte) {\n return startByte & kNaluTypeMask;\n}\nconst kNaluTypeMask = 0x1f;\nvar NALUType;\n(function (NALUType) {\n /** Coded slice of a non-IDR picture */\n NALUType[NALUType[\"SLICE_NON_IDR\"] = 1] = \"SLICE_NON_IDR\";\n /** Coded slice data partition A */\n NALUType[NALUType[\"SLICE_PARTITION_A\"] = 2] = \"SLICE_PARTITION_A\";\n /** Coded slice data partition B */\n NALUType[NALUType[\"SLICE_PARTITION_B\"] = 3] = \"SLICE_PARTITION_B\";\n /** Coded slice data partition C */\n NALUType[NALUType[\"SLICE_PARTITION_C\"] = 4] = \"SLICE_PARTITION_C\";\n /** Coded slice of an IDR picture */\n NALUType[NALUType[\"SLICE_IDR\"] = 5] = \"SLICE_IDR\";\n /** Supplemental enhancement information */\n NALUType[NALUType[\"SEI\"] = 6] = \"SEI\";\n /** Sequence parameter set */\n NALUType[NALUType[\"SPS\"] = 7] = \"SPS\";\n /** Picture parameter set */\n NALUType[NALUType[\"PPS\"] = 8] = \"PPS\";\n /** Access unit delimiter */\n NALUType[NALUType[\"AUD\"] = 9] = \"AUD\";\n /** End of sequence */\n NALUType[NALUType[\"END_SEQ\"] = 10] = \"END_SEQ\";\n /** End of stream */\n NALUType[NALUType[\"END_STREAM\"] = 11] = \"END_STREAM\";\n /** Filler data */\n NALUType[NALUType[\"FILLER_DATA\"] = 12] = \"FILLER_DATA\";\n /** Sequence parameter set extension */\n NALUType[NALUType[\"SPS_EXT\"] = 13] = \"SPS_EXT\";\n /** Prefix NAL unit */\n NALUType[NALUType[\"PREFIX_NALU\"] = 14] = \"PREFIX_NALU\";\n /** Subset sequence parameter set */\n NALUType[NALUType[\"SUBSET_SPS\"] = 15] = \"SUBSET_SPS\";\n /** Depth parameter set */\n NALUType[NALUType[\"DPS\"] = 16] = \"DPS\";\n // 17, 18 reserved\n /** Coded slice of an auxiliary coded picture without partitioning */\n NALUType[NALUType[\"SLICE_AUX\"] = 19] = \"SLICE_AUX\";\n /** Coded slice extension */\n NALUType[NALUType[\"SLICE_EXT\"] = 20] = \"SLICE_EXT\";\n /** Coded slice extension for a depth view component or a 3D-AVC texture view component */\n NALUType[NALUType[\"SLICE_LAYER_EXT\"] = 21] = \"SLICE_LAYER_EXT\";\n // 22, 23 reserved\n})(NALUType || (NALUType = {}));\n/**\n * we use a magic frame trailer to detect whether a frame is injected\n * by the livekit server and thus to be treated as unencrypted\n * @internal\n */\nfunction isFrameServerInjected(frameData, trailerBytes) {\n if (trailerBytes.byteLength === 0) {\n return false;\n }\n const frameTrailer = new Uint8Array(frameData.slice(frameData.byteLength - trailerBytes.byteLength));\n return trailerBytes.every((value, index) => value === frameTrailer[index]);\n}\n\n// TODO ParticipantKeyHandlers currently don't get destroyed on participant disconnect\n// we could do this by having a separate worker message on participant disconnected.\n/**\n * ParticipantKeyHandler is responsible for providing a cryptor instance with the\n * en-/decryption key of a participant. It assumes that all tracks of a specific participant\n * are encrypted with the same key.\n * Additionally it exposes a method to ratchet a key which can be used by the cryptor either automatically\n * if decryption fails or can be triggered manually on both sender and receiver side.\n *\n */\nclass ParticipantKeyHandler extends eventsExports.EventEmitter {\n /**\n * true if the current key has not been marked as invalid\n */\n get hasValidKey() {\n return !this.hasInvalidKeyAtIndex(this.currentKeyIndex);\n }\n constructor(participantIdentity, keyProviderOptions) {\n super();\n this.currentKeyIndex = 0;\n if (keyProviderOptions.keyringSize < 1 || keyProviderOptions.keyringSize > 256) {\n throw new TypeError('Keyring size needs to be between 1 and 256');\n }\n this.cryptoKeyRing = new Array(keyProviderOptions.keyringSize).fill(undefined);\n this.decryptionFailureCounts = new Array(keyProviderOptions.keyringSize).fill(0);\n this.keyProviderOptions = keyProviderOptions;\n this.ratchetPromiseMap = new Map();\n this.participantIdentity = participantIdentity;\n }\n /**\n * Returns true if the key at the given index is marked as invalid.\n *\n * @param keyIndex the index of the key\n */\n hasInvalidKeyAtIndex(keyIndex) {\n return this.keyProviderOptions.failureTolerance >= 0 && this.decryptionFailureCounts[keyIndex] > this.keyProviderOptions.failureTolerance;\n }\n /**\n * Informs the key handler that a decryption failure occurred for an encryption key.\n * @internal\n * @param keyIndex the key index for which the failure occurred. Defaults to the current key index.\n */\n decryptionFailure() {\n let keyIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.currentKeyIndex;\n if (this.keyProviderOptions.failureTolerance < 0) {\n return;\n }\n this.decryptionFailureCounts[keyIndex] += 1;\n if (this.decryptionFailureCounts[keyIndex] > this.keyProviderOptions.failureTolerance) {\n workerLogger.warn(\"key for \".concat(this.participantIdentity, \" at index \").concat(keyIndex, \" is being marked as invalid\"));\n }\n }\n /**\n * Informs the key handler that a frame was successfully decrypted using an encryption key.\n * @internal\n * @param keyIndex the key index for which the success occurred. Defaults to the current key index.\n */\n decryptionSuccess() {\n let keyIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.currentKeyIndex;\n this.resetKeyStatus(keyIndex);\n }\n /**\n * Call this after user initiated ratchet or a new key has been set in order to make sure to mark potentially\n * invalid keys as valid again\n *\n * @param keyIndex the index of the key. Defaults to the current key index.\n */\n resetKeyStatus(keyIndex) {\n if (keyIndex === undefined) {\n this.decryptionFailureCounts.fill(0);\n } else {\n this.decryptionFailureCounts[keyIndex] = 0;\n }\n }\n /**\n * Ratchets the current key (or the one at keyIndex if provided) and\n * returns the ratcheted material\n * if `setKey` is true (default), it will also set the ratcheted key directly on the crypto key ring\n * @param keyIndex\n * @param setKey\n */\n ratchetKey(keyIndex) {\n let setKey = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n const currentKeyIndex = keyIndex !== null && keyIndex !== void 0 ? keyIndex : this.getCurrentKeyIndex();\n const existingPromise = this.ratchetPromiseMap.get(currentKeyIndex);\n if (typeof existingPromise !== 'undefined') {\n return existingPromise;\n }\n const ratchetPromise = new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {\n try {\n const keySet = this.getKeySet(currentKeyIndex);\n if (!keySet) {\n throw new TypeError(\"Cannot ratchet key without a valid keyset of participant \".concat(this.participantIdentity));\n }\n const currentMaterial = keySet.material;\n const chainKey = yield ratchet(currentMaterial, this.keyProviderOptions.ratchetSalt);\n const newMaterial = yield importKey(chainKey, currentMaterial.algorithm.name, 'derive');\n const ratchetResult = {\n chainKey,\n cryptoKey: newMaterial\n };\n if (setKey) {\n // Set the new key and emit a ratchet event with the ratcheted chain key\n yield this.setKeyFromMaterial(newMaterial, currentKeyIndex, ratchetResult);\n }\n resolve(ratchetResult);\n } catch (e) {\n reject(e);\n } finally {\n this.ratchetPromiseMap.delete(currentKeyIndex);\n }\n }));\n this.ratchetPromiseMap.set(currentKeyIndex, ratchetPromise);\n return ratchetPromise;\n }\n /**\n * takes in a key material with `deriveBits` and `deriveKey` set as key usages\n * and derives encryption keys from the material and sets it on the key ring buffer\n * together with the material\n * also resets the valid key property and updates the currentKeyIndex\n */\n setKey(material_1) {\n return __awaiter(this, arguments, void 0, function (material) {\n var _this = this;\n let keyIndex = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n return function* () {\n yield _this.setKeyFromMaterial(material, keyIndex);\n _this.resetKeyStatus(keyIndex);\n }();\n });\n }\n /**\n * takes in a key material with `deriveBits` and `deriveKey` set as key usages\n * and derives encryption keys from the material and sets it on the key ring buffers\n * together with the material\n * also updates the currentKeyIndex\n */\n setKeyFromMaterial(material_1, keyIndex_1) {\n return __awaiter(this, arguments, void 0, function (material, keyIndex) {\n var _this2 = this;\n let ratchetedResult = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n return function* () {\n const keySet = yield deriveKeys(material, _this2.keyProviderOptions.ratchetSalt);\n const newIndex = keyIndex >= 0 ? keyIndex % _this2.cryptoKeyRing.length : _this2.currentKeyIndex;\n workerLogger.debug(\"setting new key with index \".concat(keyIndex), {\n usage: material.usages,\n algorithm: material.algorithm,\n ratchetSalt: _this2.keyProviderOptions.ratchetSalt\n });\n _this2.setKeySet(keySet, newIndex, ratchetedResult);\n if (newIndex >= 0) _this2.currentKeyIndex = newIndex;\n }();\n });\n }\n setKeySet(keySet, keyIndex) {\n let ratchetedResult = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;\n this.cryptoKeyRing[keyIndex % this.cryptoKeyRing.length] = keySet;\n if (ratchetedResult) {\n this.emit(KeyHandlerEvent.KeyRatcheted, ratchetedResult, this.participantIdentity, keyIndex);\n }\n }\n setCurrentKeyIndex(index) {\n return __awaiter(this, void 0, void 0, function* () {\n this.currentKeyIndex = index % this.cryptoKeyRing.length;\n this.resetKeyStatus(index);\n });\n }\n getCurrentKeyIndex() {\n return this.currentKeyIndex;\n }\n /**\n * returns currently used KeySet or the one at `keyIndex` if provided\n * @param keyIndex\n * @returns\n */\n getKeySet(keyIndex) {\n return this.cryptoKeyRing[keyIndex !== null && keyIndex !== void 0 ? keyIndex : this.currentKeyIndex];\n }\n}\n\nconst participantCryptors = [];\nconst participantKeys = new Map();\nlet sharedKeyHandler;\nlet messageQueue = new AsyncQueue();\nlet isEncryptionEnabled = false;\nlet useSharedKey = false;\nlet sifTrailer;\nlet keyProviderOptions = KEY_PROVIDER_DEFAULTS;\nlet rtpMap = new Map();\nworkerLogger.setDefaultLevel('info');\nonmessage = ev => {\n messageQueue.run(() => __awaiter(void 0, void 0, void 0, function* () {\n const {\n kind,\n data\n } = ev.data;\n switch (kind) {\n case 'init':\n workerLogger.setLevel(data.loglevel);\n workerLogger.info('worker initialized');\n keyProviderOptions = data.keyProviderOptions;\n useSharedKey = !!data.keyProviderOptions.sharedKey;\n // acknowledge init successful\n const ackMsg = {\n kind: 'initAck',\n data: {\n enabled: isEncryptionEnabled\n }\n };\n postMessage(ackMsg);\n break;\n case 'enable':\n setEncryptionEnabled(data.enabled, data.participantIdentity);\n workerLogger.info(\"updated e2ee enabled status for \".concat(data.participantIdentity, \" to \").concat(data.enabled));\n // acknowledge enable call successful\n postMessage(ev.data);\n break;\n case 'decode':\n let cryptor = getTrackCryptor(data.participantIdentity, data.trackId);\n cryptor.setupTransform(kind, data.readableStream, data.writableStream, data.trackId, data.codec);\n break;\n case 'encode':\n let pubCryptor = getTrackCryptor(data.participantIdentity, data.trackId);\n pubCryptor.setupTransform(kind, data.readableStream, data.writableStream, data.trackId, data.codec);\n break;\n case 'setKey':\n if (useSharedKey) {\n yield setSharedKey(data.key, data.keyIndex);\n } else if (data.participantIdentity) {\n workerLogger.info(\"set participant sender key \".concat(data.participantIdentity, \" index \").concat(data.keyIndex));\n yield getParticipantKeyHandler(data.participantIdentity).setKey(data.key, data.keyIndex);\n } else {\n workerLogger.error('no participant Id was provided and shared key usage is disabled');\n }\n break;\n case 'removeTransform':\n unsetCryptorParticipant(data.trackId, data.participantIdentity);\n break;\n case 'updateCodec':\n getTrackCryptor(data.participantIdentity, data.trackId).setVideoCodec(data.codec);\n break;\n case 'setRTPMap':\n // this is only used for the local participant\n rtpMap = data.map;\n participantCryptors.forEach(cr => {\n if (cr.getParticipantIdentity() === data.participantIdentity) {\n cr.setRtpMap(data.map);\n }\n });\n break;\n case 'ratchetRequest':\n handleRatchetRequest(data);\n break;\n case 'setSifTrailer':\n handleSifTrailer(data.trailer);\n break;\n }\n }));\n};\nfunction handleRatchetRequest(data) {\n return __awaiter(this, void 0, void 0, function* () {\n if (useSharedKey) {\n const keyHandler = getSharedKeyHandler();\n yield keyHandler.ratchetKey(data.keyIndex);\n keyHandler.resetKeyStatus();\n } else if (data.participantIdentity) {\n const keyHandler = getParticipantKeyHandler(data.participantIdentity);\n yield keyHandler.ratchetKey(data.keyIndex);\n keyHandler.resetKeyStatus();\n } else {\n workerLogger.error('no participant Id was provided for ratchet request and shared key usage is disabled');\n }\n });\n}\nfunction getTrackCryptor(participantIdentity, trackId) {\n let cryptors = participantCryptors.filter(c => c.getTrackId() === trackId);\n if (cryptors.length > 1) {\n const debugInfo = cryptors.map(c => {\n return {\n participant: c.getParticipantIdentity()\n };\n }).join(',');\n workerLogger.error(\"Found multiple cryptors for the same trackID \".concat(trackId, \". target participant: \").concat(participantIdentity, \" \"), {\n participants: debugInfo\n });\n }\n let cryptor = cryptors[0];\n if (!cryptor) {\n workerLogger.info('creating new cryptor for', {\n participantIdentity\n });\n if (!keyProviderOptions) {\n throw Error('Missing keyProvider options');\n }\n cryptor = new FrameCryptor({\n participantIdentity,\n keys: getParticipantKeyHandler(participantIdentity),\n keyProviderOptions,\n sifTrailer\n });\n cryptor.setRtpMap(rtpMap);\n setupCryptorErrorEvents(cryptor);\n participantCryptors.push(cryptor);\n } else if (participantIdentity !== cryptor.getParticipantIdentity()) {\n // assign new participant id to track cryptor and pass in correct key handler\n cryptor.setParticipant(participantIdentity, getParticipantKeyHandler(participantIdentity));\n }\n return cryptor;\n}\nfunction getParticipantKeyHandler(participantIdentity) {\n if (useSharedKey) {\n return getSharedKeyHandler();\n }\n let keys = participantKeys.get(participantIdentity);\n if (!keys) {\n keys = new ParticipantKeyHandler(participantIdentity, keyProviderOptions);\n keys.on(KeyHandlerEvent.KeyRatcheted, emitRatchetedKeys);\n participantKeys.set(participantIdentity, keys);\n }\n return keys;\n}\nfunction getSharedKeyHandler() {\n if (!sharedKeyHandler) {\n workerLogger.debug('creating new shared key handler');\n sharedKeyHandler = new ParticipantKeyHandler('shared-key', keyProviderOptions);\n }\n return sharedKeyHandler;\n}\nfunction unsetCryptorParticipant(trackId, participantIdentity) {\n const cryptors = participantCryptors.filter(c => c.getParticipantIdentity() === participantIdentity && c.getTrackId() === trackId);\n if (cryptors.length > 1) {\n workerLogger.error('Found multiple cryptors for the same participant and trackID combination', {\n trackId,\n participantIdentity\n });\n }\n const cryptor = cryptors[0];\n if (!cryptor) {\n workerLogger.warn('Could not unset participant on cryptor', {\n trackId,\n participantIdentity\n });\n } else {\n cryptor.unsetParticipant();\n }\n}\nfunction setEncryptionEnabled(enable, participantIdentity) {\n workerLogger.debug(\"setting encryption enabled for all tracks of \".concat(participantIdentity), {\n enable\n });\n encryptionEnabledMap.set(participantIdentity, enable);\n}\nfunction setSharedKey(key, index) {\n return __awaiter(this, void 0, void 0, function* () {\n workerLogger.info('set shared key', {\n index\n });\n yield getSharedKeyHandler().setKey(key, index);\n });\n}\nfunction setupCryptorErrorEvents(cryptor) {\n cryptor.on(CryptorEvent.Error, error => {\n const msg = {\n kind: 'error',\n data: {\n error: new Error(\"\".concat(CryptorErrorReason[error.reason], \": \").concat(error.message))\n }\n };\n postMessage(msg);\n });\n}\nfunction emitRatchetedKeys(ratchetResult, participantIdentity, keyIndex) {\n const msg = {\n kind: \"ratchetKey\",\n data: {\n participantIdentity,\n keyIndex,\n ratchetResult\n }\n };\n postMessage(msg);\n}\nfunction handleSifTrailer(trailer) {\n sifTrailer = trailer;\n participantCryptors.forEach(c => {\n c.setSifTrailer(trailer);\n });\n}\n// Operations using RTCRtpScriptTransform.\n// @ts-ignore\nif (self.RTCTransformEvent) {\n workerLogger.debug('setup transform event');\n // @ts-ignore\n self.onrtctransform = event => {\n // @ts-ignore .transformer property is part of RTCTransformEvent\n const transformer = event.transformer;\n workerLogger.debug('transformer', transformer);\n // @ts-ignore monkey patching non standard flag\n transformer.handled = true;\n const {\n kind,\n participantIdentity,\n trackId,\n codec\n } = transformer.options;\n const cryptor = getTrackCryptor(participantIdentity, trackId);\n workerLogger.debug('transform', {\n codec\n });\n cryptor.setupTransform(kind, transformer.readable, transformer.writable, trackId, codec);\n };\n}\n//# sourceMappingURL=livekit-client.e2ee.worker.mjs.map\n"],"names":["__awaiter","thisArg","_arguments","P","generator","adopt","value","resolve","reject","fulfilled","step","e","rejected","result","loglevel$1","loglevel","hasRequiredLoglevel","requireLoglevel","module","root","definition","noop","undefinedType","isIE","logMethods","_loggersByName","defaultLogger","bindMethod","obj","methodName","method","traceForIE","realMethod","replaceLoggingMethods","level","i","enableLoggingWhenConsoleArrives","defaultMethodFactory","_level","_loggerName","Logger","name","factory","self","inheritedLevel","defaultLevel","userLevel","storageKey","persistLevelIfPossible","levelNum","levelName","getPersistedLevel","storedLevel","cookie","cookieName","location","clearPersistedLevel","normalizeLevel","input","persist","childName","initialLevel","logger","_log","loglevelExports","LogLevel","LoggerNames","livekitLogger","workerLogger","h","s","t","o","_","l","c","QueueTaskStatus","AsyncQueue","task","taskInfo","unlock","ENCRYPTION_ALGORITHM","DECRYPTION_FAILURE_TOLERANCE","UNENCRYPTED_BYTES","IV_LENGTH","KEY_PROVIDER_DEFAULTS","MAX_SIF_COUNT","MAX_SIF_DURATION","LivekitError","code","message","ConnectionErrorReason","MediaDeviceFailure","getFailure","error","CryptorErrorReason","CryptorError","reason","participantIdentity","KeyProviderEvent","KeyHandlerEvent","EncryptionEvent","CryptorEvent","events","hasRequiredEvents","requireEvents","R","ReflectApply","target","receiver","args","ReflectOwnKeys","ProcessEmitWarning","warning","NumberIsNaN","EventEmitter","once","defaultMaxListeners","checkListener","listener","arg","n","_getMaxListeners","that","type","doError","er","err","handler","len","listeners","arrayClone","_addListener","prepend","m","existing","w","onceWrapper","_onceWrap","state","wrapped","list","position","originalListener","spliceOne","keys","key","_listeners","unwrap","evlistener","unwrapListeners","emitter","listenerCount","arr","copy","index","ret","errorListener","resolver","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","flags","wrapListener","eventsExports","isVideoFrame","frame","importKey","keyBytes_1","keyBytes","algorithm","usage","getAlgoOptions","algorithmName","salt","encodedSalt","deriveKeys","material","algorithmOptions","encryptionKey","ratchet","needsRbspUnescaping","frameData","parseRbsp","stream","dataOut","length","kZerosInStartSequence","kEmulationByte","writeRbsp","data_in","numConsecutiveZeros","byte","SifGuard","_a","encryptionEnabledMap","BaseFrameCryptor","encodedFrame","controller","FrameCryptor","opts","id","codec","map","operation","readable","writable","trackId","transformFn","transformStream","trailer","keySet","keyIndex","iv","frameInfo","frameHeader","frameTrailer","cipherText","newDataWithoutHeader","newData","isFrameServerInjected","decodedFrame","encodedFrame_1","keyIndex_1","_this","initialMaterial","ratchetOpts","encryptedData","newUint8","ivLength","cipherTextStart","cipherTextLength","plainText","ratchetedKeySet","ratchetResult","synchronizationSource","timestamp","ivView","sendCount","detectedCodec","data","naluIndices","findNALUIndices","naluIndex","NALUType","parseNALUType","payloadType","start","pos","searchLength","end","startByte","kNaluTypeMask","trailerBytes","ParticipantKeyHandler","keyProviderOptions","setKey","currentKeyIndex","existingPromise","ratchetPromise","currentMaterial","chainKey","newMaterial","material_1","_this2","ratchetedResult","newIndex","participantCryptors","participantKeys","sharedKeyHandler","messageQueue","isEncryptionEnabled","useSharedKey","sifTrailer","rtpMap","ev","kind","setEncryptionEnabled","getTrackCryptor","setSharedKey","getParticipantKeyHandler","unsetCryptorParticipant","cr","handleRatchetRequest","handleSifTrailer","keyHandler","getSharedKeyHandler","cryptors","debugInfo","cryptor","setupCryptorErrorEvents","emitRatchetedKeys","enable","msg","event","transformer"],"mappings":"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","x_google_ignoreList":[0]}
|