machinomy
Version:
Micropayments powered by Ethereum
152 lines • 5.17 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const logger_1 = require("@machinomy/logger");
const accept_payment_request_1 = require("./accept_payment_request");
const accept_payment_response_1 = require("./accept_payment_response");
const accept_token_request_1 = require("./accept_token_request");
const accept_token_response_1 = require("./accept_token_response");
const PaymentRequiredRequest_1 = require("./PaymentRequiredRequest");
const PaymentRequiredResponse_1 = require("./PaymentRequiredResponse");
const Exceptions_1 = require("./Exceptions");
let req = require('request');
const request = (opts) => {
return new Promise((resolve, reject) => {
req(opts, (err, res) => {
if (err) {
reject(err);
}
resolve(res);
});
});
};
const LOG = new logger_1.default('transport');
// noinspection MagicNumberJS
exports.STATUS_CODES = {
PAYMENT_REQUIRED: 402,
OK: 200
};
/**
* Parse response headers and return the token.
*
* @param {object} response
* @return {string}
*/
const extractPaywallToken = (response) => {
let token = response.headers['paywall-token'];
if (token) {
LOG.info('Got token from the server');
return token;
}
else {
throw new Error('Can not find a token in the response');
}
};
class Transport {
/**
* Request URI sending a paywall token.
* @return {Promise<object>}
*/
getWithToken(uri, token, opts = {}) {
let headers = {
'authorization': 'Paywall ' + token
};
LOG.info(`Getting ${uri} using access token ${token}`);
if (opts.onWillLoad) {
opts.onWillLoad();
}
return this.get(uri, headers).then(result => {
if (opts.onDidLoad) {
opts.onDidLoad();
}
return result;
});
}
get(uri, headers) {
let options = {
method: 'GET',
uri: uri,
headers: headers
};
LOG.info(`Getting ${uri} using headers and options`, headers, options);
return request(options);
}
/**
* Request token from the server's gateway
* @param {string} uri - Full url to the gateway.
* @param {Payment} payment
* @param {{uri: string, headers: object, onWillPreflight: function, onDidPreflight: function, onWillOpenChannel: function, onDidOpenChannel: function, onWillSendPayment: function, onDidSendPayment: function, onWillLoad: function, onDidLoad: function}} opts
* @return {Promise<string>}
*/
requestToken(uri, payment, opts = {}) {
if (!payment.tokenContract) {
delete payment.tokenContract;
}
let options = {
method: 'POST',
uri: uri,
json: true,
body: payment
};
LOG.info('Getting request token in exchange for payment', payment);
if (opts.onWillSendPayment) {
opts.onWillSendPayment();
}
return request(options).then(extractPaywallToken).then(result => {
if (opts.onDidSendPayment) {
opts.onDidSendPayment();
}
return result;
});
}
async doPayment(paymentRequest, gateway) {
const options = {
method: 'POST',
uri: gateway,
json: true,
headers: {
'Content-Type': 'application/json'
},
credentials: 'include',
body: accept_payment_request_1.AcceptPaymentRequestSerde.instance.serialize(paymentRequest)
};
const res = await request(options);
return accept_payment_response_1.AcceptPaymentResponseSerde.instance.deserialize(res.body);
}
async doVerify(tokenRequest, gateway) {
const options = {
method: 'POST',
uri: gateway,
json: true,
headers: {
'Content-Type': 'application/json'
},
credentials: 'include',
body: accept_token_request_1.AcceptTokenRequestSerde.instance.serialize(tokenRequest)
};
const res = await request(options);
return accept_token_response_1.AcceptTokenResponseSerde.instance.deserialize(res.body);
}
async paymentRequired(paymentRequiredRequest, gateway) {
const options = {
method: 'GET',
uri: PaymentRequiredRequest_1.PaymentRequiredRequestSerializer.instance.serialize(paymentRequiredRequest, gateway),
credentials: 'include'
};
const res = await request(options);
switch (res.statusCode) {
case exports.STATUS_CODES.PAYMENT_REQUIRED:
case exports.STATUS_CODES.OK:
return PaymentRequiredResponse_1.PaymentRequiredResponseSerializer.instance.deserialize(res.headers);
default:
throw new Exceptions_1.BadResponseError();
}
}
}
exports.Transport = Transport;
/**
* Build Transport instance.
*/
exports.build = () => {
return new Transport();
};
//# sourceMappingURL=transport.js.map