UNPKG

@datadome/fraud-sdk-node

Version:

Fraud Protection - Node.js SDK

125 lines 5.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DataDome = exports.Operation = void 0; const tslib_1 = require("tslib"); const node_fetch_1 = tslib_1.__importDefault(require("node-fetch")); const https_1 = require("https"); const url_1 = require("url"); const model_1 = require("./model"); const constants_1 = require("./constants"); function getDefaultOptions() { return { logger: console, timeout: constants_1.DATADOME_TIMEOUT, endpoint: constants_1.DATADOME_ENDPOINT, }; } var Operation; (function (Operation) { Operation["VALIDATE"] = "validate"; Operation["COLLECT"] = "collect"; })(Operation || (exports.Operation = Operation = {})); class DataDome { constructor(key, options = {}) { const defaultOptions = getDefaultOptions(); const finalParameters = Object.assign({}, defaultOptions, options); const { endpoint, logger, timeout } = finalParameters; this.endpoint = endpoint; this.timeout = timeout; this.logger = logger; this.requestOptions = { agent: new https_1.Agent({ keepAlive: true }), headers: { Accept: 'application/json', Connection: 'keep-alive', 'Content-Type': 'application/json', 'x-api-key': key, }, method: 'POST', }; if (!this.endpoint.toLowerCase().startsWith('https://') && !this.endpoint.toLowerCase().startsWith('http://')) { this.logger.warn(`Endpoint ${this.endpoint} is not a valid URL. Defaulting to ${defaultOptions.endpoint}`); this.endpoint = defaultOptions.endpoint; } } buildPayload(request, event, requestMetadata) { return event.mergeWith(new model_1.DataDomeRequest(request, requestMetadata)); } sendRequest(_a) { return tslib_1.__awaiter(this, arguments, void 0, function* ({ operation, request, requestMetadata, event, args, }) { const endpoint = this.endpoint.endsWith('/') ? this.endpoint.slice(0, -1) : this.endpoint; const url = new url_1.URL(endpoint + '/v1/' + operation + '/' + event.action); const payload = this.buildPayload(request, event, requestMetadata); this.logger.debug(`url: ${url}`); this.logger.debug(`body: ${JSON.stringify(payload)}`); const requestConfig = Object.assign(Object.assign({}, this.requestOptions), { body: JSON.stringify(payload), signal: args === null || args === void 0 ? void 0 : args.controller.signal }); return (0, node_fetch_1.default)(url.toString(), requestConfig); }); } validate(request, event, requestMetadata) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort('DataDome Fraud API timeout'), this.timeout); try { const response = yield this.sendRequest({ operation: Operation.VALIDATE, request, requestMetadata, event, args: { controller, }, }); const result = yield (response === null || response === void 0 ? void 0 : response.json()); if (response === null || response === void 0 ? void 0 : response.ok) { result.status = model_1.ResponseStatus.OK; } else { result.status = model_1.ResponseStatus.FAILURE; result.action = model_1.ResponseAction.ALLOW; this.logger.error(`Error on API response: ${JSON.stringify(result)}`); } return result; } catch (error) { if ((error === null || error === void 0 ? void 0 : error.name) === 'AbortError' && controller.signal.aborted) { return { action: model_1.ResponseAction.ALLOW, status: model_1.ResponseStatus.TIMEOUT, message: `Request timed out after ${this.timeout} milliseconds`, }; } else { return { action: model_1.ResponseAction.ALLOW, status: model_1.ResponseStatus.FAILURE, message: `Request failed :${error}`, }; } } finally { clearTimeout(timeoutId); } }); } collect(request, event, requestMetadata) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const response = yield this.sendRequest({ operation: Operation.COLLECT, request, requestMetadata, event, }); if (response.ok) { return { status: model_1.ResponseStatus.OK }; } else { const json = yield response.json(); return Object.assign({ status: model_1.ResponseStatus.FAILURE }, json); } }); } } exports.DataDome = DataDome; //# sourceMappingURL=datadome.js.map