UNPKG

@colorfulcompany/gas-http-client

Version:
436 lines (335 loc) 13.3 kB
'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;