classy-pay-core
Version:
Shared tools used in ClassyPay-related projects
156 lines • 6.71 kB
JavaScript
;
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