import { ChildProcess } from 'child_process' import MailDev from '@peertube/maildev' import { parallelTests, randomInt } from '@shared/core-utils' class MockSmtpServer { private static instance: MockSmtpServer private started = false private emailChildProcess: ChildProcess private emails: object[] private constructor () { } collectEmails (emailsCollection: object[]) { return new Promise<number>((res, rej) => { const port = parallelTests() ? randomInt(1000, 2000) : 1025 this.emails = emailsCollection if (this.started) { return res(undefined) } const maildev = new MailDev({ ip: '127.0.0.1', smtp: port, disableWeb: true, silent: true }) maildev.on('new', email => { this.emails.push(email) }) maildev.listen(err => { if (err) return rej(err) this.started = true return res(port) }) }) } kill () { if (!this.emailChildProcess) return process.kill(this.emailChildProcess.pid) this.emailChildProcess = null MockSmtpServer.instance = null } static get Instance () { return this.instance || (this.instance = new this()) } } // --------------------------------------------------------------------------- export { MockSmtpServer }