interfax
Version:
A wrapper around the InterFAX REST API for sending and receiving faxes.
197 lines (165 loc) • 16.3 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);
this._client = client;
this._documents = documents;
this._boundary = '43e578690a6d14bf1d776cd55e7d7e29';
this._emitter = new _events2.default();
}
_createClass(Delivery, [{
key: 'deliver',
value: function deliver(params, callback) {
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;
return function (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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9kZWxpdmVyeS5qcyJdLCJuYW1lcyI6WyJEZWxpdmVyeSIsImNsaWVudCIsImRvY3VtZW50cyIsIl9jbGllbnQiLCJfZG9jdW1lbnRzIiwiX2JvdW5kYXJ5IiwiX2VtaXR0ZXIiLCJFdmVudEVtaXR0ZXIiLCJwYXJhbXMiLCJjYWxsYmFjayIsIl92YWxpZGF0ZVBhcmFtcyIsInZhbGlkYXRlZFBhcmFtcyIsImZpbGVzIiwicHJvbWlzZSIsIl9wcm9taXNlIiwiX2dlbmVyYXRlRmlsZU9iamVjdHMiLCJfZGVsaXZlckZpbGVzIiwiYmluZCIsImVycm9yIiwiZmlsZU9iamVjdHMiLCJfZW1pdERlbGl2ZXJ5RmFpbHVyZSIsImJvZHkiLCJfYm9keUZvciIsImxlbmd0aCIsIl9sZW5ndGhGb3IiLCJoZWFkZXJzIiwicmVxdWVzdCIsInRoZW4iLCJfZW1pdERlbGl2ZXJ5U3VjY2VzcyIsImNhdGNoIiwicmVzdWx0IiwiZW1pdCIsImZheE51bWJlciIsIkVycm9yIiwiZmlsZSIsIl9mbGF0dGVuIiwib2JqZWN0cyIsIm9iamVjdCIsIkZpbGUiLCJvblJlYWR5IiwicmVzcG9uc2UiLCJyZWFkeSIsInB1c2giLCJwYXJ0cyIsIm1hcCIsImVsZW1lbnRzIiwiaGVhZGVyIiwicmVkdWNlIiwicHJldiIsImN1ciIsIkJ1ZmZlciIsImJ5dGVMZW5ndGgiLCJsaXN0IiwiY29uY2F0IiwiYXBwbHkiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsIm9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7Ozs7Ozs7SUFFTUEsUTtBQUVKLG9CQUFZQyxNQUFaLEVBQW9CQyxTQUFwQixFQUErQjtBQUFBOztBQUM3QixTQUFLQyxPQUFMLEdBQWtCRixNQUFsQjtBQUNBLFNBQUtHLFVBQUwsR0FBa0JGLFNBQWxCO0FBQ0EsU0FBS0csU0FBTCxHQUFrQixrQ0FBbEI7QUFDQSxTQUFLQyxRQUFMLEdBQW1CLElBQUlDLGdCQUFKLEVBQW5CO0FBQ0Q7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QUFDM0NnQixrQkFBUWhCLFFBQVI7QUFDRCxTQUhEO0FBSUEsZUFBS2xDLFFBQUwsQ0FBY29ELEVBQWQsQ0FBaUIsUUFBakIsRUFBMkIsVUFBQ3hDLEtBQUQsRUFBVztBQUNwQyxjQUFJVCxRQUFKLEVBQWM7QUFBRUEscUJBQVNTLEtBQVQsRUFBZ0IsSUFBaEI7QUFBd0I7QUFDeEN1QyxpQkFBT3ZDLEtBQVA7QUFDRCxTQUhEO0FBSUQsT0FUTSxDQUFQO0FBVUQ7Ozs7OztrQkFHWWxCLFEiLCJmaWxlIjoiZGVsaXZlcnkuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRmlsZSBmcm9tICcuL2ZpbGUnO1xyXG5pbXBvcnQgRXZlbnRFbWl0dGVyICAgICBmcm9tICdldmVudHMnO1xyXG5cclxuY2xhc3MgRGVsaXZlcnkge1xyXG5cclxuICBjb25zdHJ1Y3RvcihjbGllbnQsIGRvY3VtZW50cykge1xyXG4gICAgdGhpcy5fY2xpZW50ICAgID0gY2xpZW50O1xyXG4gICAgdGhpcy5fZG9jdW1lbnRzID0gZG9jdW1lbnRzO1xyXG4gICAgdGhpcy5fYm91bmRhcnkgID0gJzQzZTU3ODY5MGE2ZDE0YmYxZDc3NmNkNTVlN2Q3ZTI5JztcclxuICAgIHRoaXMuX2VtaXR0ZXIgICAgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgfVxyXG5cclxuICBkZWxpdmVyKHBhcmFtcywgY2FsbGJhY2spIHtcclxuICAgIGxldCBbdmFsaWRhdGVkUGFyYW1zLCBmaWxlc10gPSB0aGlzLl92YWxpZGF0ZVBhcmFtcyhwYXJhbXMpO1xyXG4gICAgbGV0IHByb21pc2UgPSB0aGlzLl9wcm9taXNlKGNhbGxiYWNrKTtcclxuXHJcbiAgICB0aGlzLl9nZW5lcmF0ZUZpbGVPYmplY3RzKGZpbGVzLCB0aGlzLl9kZWxpdmVyRmlsZXModmFsaWRhdGVkUGFyYW1zKS5iaW5kKHRoaXMpKTtcclxuXHJcbiAgICByZXR1cm4gcHJvbWlzZTtcclxuICB9XHJcblxyXG4gIF9kZWxpdmVyRmlsZXModmFsaWRhdGVkUGFyYW1zKSB7XHJcbiAgICByZXR1cm4gKGVycm9yLCBmaWxlT2JqZWN0cykgPT4ge1xyXG4gICAgICBpZiAoZXJyb3IpIHsgcmV0dXJuIHRoaXMuX2VtaXREZWxpdmVyeUZhaWx1cmUoZXJyb3IpOyB9XHJcblxyXG4gICAgICBsZXQgYm9keSAgICA9IHRoaXMuX2JvZHlGb3IoZmlsZU9iamVjdHMpO1xyXG4gICAgICBsZXQgbGVuZ3RoICA9IHRoaXMuX2xlbmd0aEZvcihib2R5KTtcclxuICAgICAgbGV0IGhlYWRlcnMgPSB7XHJcbiAgICAgICAgJ0NvbnRlbnQtVHlwZScgOiBgbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0ke3RoaXMuX2JvdW5kYXJ5fWAsXHJcbiAgICAgICAgJ0NvbnRlbnQtTGVuZ3RoJyA6IGxlbmd0aFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgcmV0dXJuIHRoaXMuX2NsaWVudC5yZXF1ZXN0KCdQT1NUJywgJy9vdXRib3VuZC9mYXhlcycsIGhlYWRlcnMsIGJvZHksIHZhbGlkYXRlZFBhcmFtcylcclxuICAgICAgICAudGhlbih0aGlzLl9lbWl0RGVsaXZlcnlTdWNjZXNzLmJpbmQodGhpcykpXHJcbiAgICAgICAgLmNhdGNoKHRoaXMuX2VtaXREZWxpdmVyeUZhaWx1cmUuYmluZCh0aGlzKSk7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgX2VtaXREZWxpdmVyeVN1Y2Nlc3MocmVzdWx0KSB7XHJcbiAgICB0aGlzLl9lbWl0dGVyLmVtaXQoJ3Jlc29sdmUnLCByZXN1bHQpO1xyXG4gIH1cclxuXHJcbiAgX2VtaXREZWxpdmVyeUZhaWx1cmUoZXJyb3IpIHtcclxuICAgIHRoaXMuX2VtaXR0ZXIuZW1pdCgncmVqZWN0JywgZXJyb3IpO1xyXG4gIH1cclxuXHJcbiAgX3ZhbGlkYXRlUGFyYW1zKHBhcmFtcykge1xyXG4gICAgaWYgKCFwYXJhbXMuZmF4TnVtYmVyKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYXJndW1lbnQ6IGZheE51bWJlcicpO1xyXG5cclxuICAgIGlmICghcGFyYW1zLmZpbGUgJiYgIXBhcmFtcy5maWxlcylcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGFyZ3VtZW50OiBmaWxlIG9yIGZpbGVzJyk7XHJcblxyXG4gICAgbGV0IGZpbGVzID0gW3BhcmFtcy5maWxlIHx8IHBhcmFtcy5maWxlc107XHJcbiAgICBmaWxlcyA9IHRoaXMuX2ZsYXR0ZW4oZmlsZXMpO1xyXG5cclxuICAgIGRlbGV0ZSBwYXJhbXNbJ2ZpbGUnXTtcclxuICAgIGRlbGV0ZSBwYXJhbXNbJ2ZpbGVzJ107XHJcblxyXG4gICAgcmV0dXJuIFtwYXJhbXMsIGZpbGVzXTtcclxuICB9XHJcblxyXG4gIF9nZW5lcmF0ZUZpbGVPYmplY3RzKGZpbGVzLCBjYWxsYmFjaykge1xyXG4gICAgbGV0IG9iamVjdHMgPSBbXTtcclxuXHJcbiAgICBmb3IgKGxldCBmaWxlIG9mIGZpbGVzKSB7XHJcbiAgICAgIGxldCBvYmplY3QgPSBmaWxlO1xyXG4gICAgICBpZiAodHlwZW9mKGZpbGUpID09PSAnc3RyaW5nJykge1xyXG4gICAgICAgIG9iamVjdCA9IG5ldyBGaWxlKHRoaXMuX2RvY3VtZW50cywgZmlsZSk7XHJcbiAgICAgIH1cclxuICAgICAgb2JqZWN0Lm9uUmVhZHkoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKCFvYmplY3QucmVhZHkpIHsgY2FsbGJhY2socmVzcG9uc2UsIG51bGwpOyB9XHJcbiAgICAgICAgb2JqZWN0cy5wdXNoKG9iamVjdCk7XHJcbiAgICAgICAgaWYgKG9iamVjdHMubGVuZ3RoID09IGZpbGVzLmxlbmd0aCkgeyBjYWxsYmFjayhudWxsLCBvYmplY3RzKTsgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgX2JvZHlGb3IoZmlsZXMpIHtcclxuICAgIGxldCBwYXJ0cyA9IGZpbGVzLm1hcChmaWxlID0+IHtcclxuICAgICAgbGV0IGVsZW1lbnRzID0gW2AtLSR7dGhpcy5fYm91bmRhcnl9YCwgJ1xcclxcbicsIGZpbGUuaGVhZGVyLCAnXFxyXFxuXFxyXFxuJ107XHJcbiAgICAgIGlmIChmaWxlLmJvZHkpIHtcclxuICAgICAgICBlbGVtZW50cy5wdXNoKGZpbGUuYm9keSk7XHJcbiAgICAgICAgZWxlbWVudHMucHVzaCgnXFxyXFxuXFxyXFxuJyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGVsZW1lbnRzO1xyXG4gICAgfSk7XHJcbiAgICBwYXJ0cy5wdXNoKGAtLSR7dGhpcy5fYm91bmRhcnl9LS1gKTtcclxuICAgIHJldHVybiB0aGlzLl9mbGF0dGVuKHBhcnRzKTtcclxuICB9XHJcblxyXG4gIF9sZW5ndGhGb3IocGFydHMpIHtcclxuICAgIHJldHVybiBwYXJ0cy5yZWR1Y2UoKHByZXYsIGN1cikgPT4ge1xyXG4gICAgICByZXR1cm4gcHJldiArIEJ1ZmZlci5ieXRlTGVuZ3RoKGN1cik7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIF9mbGF0dGVuKGxpc3QpIHtcclxuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGxpc3QpO1xyXG4gIH1cclxuXHJcbiAgX3Byb21pc2UoY2FsbGJhY2spIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIHRoaXMuX2VtaXR0ZXIub24oJ3Jlc29sdmUnLCAocmVzcG9uc2UpID0+IHtcclxuICAgICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2sobnVsbCwgcmVzcG9uc2UpOyB9XHJcbiAgICAgICAgcmVzb2x2ZShyZXNwb25zZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgICB0aGlzLl9lbWl0dGVyLm9uKCdyZWplY3QnLCAoZXJyb3IpID0+IHtcclxuICAgICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2soZXJyb3IsIG51bGwpOyB9XHJcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IERlbGl2ZXJ5O1xyXG4iXX0=