Source: connectorType/Passive.js

import ConnectorMode from './ConnectorMode'
import { createServer } from 'net';
import { write } from '../utils/responseUtils.js'

/**
 * Represents passive connection mode
 * @class
 */
export default class Passive extends ConnectorMode {

    /**
     * @param {ConnectionFTP} connection 
     */
    constructor(connection) {
        super(connection)
        this.prepareConnection()
    }

    /**
     * Prepares for server connection 
     */
    prepareConnection = async () => {
        const serverData = createServer(socket => this.setupDataSocket(socket));
        serverData.listen(0, () => {
            const portData = serverData.address().port;
            this.pasv = `227 Entering passive mode (127,0,0,1,${Math.floor(portData / 256).toString()},${Math.floor(portData % 256).toString()}).`
            console.log('Server data created on port' + portData)
            write(this.connection.commandSocket, this.pasv);
        });
    }

    /**
     * Setting up data socket
     * @param {Socket} socket 
     */
    setupDataSocket = (socket) => {
        console.log('client connected to data pipe')
        this.dataSocket = socket;
    }
}