node-ebics-client/lib/Client.js

131 lines
3.4 KiB
JavaScript
Raw Normal View History

2018-05-17 15:03:59 +00:00
'use strict';
2018-06-01 13:16:43 +00:00
const $request = require('request');
2018-05-17 15:03:59 +00:00
2018-06-20 09:20:03 +00:00
const constants = require('./consts');
const Keys = require('./keymanagers/Keys');
const defaultKeyEncryptor = require('./keymanagers/defaultKeyEncryptor');
2018-06-15 06:33:41 +00:00
const signer = require('./middleware/signer');
const serializer = require('./middleware/serializer');
const response = require('./middleware/response');
2018-05-17 15:03:59 +00:00
module.exports = class Client {
2018-06-20 09:20:03 +00:00
constructor({
url,
partnerId,
userId,
hostId,
passphrase,
keyStorage,
}) {
if (!url)
throw new Error('EBICS URL is requierd');
if (!partnerId)
throw new Error('partnerId is requierd');
if (!userId)
throw new Error('userId is requierd');
if (!hostId)
throw new Error('hostId is requierd');
if (!passphrase)
throw new Error('passphrase is requierd');
if (!keyStorage || typeof keyStorage.read !== 'function' || typeof keyStorage.write !== 'function')
throw new Error('keyStorage implemntation missing or wrong');
this.url = url;
2018-06-20 09:20:03 +00:00
this.partnerId = partnerId;
this.userId = userId;
this.hostId = hostId;
this.keyStorage = keyStorage;
this.keyEncryptor = defaultKeyEncryptor({ passphrase });
}
send(order) {
const isInObject = ('operation' in order);
if (!isInObject) throw new Error('Operation for the order needed');
if (order.operation.toUpperCase() === constants.orderOperations.ini) return this.initialization(order);
if (order.operation.toUpperCase() === constants.orderOperations.upload) return this.upload(order);
if (order.operation.toUpperCase() === constants.orderOperations.download) return this.download(order);
throw new Error('Wrong order operation provided');
2018-06-01 13:16:43 +00:00
}
2018-05-17 15:03:59 +00:00
async initialization(order) {
2018-06-11 12:25:07 +00:00
const res = await this.ebicsRequest(order);
const xml = res.orderData();
2018-06-01 13:16:43 +00:00
return {
orderData: xml,
orderId: res.orderId(),
returnCode: res.returnCode(),
reportText: res.reportText(),
bankKeys: res.bankKeys(),
};
2018-05-17 15:03:59 +00:00
}
async download(order) {
2018-06-11 12:25:07 +00:00
const res = await this.ebicsRequest(order);
2018-05-17 15:03:59 +00:00
order.transactionId = res.transactionId();
if (res.isSegmented() && res.isLastSegment())
2018-06-11 12:25:07 +00:00
await this.ebicsRequest(order);
2018-05-17 15:03:59 +00:00
return {
orderData: res.orderData(),
orderId: res.orderId(),
returnCode: res.returnCode(),
reportText: res.reportText(),
};
2018-06-01 13:16:43 +00:00
}
2018-05-17 15:03:59 +00:00
2018-05-31 09:08:07 +00:00
async upload(order) {
2018-06-11 12:25:07 +00:00
let res = await this.ebicsRequest(order);
const transactionId = res.transactionId();
const orderId = res.orderId();
order.transactionId = transactionId;
2018-05-31 09:08:07 +00:00
2018-06-11 12:25:07 +00:00
res = await this.ebicsRequest(order);
2018-05-31 09:08:07 +00:00
return [transactionId, orderId];
2018-05-31 09:08:07 +00:00
}
2018-06-11 12:25:07 +00:00
ebicsRequest(order) {
2018-05-17 15:03:59 +00:00
return new Promise((resolve, reject) => {
2018-06-20 09:20:03 +00:00
const { version } = order;
const keys = this.keys();
2018-05-17 15:03:59 +00:00
$request.post({
2018-06-01 13:16:43 +00:00
url: this.url,
2018-06-20 09:20:03 +00:00
body: signer.version(version).sign(serializer.use(order, this).toXML(), keys.x()), // s, // new (signer.version(version))(serializer.use(order).toXML(), keys).digest().sign().toXML(),
2018-06-01 13:16:43 +00:00
headers: { 'content-type': 'text/xml;charset=UTF-8' },
2018-06-15 06:33:41 +00:00
}, (err, res, data) => (err ? reject(err) : resolve(response.version(version)(data, keys))));
2018-05-17 15:03:59 +00:00
});
2018-06-01 13:16:43 +00:00
}
2018-05-17 15:03:59 +00:00
2018-06-20 09:20:03 +00:00
keys() {
const keysString = this.keyStorage.read();
return new Keys(JSON.parse(this.keyEncryptor.decrypt(keysString)));
}
setBankKeys(bankKeys) {
const keysObject = this.keys();
keysObject.setBankKeys(bankKeys);
const { keys } = keysObject;
Object.keys(keys).map((key) => {
keys[key] = keys[key] === null ? null : keys[key].toPem();
return key;
});
this.keyStorage.write(this.keyEncryptor.encrypt(JSON.stringify(keys)));
}
2018-05-17 15:03:59 +00:00
};