client/client-node.js

global.WebSocket = require('ws'); // Polyfill for extending browser code
const http = require('http');
const https = require('https');
const Client = require('./client-web');
const Deferred = require('../lib/deferred');


/**
 * Polyfill http request for node
 */
Client.fetchResponseUrl = function(url, timeout = 3000) {
    let req;

    return new Deferred({
        timeout,
        onExpire: () => req && req.destroy(),
        handler: (deferred) => {
            const transport = new URL(url).protocol == 'https:' ? https : http;

            req = transport.request(url, {method: 'HEAD'}, (response) => {
                response.resume();

                if (response.statusCode != 301 && response.statusCode != 302) {
                    return deferred.reject(new Error(`Not redirected, status code: "${response.statusCode}"`));
                }

                if (!response.headers.location) {
                    return deferred.reject(new Error(`Redirected, but no location header`));
                }

                deferred.resolve(response.headers.location);
            });

            req.on('error', err => deferred.reject(err));
            req.end();
        }
    });
};


module.exports = Client;