Musique/node_modules/@discordjs/voice/dist/index.js

10 lines
36 KiB
JavaScript

var ze=Object.create;var M=Object.defineProperty;var Ye=Object.getOwnPropertyDescriptor;var Xe=Object.getOwnPropertyNames;var Ze=Object.getPrototypeOf,Qe=Object.prototype.hasOwnProperty;var et=(i,e,t)=>e in i?M(i,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):i[e]=t;var re=i=>M(i,"__esModule",{value:!0});var tt=(i,e)=>()=>(e||i((e={exports:{}}).exports,e),e.exports),it=(i,e)=>{re(i);for(var t in e)M(i,t,{get:e[t],enumerable:!0})},st=(i,e,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Xe(e))!Qe.call(i,s)&&s!=="default"&&M(i,s,{get:()=>e[s],enumerable:!(t=Ye(e,s))||t.enumerable});return i},h=i=>st(re(M(i!=null?ze(Ze(i)):{},"default",i&&i.__esModule&&"default"in i?{get:()=>i.default,enumerable:!0}:{value:i,enumerable:!0})),i);var r=(i,e,t)=>(et(i,typeof e!="symbol"?e+"":e,t),t);var Fe=tt((Li,Pt)=>{Pt.exports={name:"@discordjs/voice",version:"0.7.4",description:"Implementation of the Discord Voice API for Node.js",scripts:{pretest:"npm run build",test:"jest --pass-with-no-tests","test:ci":"jest --no-stack-trace --verbose --pass-with-no-tests",prebuild:"npm run lint",build:"tsup",postbuild:"node scripts/postbuild.mjs",lint:"eslint src --ext mjs,js,ts","lint:fix":"eslint src --ext mjs,js,ts --fix",format:"prettier --write **/*.{ts,js,json,yml,yaml}",prepare:"is-ci || husky install",docs:"typedoc --json docs/typedoc-out.json src/index.ts && node scripts/docs.mjs",prepublishOnly:"npm run lint && npm run test",release:"standard-version --preset angular"},main:"./dist/index.js",module:"./dist/index.mjs",typings:"./dist/index.d.ts",exports:{import:"./dist/index.mjs",require:"./dist/index.js"},directories:{lib:"src",test:"__tests__"},files:["dist"],author:"Amish Shah <amish@shah.gg>",license:"Apache-2.0",keywords:["discord","discord.js","audio","voice","streaming"],repository:{type:"git",url:"git+https://github.com/discordjs/voice.git"},bugs:{url:"https://github.com/discordjs/voice/issues"},homepage:"https://github.com/discordjs/voice",dependencies:{"@types/ws":"^8.2.0","discord-api-types":"^0.24.0","prism-media":"^1.3.2","tiny-typed-emitter":"^2.1.0",tslib:"^2.3.1",ws:"^8.2.3"},devDependencies:{"@babel/core":"^7.16.0","@babel/preset-env":"^7.16.0","@babel/preset-typescript":"^7.16.0","@commitlint/cli":"^14.1.0","@commitlint/config-angular":"^14.1.0","@discordjs/ts-docgen":"^0.3.2","@types/jest":"^27.0.2","@types/node":"^16.11.7","@typescript-eslint/eslint-plugin":"^5.3.1","@typescript-eslint/parser":"^5.3.1",eslint:"^8.2.0","eslint-config-marine":"^9.0.6","eslint-config-prettier":"^8.3.0","eslint-plugin-prettier":"^4.0.0",husky:"^7.0.4","is-ci":"^3.0.1",jest:"^27.3.1","jest-websocket-mock":"^2.2.1","lint-staged":"^11.2.6","mock-socket":"^9.0.7",prettier:"^2.4.1","standard-version":"^9.3.2",tsup:"^5.7.0",typedoc:"^0.22.8",typescript:"^4.4.4"},engines:{node:">=16.0.0",npm:">=7.0.0"},publishConfig:{access:"public"}}});it(exports,{AudioPlayer:()=>H,AudioPlayerError:()=>N,AudioPlayerStatus:()=>d,AudioReceiveStream:()=>J,AudioResource:()=>j,EndBehaviorType:()=>I,NoSubscriberBehavior:()=>x,PlayerSubscription:()=>W,SSRCMap:()=>L,SpeakingMap:()=>T,StreamType:()=>p,VoiceConnection:()=>K,VoiceConnectionDisconnectReason:()=>y,VoiceConnectionStatus:()=>c,VoiceReceiver:()=>q,createAudioPlayer:()=>De,createAudioResource:()=>je,createDefaultAudioReceiveStreamOptions:()=>ie,demuxProbe:()=>xt,entersState:()=>wt,generateDependencyReport:()=>Ct,getGroups:()=>ce,getVoiceConnection:()=>B,getVoiceConnections:()=>G,joinVoiceChannel:()=>gt,validateDiscordOpusHead:()=>qe});var ae=h(require("discord-api-types/v9"));function R(i){return{op:ae.GatewayOpcodes.VoiceStateUpdate,d:{guild_id:i.guildId,channel_id:i.channelId,self_deaf:i.selfDeaf,self_mute:i.selfMute}}}var U=new Map;U.set("default",new Map);function ot(i){let e=U.get(i);if(e)return e;let t=new Map;return U.set(i,t),t}function ce(){return U}function G(i="default"){return U.get(i)}function B(i,e="default"){return G(e)?.get(i)}function de(i){return G(i.joinConfig.group)?.delete(i.joinConfig.guildId)}function ue(i){return ot(i.joinConfig.group).set(i.joinConfig.guildId,i)}var nt=20,Y,V=-1,w=[];function pe(){if(V===-1)return;V+=nt;let i=w.filter(e=>e.checkPlayable());i.forEach(e=>e._stepDispatch()),le(i)}function le(i){let e=i.shift();if(!e){V!==-1&&(Y=setTimeout(()=>pe(),V-Date.now()));return}e._stepPrepare(),setImmediate(()=>le(i))}function rt(i){return w.includes(i)}function fe(i){return rt(i)||(w.push(i),w.length===1&&(V=Date.now(),setImmediate(()=>pe()))),i}function he(i){let e=w.indexOf(i);e!==-1&&(w.splice(e,1),w.length===0&&(V=-1,typeof Y!="undefined"&&clearTimeout(Y)))}var k=h(require("discord-api-types/voice/v4"));var me=h(require("node:dgram")),ge=h(require("node:net")),ye=h(require("tiny-typed-emitter")),at=5e3,ct=12,dt=2**32-1,X=class extends ye.TypedEmitter{constructor(e,t=!1){super();r(this,"socket");r(this,"remote");r(this,"keepAlives");r(this,"keepAliveCounter",0);r(this,"keepAliveBuffer");r(this,"keepAliveInterval");r(this,"ping");r(this,"debug");this.socket=(0,me.createSocket)("udp4"),this.socket.on("error",s=>this.emit("error",s)),this.socket.on("message",s=>this.onMessage(s)),this.socket.on("close",()=>this.emit("close")),this.remote=e,this.keepAlives=[],this.keepAliveBuffer=Buffer.alloc(8),this.keepAliveInterval=setInterval(()=>this.keepAlive(),at),setImmediate(()=>this.keepAlive()),this.debug=t?s=>this.emit("debug",s):null}onMessage(e){if(e.length===8){let t=e.readUInt32LE(0),s=this.keepAlives.findIndex(({value:n})=>n===t);if(s===-1)return;this.ping=Date.now()-this.keepAlives[s].timestamp,this.keepAlives.splice(0,s)}this.emit("message",e)}keepAlive(){if(this.keepAlives.length>=ct){this.debug?.("UDP socket has not received enough responses from Discord - closing socket"),this.destroy();return}this.keepAliveBuffer.writeUInt32LE(this.keepAliveCounter,0),this.send(this.keepAliveBuffer),this.keepAlives.push({value:this.keepAliveCounter,timestamp:Date.now()}),this.keepAliveCounter++,this.keepAliveCounter>dt&&(this.keepAliveCounter=0)}send(e){return this.socket.send(e,this.remote.port,this.remote.ip)}destroy(){try{this.socket.close()}catch{}clearInterval(this.keepAliveInterval)}performIPDiscovery(e){return new Promise((t,s)=>{let n=u=>{try{if(u.readUInt16BE(0)!==2)return;let a=ut(u);this.socket.off("message",n),t(a)}catch{}};this.socket.on("message",n),this.socket.once("close",()=>s(new Error("Cannot perform IP discovery - socket closed")));let o=Buffer.alloc(74);o.writeUInt16BE(1,0),o.writeUInt16BE(70,2),o.writeUInt32BE(e,4),this.send(o)})}};function ut(i){let e=Buffer.from(i),t=e.slice(8,e.indexOf(0,8)).toString("utf-8");if(!(0,ge.isIPv4)(t))throw new Error("Malformed IP address");let s=e.readUInt16BE(e.length-2);return{ip:t,port:s}}var Z=h(require("discord-api-types/voice/v4")),be=h(require("ws")),Se=h(require("tiny-typed-emitter")),Q=class extends Se.TypedEmitter{constructor(e,t){super();r(this,"heartbeatInterval");r(this,"lastHeartbeatAck");r(this,"lastHeatbeatSend");r(this,"missedHeartbeats",0);r(this,"ping");r(this,"debug");r(this,"ws");this.ws=new be.default(e),this.ws.onmessage=s=>this.onMessage(s),this.ws.onopen=s=>this.emit("open",s),this.ws.onerror=s=>this.emit("error",s instanceof Error?s:s.error),this.ws.onclose=s=>this.emit("close",s),this.lastHeartbeatAck=0,this.lastHeatbeatSend=0,this.debug=t?s=>this.emit("debug",s):null}destroy(){try{this.debug?.("destroyed"),this.setHeartbeatInterval(-1),this.ws.close(1e3)}catch(e){let t=e;this.emit("error",t)}}onMessage(e){if(typeof e.data!="string")return;this.debug?.(`<< ${e.data}`);let t;try{t=JSON.parse(e.data)}catch(s){let n=s;this.emit("error",n);return}t.op===Z.VoiceOpcodes.HeartbeatAck&&(this.lastHeartbeatAck=Date.now(),this.missedHeartbeats=0,this.ping=this.lastHeartbeatAck-this.lastHeatbeatSend),this.emit("packet",t)}sendPacket(e){try{let t=JSON.stringify(e);return this.debug?.(`>> ${t}`),this.ws.send(t)}catch(t){let s=t;this.emit("error",s)}}sendHeartbeat(){this.lastHeatbeatSend=Date.now(),this.missedHeartbeats++;let e=this.lastHeatbeatSend;return this.sendPacket({op:Z.VoiceOpcodes.Heartbeat,d:e})}setHeartbeatInterval(e){typeof this.heartbeatInterval!="undefined"&&clearInterval(this.heartbeatInterval),e>0&&(this.heartbeatInterval=setInterval(()=>{this.lastHeatbeatSend!==0&&this.missedHeartbeats>=3&&(this.ws.close(),this.setHeartbeatInterval(-1)),this.sendHeartbeat()},e))}};var ke={sodium:i=>({open:i.api.crypto_secretbox_open_easy,close:i.api.crypto_secretbox_easy,random:(e,t)=>(t||(t=Buffer.allocUnsafe(e)),i.api.randombytes_buf(t),t)}),"libsodium-wrappers":i=>({open:i.crypto_secretbox_open_easy,close:i.crypto_secretbox_easy,random:e=>i.randombytes_buf(e)}),tweetnacl:i=>({open:i.secretbox.open,close:i.secretbox,random:e=>i.randomBytes(e)})},ee=()=>{throw new Error(`Cannot play audio as no valid encryption package is installed.
- Install sodium, libsodium-wrappers, or tweetnacl.
- Use the generateDependencyReport() function for more information.
`)},C={open:ee,close:ee,random:ee};(async()=>{for(let i of Object.keys(ke))try{let e=require(i);i==="libsodium-wrappers"&&e.ready&&await e.ready,Object.assign(C,ke[i](e));break}catch{}})();var g=()=>{};var ve=h(require("tiny-typed-emitter")),pt=2,lt=48e3/100*pt,ft=2**32-1,ht=["xsalsa20_poly1305_lite","xsalsa20_poly1305_suffix","xsalsa20_poly1305"],l;(function(a){a[a.OpeningWs=0]="OpeningWs",a[a.Identifying=1]="Identifying",a[a.UdpHandshaking=2]="UdpHandshaking",a[a.SelectingProtocol=3]="SelectingProtocol",a[a.Ready=4]="Ready",a[a.Resuming=5]="Resuming",a[a.Closed=6]="Closed"})(l||(l={}));var Pe=Buffer.alloc(24),te=class extends ve.TypedEmitter{constructor(e,t){super();r(this,"_state");r(this,"debug");this.onWsOpen=this.onWsOpen.bind(this),this.onChildError=this.onChildError.bind(this),this.onWsPacket=this.onWsPacket.bind(this),this.onWsClose=this.onWsClose.bind(this),this.onWsDebug=this.onWsDebug.bind(this),this.onUdpDebug=this.onUdpDebug.bind(this),this.onUdpClose=this.onUdpClose.bind(this),this.debug=t?s=>this.emit("debug",s):null,this._state={code:0,ws:this.createWebSocket(e.endpoint),connectionOptions:e}}destroy(){this.state={code:6}}get state(){return this._state}set state(e){let t=Reflect.get(this._state,"ws"),s=Reflect.get(e,"ws");t&&t!==s&&(t.off("debug",this.onWsDebug),t.on("error",g),t.off("error",this.onChildError),t.off("open",this.onWsOpen),t.off("packet",this.onWsPacket),t.off("close",this.onWsClose),t.destroy());let n=Reflect.get(this._state,"udp"),o=Reflect.get(e,"udp");n&&n!==o&&(n.on("error",g),n.off("error",this.onChildError),n.off("close",this.onUdpClose),n.off("debug",this.onUdpDebug),n.destroy());let u=this._state;this._state=e,this.emit("stateChange",u,e),this.debug?.(`state change:
from ${Ae(u)}
to ${Ae(e)}`)}createWebSocket(e){let t=new Q(`wss://${e}?v=4`,Boolean(this.debug));return t.on("error",this.onChildError),t.once("open",this.onWsOpen),t.on("packet",this.onWsPacket),t.once("close",this.onWsClose),t.on("debug",this.onWsDebug),t}onChildError(e){this.emit("error",e)}onWsOpen(){if(this.state.code===0){let e={op:k.VoiceOpcodes.Identify,d:{server_id:this.state.connectionOptions.serverId,user_id:this.state.connectionOptions.userId,session_id:this.state.connectionOptions.sessionId,token:this.state.connectionOptions.token}};this.state.ws.sendPacket(e),this.state={...this.state,code:1}}else if(this.state.code===5){let e={op:k.VoiceOpcodes.Resume,d:{server_id:this.state.connectionOptions.serverId,session_id:this.state.connectionOptions.sessionId,token:this.state.connectionOptions.token}};this.state.ws.sendPacket(e)}}onWsClose({code:e}){(e===4015||e<4e3)&&this.state.code===4?this.state={...this.state,code:5,ws:this.createWebSocket(this.state.connectionOptions.endpoint)}:this.state.code!==6&&(this.destroy(),this.emit("close",e))}onUdpClose(){this.state.code===4&&(this.state={...this.state,code:5,ws:this.createWebSocket(this.state.connectionOptions.endpoint)})}onWsPacket(e){if(e.op===k.VoiceOpcodes.Hello&&this.state.code!==6)this.state.ws.setHeartbeatInterval(e.d.heartbeat_interval);else if(e.op===k.VoiceOpcodes.Ready&&this.state.code===1){let{ip:t,port:s,ssrc:n,modes:o}=e.d,u=new X({ip:t,port:s});u.on("error",this.onChildError),u.on("debug",this.onUdpDebug),u.once("close",this.onUdpClose),u.performIPDiscovery(n).then(a=>{this.state.code===2&&(this.state.ws.sendPacket({op:k.VoiceOpcodes.SelectProtocol,d:{protocol:"udp",data:{address:a.ip,port:a.port,mode:mt(o)}}}),this.state={...this.state,code:3})}).catch(a=>this.emit("error",a)),this.state={...this.state,code:2,udp:u,connectionData:{ssrc:n}}}else if(e.op===k.VoiceOpcodes.SessionDescription&&this.state.code===3){let{mode:t,secret_key:s}=e.d;this.state={...this.state,code:4,connectionData:{...this.state.connectionData,encryptionMode:t,secretKey:new Uint8Array(s),sequence:Ce(16),timestamp:Ce(32),nonce:0,nonceBuffer:Buffer.alloc(24),speaking:!1,packetsPlayed:0}}}else e.op===k.VoiceOpcodes.Resumed&&this.state.code===5&&(this.state={...this.state,code:4},this.state.connectionData.speaking=!1)}onWsDebug(e){this.debug?.(`[WS] ${e}`)}onUdpDebug(e){this.debug?.(`[UDP] ${e}`)}prepareAudioPacket(e){let t=this.state;if(t.code===4)return t.preparedPacket=this.createAudioPacket(e,t.connectionData),t.preparedPacket}dispatchAudio(){let e=this.state;return e.code!==4?!1:typeof e.preparedPacket!="undefined"?(this.playAudioPacket(e.preparedPacket),e.preparedPacket=void 0,!0):!1}playAudioPacket(e){let t=this.state;if(t.code!==4)return;let{connectionData:s}=t;s.packetsPlayed++,s.sequence++,s.timestamp+=lt,s.sequence>=2**16&&(s.sequence=0),s.timestamp>=2**32&&(s.timestamp=0),this.setSpeaking(!0),t.udp.send(e)}setSpeaking(e){let t=this.state;t.code===4&&t.connectionData.speaking!==e&&(t.connectionData.speaking=e,t.ws.sendPacket({op:k.VoiceOpcodes.Speaking,d:{speaking:e?1:0,delay:0,ssrc:t.connectionData.ssrc}}))}createAudioPacket(e,t){let s=Buffer.alloc(12);s[0]=128,s[1]=120;let{sequence:n,timestamp:o,ssrc:u}=t;return s.writeUIntBE(n,2,2),s.writeUIntBE(o,4,4),s.writeUIntBE(u,8,4),s.copy(Pe,0,0,12),Buffer.concat([s,...this.encryptOpusPacket(e,t)])}encryptOpusPacket(e,t){let{secretKey:s,encryptionMode:n}=t;if(n==="xsalsa20_poly1305_lite")return t.nonce++,t.nonce>ft&&(t.nonce=0),t.nonceBuffer.writeUInt32BE(t.nonce,0),[C.close(e,t.nonceBuffer,s),t.nonceBuffer.slice(0,4)];if(n==="xsalsa20_poly1305_suffix"){let o=C.random(24,t.nonceBuffer);return[C.close(e,o,s),o]}return[C.close(e,Pe,s)]}};function Ce(i){return Math.floor(Math.random()*2**i)}function Ae(i){return JSON.stringify({...i,ws:Reflect.has(i,"ws"),udp:Reflect.has(i,"udp")})}function mt(i){let e=i.find(t=>ht.includes(t));if(!e)throw new Error(`No compatible encryption modes. Available include: ${i.join(", ")}`);return e}var Oe=h(require("tiny-typed-emitter"));var $=h(require("discord-api-types/voice/v4"));var Ee=h(require("node:stream"));var N=class extends Error{constructor(e,t){super(e.message);r(this,"resource");this.resource=t,this.name=e.name,this.stack=e.stack}};var W=class{constructor(e,t){r(this,"connection");r(this,"player");this.connection=e,this.player=t}unsubscribe(){this.connection.onSubscriptionRemoved(this),this.player.unsubscribe(this)}};var we=h(require("tiny-typed-emitter")),O=Buffer.from([248,255,254]),x;(function(s){s.Pause="pause",s.Play="play",s.Stop="stop"})(x||(x={}));var d;(function(o){o.Idle="idle",o.Buffering="buffering",o.Paused="paused",o.Playing="playing",o.AutoPaused="autopaused"})(d||(d={}));var H=class extends we.TypedEmitter{constructor(e={}){super();r(this,"_state");r(this,"subscribers",[]);r(this,"behaviors");r(this,"debug");this._state={status:d.Idle},this.behaviors={noSubscriber:x.Pause,maxMissedFrames:5,...e.behaviors},this.debug=e.debug===!1?null:t=>this.emit("debug",t)}get playable(){return this.subscribers.filter(({connection:e})=>e.state.status===c.Ready).map(({connection:e})=>e)}subscribe(e){let t=this.subscribers.find(s=>s.connection===e);if(!t){let s=new W(e,this);return this.subscribers.push(s),setImmediate(()=>this.emit("subscribe",s)),s}return t}unsubscribe(e){let t=this.subscribers.indexOf(e),s=t!==-1;return s&&(this.subscribers.splice(t,1),e.connection.setSpeaking(!1),this.emit("unsubscribe",e)),s}get state(){return this._state}set state(e){let t=this._state,s=Reflect.get(e,"resource");t.status!==d.Idle&&t.resource!==s&&(t.resource.playStream.on("error",g),t.resource.playStream.off("error",t.onStreamError),t.resource.audioPlayer=void 0,t.resource.playStream.destroy(),t.resource.playStream.read()),t.status===d.Buffering&&(e.status!==d.Buffering||e.resource!==t.resource)&&(t.resource.playStream.off("end",t.onFailureCallback),t.resource.playStream.off("close",t.onFailureCallback),t.resource.playStream.off("finish",t.onFailureCallback),t.resource.playStream.off("readable",t.onReadableCallback)),e.status===d.Idle&&(this._signalStopSpeaking(),he(this)),s&&fe(this);let n=t.status!==d.Idle&&e.status===d.Playing&&t.resource!==e.resource;this._state=e,this.emit("stateChange",t,this._state),(t.status!==e.status||n)&&this.emit(e.status,t,this._state),this.debug?.(`state change:
from ${xe(t)}
to ${xe(e)}`)}play(e){if(e.ended)throw new Error("Cannot play a resource that has already ended.");if(e.audioPlayer){if(e.audioPlayer===this)return;throw new Error("Resource is already being played by another audio player.")}e.audioPlayer=this;let t=s=>{this.state.status!==d.Idle&&this.emit("error",new N(s,this.state.resource)),this.state.status!==d.Idle&&this.state.resource===e&&(this.state={status:d.Idle})};if(e.playStream.once("error",t),e.started)this.state={status:d.Playing,missedFrames:0,playbackDuration:0,resource:e,onStreamError:t};else{let s=()=>{this.state.status===d.Buffering&&this.state.resource===e&&(this.state={status:d.Playing,missedFrames:0,playbackDuration:0,resource:e,onStreamError:t})},n=()=>{this.state.status===d.Buffering&&this.state.resource===e&&(this.state={status:d.Idle})};e.playStream.once("readable",s),e.playStream.once("end",n),e.playStream.once("close",n),e.playStream.once("finish",n),this.state={status:d.Buffering,resource:e,onReadableCallback:s,onFailureCallback:n,onStreamError:t}}}pause(e=!0){return this.state.status!==d.Playing?!1:(this.state={...this.state,status:d.Paused,silencePacketsRemaining:e?5:0},!0)}unpause(){return this.state.status!==d.Paused?!1:(this.state={...this.state,status:d.Playing,missedFrames:0},!0)}stop(e=!1){return this.state.status===d.Idle?!1:(e||this.state.resource.silencePaddingFrames===0?this.state={status:d.Idle}:this.state.resource.silenceRemaining===-1&&(this.state.resource.silenceRemaining=this.state.resource.silencePaddingFrames),!0)}checkPlayable(){let e=this._state;return e.status===d.Idle||e.status===d.Buffering?!1:e.resource.readable?!0:(this.state={status:d.Idle},!1)}_stepDispatch(){let e=this._state;e.status===d.Idle||e.status===d.Buffering||this.playable.forEach(t=>t.dispatchAudio())}_stepPrepare(){let e=this._state;if(e.status===d.Idle||e.status===d.Buffering)return;let t=this.playable;if(e.status===d.AutoPaused&&t.length>0&&(this.state={...e,status:d.Playing,missedFrames:0}),e.status===d.Paused||e.status===d.AutoPaused){e.silencePacketsRemaining>0&&(e.silencePacketsRemaining--,this._preparePacket(O,t,e),e.silencePacketsRemaining===0&&this._signalStopSpeaking());return}if(t.length===0)if(this.behaviors.noSubscriber===x.Pause){this.state={...e,status:d.AutoPaused,silencePacketsRemaining:5};return}else this.behaviors.noSubscriber===x.Stop&&this.stop(!0);let s=e.resource.read();e.status===d.Playing&&(s?(this._preparePacket(s,t,e),e.missedFrames=0):(this._preparePacket(O,t,e),e.missedFrames++,e.missedFrames>=this.behaviors.maxMissedFrames&&this.stop()))}_signalStopSpeaking(){return this.subscribers.forEach(({connection:e})=>e.setSpeaking(!1))}_preparePacket(e,t,s){s.playbackDuration+=20,t.forEach(n=>n.prepareAudioPacket(e))}};function xe(i){return JSON.stringify({...i,resource:Reflect.has(i,"resource"),stepTimeout:Reflect.has(i,"stepTimeout")})}function De(i){return new H(i)}var I;(function(s){s[s.Manual=0]="Manual",s[s.AfterSilence=1]="AfterSilence",s[s.AfterInactivity=2]="AfterInactivity"})(I||(I={}));function ie(){return{end:{behavior:0}}}var J=class extends Ee.Readable{constructor({end:e,...t}){super({...t,objectMode:!0});r(this,"end");r(this,"endTimeout");this.end=e}push(e){return e&&(this.end.behavior===2||this.end.behavior===1&&(e.compare(O)!==0||typeof this.endTimeout=="undefined"))&&this.renewEndTimeout(this.end),super.push(e)}renewEndTimeout(e){this.endTimeout&&clearTimeout(this.endTimeout),this.endTimeout=setTimeout(()=>this.push(null),e.duration)}_read(){}};var Re=h(require("tiny-typed-emitter")),se=class extends Re.TypedEmitter{constructor(){super();r(this,"users");r(this,"speakingTimeouts");this.users=new Map,this.speakingTimeouts=new Map}onPacket(e){let t=this.speakingTimeouts.get(e);t?clearTimeout(t):(this.users.set(e,Date.now()),this.emit("start",e)),this.startTimeout(e)}startTimeout(e){this.speakingTimeouts.set(e,setTimeout(()=>{this.emit("end",e),this.speakingTimeouts.delete(e),this.users.delete(e)},se.DELAY))}},T=se;r(T,"DELAY",100);var Ve=h(require("tiny-typed-emitter")),L=class extends Ve.TypedEmitter{constructor(){super();r(this,"map");this.map=new Map}update(e){let t=this.map.get(e.audioSSRC),s={...this.map.get(e.audioSSRC),...e};this.map.set(e.audioSSRC,s),t||this.emit("create",s),this.emit("update",t,s)}get(e){if(typeof e=="number")return this.map.get(e);for(let t of this.map.values())if(t.userId===e)return t}delete(e){if(typeof e=="number"){let t=this.map.get(e);return t&&(this.map.delete(e),this.emit("delete",t)),t}for(let[t,s]of this.map.entries())if(s.userId===e)return this.map.delete(t),this.emit("delete",s),s}};var q=class{constructor(e){r(this,"voiceConnection");r(this,"ssrcMap");r(this,"subscriptions");r(this,"connectionData");r(this,"speaking");this.voiceConnection=e,this.ssrcMap=new L,this.speaking=new T,this.subscriptions=new Map,this.connectionData={},this.onWsPacket=this.onWsPacket.bind(this),this.onUdpMessage=this.onUdpMessage.bind(this)}onWsPacket(e){e.op===$.VoiceOpcodes.ClientDisconnect&&typeof e.d?.user_id=="string"?this.ssrcMap.delete(e.d.user_id):e.op===$.VoiceOpcodes.Speaking&&typeof e.d?.user_id=="string"&&typeof e.d?.ssrc=="number"?this.ssrcMap.update({userId:e.d.user_id,audioSSRC:e.d.ssrc}):e.op===$.VoiceOpcodes.ClientConnect&&typeof e.d?.user_id=="string"&&typeof e.d?.audio_ssrc=="number"&&this.ssrcMap.update({userId:e.d.user_id,audioSSRC:e.d.audio_ssrc,videoSSRC:e.d.video_ssrc===0?void 0:e.d.video_ssrc})}decrypt(e,t,s,n){let o;t==="xsalsa20_poly1305_lite"?(e.copy(s,0,e.length-4),o=e.length-4):t==="xsalsa20_poly1305_suffix"?(e.copy(s,0,e.length-24),o=e.length-24):e.copy(s,0,0,12);let u=C.open(e.slice(12,o),s,n);if(!!u)return Buffer.from(u)}parsePacket(e,t,s,n){let o=this.decrypt(e,t,s,n);if(!!o){if(o[0]===190&&o[1]===222&&o.length>4){let u=o.readUInt16BE(2),a=4;for(let D=0;D<u;D++){let E=o[a];a++,E!==0&&(a+=1+(E>>4))}let P=o.readUInt8(a);(P===0||P===2)&&a++,o=o.slice(a)}return o}}onUdpMessage(e){if(e.length<=8)return;let t=e.readUInt32BE(8),s=this.ssrcMap.get(t);if(!s)return;this.speaking.onPacket(s.userId);let n=this.subscriptions.get(s.userId);if(!!n&&this.connectionData.encryptionMode&&this.connectionData.nonceBuffer&&this.connectionData.secretKey){let o=this.parsePacket(e,this.connectionData.encryptionMode,this.connectionData.nonceBuffer,this.connectionData.secretKey);o?n.push(o):n.destroy(new Error("Failed to parse packet"))}}subscribe(e,t){let s=this.subscriptions.get(e);if(s)return s;let n=new J({...ie(),...t});return n.once("close",()=>this.subscriptions.delete(e)),this.subscriptions.set(e,n),n}};var c;(function(o){o.Signalling="signalling",o.Connecting="connecting",o.Ready="ready",o.Disconnected="disconnected",o.Destroyed="destroyed"})(c||(c={}));var y;(function(n){n[n.WebSocketClose=0]="WebSocketClose",n[n.AdapterUnavailable=1]="AdapterUnavailable",n[n.EndpointRemoved=2]="EndpointRemoved",n[n.Manual=3]="Manual"})(y||(y={}));var K=class extends Oe.TypedEmitter{constructor(e,{debug:t,adapterCreator:s}){super();r(this,"rejoinAttempts");r(this,"_state");r(this,"joinConfig");r(this,"packets");r(this,"receiver");r(this,"debug");this.debug=t?o=>this.emit("debug",o):null,this.rejoinAttempts=0,this.receiver=new q(this),this.onNetworkingClose=this.onNetworkingClose.bind(this),this.onNetworkingStateChange=this.onNetworkingStateChange.bind(this),this.onNetworkingError=this.onNetworkingError.bind(this),this.onNetworkingDebug=this.onNetworkingDebug.bind(this);let n=s({onVoiceServerUpdate:o=>this.addServerPacket(o),onVoiceStateUpdate:o=>this.addStatePacket(o),destroy:()=>this.destroy(!1)});this._state={status:c.Signalling,adapter:n},this.packets={server:void 0,state:void 0},this.joinConfig=e}get state(){return this._state}set state(e){let t=this._state,s=Reflect.get(t,"networking"),n=Reflect.get(e,"networking"),o=Reflect.get(t,"subscription"),u=Reflect.get(e,"subscription");if(s!==n&&(s&&(s.on("error",g),s.off("debug",this.onNetworkingDebug),s.off("error",this.onNetworkingError),s.off("close",this.onNetworkingClose),s.off("stateChange",this.onNetworkingStateChange),s.destroy()),n&&this.updateReceiveBindings(n.state,s?.state)),e.status===c.Ready)this.rejoinAttempts=0;else if(e.status===c.Destroyed)for(let a of this.receiver.subscriptions.values())a.destroyed||a.destroy();t.status!==c.Destroyed&&e.status===c.Destroyed&&t.adapter.destroy(),this._state=e,o&&o!==u&&o.unsubscribe(),this.emit("stateChange",t,e),t.status!==e.status&&this.emit(e.status,t,e)}addServerPacket(e){this.packets.server=e,e.endpoint?this.configureNetworking():this.state.status!==c.Destroyed&&(this.state={...this.state,status:c.Disconnected,reason:2})}addStatePacket(e){this.packets.state=e,typeof e.self_deaf!="undefined"&&(this.joinConfig.selfDeaf=e.self_deaf),typeof e.self_mute!="undefined"&&(this.joinConfig.selfMute=e.self_mute),e.channel_id&&(this.joinConfig.channelId=e.channel_id)}updateReceiveBindings(e,t){let s=Reflect.get(t??{},"ws"),n=Reflect.get(e,"ws"),o=Reflect.get(t??{},"udp"),u=Reflect.get(e,"udp");s!==n&&(s?.off("packet",this.receiver.onWsPacket),n?.on("packet",this.receiver.onWsPacket)),o!==u&&(o?.off("message",this.receiver.onUdpMessage),u?.on("message",this.receiver.onUdpMessage)),this.receiver.connectionData=Reflect.get(e,"connectionData")??{}}configureNetworking(){let{server:e,state:t}=this.packets;if(!e||!t||this.state.status===c.Destroyed||!e.endpoint)return;let s=new te({endpoint:e.endpoint,serverId:e.guild_id,token:e.token,sessionId:t.session_id,userId:t.user_id},Boolean(this.debug));s.once("close",this.onNetworkingClose),s.on("stateChange",this.onNetworkingStateChange),s.on("error",this.onNetworkingError),s.on("debug",this.onNetworkingDebug),this.state={...this.state,status:c.Connecting,networking:s}}onNetworkingClose(e){this.state.status!==c.Destroyed&&(e===4014?this.state={...this.state,status:c.Disconnected,reason:0,closeCode:e}:(this.state={...this.state,status:c.Signalling},this.rejoinAttempts++,this.state.adapter.sendPayload(R(this.joinConfig))||(this.state={...this.state,status:c.Disconnected,reason:1})))}onNetworkingStateChange(e,t){this.updateReceiveBindings(t,e),e.code!==t.code&&(this.state.status!==c.Connecting&&this.state.status!==c.Ready||(t.code===l.Ready?this.state={...this.state,status:c.Ready}:t.code!==l.Closed&&(this.state={...this.state,status:c.Connecting})))}onNetworkingError(e){this.emit("error",e)}onNetworkingDebug(e){this.debug?.(`[NW] ${e}`)}prepareAudioPacket(e){let t=this.state;if(t.status===c.Ready)return t.networking.prepareAudioPacket(e)}dispatchAudio(){let e=this.state;if(e.status===c.Ready)return e.networking.dispatchAudio()}playOpusPacket(e){let t=this.state;if(t.status===c.Ready)return t.networking.prepareAudioPacket(e),t.networking.dispatchAudio()}destroy(e=!0){if(this.state.status===c.Destroyed)throw new Error("Cannot destroy VoiceConnection - it has already been destroyed");B(this.joinConfig.guildId)===this&&de(this),e&&this.state.adapter.sendPayload(R({...this.joinConfig,channelId:null})),this.state={status:c.Destroyed}}disconnect(){return this.state.status===c.Destroyed||this.state.status===c.Signalling?!1:(this.joinConfig.channelId=null,this.state.adapter.sendPayload(R(this.joinConfig))?(this.state={adapter:this.state.adapter,reason:3,status:c.Disconnected},!0):(this.state={adapter:this.state.adapter,subscription:this.state.subscription,status:c.Disconnected,reason:1},!1))}rejoin(e){if(this.state.status===c.Destroyed)return!1;let t=this.state.status!==c.Ready;return t&&this.rejoinAttempts++,Object.assign(this.joinConfig,e),this.state.adapter.sendPayload(R(this.joinConfig))?(t&&(this.state={...this.state,status:c.Signalling}),!0):(this.state={adapter:this.state.adapter,subscription:this.state.subscription,status:c.Disconnected,reason:1},!1)}setSpeaking(e){return this.state.status!==c.Ready?!1:this.state.networking.setSpeaking(e)}subscribe(e){if(this.state.status===c.Destroyed)return;let t=e.subscribe(this);return this.state={...this.state,subscription:t},t}get ping(){return this.state.status===c.Ready&&this.state.networking.state.code===l.Ready?{ws:this.state.networking.state.ws.ping,udp:this.state.networking.state.udp.ping}:{ws:void 0,udp:void 0}}onSubscriptionRemoved(e){this.state.status!==c.Destroyed&&this.state.subscription===e&&(this.state={...this.state,subscription:void 0})}};function Ie(i,e){let t=R(i),s=B(i.guildId);if(s&&s.state.status!==c.Destroyed)return s.state.status===c.Disconnected?s.rejoin({channelId:i.channelId,selfDeaf:i.selfDeaf,selfMute:i.selfMute}):s.state.adapter.sendPayload(t)||(s.state={...s.state,status:c.Disconnected,reason:1}),s;let n=new K(i,e);return ue(n),n.state.status!==c.Destroyed&&(n.state.adapter.sendPayload(t)||(n.state={...n.state,status:c.Disconnected,reason:1})),n}function gt(i){let e={selfDeaf:!0,selfMute:!1,group:"default",...i};return Ie(e,{adapterCreator:i.adapterCreator,debug:i.debug})}var v=h(require("prism-media")),_e=["-analyzeduration","0","-loglevel","0","-f","s16le","-ar","48000","-ac","2"],Me=["-analyzeduration","0","-loglevel","0","-acodec","libopus","-f","opus","-ar","48000","-ac","2"],p;(function(o){o.Arbitrary="arbitrary",o.Raw="raw",o.OggOpus="ogg/opus",o.WebmOpus="webm/opus",o.Opus="opus"})(p||(p={}));var b;(function(a){a.FFmpegPCM="ffmpeg pcm",a.FFmpegOgg="ffmpeg ogg",a.OpusEncoder="opus encoder",a.OpusDecoder="opus decoder",a.OggOpusDemuxer="ogg/opus demuxer",a.WebmOpusDemuxer="webm/opus demuxer",a.InlineVolume="volume transformer"})(b||(b={}));var Ue=class{constructor(e){r(this,"edges",[]);r(this,"type");this.type=e}addEdge(e){this.edges.push({...e,from:this})}},Be=new Map;for(let i of Object.values(p))Be.set(i,new Ue(i));function m(i){let e=Be.get(i);if(!e)throw new Error(`Node type '${i}' does not exist!`);return e}m(p.Raw).addEdge({type:b.OpusEncoder,to:m(p.Opus),cost:1.5,transformer:()=>new v.default.opus.Encoder({rate:48e3,channels:2,frameSize:960})});m(p.Opus).addEdge({type:b.OpusDecoder,to:m(p.Raw),cost:1.5,transformer:()=>new v.default.opus.Decoder({rate:48e3,channels:2,frameSize:960})});m(p.OggOpus).addEdge({type:b.OggOpusDemuxer,to:m(p.Opus),cost:1,transformer:()=>new v.default.opus.OggDemuxer});m(p.WebmOpus).addEdge({type:b.WebmOpusDemuxer,to:m(p.Opus),cost:1,transformer:()=>new v.default.opus.WebmDemuxer});var oe={type:b.FFmpegPCM,to:m(p.Raw),cost:2,transformer:i=>new v.default.FFmpeg({args:typeof i=="string"?["-i",i,..._e]:_e})};m(p.Arbitrary).addEdge(oe);m(p.OggOpus).addEdge(oe);m(p.WebmOpus).addEdge(oe);m(p.Raw).addEdge({type:b.InlineVolume,to:m(p.Raw),cost:.5,transformer:()=>new v.default.VolumeTransformer({type:"s16le"})});function yt(){try{return v.default.FFmpeg.getInfo().output.includes("--enable-libopus")}catch{}return!1}if(yt()){let i={type:b.FFmpegOgg,to:m(p.OggOpus),cost:2,transformer:e=>new v.default.FFmpeg({args:typeof e=="string"?["-i",e,...Me]:Me})};m(p.Arbitrary).addEdge(i),m(p.OggOpus).addEdge(i),m(p.WebmOpus).addEdge(i)}function Ne(i,e,t=m(p.Opus),s=[],n=5){if(i===t&&e(s))return{cost:0};if(n===0)return{cost:1/0};let o;for(let u of i.edges){if(o&&u.cost>o.cost)continue;let a=Ne(u.to,e,t,[...s,u],n-1),P=u.cost+a.cost;(!o||P<o.cost)&&(o={cost:P,edge:u,next:a})}return o??{cost:1/0}}function bt(i){let e=[],t=i;for(;t?.edge;)e.push(t.edge),t=t.next;return e}function We(i,e){return bt(Ne(m(i),e))}var Te=h(require("node:stream"));var A=h(require("prism-media"));var j=class{constructor(e,t,s,n){r(this,"playStream");r(this,"edges");r(this,"metadata");r(this,"volume");r(this,"encoder");r(this,"audioPlayer");r(this,"playbackDuration",0);r(this,"started",!1);r(this,"silencePaddingFrames");r(this,"silenceRemaining",-1);this.edges=e,this.playStream=t.length>1?(0,Te.pipeline)(t,g):t[0],this.metadata=s,this.silencePaddingFrames=n;for(let o of t)o instanceof A.default.VolumeTransformer?this.volume=o:o instanceof A.default.opus.Encoder&&(this.encoder=o);this.playStream.once("readable",()=>this.started=!0)}get readable(){if(this.silenceRemaining===0)return!1;let e=this.playStream.readable;return e||(this.silenceRemaining===-1&&(this.silenceRemaining=this.silencePaddingFrames),this.silenceRemaining!==0)}get ended(){return this.playStream.readableEnded||this.playStream.destroyed||this.silenceRemaining===0}read(){if(this.silenceRemaining===0)return null;if(this.silenceRemaining>0)return this.silenceRemaining--,O;let e=this.playStream.read();return e&&(this.playbackDuration+=20),e}},St=i=>i.some(e=>e.type===b.InlineVolume),kt=()=>!0;function vt(i){return i instanceof A.default.opus.Encoder?{streamType:p.Opus,hasVolume:!1}:i instanceof A.default.opus.Decoder?{streamType:p.Raw,hasVolume:!1}:i instanceof A.default.VolumeTransformer?{streamType:p.Raw,hasVolume:!0}:i instanceof A.default.opus.OggDemuxer?{streamType:p.Opus,hasVolume:!1}:i instanceof A.default.opus.WebmDemuxer?{streamType:p.Opus,hasVolume:!1}:{streamType:p.Arbitrary,hasVolume:!1}}function je(i,e={}){let t=e.inputType,s=Boolean(e.inlineVolume);if(typeof i=="string")t=p.Arbitrary;else if(typeof t=="undefined"){let u=vt(i);t=u.streamType,s=s&&!u.hasVolume}let n=We(t,s?St:kt);if(n.length===0){if(typeof i=="string")throw new Error(`Invalid pipeline constructed for string resource '${i}'`);return new j([],[i],e.metadata??null,e.silencePaddingFrames??5)}let o=n.map(u=>u.transformer(i));return typeof i!="string"&&o.unshift(i),new j(n,o,e.metadata??null,e.silencePaddingFrames??5)}var F=h(require("node:path")),Ge=h(require("prism-media"));function Ct(){let i=[],e=t=>i.push(`- ${t}: ${At(t)}`);i.push("Core Dependencies"),e("@discordjs/voice"),e("prism-media"),i.push(""),i.push("Opus Libraries"),e("@discordjs/opus"),e("opusscript"),i.push(""),i.push("Encryption Libraries"),e("sodium"),e("libsodium-wrappers"),e("tweetnacl"),i.push(""),i.push("FFmpeg");try{let t=Ge.default.FFmpeg.getInfo();i.push(`- version: ${t.version}`),i.push(`- libopus: ${t.output.includes("--enable-libopus")?"yes":"no"}`)}catch{i.push("- not found")}return["-".repeat(50),...i,"-".repeat(50)].join(`
`)}function He(i,e,t){if(t===0)return;let s=(0,F.resolve)(i,"./package.json");try{let n=require(s);if(n.name!==e)throw new Error("package.json does not match");return n}catch{return He((0,F.resolve)(i,".."),e,t-1)}}function At(i){try{return(i==="@discordjs/voice"?Fe():He((0,F.dirname)(require.resolve(i)),i,3))?.version??"not found"}catch{return"not found"}}function Je(i){let e=new AbortController,t=setTimeout(()=>e.abort(),i);return e.signal.addEventListener("abort",()=>clearTimeout(t)),[e,e.signal]}var Le=h(require("node:events"));async function wt(i,e,t){if(i.state.status!==e){let[s,n]=typeof t=="number"?Je(t):[void 0,t];try{await(0,Le.once)(i,e,{signal:n})}finally{s?.abort()}}return i}var $e=h(require("node:stream")),ne=h(require("prism-media"));function qe(i){let e=i.readUInt8(9),t=i.readUInt32LE(12);return e===2&&t===48e3}function xt(i,e=1024,t=qe){return new Promise((s,n)=>{i.readableObjectMode&&n(new Error("Cannot probe a readable stream in object mode")),i.readableEnded&&n(new Error("Cannot probe a stream that has ended"));let o=Buffer.alloc(0),u,a=S=>{i.off("data",z),i.off("close",_),i.off("end",_),i.pause(),u=S,i.readableEnded?s({stream:$e.Readable.from(o),type:S}):(o.length>0&&i.push(o),s({stream:i,type:S}))},P=S=>Ke=>{t(Ke)&&a(S)},D=new ne.default.opus.WebmDemuxer;D.once("error",g),D.on("head",P(p.WebmOpus));let E=new ne.default.opus.OggDemuxer;E.once("error",g),E.on("head",P(p.OggOpus));let _=()=>{u||a(p.Arbitrary)},z=S=>{o=Buffer.concat([o,S]),D.write(S),E.write(S),o.length>=e&&(i.off("data",z),i.pause(),process.nextTick(_))};i.once("error",n),i.on("data",z),i.once("close",_),i.once("end",_)})}0&&(module.exports={AudioPlayer,AudioPlayerError,AudioPlayerStatus,AudioReceiveStream,AudioResource,EndBehaviorType,NoSubscriberBehavior,PlayerSubscription,SSRCMap,SpeakingMap,StreamType,VoiceConnection,VoiceConnectionDisconnectReason,VoiceConnectionStatus,VoiceReceiver,createAudioPlayer,createAudioResource,createDefaultAudioReceiveStreamOptions,demuxProbe,entersState,generateDependencyReport,getGroups,getVoiceConnection,getVoiceConnections,joinVoiceChannel,validateDiscordOpusHead});
//# sourceMappingURL=index.js.map