Skip to content

@discordjs voice example recorder has memory leaks #3

@seanroades

Description

@seanroades

Which example is this bug report for?

basic

Issue description

git clone https://github.com/discordjs/voice-examples.git
cd recorder
npm i -D
npm start

Join a voice channel
/join
/record speaker@<your_user>

Talk into the mic, and after a while you'll see

👂 Started recording ./recordings/1696122267181-dimsey8_0.ogg
✅ Recorded ./recordings/1696122267181-dimsey8_0.ogg
👂 Started recording ./recordings/1696122271590-dimsey8_0.ogg
👂 Started recording ./recordings/1696122275391-dimsey8_0.ogg
👂 Started recording ./recordings/1696122278329-dimsey8_0.ogg
(node:64307) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added to [AudioReceiveStream]. Use emitter.setMaxListeners() to increase limit
(Use node --trace-warnings ... to show where the warning was created)
✅ Recorded ./recordings/1696122278329-dimsey8_0.ogg
✅ Recorded ./recordings/1696122275391-dimsey8_0.ogg
✅ Recorded ./recordings/1696122271590-dimsey8_0.ogg

Code sample

import { createWriteStream } from 'node:fs';
import { pipeline } from 'node:stream';
import { EndBehaviorType, VoiceReceiver } from '@discordjs/voice';
import type { User } from 'discord.js';
import * as prism from 'prism-media';

function getDisplayName(userId: string, user?: User) {
	return user ? `${user.username}_${user.discriminator}` : userId;
}

export function createListeningStream(receiver: VoiceReceiver, userId: string, user?: User) {
	const opusStream = receiver.subscribe(userId, {
		end: {
			behavior: EndBehaviorType.AfterSilence,
			duration: 1000,
		},
	});

	const oggStream = new prism.opus.OggLogicalBitstream({
		opusHead: new prism.opus.OpusHead({
			channelCount: 2,
			sampleRate: 48000,
		}),
		pageSizeControl: {
			maxPackets: 10,
		},
	});

	const filename = `./recordings/${Date.now()}-${getDisplayName(userId, user)}.ogg`;

	const out = createWriteStream(filename);

	console.log(`👂 Started recording ${filename}`);

	pipeline(opusStream, oggStream, out, (err) => {
		if (err) {
			console.warn(`❌ Error recording file ${filename} - ${err.message}`);
		} else {
			console.log(`✅ Recorded ${filename}`);
		}
	});
}

@discordjs/version version

@discordjs/voice@0.11.0

Node.js version

Node@18.18.0

Operating system

MacOS m1

Priority this issue should have

Medium (should be fixed soon)

I have tested this issue on a development release

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions