@amplitude/analytics-browser
Version:
Official Amplitude SDK for Web
379 lines • 20.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.getTopLevelDomain = exports.createTransport = exports.createCookieStorage = exports.useBrowserConfig = exports.BrowserConfig = void 0;
var tslib_1 = require("tslib");
var analytics_core_1 = require("@amplitude/analytics-core");
var local_storage_1 = require("./storage/local-storage");
var session_storage_1 = require("./storage/session-storage");
var xhr_1 = require("./transports/xhr");
var send_beacon_1 = require("./transports/send-beacon");
var cookie_migration_1 = require("./cookie-migration");
var constants_1 = require("./constants");
var version_1 = require("./version");
// Exported for testing purposes only. Do not expose to public interface.
var BrowserConfig = /** @class */ (function (_super) {
tslib_1.__extends(BrowserConfig, _super);
function BrowserConfig(apiKey, appVersion, cookieStorage, cookieOptions, defaultTracking, autocapture, deviceId, flushIntervalMillis, flushMaxRetries, flushQueueSize, identityStorage, ingestionMetadata, instanceName, lastEventId, lastEventTime, loggerProvider, logLevel, minIdLength, offline, optOut, partnerId, plan, serverUrl, serverZone, sessionId, sessionTimeout, storageProvider, trackingOptions, transport, useBatch, fetchRemoteConfig, userId, pageCounter, debugLogsEnabled, networkTrackingOptions, identify, enableDiagnostics, diagnosticsSampleRate, diagnosticsClient, remoteConfig) {
if (cookieStorage === void 0) { cookieStorage = new analytics_core_1.MemoryStorage(); }
if (cookieOptions === void 0) { cookieOptions = {
domain: '',
expiration: 365,
sameSite: 'Lax',
secure: false,
upgrade: true,
}; }
if (flushIntervalMillis === void 0) { flushIntervalMillis = 1000; }
if (flushMaxRetries === void 0) { flushMaxRetries = 5; }
if (flushQueueSize === void 0) { flushQueueSize = 30; }
if (identityStorage === void 0) { identityStorage = constants_1.DEFAULT_IDENTITY_STORAGE; }
if (loggerProvider === void 0) { loggerProvider = new analytics_core_1.Logger(); }
if (logLevel === void 0) { logLevel = analytics_core_1.LogLevel.Warn; }
if (offline === void 0) { offline = false; }
if (optOut === void 0) { optOut = false; }
if (serverUrl === void 0) { serverUrl = ''; }
if (serverZone === void 0) { serverZone = constants_1.DEFAULT_SERVER_ZONE; }
if (sessionTimeout === void 0) { sessionTimeout = 30 * 60 * 1000; }
if (storageProvider === void 0) { storageProvider = new local_storage_1.LocalStorage({ loggerProvider: loggerProvider }); }
if (trackingOptions === void 0) { trackingOptions = {
ipAddress: true,
language: true,
platform: true,
}; }
if (transport === void 0) { transport = 'fetch'; }
if (useBatch === void 0) { useBatch = false; }
if (fetchRemoteConfig === void 0) { fetchRemoteConfig = true; }
if (enableDiagnostics === void 0) { enableDiagnostics = true; }
if (diagnosticsSampleRate === void 0) { diagnosticsSampleRate = 0; }
var _this = _super.call(this, { apiKey: apiKey, storageProvider: storageProvider, transportProvider: (0, exports.createTransport)(transport) }) || this;
_this.apiKey = apiKey;
_this.appVersion = appVersion;
_this.cookieOptions = cookieOptions;
_this.defaultTracking = defaultTracking;
_this.autocapture = autocapture;
_this.flushIntervalMillis = flushIntervalMillis;
_this.flushMaxRetries = flushMaxRetries;
_this.flushQueueSize = flushQueueSize;
_this.identityStorage = identityStorage;
_this.ingestionMetadata = ingestionMetadata;
_this.instanceName = instanceName;
_this.loggerProvider = loggerProvider;
_this.logLevel = logLevel;
_this.minIdLength = minIdLength;
_this.offline = offline;
_this.partnerId = partnerId;
_this.plan = plan;
_this.serverUrl = serverUrl;
_this.serverZone = serverZone;
_this.sessionTimeout = sessionTimeout;
_this.storageProvider = storageProvider;
_this.trackingOptions = trackingOptions;
_this.transport = transport;
_this.useBatch = useBatch;
_this.fetchRemoteConfig = fetchRemoteConfig;
_this.networkTrackingOptions = networkTrackingOptions;
_this.identify = identify;
_this.enableDiagnostics = enableDiagnostics;
_this.diagnosticsSampleRate = diagnosticsSampleRate;
_this.diagnosticsClient = diagnosticsClient;
_this.remoteConfig = remoteConfig;
_this.version = version_1.VERSION;
_this._optOut = false;
_this._cookieStorage = cookieStorage;
_this.deviceId = deviceId;
_this.lastEventId = lastEventId;
_this.lastEventTime = lastEventTime;
_this.optOut = optOut;
_this.sessionId = sessionId;
_this.pageCounter = pageCounter;
_this.userId = userId;
_this.debugLogsEnabled = debugLogsEnabled;
_this.loggerProvider.enable(debugLogsEnabled ? analytics_core_1.LogLevel.Debug : _this.logLevel);
_this.networkTrackingOptions = networkTrackingOptions;
_this.identify = identify;
_this.enableDiagnostics = enableDiagnostics;
_this.diagnosticsSampleRate = diagnosticsSampleRate;
_this.diagnosticsClient = diagnosticsClient;
// Backward compatibility for fetchRemoteConfig
if (fetchRemoteConfig) {
if (!_this.remoteConfig) {
_this.remoteConfig = {
fetchRemoteConfig: fetchRemoteConfig,
};
}
if (!_this.remoteConfig.fetchRemoteConfig) {
_this.remoteConfig.fetchRemoteConfig = fetchRemoteConfig;
}
}
return _this;
}
Object.defineProperty(BrowserConfig.prototype, "cookieStorage", {
get: function () {
return this._cookieStorage;
},
set: function (cookieStorage) {
if (this._cookieStorage !== cookieStorage) {
this._cookieStorage = cookieStorage;
this.updateStorage();
}
},
enumerable: false,
configurable: true
});
Object.defineProperty(BrowserConfig.prototype, "deviceId", {
get: function () {
return this._deviceId;
},
set: function (deviceId) {
if (this._deviceId !== deviceId) {
this._deviceId = deviceId;
this.updateStorage();
}
},
enumerable: false,
configurable: true
});
Object.defineProperty(BrowserConfig.prototype, "userId", {
get: function () {
return this._userId;
},
set: function (userId) {
if (this._userId !== userId) {
this._userId = userId;
this.updateStorage();
}
},
enumerable: false,
configurable: true
});
Object.defineProperty(BrowserConfig.prototype, "sessionId", {
get: function () {
return this._sessionId;
},
set: function (sessionId) {
if (this._sessionId !== sessionId) {
this._sessionId = sessionId;
this.updateStorage();
}
},
enumerable: false,
configurable: true
});
Object.defineProperty(BrowserConfig.prototype, "optOut", {
get: function () {
return this._optOut;
},
set: function (optOut) {
if (this._optOut !== optOut) {
this._optOut = optOut;
this.updateStorage();
}
},
enumerable: false,
configurable: true
});
Object.defineProperty(BrowserConfig.prototype, "lastEventTime", {
get: function () {
return this._lastEventTime;
},
set: function (lastEventTime) {
if (this._lastEventTime !== lastEventTime) {
this._lastEventTime = lastEventTime;
this.updateStorage();
}
},
enumerable: false,
configurable: true
});
Object.defineProperty(BrowserConfig.prototype, "lastEventId", {
get: function () {
return this._lastEventId;
},
set: function (lastEventId) {
if (this._lastEventId !== lastEventId) {
this._lastEventId = lastEventId;
this.updateStorage();
}
},
enumerable: false,
configurable: true
});
Object.defineProperty(BrowserConfig.prototype, "pageCounter", {
get: function () {
return this._pageCounter;
},
set: function (pageCounter) {
if (this._pageCounter !== pageCounter) {
this._pageCounter = pageCounter;
this.updateStorage();
}
},
enumerable: false,
configurable: true
});
Object.defineProperty(BrowserConfig.prototype, "debugLogsEnabled", {
set: function (debugLogsEnabled) {
if (this._debugLogsEnabled !== debugLogsEnabled) {
this._debugLogsEnabled = debugLogsEnabled;
this.updateStorage();
}
},
enumerable: false,
configurable: true
});
BrowserConfig.prototype.updateStorage = function () {
var cache = {
deviceId: this._deviceId,
userId: this._userId,
sessionId: this._sessionId,
optOut: this._optOut,
lastEventTime: this._lastEventTime,
lastEventId: this._lastEventId,
pageCounter: this._pageCounter,
debugLogsEnabled: this._debugLogsEnabled,
};
void this.cookieStorage.set((0, analytics_core_1.getCookieName)(this.apiKey), cache);
};
return BrowserConfig;
}(analytics_core_1.Config));
exports.BrowserConfig = BrowserConfig;
var useBrowserConfig = function (apiKey, options, amplitudeInstance) {
if (options === void 0) { options = {}; }
return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var identityStorage, cookieOptions, _a, _b, cookieStorage, legacyCookies, previousCookies, queryParams, ampTimestamp, isWithinTimeLimit, deviceId, lastEventId, lastEventTime, optOut, sessionId, userId, trackingOptions, pageCounter, debugLogsEnabled, browserConfig;
var _c;
var _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0, _1, _2;
return tslib_1.__generator(this, function (_3) {
switch (_3.label) {
case 0:
identityStorage = options.identityStorage || constants_1.DEFAULT_IDENTITY_STORAGE;
_c = {};
if (!(identityStorage !== constants_1.DEFAULT_IDENTITY_STORAGE)) return [3 /*break*/, 1];
_a = '';
return [3 /*break*/, 5];
case 1:
if (!((_e = (_d = options.cookieOptions) === null || _d === void 0 ? void 0 : _d.domain) !== null && _e !== void 0)) return [3 /*break*/, 2];
_b = _e;
return [3 /*break*/, 4];
case 2: return [4 /*yield*/, (0, exports.getTopLevelDomain)()];
case 3:
_b = (_3.sent());
_3.label = 4;
case 4:
_a = _b;
_3.label = 5;
case 5:
cookieOptions = tslib_1.__assign.apply(void 0, [(_c.domain = _a, _c.expiration = 365, _c.sameSite = 'Lax', _c.secure = false, _c.upgrade = true, _c), options.cookieOptions]);
cookieStorage = (0, exports.createCookieStorage)(options.identityStorage, cookieOptions);
return [4 /*yield*/, (0, cookie_migration_1.parseLegacyCookies)(apiKey, cookieStorage, (_g = (_f = options.cookieOptions) === null || _f === void 0 ? void 0 : _f.upgrade) !== null && _g !== void 0 ? _g : true)];
case 6:
legacyCookies = _3.sent();
return [4 /*yield*/, cookieStorage.get((0, analytics_core_1.getCookieName)(apiKey))];
case 7:
previousCookies = _3.sent();
queryParams = (0, analytics_core_1.getQueryParams)();
ampTimestamp = queryParams.ampTimestamp ? Number(queryParams.ampTimestamp) : undefined;
isWithinTimeLimit = ampTimestamp ? Date.now() < ampTimestamp : true;
deviceId = (_m = (_l = (_k = (_h = options.deviceId) !== null && _h !== void 0 ? _h : (isWithinTimeLimit ? (_j = queryParams.ampDeviceId) !== null && _j !== void 0 ? _j : queryParams.deviceId : undefined)) !== null && _k !== void 0 ? _k : previousCookies === null || previousCookies === void 0 ? void 0 : previousCookies.deviceId) !== null && _l !== void 0 ? _l : legacyCookies.deviceId) !== null && _m !== void 0 ? _m : (0, analytics_core_1.UUID)();
lastEventId = (_o = previousCookies === null || previousCookies === void 0 ? void 0 : previousCookies.lastEventId) !== null && _o !== void 0 ? _o : legacyCookies.lastEventId;
lastEventTime = (_p = previousCookies === null || previousCookies === void 0 ? void 0 : previousCookies.lastEventTime) !== null && _p !== void 0 ? _p : legacyCookies.lastEventTime;
optOut = (_r = (_q = options.optOut) !== null && _q !== void 0 ? _q : previousCookies === null || previousCookies === void 0 ? void 0 : previousCookies.optOut) !== null && _r !== void 0 ? _r : legacyCookies.optOut;
sessionId = (_s = previousCookies === null || previousCookies === void 0 ? void 0 : previousCookies.sessionId) !== null && _s !== void 0 ? _s : legacyCookies.sessionId;
userId = (_u = (_t = options.userId) !== null && _t !== void 0 ? _t : previousCookies === null || previousCookies === void 0 ? void 0 : previousCookies.userId) !== null && _u !== void 0 ? _u : legacyCookies.userId;
amplitudeInstance.previousSessionDeviceId = (_v = previousCookies === null || previousCookies === void 0 ? void 0 : previousCookies.deviceId) !== null && _v !== void 0 ? _v : legacyCookies.deviceId;
amplitudeInstance.previousSessionUserId = (_w = previousCookies === null || previousCookies === void 0 ? void 0 : previousCookies.userId) !== null && _w !== void 0 ? _w : legacyCookies.userId;
trackingOptions = {
ipAddress: (_y = (_x = options.trackingOptions) === null || _x === void 0 ? void 0 : _x.ipAddress) !== null && _y !== void 0 ? _y : true,
language: (_0 = (_z = options.trackingOptions) === null || _z === void 0 ? void 0 : _z.language) !== null && _0 !== void 0 ? _0 : true,
platform: (_2 = (_1 = options.trackingOptions) === null || _1 === void 0 ? void 0 : _1.platform) !== null && _2 !== void 0 ? _2 : true,
};
pageCounter = previousCookies === null || previousCookies === void 0 ? void 0 : previousCookies.pageCounter;
debugLogsEnabled = previousCookies === null || previousCookies === void 0 ? void 0 : previousCookies.debugLogsEnabled;
// Override default tracking options if autocapture is set
if (options.autocapture !== undefined) {
options.defaultTracking = options.autocapture;
}
browserConfig = new BrowserConfig(apiKey, options.appVersion, cookieStorage, cookieOptions, options.defaultTracking, options.autocapture, deviceId, options.flushIntervalMillis, options.flushMaxRetries, options.flushQueueSize, identityStorage, options.ingestionMetadata, options.instanceName, lastEventId, lastEventTime, options.loggerProvider, options.logLevel, options.minIdLength, options.offline, optOut, options.partnerId, options.plan, options.serverUrl, options.serverZone, sessionId, options.sessionTimeout, options.storageProvider, trackingOptions, options.transport, options.useBatch, options.fetchRemoteConfig, userId, pageCounter, debugLogsEnabled, options.networkTrackingOptions, options.identify, options.enableDiagnostics, undefined, // diagnosticsSampleRate - set in _setDiagnosticsSampleRate or defaults to 0
undefined, // diagnosticsClient - set after config creation
options.remoteConfig);
return [4 /*yield*/, browserConfig.storageProvider.isEnabled()];
case 8:
if (!(_3.sent())) {
browserConfig.loggerProvider.warn("Storage provider ".concat(browserConfig.storageProvider.constructor.name, " is not enabled. Falling back to MemoryStorage."));
browserConfig.storageProvider = new analytics_core_1.MemoryStorage();
}
return [2 /*return*/, browserConfig];
}
});
});
};
exports.useBrowserConfig = useBrowserConfig;
var createCookieStorage = function (identityStorage, cookieOptions) {
if (identityStorage === void 0) { identityStorage = constants_1.DEFAULT_IDENTITY_STORAGE; }
if (cookieOptions === void 0) { cookieOptions = {}; }
switch (identityStorage) {
case 'localStorage':
return new local_storage_1.LocalStorage();
case 'sessionStorage':
return new session_storage_1.SessionStorage();
case 'none':
return new analytics_core_1.MemoryStorage();
case 'cookie':
default:
return new analytics_core_1.CookieStorage(tslib_1.__assign(tslib_1.__assign({}, cookieOptions), { expirationDays: cookieOptions.expiration }));
}
};
exports.createCookieStorage = createCookieStorage;
var createTransport = function (transport) {
if (transport === 'xhr') {
return new xhr_1.XHRTransport();
}
if (transport === 'beacon') {
return new send_beacon_1.SendBeaconTransport();
}
return new analytics_core_1.FetchTransport();
};
exports.createTransport = createTransport;
var getTopLevelDomain = function (url) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
var host, parts, levels, storageKey, i, i, domain, options, storage, value;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0: return [4 /*yield*/, new analytics_core_1.CookieStorage().isEnabled()];
case 1:
if (!(_a.sent()) ||
(!url && (typeof location === 'undefined' || !location.hostname))) {
return [2 /*return*/, ''];
}
host = url !== null && url !== void 0 ? url : location.hostname;
parts = host.split('.');
levels = [];
storageKey = 'AMP_TLDTEST';
for (i = parts.length - 2; i >= 0; --i) {
levels.push(parts.slice(i).join('.'));
}
i = 0;
_a.label = 2;
case 2:
if (!(i < levels.length)) return [3 /*break*/, 7];
domain = levels[i];
options = { domain: '.' + domain };
storage = new analytics_core_1.CookieStorage(options);
return [4 /*yield*/, storage.set(storageKey, 1)];
case 3:
_a.sent();
return [4 /*yield*/, storage.get(storageKey)];
case 4:
value = _a.sent();
if (!value) return [3 /*break*/, 6];
return [4 /*yield*/, storage.remove(storageKey)];
case 5:
_a.sent();
return [2 /*return*/, '.' + domain];
case 6:
i++;
return [3 /*break*/, 2];
case 7: return [2 /*return*/, ''];
}
});
}); };
exports.getTopLevelDomain = getTopLevelDomain;
//# sourceMappingURL=config.js.map