ravelin
Version:
Server-side JS library for the Ravelin API. Ravelin is a fraud detection tool.
458 lines (349 loc) • 13.7 kB
JavaScript
'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