lundi 6 août 2018

Ember includedCommands: HTTPS request does not fetch

I am writing an ember includedCommand for fetching and updating the app/index.html file - which uses NodeJS https and fs module to replace the indexFile by calling a function BuildIndexFile, where I am facing a weird issue -

  • When I perform command ember server --update-index - I can see the BuildIndexFile is being called and the https request is made to the remote server which downloads the file and gets written by fs.writeFileSync in app/index.html.

ember server --update-index

  • But when I perform ember update-index which is an included command, I can see BuildIndexFile has been called, and it reaches till console.log('Fetching index.html'); and I believe it is calling https.request... but it closes from there, I have no idea why the call didn't go through, when I debugged using node --inspect-brk ./node_modules/.bin/ember update-index I can see the https is available on the file, but not executing.

ember update-index

I am attaching my sample code available as a in-repo-addon available at lib/hello/index.js -

lib/hello/index.js

/* eslint-env node */
'use strict';


const parseArgs = require('minimist');
const watchman = require('fb-watchman');

let client = new watchman.Client();

client.capabilityCheck({optional: [], required: ['relative_root']}, function (error, response) {
  if (error) {
    console.log(error);
  }
  console.log('Watchman', response);
});

const ServeCommand = require('ember-cli/lib/commands/serve');

const ARGS = parseArgs(process.argv.slice(2));

const fs = require('fs');
const https = require('https');

module.exports = {
  name: 'hello',

  isDevelopingAddon() {
    return true;
  },
  includedCommands: function() {
    var self = this;
    return {
      hello: ServeCommand.extend({
        name: 'hello',
        description: 'A test command that says hello',
        availableOptions: ServeCommand.prototype.availableOptions.concat([{
          name: 'updateindex',
          type: String
        }]),
        run: function(commandOptions, rawArgs) {
          console.log(commandOptions, rawArgs);
          if (commandOptions['updateindex']) {
            console.log('Update Index')
          }
          const sampleHelloPromise = sampleHello();
          const servePromise = this._super.run.apply(this, arguments);
          return Promise.all([sampleHelloPromise, servePromise]);
        }
      }),
      updateIndex: {
        name: 'update-index',
        description: 'Update Index File',
        availableOptions: [{
          name: 'index-file',
          type: String
        }],
        run: function(commandOptions, rawArgs) {
          BuildIndexFile(self.project.root, 'https://yahoo.com', {});
        }
      }
    }
  },
  preBuild: function(result) {
    let self = this;
    if (ARGS['update-index']) {
      BuildIndexFile(self.project.root, 'https://google.com', {}).then(function() {
        delete ARGS['update-index'];
      })
      .catch(function(e) {
        console.log(e);
      });;
    }
  }
};

async function sampleHello() {
  return await new Promise(resolve => {
    setTimeout(() => resolve('hello'), 2000);
  })
}

const BuildIndexFile = (rootPath, target, headers) => {
    try {
        debugger;
        const indexFile = `${rootPath}/app/index.html`;
        let noIndexFile = !fs.existsSync(indexFile);

    return new Promise(function (resolve, reject) {
      let options = {
        hostname: target.replace(/^http(?:s):\/\//i, ''),
        port: 443,
        method: 'GET'
      };

      let dataContent = '';

      console.log('Fetching index.html');
      var request = https.request(options, function(response) {
        response.on('data', function(d) {
          dataContent += d;
        });

        response.on('end', function() {
          fs.writeFileSync(indexFile, dataContent);
          return resolve();
        });
      });

      request.on('error', function(e) {
        console.log(e);
        return reject(`Error: Creating Index File`);
      });

      request.end();
    });
} catch(e) {
    throw e;
}
}




Aucun commentaire:

Enregistrer un commentaire