interfax
Version:
A wrapper around the InterFAX REST API for sending and receiving faxes.
194 lines (163 loc) • 16.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
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 _responseHandler = require('./response-handler');
var _responseHandler2 = _interopRequireDefault(_responseHandler);
var _errorHandler = require('./error-handler');
var _errorHandler2 = _interopRequireDefault(_errorHandler);
var _bluebird = require('bluebird');
var _bluebird2 = _interopRequireDefault(_bluebird);
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 Client = function () {
function Client(https, credentials, version, debug) {
_classCallCheck(this, Client);
this._https = https;
this._credentials = credentials || {};
this._version = version;
this._debug = debug || false;
this._validateCredentials();
}
_createClass(Client, [{
key: 'get',
value: function get(path, params, callback) {
return this.request('GET', path, {}, null, params, callback);
}
}, {
key: 'post',
value: function post(path, params, callback) {
return this.request('POST', path, {}, null, params, callback);
}
}, {
key: 'delete',
value: function _delete(path, params, callback) {
return this.request('DELETE', path, {}, null, params, callback);
}
}, {
key: 'request',
value: function request(method, path, headers, body, params, callback) {
var emitter = new _events2.default();
var __callback = this._callback(params, callback);
var promise = this._promise(emitter, __callback);
var options = this._options(method, path, headers, params);
var request = this._https.request(options);
if (this._debug) {
console.log(headers); // eslint-disable-line no-console
console.log(options); // eslint-disable-line no-console
}
request.on('response', new _responseHandler2.default(emitter, this._debug));
request.on('error', new _errorHandler2.default(emitter, this._debug));
this._writeBody(request, body);
request.end();
return promise;
}
// private methods
}, {
key: '_validateCredentials',
value: function _validateCredentials() {
this._credentials.username = this._credentials.username || process.env.INTERFAX_USERNAME;
if (!this._credentials.username) throw new Error('Missing argument: username');
this._credentials.password = this._credentials.password || process.env.INTERFAX_PASSWORD;
if (!this._credentials.password) throw new Error('Missing argument: password');
}
}, {
key: '_callback',
value: function _callback() {
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
for (var i = args.length - 1; i >= 0; i--) {
var argument = args[i];
if (typeof argument === 'function') return argument;
}
return null;
}
}, {
key: '_options',
value: function _options(method, path, headers, params) {
headers['User-Agent'] = 'InterFAX Node ' + this._version;
return {
'host': 'rest.interfax.net',
'path': this._path(path, params),
'port': 443,
'auth': this._credentials.username + ':' + this._credentials.password,
'method': method,
'headers': headers
};
}
}, {
key: '_path',
value: function _path(path, params) {
var query = this._query(params);
return path + '?' + query;
}
}, {
key: '_query',
value: function _query(params) {
if ((typeof params === 'undefined' ? 'undefined' : _typeof(params)) !== 'object') params = {};
return Object.keys(params).map(function (k) {
return encodeURIComponent(k) + '=' + encodeURIComponent(params[k]);
}).join('&');
}
}, {
key: '_writeBody',
value: function _writeBody(request, body) {
if (!body) {
return;
}
if (typeof body === 'string' || body instanceof Buffer) {
request.write(body);
} else {
var _iteratorNormalCompletion = true;
var _didIteratorError = false;
var _iteratorError = undefined;
try {
for (var _iterator = body[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
var part = _step.value;
request.write(part);
}
} catch (err) {
_didIteratorError = true;
_iteratorError = err;
} finally {
try {
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
} finally {
if (_didIteratorError) {
throw _iteratorError;
}
}
}
}
}
}, {
key: '_promise',
value: function _promise(emitter, callback) {
return new _bluebird2.default(function (resolve, reject) {
emitter.on('resolve', function (response) {
if (callback) {
callback(null, response);
}
resolve(response);
});
emitter.on('reject', function (error) {
if (callback) {
callback(error, null);
}
reject(error);
});
});
}
}]);
return Client;
}();
exports.default = Client;
module.exports = exports['default'];
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9jbGllbnQuanMiXSwibmFtZXMiOlsiQ2xpZW50IiwiaHR0cHMiLCJjcmVkZW50aWFscyIsInZlcnNpb24iLCJkZWJ1ZyIsIl9odHRwcyIsIl9jcmVkZW50aWFscyIsIl92ZXJzaW9uIiwiX2RlYnVnIiwiX3ZhbGlkYXRlQ3JlZGVudGlhbHMiLCJwYXRoIiwicGFyYW1zIiwiY2FsbGJhY2siLCJyZXF1ZXN0IiwibWV0aG9kIiwiaGVhZGVycyIsImJvZHkiLCJlbWl0dGVyIiwiRXZlbnRFbWl0dGVyIiwiX19jYWxsYmFjayIsIl9jYWxsYmFjayIsInByb21pc2UiLCJfcHJvbWlzZSIsIm9wdGlvbnMiLCJfb3B0aW9ucyIsImNvbnNvbGUiLCJsb2ciLCJvbiIsIlJlc3BvbnNlSGFuZGxlciIsIkVycm9ySGFuZGxlciIsIl93cml0ZUJvZHkiLCJlbmQiLCJ1c2VybmFtZSIsInByb2Nlc3MiLCJlbnYiLCJJTlRFUkZBWF9VU0VSTkFNRSIsIkVycm9yIiwicGFzc3dvcmQiLCJJTlRFUkZBWF9QQVNTV09SRCIsImFyZ3MiLCJpIiwibGVuZ3RoIiwiYXJndW1lbnQiLCJfcGF0aCIsInF1ZXJ5IiwiX3F1ZXJ5IiwiT2JqZWN0Iiwia2V5cyIsIm1hcCIsImVuY29kZVVSSUNvbXBvbmVudCIsImsiLCJqb2luIiwiQnVmZmVyIiwid3JpdGUiLCJwYXJ0IiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJyZXNwb25zZSIsImVycm9yIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0lBRU1BLE07QUFDSixrQkFBWUMsS0FBWixFQUFtQkMsV0FBbkIsRUFBZ0NDLE9BQWhDLEVBQXlDQyxLQUF6QyxFQUFnRDtBQUFBOztBQUM5QyxTQUFLQyxNQUFMLEdBQWNKLEtBQWQ7QUFDQSxTQUFLSyxZQUFMLEdBQW9CSixlQUFlLEVBQW5DO0FBQ0EsU0FBS0ssUUFBTCxHQUFnQkosT0FBaEI7QUFDQSxTQUFL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QUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBSU47QUFDRjs7OzZCQUVRckMsTyxFQUFTTCxRLEVBQVU7QUFDMUIsYUFBTyxJQUFJMkMsa0JBQUosQ0FBWSxVQUFDQyxPQUFELEVBQVVDLE1BQVYsRUFBcUI7QUFDdEN4QyxnQkFBUVUsRUFBUixDQUFXLFNBQVgsRUFBc0IsVUFBQytCLFFBQUQsRUFBYztBQUNsQyxjQUFJOUMsUUFBSixFQUFjO0FBQUVBLHFCQUFTLElBQVQsRUFBZThDLFFBQWY7QUFBMkI7QUFDM0NGLGtCQUFRRSxRQUFSO0FBQ0QsU0FIRDtBQUlBekMsZ0JBQVFVLEVBQVIsQ0FBVyxRQUFYLEVBQXFCLFVBQUNnQyxLQUFELEVBQVc7QUFDOUIsY0FBSS9DLFFBQUosRUFBYztBQUFFQSxxQkFBUytDLEtBQVQsRUFBZ0IsSUFBaEI7QUFBd0I7QUFDeENGLGlCQUFPRSxLQUFQO0FBQ0QsU0FIRDtBQUlELE9BVE0sQ0FBUDtBQVVEOzs7Ozs7a0JBR1kzRCxNIiwiZmlsZSI6ImNsaWVudC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBSZXNwb25zZUhhbmRsZXIgIGZyb20gJy4vcmVzcG9uc2UtaGFuZGxlcic7XHJcbmltcG9ydCBFcnJvckhhbmRsZXIgICAgIGZyb20gJy4vZXJyb3ItaGFuZGxlcic7XHJcbmltcG9ydCBQcm9taXNlICAgICAgICAgIGZyb20gJ2JsdWViaXJkJztcclxuaW1wb3J0IEV2ZW50RW1pdHRlciAgICAgZnJvbSAnZXZlbnRzJztcclxuXHJcbmNsYXNzIENsaWVudCB7XHJcbiAgY29uc3RydWN0b3IoaHR0cHMsIGNyZWRlbnRpYWxzLCB2ZXJzaW9uLCBkZWJ1Zykge1xyXG4gICAgdGhpcy5faHR0cHMgPSBodHRwcztcclxuICAgIHRoaXMuX2NyZWRlbnRpYWxzID0gY3JlZGVudGlhbHMgfHwge307XHJcbiAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcclxuICAgIHRoaXMuX2RlYnVnID0gZGVidWcgfHwgZmFsc2U7XHJcbiAgICB0aGlzLl92YWxpZGF0ZUNyZWRlbnRpYWxzKCk7XHJcbiAgfVxyXG5cclxuICBnZXQocGF0aCwgcGFyYW1zLCBjYWxsYmFjaykge1xyXG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnR0VUJywgcGF0aCwge30sIG51bGwsIHBhcmFtcywgY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgcG9zdChwYXRoLCBwYXJhbXMsIGNhbGxiYWNrKSB7XHJcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQT1NUJywgcGF0aCwge30sIG51bGwsIHBhcmFtcywgY2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlKHBhdGgsIHBhcmFtcywgY2FsbGJhY2spIHtcclxuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIHBhdGgsIHt9LCBudWxsLCBwYXJhbXMsIGNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIHJlcXVlc3QobWV0aG9kLCBwYXRoLCBoZWFkZXJzLCBib2R5LCBwYXJhbXMsIGNhbGxiYWNrKSB7XHJcbiAgICBsZXQgZW1pdHRlciAgICAgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICBsZXQgX19jYWxsYmFjayAgPSB0aGlzLl9jYWxsYmFjayhwYXJhbXMsIGNhbGxiYWNrKTtcclxuICAgIGxldCBwcm9taXNlICAgICA9IHRoaXMuX3Byb21pc2UoZW1pdHRlciwgX19jYWxsYmFjayk7XHJcbiAgICBsZXQgb3B0aW9ucyAgICAgPSB0aGlzLl9vcHRpb25zKG1ldGhvZCwgcGF0aCwgaGVhZGVycywgcGFyYW1zKTtcclxuICAgIHZhciByZXF1ZXN0ICAgICA9IHRoaXMuX2h0dHBzLnJlcXVlc3Qob3B0aW9ucyk7XHJcblxyXG4gICAgaWYgKHRoaXMuX2RlYnVnKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGhlYWRlcnMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcclxuICAgICAgY29uc29sZS5sb2cob3B0aW9ucyk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxyXG4gICAgfVxyXG5cclxuICAgIHJlcXVlc3Qub24oJ3Jlc3BvbnNlJywgbmV3IFJlc3BvbnNlSGFuZGxlcihlbWl0dGVyLCB0aGlzLl9kZWJ1ZykpO1xyXG4gICAgcmVxdWVzdC5vbignZXJyb3InLCBuZXcgRXJyb3JIYW5kbGVyKGVtaXR0ZXIsIHRoaXMuX2RlYnVnKSk7XHJcblxyXG4gICAgdGhpcy5fd3JpdGVCb2R5KHJlcXVlc3QsIGJvZHkpO1xyXG5cclxuICAgIHJlcXVlc3QuZW5kKCk7XHJcblxyXG4gICAgcmV0dXJuIHByb21pc2U7XHJcbiAgfVxyXG5cclxuICAvLyBwcml2YXRlIG1ldGhvZHNcclxuXHJcbiAgX3ZhbGlkYXRlQ3JlZGVudGlhbHMoKSB7XHJcbiAgICB0aGlzLl9jcmVkZW50aWFscy51c2VybmFtZSA9IHRoaXMuX2NyZWRlbnRpYWxzLnVzZXJuYW1lIHx8IHByb2Nlc3MuZW52LklOVEVSRkFYX1VTRVJOQU1FO1xyXG4gICAgaWYgKCF0aGlzLl9jcmVkZW50aWFscy51c2VybmFtZSlcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIGFyZ3VtZW50OiB1c2VybmFtZScpO1xyXG5cclxuICAgIHRoaXMuX2NyZWRlbnRpYWxzLnBhc3N3b3JkID0gdGhpcy5fY3JlZGVudGlhbHMucGFzc3dvcmQgfHwgcHJvY2Vzcy5lbnYuSU5URVJGQVhfUEFTU1dPUkQ7XHJcbiAgICBpZiAoIXRoaXMuX2NyZWRlbnRpYWxzLnBhc3N3b3JkKVxyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYXJndW1lbnQ6IHBhc3N3b3JkJyk7XHJcbiAgfVxyXG5cclxuICBfY2FsbGJhY2soLi4uYXJncykge1xyXG4gICAgZm9yIChsZXQgaSA9IGFyZ3MubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7XHJcbiAgICAgIGxldCBhcmd1bWVudCA9IGFyZ3NbaV07XHJcbiAgICAgIGlmICh0eXBlb2YoYXJndW1lbnQpID09PSAgJ2Z1bmN0aW9uJykgcmV0dXJuIGFyZ3VtZW50O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBfb3B0aW9ucyhtZXRob2QsIHBhdGgsIGhlYWRlcnMsIHBhcmFtcykge1xyXG4gICAgaGVhZGVyc1snVXNlci1BZ2VudCddID0gYEludGVyRkFYIE5vZGUgJHt0aGlzLl92ZXJzaW9ufWA7XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgJ2hvc3QnOiAncmVzdC5pbnRlcmZheC5uZXQnLFxyXG4gICAgICAncGF0aCc6IHRoaXMuX3BhdGgocGF0aCwgcGFyYW1zKSxcclxuICAgICAgJ3BvcnQnOiA0NDMsXHJcbiAgICAgICdhdXRoJzogYCR7dGhpcy5fY3JlZGVudGlhbHMudXNlcm5hbWV9OiR7dGhpcy5fY3JlZGVudGlhbHMucGFzc3dvcmR9YCxcclxuICAgICAgJ21ldGhvZCc6IG1ldGhvZCxcclxuICAgICAgJ2hlYWRlcnMnOiBoZWFkZXJzXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgX3BhdGgocGF0aCwgcGFyYW1zKSB7XHJcbiAgICBsZXQgcXVlcnkgPSB0aGlzLl9xdWVyeShwYXJhbXMpO1xyXG4gICAgcmV0dXJuIGAke3BhdGh9PyR7cXVlcnl9YDtcclxuICB9XHJcblxyXG4gIF9xdWVyeShwYXJhbXMpIHtcclxuICAgIGlmICh0eXBlb2YocGFyYW1zKSAhPT0gJ29iamVjdCcpIHBhcmFtcyA9IHt9O1xyXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHBhcmFtcykubWFwKGsgPT4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGspfT0ke2VuY29kZVVSSUNvbXBvbmVudChwYXJhbXNba10pfWApLmpvaW4oJyYnKTtcclxuICB9XHJcblxyXG4gIF93cml0ZUJvZHkocmVxdWVzdCwgYm9keSkge1xyXG4gICAgaWYgKCFib2R5KSB7IHJldHVybjsgfVxyXG5cclxuICAgIGlmICh0eXBlb2YoYm9keSkgPT09ICdzdHJpbmcnIHx8IGJvZHkgaW5zdGFuY2VvZiBCdWZmZXIpIHtcclxuICAgICAgcmVxdWVzdC53cml0ZShib2R5KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZvciAobGV0IHBhcnQgb2YgYm9keSkge1xyXG4gICAgICAgIHJlcXVlc3Qud3JpdGUocGFydCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIF9wcm9taXNlKGVtaXR0ZXIsIGNhbGxiYWNrKSB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBlbWl0dGVyLm9uKCdyZXNvbHZlJywgKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7IGNhbGxiYWNrKG51bGwsIHJlc3BvbnNlKTsgfVxyXG4gICAgICAgIHJlc29sdmUocmVzcG9uc2UpO1xyXG4gICAgICB9KTtcclxuICAgICAgZW1pdHRlci5vbigncmVqZWN0JywgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgaWYgKGNhbGxiYWNrKSB7IGNhbGxiYWNrKGVycm9yLCBudWxsKTsgfVxyXG4gICAgICAgIHJlamVjdChlcnJvcik7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBDbGllbnQ7XHJcbiJdfQ==