UNPKG

morar-client

Version:

A module for interacting with morar.ft.com

146 lines (108 loc) 3.45 kB
'use strict'; var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var dotenv = require('dotenv').config({ silent: true }); var debug = require('debug')('morar-client:index'); var fs = require('fs'); var requestProtocol = process.env.ENV === 'development' ? require('http') : require('https'); var FormData = require('form-data'); var serviceHost = 'morar.ft.com'; var opts = { token: process.env.MORAR_TOKEN || undefined, name: process.env.MORAR_NAME || undefined }; function checkValuesAreSet() { if (opts.name === undefined || opts.name === '') { throw 'You must pass a \'name\' value when you configure the Morar client. You can also set the environment variable MORAR_NAME.'; } if (opts.token === undefined || opts.token === '') { throw 'You must pass a \'token\' value when you configure the Morar client. You can also set the environment variable MORAR_TOKEN.'; } } function storeData(data, params) { checkValuesAreSet(); var requestBody = data; var queryParams = ''; if (params !== undefined) { Object.keys(params).forEach(function (key) { queryParams += '&' + key + '=' + encodeURIComponent(params[key]); }); } else if (data === undefined) { throw "No parameters or data was passed"; } debug('Passed values:'); debug(queryParams, requestBody); debug(typeof data === 'undefined' ? 'undefined' : _typeof(data)); var form = new FormData(); if (requestBody !== undefined && requestBody !== '') { // It's a string, so we save it as a text file if (typeof data === 'string') { debug('Body is String'); form.append('data', requestBody); } if ((typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object') { try { form.append('data', JSON.stringify(requestBody)); } catch (err) { debug(err); throw "Object passed was not JSON"; } } // It's a readable stream, so we'll save it as a binary file if (typeof data.on === 'function') { debug('Body is Buffer'); form.append('f', data); } } return new Promise(function (resolve, reject) { var request = requestProtocol.request({ method: 'POST', host: serviceHost, path: '/store?name=' + encodeURIComponent(opts.name) + '&token=' + opts.token + queryParams, headers: form.getHeaders(), port: 443 }); request.on('response', function (res) { debug(res.statusCode); res.setEncoding('utf8'); var b = ""; res.on('data', function (chunk) { b += chunk; }); res.on('end', function () { debug(b); if (res.statusCode !== 200) { try { reject(JSON.parse(b)); } catch (err) { reject({ status: 'error', reason: 'morar-client was unable to parse the response from Morar service', details: [err, b] }); } } else { resolve(JSON.parse(b)); } }); }); request.on('error', function (e) { reject(e.message); }); form.pipe(request); }); } function setConfigurationOptions(options) { debug(options); if (options !== undefined) { Object.keys(options).forEach(function (key) { opts[key] = options[key]; }); } debug(opts); checkValuesAreSet(); return storeData; } module.exports = { config: setConfigurationOptions, store: storeData };