@colorfulcompany/gas-http-client
Version:
simple http client with google apps UrlFetchApp
436 lines (335 loc) • 13.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.GasHttpClientNoJwtSecret = exports.GasHttpClientInvalidMethod = exports.GasHttpClientInvalidOptionKey = exports['default'] = undefined;
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
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 _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _lodash = require('lodash/lodash.min');
var _lodash2 = _interopRequireDefault(_lodash);
var _url = require('url');
var _url2 = _interopRequireDefault(_url);
var _KaleoJWT = require('kaleoJWT/dist/KaleoJWT.min');
var _KaleoJWT2 = _interopRequireDefault(_KaleoJWT);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
var GasHttpClientInvalidOptionKey = function (_Error) {
_inherits(GasHttpClientInvalidOptionKey, _Error);
function GasHttpClientInvalidOptionKey(key, validKeys) {
_classCallCheck(this, GasHttpClientInvalidOptionKey);
return _possibleConstructorReturn(this, (GasHttpClientInvalidOptionKey.__proto__ || Object.getPrototypeOf(GasHttpClientInvalidOptionKey)).call(this, key + ' is not valid param. select key from [' + validKeys.join(', ') + ']'));
}
return GasHttpClientInvalidOptionKey;
}(Error);
var GasHttpClientInvalidMethod = function (_Error2) {
_inherits(GasHttpClientInvalidMethod, _Error2);
function GasHttpClientInvalidMethod(method, validMethods) {
_classCallCheck(this, GasHttpClientInvalidMethod);
return _possibleConstructorReturn(this, (GasHttpClientInvalidMethod.__proto__ || Object.getPrototypeOf(GasHttpClientInvalidMethod)).call(this, method + ' is not valid method, select method from [' + validMethods.join(', ') + ']'));
}
return GasHttpClientInvalidMethod;
}(Error);
var GasHttpClientNoJwtSecret = function (_Error3) {
_inherits(GasHttpClientNoJwtSecret, _Error3);
function GasHttpClientNoJwtSecret() {
_classCallCheck(this, GasHttpClientNoJwtSecret);
return _possibleConstructorReturn(this, (GasHttpClientNoJwtSecret.__proto__ || Object.getPrototypeOf(GasHttpClientNoJwtSecret)).apply(this, arguments));
}
return GasHttpClientNoJwtSecret;
}(Error);
var GasHttpClient = function () {
/**
* @param {UrlFetchApp} app
* @param {String} endpoint
* @param {Object} opts
*/
/** @var {Object} */
/** @var {Object} */
/** @var {UrlFetchApp} */
function GasHttpClient(app, endpoint) {
var opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
_classCallCheck(this, GasHttpClient);
this._headers = {};
this._response = {};
this._jwtOpts = {};
this._app = app;
this._endpoint = endpoint;
this.clear();
this.opts(opts);
}
/** @var {Object} */
/** @var {Object} */
/** @var {String} */
_createClass(GasHttpClient, [{
key: 'clear',
value: function clear() {
this._opts = this.defaultOpts();
this._headers = {};
}
/**
* @return {Object}
*/
}, {
key: 'app',
value: function app() {
return this._app;
}
/**
* @return {String}
*/
}, {
key: 'endpoint',
value: function endpoint() {
return this._endpoint;
}
/**
* @return {Object}
*/
}, {
key: 'defaultOpts',
value: function defaultOpts() {
return {
method: 'get'
};
}
/**
* @return {Array}
*/
}, {
key: 'optionKeys',
value: function optionKeys() {
return ['contentType', 'headers', 'method', 'payload', 'validateHttpsCertificates', 'followRedirects', 'muteHttpExceptions', 'escaping'];
}
/**
* @param {String}
* @return {Boolean}
*/
}, {
key: 'isValidOptionKey',
value: function isValidOptionKey(key) {
return this.optionKeys().indexOf(key) >= 0;
}
/**
* @param {Object}
* @return {Object}
*/
}, {
key: 'opts',
value: function opts() {
var _this4 = this;
var _opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
if (_opts && (typeof _opts === 'undefined' ? 'undefined' : _typeof(_opts)) === 'object') {
// store headers
if (_opts['headers'] && _typeof(_opts['headers']) !== 'object') {
this.headers(_opts['headers']);
delete _opts['headers'];
}
// store JWT options
if (_opts['withJWT'] && _typeof(_opts['withJWT']) === 'object') {
var _jwt = _opts['withJWT'];
delete _opts['withJWT'];
this.jwtOpts(_jwt);
}
// validate Option Key
Object.keys(_opts).forEach(function (e) {
if (!_this4.isValidOptionKey(e)) {
throw new GasHttpClientInvalidOptionKey(e, _this4.optionKeys());
}
});
// validate HTTP Method
if (typeof _opts['method'] === 'string') {
var method = _opts['method'];
if (!this.isValidMethod(method)) {
throw new GasHttpClientInvalidMethod(method, this.methods());
}
}
this._opts = _lodash2['default'].merge(this._opts, _opts);
}
return this._opts;
}
/**
* @param {Object} parts
* @return {Object}
*/
}, {
key: 'jwtOpts',
value: function jwtOpts() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
if (Object.keys(opts).length > 0) {
this._jwtOpts = _lodash2['default'].merge(this._jwtOpts, opts);
}
return this._jwtOpts;
}
/**
* @param {Object}
* @return {Object}
*/
}, {
key: 'headers',
value: function headers() {
var _headers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined;
if (typeof _headers !== 'undefined') {
this._headers = _lodash2['default'].merge(this._headers, _headers);
}
return this._headers;
}
/**
* @param {String} field
* @return {mixed} Object or false
*/
}, {
key: 'deleteHeader',
value: function deleteHeader(field) {
if (_lodash2['default'].has(this._headers, field)) {
var item = {};
item[field] = this._headers[field];
if (delete this._headers[field]) {
return item;
} else {
return false;
}
} else {
return false;
}
}
/**
* @return {Array}
*/
}, {
key: 'methods',
value: function methods() {
return ['get', 'delete', 'patch', 'post', 'put'];
}
/**
* @return {Boolean}
*/
}, {
key: 'isValidMethod',
value: function isValidMethod(method) {
return this.methods().indexOf(method) >= 0;
}
/**
* @param {String} uri
* @return {String}
*/
}, {
key: 'buildUrl',
value: function buildUrl() {
var uri = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
if (typeof uri === 'string' && uri.length > 0) {
return _url2['default'].resolve(this.endpoint(), uri);
} else if (uri !== null && (typeof uri === 'undefined' ? 'undefined' : _typeof(uri)) === 'object') {
return _url2['default'].format(_lodash2['default'].merge(_url2['default'].parse(this.endpoint(), true), uri));
} else {
return this.endpoint();
}
}
/**
* @param {Object} opts
* @return {Object}
*/
}, {
key: 'buildParam',
value: function buildParam() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
return _lodash2['default'].merge(this.opts(opts), { headers: this.headers() });
}
/**
* @param {Object} opts
* @return {Object}
*/
}, {
key: 'buildParamForJSON',
value: function buildParamForJSON() {
var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
this.headers({ 'Accept': 'application/json' });
if (typeof opts['method'] != 'undefined' && opts['method'] != 'get' || this.opts()['method'] != 'get') {
this.opts({ 'contentType': 'application/json' });
}
var param = _lodash2['default'].cloneDeep(this.buildParam(opts));
// encode payload
if (typeof param['payload'] !== 'undefined' && typeof param['payload'] !== 'string') {
param['payload'] = JSON.stringify(param['payload']);
}
// generate jwt
if (typeof this.opts()['payload'] !== 'undefined' && _typeof(this.opts()['payload']) == 'object' && typeof this.jwtOpts()['secret'] == 'string') {
var _jwt2 = this.buildJwt(this.opts()['payload']);
if (_jwt2) {
var _jwt3 = _slicedToArray(_jwt2, 2),
field = _jwt3[0],
token = _jwt3[1];
param['headers'][field] = token;
}
}
return param;
}
/**
* call after setting opts
*
* @param {Object} payload
* @return {mixed}
*/
}, {
key: 'buildJwt',
value: function buildJwt(payload) {
var token = void 0;
var secret = void 0;
var headerField = void 0;
var opts = _lodash2['default'].cloneDeep(this.jwtOpts());
if (typeof opts['headerField'] === 'string') {
headerField = opts['headerField'];
delete opts['headerField'];
}
if (typeof opts['secret'] == 'string' && opts['secret'].length > 0) {
secret = opts['secret'];
delete opts['secret'];
token = _KaleoJWT2['default'].sign(payload, secret);
} else {
throw new GasHttpClientNoJwtSecret('no jwt secret specified');
}
return headerField && token ? [headerField, token] : false;
}
/**
* @param {mixed} uri
* @param {Object} opts
* @return {HTTPResponse}
*/
}, {
key: 'request',
value: function request() {
var uri = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
this._response = this.app().fetch(this.buildUrl(uri), this.buildParam(opts));
return this.response();
}
/**
* @param {mixed} uri
* @param {Object} opts
* @return {HTTPResponse}
*/
}, {
key: 'requestJSON',
value: function requestJSON() {
var uri = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
this._response = this.app().fetch(this.buildUrl(uri), this.buildParamForJSON(opts));
return this.response();
}
/**
* @return {Object}
*/
}, {
key: 'response',
value: function response() {
return this._response;
}
}]);
return GasHttpClient;
}();
exports['default'] = GasHttpClient;
exports.GasHttpClientInvalidOptionKey = GasHttpClientInvalidOptionKey;
exports.GasHttpClientInvalidMethod = GasHttpClientInvalidMethod;
exports.GasHttpClientNoJwtSecret = GasHttpClientNoJwtSecret;