async getAgent()

in src/agents/ngrok.js [34:69]


    async getAgent(action) {
        log.verbose("Setting up ngrok", this.argv.ngrokRegion ? `(region: ${this.argv.ngrokRegion})` : "");

        // 1. start local server on random port
        this.ngrokServer = http.createServer(this.ngrokHandler.bind(this));
        // turn server.listen() into promise so we can await
        const listen = util.promisify( this.ngrokServer.listen.bind(this.ngrokServer) );
        await listen(0, '127.0.0.1');

        // 2. start ngrok tunnel connected to that port
        this.ngrokServerPort = this.ngrokServer.address().port;

        // create a unique authorization token that we check on our local instance later
        // this adds extra protection on top of the uniquely generated ngrok subdomain (e.g. a01ae275.ngrok.io)
        this.ngrokAuth = crypto.randomBytes(32).toString("hex");
        const ngrokUrl = await ngrok.connect({
            addr: this.ngrokServerPort,
            region: this.argv.ngrokRegion
        });

        // 3. pass on public ngrok url to agent
        action.parameters.push({
            key: "$ngrokUrl",
            value: url.parse(ngrokUrl).host
        });
        action.parameters.push({
            key: "$ngrokAuth",
            value: this.ngrokAuth
        });

        const h = log.highlightColor;
        log.step(`Ngrok forwarding: ${h(ngrokUrl)} => http://localhost:${h(this.ngrokServerPort)}`);
        log.debug(`ngrok agent auth key: ${this.ngrokAuth}`)

        return fs.readFileSync(`${__dirname}/../../agent/agent-ngrok.js`, {encoding: 'utf8'});
    }