interfax-kevin
Version:
A wrapper around the InterFAX REST API for sending and receiving faxes.
202 lines (169 loc) • 16.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
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 _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 _file = require('./file');
var _file2 = _interopRequireDefault(_file);
var _events = require('events');
var _events2 = _interopRequireDefault(_events);
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"); } }
var Delivery = function () {
function Delivery(client, documents) {
_classCallCheck(this, Delivery);
console.log('----->in constructor<-----');
this._client = client;
this._documents = documents;
this._boundary = '43e578690a6d14bf1d776cd55e7d7e29';
this._emitter = new _events2.default();
}
_createClass(Delivery, [{
key: 'deliver',
value: function deliver(params, callback) {
console.log('----->in deliver<-----', params);
var _validateParams2 = this._validateParams(params),
_validateParams3 = _slicedToArray(_validateParams2, 2),
validatedParams = _validateParams3[0],
files = _validateParams3[1];
var promise = this._promise(callback);
this._generateFileObjects(files, this._deliverFiles(validatedParams).bind(this));
return promise;
}
}, {
key: '_deliverFiles',
value: function _deliverFiles(validatedParams) {
var _this = this;
console.log('----->in deliver files<-----');
return function (error, fileObjects) {
console.log('----->in _deliverFiles<-----', error, fileObjects);
if (error) {
return _this._emitDeliveryFailure(error);
}
var body = _this._bodyFor(fileObjects);
var length = _this._lengthFor(body);
var headers = {
'Content-Type': 'multipart/mixed; boundary=' + _this._boundary,
'Content-Length': length
};
return _this._client.request('POST', '/outbound/faxes', headers, body, validatedParams).then(_this._emitDeliverySuccess.bind(_this)).catch(_this._emitDeliveryFailure.bind(_this));
};
}
}, {
key: '_emitDeliverySuccess',
value: function _emitDeliverySuccess(result) {
this._emitter.emit('resolve', result);
}
}, {
key: '_emitDeliveryFailure',
value: function _emitDeliveryFailure(error) {
this._emitter.emit('reject', error);
}
}, {
key: '_validateParams',
value: function _validateParams(params) {
if (!params.faxNumber) throw new Error('Missing argument: faxNumber');
if (!params.file && !params.files) throw new Error('Missing argument: file or files');
var files = [params.file || params.files];
files = this._flatten(files);
delete params['file'];
delete params['files'];
return [params, files];
}
}, {
key: '_generateFileObjects',
value: function _generateFileObjects(files, callback) {
var _this2 = this;
var objects = [];
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
var _loop = function _loop() {
var file = _step.value;
var object = file;
if (typeof file === 'string') {
object = new _file2.default(_this2._documents, file);
}
object.onReady(function (response) {
if (!object.ready) {
callback(response, null);
}
objects.push(object);
if (objects.length == files.length) {
callback(null, objects);
}
});
};
for (var _iterator = files[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
_loop();
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
return null;
}
}, {
key: '_bodyFor',
value: function _bodyFor(files) {
var _this3 = this;
var parts = files.map(function (file) {
var elements = ['--' + _this3._boundary, '\r\n', file.header, '\r\n\r\n'];
if (file.body) {
elements.push(file.body);
elements.push('\r\n\r\n');
}
return elements;
});
parts.push('--' + this._boundary + '--');
return this._flatten(parts);
}
}, {
key: '_lengthFor',
value: function _lengthFor(parts) {
return parts.reduce(function (prev, cur) {
return prev + Buffer.byteLength(cur);
}, 0);
}
}, {
key: '_flatten',
value: function _flatten(list) {
return [].concat.apply([], list);
}
}, {
key: '_promise',
value: function _promise(callback) {
var _this4 = this;
return new Promise(function (resolve, reject) {
_this4._emitter.on('resolve', function (response) {
if (callback) {
callback(null, response);
}
resolve(response);
});
_this4._emitter.on('reject', function (error) {
if (callback) {
callback(error, null);
}
reject(error);
});
});
}
}]);
return Delivery;
}();
exports.default = Delivery;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWxpdmVyeS5qcyJdLCJuYW1lcyI6WyJEZWxpdmVyeSIsImNsaWVudCIsImRvY3VtZW50cyIsImNvbnNvbGUiLCJsb2ciLCJfY2xpZW50IiwiX2RvY3VtZW50cyIsIl9ib3VuZGFyeSIsIl9lbWl0dGVyIiwicGFyYW1zIiwiY2FsbGJhY2siLCJfdmFsaWRhdGVQYXJhbXMiLCJ2YWxpZGF0ZWRQYXJhbXMiLCJmaWxlcyIsInByb21pc2UiLCJfcHJvbWlzZSIsIl9nZW5lcmF0ZUZpbGVPYmplY3RzIiwiX2RlbGl2ZXJGaWxlcyIsImJpbmQiLCJlcnJvciIsImZpbGVPYmplY3RzIiwiX2VtaXREZWxpdmVyeUZhaWx1cmUiLCJib2R5IiwiX2JvZHlGb3IiLCJsZW5ndGgiLCJfbGVuZ3RoRm9yIiwiaGVhZGVycyIsInJlcXVlc3QiLCJ0aGVuIiwiX2VtaXREZWxpdmVyeVN1Y2Nlc3MiLCJjYXRjaCIsInJlc3VsdCIsImVtaXQiLCJmYXhOdW1iZXIiLCJFcnJvciIsImZpbGUiLCJfZmxhdHRlbiIsIm9iamVjdHMiLCJvYmplY3QiLCJvblJlYWR5IiwicmVzcG9uc2UiLCJyZWFkeSIsInB1c2giLCJwYXJ0cyIsIm1hcCIsImVsZW1lbnRzIiwiaGVhZGVyIiwicmVkdWNlIiwicHJldiIsImN1ciIsIkJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJsaXN0IiwiY29uY2F0IiwiYXBwbHkiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7Ozs7Ozs7SUFFTUEsUTtBQUVKLG9CQUFZQyxNQUFaLEVBQW9CQyxTQUFwQixFQUErQjtBQUFBOztBQUM3QkMsWUFBUUMsR0FBUixDQUFZLDRCQUFaO0FBQ0EsU0FBS0MsT0FBTCxHQUFrQkosTUFBbEI7QUFDQSxTQUFLSyxVQUFMLEdBQWtCSixTQUFsQjtBQUNBLFNBQUtLLFNBQUwsR0FBa0Isa0NBQWxCO0FBQ0EsU0FBS0MsUUFBTCxHQUFtQixz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Q0FBY2tELEVBQWQsQ0FBaUIsU0FBakIsRUFBNEIsVUFBQ2xCLFFBQUQsRUFBYztBQUN4QyxjQUFJOUIsUUFBSixFQUFjO0FBQUVBLHFCQUFTLElBQVQsRUFBZThCLFFBQWY7QUFBMkI7QUFDM0NnQixrQkFBUWhCLFFBQVI7QUFDRCxTQUhEO0FBSUEsZUFBS2hDLFFBQUwsQ0FBY2tELEVBQWQsQ0FBaUIsUUFBakIsRUFBMkIsVUFBQ3ZDLEtBQUQsRUFBVztBQUNwQyxjQUFJVCxRQUFKLEVBQWM7QUFBRUEscUJBQVNTLEtBQVQsRUFBZ0IsSUFBaEI7QUFBd0I7QUFDeENzQyxpQkFBT3RDLEtBQVA7QUFDRCxTQUhEO0FBSUQsT0FUTSxDQUFQO0FBVUQ7Ozs7OztrQkFHWW5CLFEiLCJmaWxlIjoiZGVsaXZlcnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmlsZSBmcm9tICcuL2ZpbGUnO1xuaW1wb3J0IEV2ZW50RW1pdHRlciAgICAgZnJvbSAnZXZlbnRzJztcblxuY2xhc3MgRGVsaXZlcnkge1xuXG4gIGNvbnN0cnVjdG9yKGNsaWVudCwgZG9jdW1lbnRzKSB7XG4gICAgY29uc29sZS5sb2coJy0tLS0tPmluIGNvbnN0cnVjdG9yPC0tLS0tJyk7XG4gICAgdGhpcy5fY2xpZW50ICAgID0gY2xpZW50O1xuICAgIHRoaXMuX2RvY3VtZW50cyA9IGRvY3VtZW50cztcbiAgICB0aGlzLl9ib3VuZGFyeSAgPSAnNDNlNTc4NjkwYTZkMTRiZjFkNzc2Y2Q1NWU3ZDdlMjknO1xuICAgIHRoaXMuX2VtaXR0ZXIgICAgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIH1cblxuICBkZWxpdmVyKHBhcmFtcywgY2FsbGJhY2spIHtcbiAgICBjb25zb2xlLmxvZygnLS0tLS0+aW4gZGVsaXZlcjwtLS0tLScsIHBhcmFtcyk7XG4gICAgbGV0IFt2YWxpZGF0ZWRQYXJhbXMsIGZpbGVzXSA9IHRoaXMuX3ZhbGlkYXRlUGFyYW1zKHBhcmFtcyk7XG4gICAgbGV0IHByb21pc2UgPSB0aGlzLl9wcm9taXNlKGNhbGxiYWNrKTtcblxuICAgIHRoaXMuX2dlbmVyYXRlRmlsZU9iamVjdHMoZmlsZXMsIHRoaXMuX2RlbGl2ZXJGaWxlcyh2YWxpZGF0ZWRQYXJhbXMpLmJpbmQodGhpcykpO1xuXG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBfZGVsaXZlckZpbGVzKHZhbGlkYXRlZFBhcmFtcykge1xuICAgIGNvbnNvbGUubG9nKCctLS0tLT5pbiBkZWxpdmVyIGZpbGVzPC0tLS0tJyk7XG4gICAgcmV0dXJuIChlcnJvciwgZmlsZU9iamVjdHMpID0+IHtcbiAgICAgIGNvbnNvbGUubG9nKCctLS0tLT5pbiBfZGVsaXZlckZpbGVzPC0tLS0tJywgZXJyb3IsIGZpbGVPYmplY3RzKTtcbiAgICAgIGlmIChlcnJvcikgeyByZXR1cm4gdGhpcy5fZW1pdERlbGl2ZXJ5RmFpbHVyZShlcnJvcik7IH1cblxuICAgICAgbGV0IGJvZHkgICAgPSB0aGlzLl9ib2R5Rm9yKGZpbGVPYmplY3RzKTtcbiAgICAgIGxldCBsZW5ndGggID0gdGhpcy5fbGVuZ3RoRm9yKGJvZHkpO1xuICAgICAgbGV0IGhlYWRlcnMgPSB7XG4gICAgICAgICdDb250ZW50LVR5cGUnIDogYG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9JHt0aGlzLl9ib3VuZGFyeX1gLFxuICAgICAgICAnQ29udGVudC1MZW5ndGgnIDogbGVuZ3RoXG4gICAgICB9O1xuXG4gICAgICByZXR1cm4gdGhpcy5fY2xpZW50LnJlcXVlc3QoJ1BPU1QnLCAnL291dGJvdW5kL2ZheGVzJywgaGVhZGVycywgYm9keSwgdmFsaWRhdGVkUGFyYW1zKVxuICAgICAgICAudGhlbih0aGlzLl9lbWl0RGVsaXZlcnlTdWNjZXNzLmJpbmQodGhpcykpXG4gICAgICAgIC5jYXRjaCh0aGlzLl9lbWl0RGVsaXZlcnlGYWlsdXJlLmJpbmQodGhpcykpO1xuICAgIH07XG4gIH1cblxuICBfZW1pdERlbGl2ZXJ5U3VjY2VzcyhyZXN1bHQpIHtcbiAgICB0aGlzLl9lbWl0dGVyLmVtaXQoJ3Jlc29sdmUnLCByZXN1bHQpO1xuICB9XG5cbiAgX2VtaXREZWxpdmVyeUZhaWx1cmUoZXJyb3IpIHtcbiAgICB0aGlzLl9lbWl0dGVyLmVtaXQoJ3JlamVjdCcsIGVycm9yKTtcbiAgfVxuXG4gIF92YWxpZGF0ZVBhcmFtcyhwYXJhbXMpIHtcbiAgICBpZiAoIXBhcmFtcy5mYXhOdW1iZXIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYXJndW1lbnQ6IGZheE51bWJlcicpO1xuXG4gICAgaWYgKCFwYXJhbXMuZmlsZSAmJiAhcGFyYW1zLmZpbGVzKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGFyZ3VtZW50OiBmaWxlIG9yIGZpbGVzJyk7XG5cbiAgICBsZXQgZmlsZXMgPSBbcGFyYW1zLmZpbGUgfHwgcGFyYW1zLmZpbGVzXTtcbiAgICBmaWxlcyA9IHRoaXMuX2ZsYXR0ZW4oZmlsZXMpO1xuXG4gICAgZGVsZXRlIHBhcmFtc1snZmlsZSddO1xuICAgIGRlbGV0ZSBwYXJhbXNbJ2ZpbGVzJ107XG5cbiAgICByZXR1cm4gW3BhcmFtcywgZmlsZXNdO1xuICB9XG5cbiAgX2dlbmVyYXRlRmlsZU9iamVjdHMoZmlsZXMsIGNhbGxiYWNrKSB7XG4gICAgbGV0IG9iamVjdHMgPSBbXTtcblxuICAgIGZvciAobGV0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICAgIGxldCBvYmplY3QgPSBmaWxlO1xuICAgICAgaWYgKHR5cGVvZihmaWxlKSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgb2JqZWN0ID0gbmV3IEZpbGUodGhpcy5fZG9jdW1lbnRzLCBmaWxlKTtcbiAgICAgIH1cbiAgICAgIG9iamVjdC5vblJlYWR5KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoIW9iamVjdC5yZWFkeSkgeyBjYWxsYmFjayhyZXNwb25zZSwgbnVsbCk7IH1cbiAgICAgICAgb2JqZWN0cy5wdXNoKG9iamVjdCk7XG4gICAgICAgIGlmIChvYmplY3RzLmxlbmd0aCA9PSBmaWxlcy5sZW5ndGgpIHsgY2FsbGJhY2sobnVsbCwgb2JqZWN0cyk7IH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIF9ib2R5Rm9yKGZpbGVzKSB7XG4gICAgbGV0IHBhcnRzID0gZmlsZXMubWFwKGZpbGUgPT4ge1xuICAgICAgbGV0IGVsZW1lbnRzID0gW2AtLSR7dGhpcy5fYm91bmRhcnl9YCwgJ1xcclxcbicsIGZpbGUuaGVhZGVyLCAnXFxyXFxuXFxyXFxuJ107XG4gICAgICBpZiAoZmlsZS5ib2R5KSB7XG4gICAgICAgIGVsZW1lbnRzLnB1c2goZmlsZS5ib2R5KTtcbiAgICAgICAgZWxlbWVudHMucHVzaCgnXFxyXFxuXFxyXFxuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfSk7XG4gICAgcGFydHMucHVzaChgLS0ke3RoaXMuX2JvdW5kYXJ5fS0tYCk7XG4gICAgcmV0dXJuIHRoaXMuX2ZsYXR0ZW4ocGFydHMpO1xuICB9XG5cbiAgX2xlbmd0aEZvcihwYXJ0cykge1xuICAgIHJldHVybiBwYXJ0cy5yZWR1Y2UoKHByZXYsIGN1cikgPT4ge1xuICAgICAgcmV0dXJuIHByZXYgKyBCdWZmZXIuYnl0ZUxlbmd0aChjdXIpO1xuICAgIH0sIDApO1xuICB9XG5cbiAgX2ZsYXR0ZW4obGlzdCkge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGxpc3QpO1xuICB9XG5cbiAgX3Byb21pc2UoY2FsbGJhY2spIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdGhpcy5fZW1pdHRlci5vbigncmVzb2x2ZScsIChyZXNwb25zZSkgPT4ge1xuICAgICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UpOyB9XG4gICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9lbWl0dGVyLm9uKCdyZWplY3QnLCAoZXJyb3IpID0+IHtcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7IGNhbGxiYWNrKGVycm9yLCBudWxsKTsgfVxuICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGVsaXZlcnk7XG4iXX0=