text: const EventEmitter = require('events');
  const prism = require('prism-media');
  const PacketHandler = require('./PacketHandler');
  const { Error } = require('../../../errors');
  
  /**
   * Receives audio packets from a voice connection.
   * @example
   * const receiver = connection.createReceiver();
   * // opusStream is a ReadableStream - that means you could play it back to a voice channel if you wanted to!
   * const opusStream = receiver.createStream(user);
   */
  class VoiceReceiver extends EventEmitter {
    constructor(connection) {
      super();
      this.connection = connection;
      this.packets = new PacketHandler(this);
      /**
       * Emitted whenever there is a warning
       * @event VoiceReceiver#debug
       * @param {Error|string} error The error or message to debug
       */
      this.packets.on('error', err => this.emit('debug', err));
      this.connection.sockets.udp.socket.on('message', buffer => this.packets.push(buffer));
    }
  
    /**
     * Options passed to `VoiceReceiver#createStream`.
     * @typedef {Object} ReceiveStreamOptions
     * @property {string} [mode='opus'] The mode for audio output. This defaults to opus, meaning discord.js won't decode
     * the packets for you. You can set this to 'pcm' so that the stream's output will be 16-bit little-endian stereo
     * audio
     */
  
    /**
     * Creates a new audio receiving stream. If a stream already exists for a user, then that stream will be returned
     * rather than generating a new one.
     * @param {UserResolvable} user The user to start listening to.
     * @param {ReceiveStreamOptions} options Options.
     * @returns {ReadableStream}
     */
    createStream(user, { mode = 'opus' } = {}) {
      user = this.connection.client.users.resolve(user);
      if (!user) throw new Error('VOICE_USER_MISSING');
      const stream = this.packets.makeStream(user.id);
      if (mode === 'pcm') {
        const decoder = new prism.opus.Decoder({ channels: 2, rate: 48000, frameSize: 960 });
        stream.pipe(decoder);
        return decoder;
      }
      return stream;
    }
  }
  
  module.exports = VoiceReceiver;
  