'use strict';
var kount = require('./kount');
var fraudnet = require('./fraudnet');
var BraintreeError = require('../lib/error');
var methods = require('../lib/methods');
var throwIfNoCallback = require('../lib/throw-if-no-callback');
var convertMethodsToError = require('../lib/convert-methods-to-error');
var deferred = require('../lib/deferred');
var VERSION = require('package.version');
var sharedErrors = require('../errors');
var errors = require('./errors');
function create(options, callback) {
var data, kountInstance, fraudnetInstance, result, config, clientVersion;
var instances = [];
throwIfNoCallback(callback, 'create');
callback = deferred(callback);
function teardown(cb) {
var i;
for (i = 0; i < instances.length; i++) {
instances[i].teardown();
}
convertMethodsToError(result, methods(result));
if (cb) {
cb = deferred(cb);
cb();
}
}
if (options.client == null) {
callback(new BraintreeError({
type: sharedErrors.INSTANTIATION_OPTION_REQUIRED.type,
code: sharedErrors.INSTANTIATION_OPTION_REQUIRED.code,
message: 'options.client is required when instantiating Data Collector.'
}));
return;
}
config = options.client.getConfiguration();
clientVersion = config.analyticsMetadata.sdkVersion;
if (clientVersion !== VERSION) {
callback(new BraintreeError({
type: sharedErrors.INCOMPATIBLE_VERSIONS.type,
code: sharedErrors.INCOMPATIBLE_VERSIONS.code,
message: 'Client (version ' + clientVersion + ') and Data Collector (version ' + VERSION + ') components must be from the same SDK version.'
}));
return;
}
if (options.kount === true) {
if (!config.gatewayConfiguration.kount) {
callback(new BraintreeError(errors.DATA_COLLECTOR_KOUNT_NOT_ENABLED));
return;
}
try {
kountInstance = kount.setup({
environment: config.gatewayConfiguration.environment,
merchantId: config.gatewayConfiguration.kount.kountMerchantId
});
} catch (err) {
callback(new BraintreeError({
type: errors.DATA_COLLECTOR_KOUNT_ERROR.type,
code: errors.DATA_COLLECTOR_KOUNT_ERROR.code,
message: err.message
}));
return;
}
data = kountInstance.deviceData;
instances.push(kountInstance);
} else {
data = {};
}
if (options.paypal === true) {
if (config.gatewayConfiguration.paypalEnabled !== true) {
callback(new BraintreeError(errors.DATA_COLLECTOR_PAYPAL_NOT_ENABLED));
return;
}
fraudnetInstance = fraudnet.setup();
data.correlation_id = fraudnetInstance.sessionId;
instances.push(fraudnetInstance);
}
if (instances.length === 0) {
callback(new BraintreeError(errors.DATA_COLLECTOR_REQUIRES_CREATE_OPTIONS));
return;
}
result = {
deviceData: JSON.stringify(data),
teardown: teardown
};
callback(null, result);
}
module.exports = {
create: create,
VERSION: VERSION
};