UNPKG

ravelin

Version:

Server-side JS library for the Ravelin API. Ravelin is a fraud detection tool.

458 lines (349 loc) 13.7 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _stringify = require('babel-runtime/core-js/json/stringify'); var _stringify2 = _interopRequireDefault(_stringify); var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _iterator2 = require('babel-runtime/core-js/symbol/iterator'); var _iterator3 = _interopRequireDefault(_iterator2); var _entries = require('babel-runtime/core-js/object/entries'); var _entries2 = _interopRequireDefault(_entries); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _typeof2 = require('babel-runtime/helpers/typeof'); var _typeof3 = _interopRequireDefault(_typeof2); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _hasInstance = require('babel-runtime/core-js/symbol/has-instance'); var _hasInstance2 = _interopRequireDefault(_hasInstance); var _defineProperty = require('babel-runtime/core-js/object/define-property'); var _defineProperty2 = _interopRequireDefault(_defineProperty); var _jsonClient = require('json-client'); var _jsonClient2 = _interopRequireDefault(_jsonClient); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var millisPerSecond = 1000; var eventNameRegex = /^[a-z0-9_-]*$/i; var Options = function () { function Options(input) { return input != null && (input.baseUrl == null || typeof input.baseUrl === 'string') && typeof input.secretKey === 'string'; } ; (0, _defineProperty2.default)(Options, _hasInstance2.default, { value: function value(input) { return Options(input); } }); return Options; }(); var Ravelin = function () { function Ravelin(options) { (0, _classCallCheck3.default)(this, Ravelin); if (!Options(options)) { throw new TypeError('Value of argument "options" violates contract.\n\nExpected:\nOptions\n\nGot:\n' + _inspect(options)); } this._options = (0, _extends3.default)({ baseUrl: 'https://api.ravelin.com/v2/' }, options); if (!Options(this._options)) { throw new TypeError('Value of "this._options" violates contract.\n\nExpected:\nOptions\n\nGot:\n' + _inspect(this._options)); } this._client = (0, _jsonClient2.default)(this._options.baseUrl, { headers: { authorization: 'token ' + this._options.secretKey } }); if (!(typeof this._client === 'function')) { throw new TypeError('Value of "this._client" violates contract.\n\nExpected:\n(string, string, {} | null, any | null) => Promise\n\nGot:\n' + _inspect(this._client)); } } (0, _createClass3.default)(Ravelin, [{ key: 'sendEvent', value: function () { var _ref8 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(name, params) { return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (typeof name === 'string') { _context.next = 2; break; } throw new TypeError('Value of argument "name" violates contract.\n\nExpected:\nstring\n\nGot:\n' + _inspect(name)); case 2: if (params != null && (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) === 'object') { _context.next = 4; break; } throw new TypeError('Value of argument "params" violates contract.\n\nExpected:\n{}\n\nGot:\n' + _inspect(params)); case 4: _context.next = 6; return this._internalSend(null, name, (0, _extends3.default)({ timestamp: new Date() }, params)); case 6: case 'end': return _context.stop(); } } }, _callee, this); })); function sendEvent(_x, _x2) { return _ref8.apply(this, arguments); } return sendEvent; }() }, { key: 'sendEventAndScore', value: function () { var _ref9 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2(name, params) { return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (typeof name === 'string') { _context2.next = 2; break; } throw new TypeError('Value of argument "name" violates contract.\n\nExpected:\nstring\n\nGot:\n' + _inspect(name)); case 2: if (params != null && (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) === 'object') { _context2.next = 4; break; } throw new TypeError('Value of argument "params" violates contract.\n\nExpected:\n{}\n\nGot:\n' + _inspect(params)); case 4: _context2.next = 6; return this._internalSend(null, name, (0, _extends3.default)({ timestamp: new Date() }, params), { score: true }); case 6: return _context2.abrupt('return', _context2.sent); case 7: case 'end': return _context2.stop(); } } }, _callee2, this); })); function sendEventAndScore(_x3, _x4) { return _ref9.apply(this, arguments); } return sendEventAndScore; }() }, { key: 'sendBackfillEvent', value: function () { var _ref10 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3(name, params) { return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: if (typeof name === 'string') { _context3.next = 2; break; } throw new TypeError('Value of argument "name" violates contract.\n\nExpected:\nstring\n\nGot:\n' + _inspect(name)); case 2: if (params != null && (typeof params === 'undefined' ? 'undefined' : (0, _typeof3.default)(params)) === 'object') { _context3.next = 4; break; } throw new TypeError('Value of argument "params" violates contract.\n\nExpected:\n{}\n\nGot:\n' + _inspect(params)); case 4: _context3.next = 6; return this._internalSend('backfill', name, params); case 6: case 'end': return _context3.stop(); } } }, _callee3, this); })); function sendBackfillEvent(_x5, _x6) { return _ref10.apply(this, arguments); } return sendBackfillEvent; }() }, { key: '_internalSend', value: function () { var _ref11 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4(type, name, bodyParams, urlParams) { var path, params, body, result; return _regenerator2.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: if (typeof type === 'string' || type == null) { _context4.next = 2; break; } throw new TypeError('Value of argument "type" violates contract.\n\nExpected:\nstring | null\n\nGot:\n' + _inspect(type)); case 2: if (typeof name === 'string') { _context4.next = 4; break; } throw new TypeError('Value of argument "name" violates contract.\n\nExpected:\nstring\n\nGot:\n' + _inspect(name)); case 4: if (bodyParams != null && (typeof bodyParams === 'undefined' ? 'undefined' : (0, _typeof3.default)(bodyParams)) === 'object') { _context4.next = 6; break; } throw new TypeError('Value of argument "bodyParams" violates contract.\n\nExpected:\n{}\n\nGot:\n' + _inspect(bodyParams)); case 6: if (urlParams == null || urlParams != null && (typeof urlParams === 'undefined' ? 'undefined' : (0, _typeof3.default)(urlParams)) === 'object') { _context4.next = 8; break; } throw new TypeError('Value of argument "urlParams" violates contract.\n\nExpected:\n?{}\n\nGot:\n' + _inspect(urlParams)); case 8: validateEventName(name); path = type ? type + '/' + name : name; params = urlParams || null; body = transformBody(bodyParams); _context4.next = 14; return this._client('post', path, params, body); case 14: result = _context4.sent; return _context4.abrupt('return', result && result.data || null); case 16: case 'end': return _context4.stop(); } } }, _callee4, this); })); function _internalSend(_x7, _x8, _x9, _x10) { return _ref11.apply(this, arguments); } return _internalSend; }() }]); return Ravelin; }(); exports.default = Ravelin; function validateEventName(name) { if (!(typeof name === 'string')) { throw new TypeError('Value of argument "name" violates contract.\n\nExpected:\nstring\n\nGot:\n' + _inspect(name)); } if (!name.length) throw error('missing_event_name'); if (!eventNameRegex.test(name)) throw error('invalid_event_name', { allowedRegex: eventNameRegex }); } function error(code, meta) { if (!(typeof code === 'string')) { throw new TypeError('Value of argument "code" violates contract.\n\nExpected:\nstring\n\nGot:\n' + _inspect(code)); } if (!(meta == null || meta != null && (typeof meta === 'undefined' ? 'undefined' : (0, _typeof3.default)(meta)) === 'object')) { throw new TypeError('Value of argument "meta" violates contract.\n\nExpected:\n?{}\n\nGot:\n' + _inspect(meta)); } var e = new Error(code); e.code = code; e.meta = meta || null; return e; } // fails if input contains a recursive reference function transformBody(value) { if (value instanceof Date) return Math.floor(value.getTime() / millisPerSecond); // currently doesn't support array-like objects // maybe change to `typeof value.map === 'function'`? if (Array.isArray(value)) return Array.prototype.map.call(value, transformBody); if (value === null) return void 0; if ((typeof value === 'undefined' ? 'undefined' : (0, _typeof3.default)(value)) !== 'object') return value; var newBody = {}; _Object$entries = (0, _entries2.default)(value); if (!(_Object$entries && (typeof _Object$entries[_iterator3.default] === 'function' || Array.isArray(_Object$entries)))) { throw new TypeError('Expected _Object$entries to be iterable, got ' + _inspect(_Object$entries)); } var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)(_Object$entries), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var _Object$entries; var _step$value = (0, _slicedToArray3.default)(_step.value, 2), key = _step$value[0], _value = _step$value[1]; newBody[key] = transformBody(_value); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return newBody; } function _inspect(input, depth) { var maxDepth = 4; var maxKeys = 15; if (depth === undefined) { depth = 0; } depth += 1; if (input === null) { return 'null'; } else if (input === undefined) { return 'void'; } else if (typeof input === 'string' || typeof input === 'number' || typeof input === 'boolean') { return typeof input === 'undefined' ? 'undefined' : (0, _typeof3.default)(input); } else if (Array.isArray(input)) { if (input.length > 0) { if (depth > maxDepth) return '[...]'; var first = _inspect(input[0], depth); if (input.every(function (item) { return _inspect(item, depth) === first; })) { return first.trim() + '[]'; } else { return '[' + input.slice(0, maxKeys).map(function (item) { return _inspect(item, depth); }).join(', ') + (input.length >= maxKeys ? ', ...' : '') + ']'; } } else { return 'Array'; } } else { var keys = (0, _keys2.default)(input); if (!keys.length) { if (input.constructor && input.constructor.name && input.constructor.name !== 'Object') { return input.constructor.name; } else { return 'Object'; } } if (depth > maxDepth) return '{...}'; var indent = ' '.repeat(depth - 1); var entries = keys.slice(0, maxKeys).map(function (key) { return (/^([A-Z_$][A-Z0-9_$]*)$/i.test(key) ? key : (0, _stringify2.default)(key)) + ': ' + _inspect(input[key], depth) + ';'; }).join('\n ' + indent); if (keys.length >= maxKeys) { entries += '\n ' + indent + '...'; } if (input.constructor && input.constructor.name && input.constructor.name !== 'Object') { return input.constructor.name + ' {\n ' + indent + entries + '\n' + indent + '}'; } else { return '{\n ' + indent + entries + '\n' + indent + '}'; } } } //# sourceMappingURL=index.js.map