UNPKG

classy-pay-core

Version:

Shared tools used in ClassyPay-related projects

156 lines 6.71 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.PayClient = void 0; const bluebird_1 = require("bluebird"); const _ = __importStar(require("lodash")); const hmac256AuthSigner_1 = require("./utils/hmac256AuthSigner"); const utils_1 = require("./utils/utils"); require('source-map-support').install(); const PAGE_LIMIT = 25; class PayClient { constructor(apiUrl, token, secret, config = {}) { if (!apiUrl) throw new Error('PayClient requires apiUrl'); if (!token) throw new Error('PayClient requires token'); if (!secret) throw new Error('PayClient requires secret'); this.apiUrl = apiUrl; this.config = config; this.log = config.log; this.version = config.version; this.sign = (0, hmac256AuthSigner_1.CreateHMACSigner)('CWS', token, secret); } getHeaders(method, resource, payload, idempotencyKey) { const headers = { Authorization: this.sign(method, resource, 'application/json', payload ? JSON.stringify(payload) : undefined), 'User-Agent': 'ClassyPay Node.JS', 'Content-Type': payload ? 'application/json' : undefined, }; if (this.version) { headers['x-classypay-version'] = this.version; } if (idempotencyKey) { headers['x-classypay-idempotency-key'] = idempotencyKey; } return headers; } getOptions(appId, method, resource, payload, params, idempotencyKey) { return { method, url: `${this.apiUrl}${resource}`, params: _.extend({ appId, meta: true }, params), data: payload, timeout: this.config.timeout, headers: this.getHeaders(method, resource, payload, idempotencyKey), }; } async request(appId, method, resource, payload, params, idempotencyKey) { if (!_.isString(appId)) { throw new Error('App ID must be provided as string to avoid losing precision'); } if (!resource.match(/^\/[\/A-Za-z0-9_\-]*$/)) { throw new Error(`Invalid resource: ${resource}`); } const options = this.getOptions(appId, method, resource, payload, params, idempotencyKey); // tslint:disable-next-line:no-console const response = await (0, utils_1.requestWithLogs)(options, this.log); if (response.status < 200 || response.status > 299) { throw new Error(`Server returned error code ${response.status} from ${method} ${resource}: ${response.data}`); } return { status: response.status, object: response.data, }; } async forObject(appId, method, resource, body, params, idempotencyKey) { return (await this.request(appId, method, resource, body, params, idempotencyKey)).object; } async forList(appId, resource) { const responseObj = (await this.request(appId, 'GET', `${resource}/count`)).object; if (typeof responseObj === 'string') { throw new Error(`Expected server response with count, instead got: ${responseObj}`); } else { const max = responseObj.count; const results = await bluebird_1.Promise.map(_.range(0, max, PAGE_LIMIT), async (page) => { const innerResponse = await this.request(appId, 'GET', resource, undefined, { limit: PAGE_LIMIT, offset: page, }); if (innerResponse.status < 200 || innerResponse.status > 299 || typeof innerResponse.object === 'string') { throw new Error(`Expected server response with object, instead got: ${innerResponse}`); } else { return innerResponse.object; } }, { concurrency: 10, }); return _.flatten(results); } } async list(appId, resource) { return await this.forList(appId, resource); } async get(appId, resource, params) { return await this.forObject(appId, 'GET', resource, undefined, params); } async post(appId, resource, object, params, idempotencyKey) { return await this.forObject(appId, 'POST', resource, object, params, idempotencyKey); } async put(appId, resource, object, params, idempotencyKey) { return await this.forObject(appId, 'PUT', resource, object, params, idempotencyKey); } async del(appId, resource, params) { return await this.forObject(appId, 'DELETE', resource, undefined, params); } forAppId(appId) { if (!_.isString(appId)) { throw new Error('App ID must be provided as string to avoid losing precision'); } return { list: resource => this.list(appId, resource), get: (resource, params) => this.get(appId, resource, params), post: (resource, object, params) => this.post(appId, resource, object, params), put: (resource, object, params) => this.put(appId, resource, object, params), del: (resource, params) => this.del(appId, resource, params), }; } } exports.PayClient = PayClient; exports.default = PayClient; //# sourceMappingURL=PayClient.js.map