4550 lines
182 KiB
JavaScript
4550 lines
182 KiB
JavaScript
/*!
|
|
* 1DS JS SDK POST plugin, 3.2.13
|
|
* Copyright (c) Microsoft and contributors. All rights reserved.
|
|
* (Microsoft Internal Only)
|
|
*/
|
|
'use strict';
|
|
|
|
(function (global, factory) {
|
|
var undef = "undefined";
|
|
typeof exports === "object" && typeof module !== undef ? factory(exports) :
|
|
typeof define === "function" && define.amd ? define(["exports"], factory) :
|
|
(function(global){
|
|
var nsKey, key, nm, theExports = {}, modName = "esm_ms_post_3_2_13", msMod="__ms$mod__";
|
|
var mods={}, modDetail=mods[modName]={}, ver="3.2.13";
|
|
// Versioned namespace "oneDS3"
|
|
var exportNs=global, nsKey="oneDS3", exportNs=exportNs[nsKey]=(exportNs[nsKey]||{});
|
|
// Global namespace "oneDS"
|
|
var destNs=global, nsKey="oneDS", destNs=destNs[nsKey]=(destNs[nsKey]||{});
|
|
var expNsDetail=(exportNs[msMod]=(exportNs[msMod] || {})), expNameVer=(expNsDetail["v"]=(expNsDetail["v"] || []));
|
|
var destNsDetail=(destNs[msMod]=(destNs[msMod] || {})), destNameVer=(destNsDetail["v"]=(destNsDetail["v"] || []));
|
|
(destNsDetail["o"]=(destNsDetail["o"] || [])).push(mods);
|
|
factory(theExports);
|
|
for(var key in theExports) {
|
|
// Always set the imported value into the "export" versioned namespace (last-write wins)
|
|
nm="x", exportNs[key]=theExports[key], expNameVer[key]=ver;
|
|
// Overwrite every elements in namespace and record (last-write wins)
|
|
nm="n", destNs[key]=theExports[key], destNameVer[key]=ver;
|
|
(modDetail[nm] = (modDetail[nm] || [])).push(key);
|
|
}
|
|
})(typeof globalThis !== undef ? globalThis : global || self);
|
|
})(this, (function (exports) {
|
|
'use strict';
|
|
|
|
|
|
(function(obj, prop, descriptor) { /* ai_es3_polyfil defineProperty */ var func = Object["defineProperty"]; if (func) { try { return func(obj, prop, descriptor); } catch(e) { /* IE8 defines defineProperty, but will throw */ } } if (descriptor && typeof descriptor.value !== undefined) { obj[prop] = descriptor.value; } return obj; })(exports, '__esModule', { value: true });
|
|
|
|
var strShimFunction = "function";
|
|
var strShimObject = "object";
|
|
var strShimUndefined = "undefined";
|
|
var strShimPrototype = "prototype";
|
|
var strShimHasOwnProperty = "hasOwnProperty";
|
|
var ObjClass = Object;
|
|
var ObjProto = ObjClass[strShimPrototype];
|
|
var ObjAssign = ObjClass["assign"];
|
|
var ObjCreate = ObjClass["create"];
|
|
var ObjDefineProperty = ObjClass["defineProperty"];
|
|
var ObjHasOwnProperty = ObjProto[strShimHasOwnProperty];
|
|
|
|
var _cachedGlobal = null;
|
|
function getGlobal(useCached) {
|
|
if (useCached === void 0) { useCached = true; }
|
|
var result = useCached === false ? null : _cachedGlobal;
|
|
if (!result) {
|
|
if (typeof globalThis !== strShimUndefined) {
|
|
result = globalThis;
|
|
}
|
|
if (!result && typeof self !== strShimUndefined) {
|
|
result = self;
|
|
}
|
|
if (!result && typeof window !== strShimUndefined) {
|
|
result = window;
|
|
}
|
|
if (!result && typeof global !== strShimUndefined) {
|
|
result = global;
|
|
}
|
|
_cachedGlobal = result;
|
|
}
|
|
return result;
|
|
}
|
|
function throwTypeError(message) {
|
|
throw new TypeError(message);
|
|
}
|
|
function objCreateFn(obj) {
|
|
var func = ObjCreate;
|
|
if (func) {
|
|
return func(obj);
|
|
}
|
|
if (obj == null) {
|
|
return {};
|
|
}
|
|
var type = typeof obj;
|
|
if (type !== strShimObject && type !== strShimFunction) {
|
|
throwTypeError("Object prototype may only be an Object:" + obj);
|
|
}
|
|
function tmpFunc() { }
|
|
tmpFunc[strShimPrototype] = obj;
|
|
return new tmpFunc();
|
|
}
|
|
|
|
(getGlobal() || {})["Symbol"];
|
|
(getGlobal() || {})["Reflect"];
|
|
var extendStaticsFn = function (d, b) {
|
|
extendStaticsFn = ObjClass["setPrototypeOf"] ||
|
|
({ __proto__: [] } instanceof Array && function (d, b) {
|
|
d.__proto__ = b;
|
|
}) ||
|
|
function (d, b) {
|
|
for (var p in b) {
|
|
if (b[strShimHasOwnProperty](p)) {
|
|
d[p] = b[p];
|
|
}
|
|
}
|
|
};
|
|
return extendStaticsFn(d, b);
|
|
};
|
|
function __extendsFn(d, b) {
|
|
if (typeof b !== strShimFunction && b !== null) {
|
|
throwTypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
}
|
|
extendStaticsFn(d, b);
|
|
function __() {
|
|
this.constructor = d;
|
|
}
|
|
d[strShimPrototype] = b === null ? objCreateFn(b) : (__[strShimPrototype] = b[strShimPrototype], new __());
|
|
}
|
|
|
|
/*!
|
|
* Microsoft Dynamic Proto Utility, 1.1.9
|
|
* Copyright (c) Microsoft and contributors. All rights reserved.
|
|
*/
|
|
var _a$2;
|
|
var UNDEFINED = "undefined";
|
|
var Constructor = 'constructor';
|
|
var Prototype = 'prototype';
|
|
var strFunction = 'function';
|
|
var DynInstFuncTable = '_dynInstFuncs';
|
|
var DynProxyTag = '_isDynProxy';
|
|
var DynClassName = '_dynClass';
|
|
var DynClassNamePrefix = '_dynCls$';
|
|
var DynInstChkTag = '_dynInstChk';
|
|
var DynAllowInstChkTag = DynInstChkTag;
|
|
var DynProtoDefaultOptions = '_dfOpts';
|
|
var UnknownValue = '_unknown_';
|
|
var str__Proto$1 = "__proto__";
|
|
var DynProtoBaseProto = "_dyn" + str__Proto$1;
|
|
var DynProtoGlobalSettings = "__dynProto$Gbl";
|
|
var DynProtoCurrent = "_dynInstProto";
|
|
var strUseBaseInst = 'useBaseInst';
|
|
var strSetInstFuncs = 'setInstFuncs';
|
|
var Obj = Object;
|
|
var _objGetPrototypeOf$1 = Obj["getPrototypeOf"];
|
|
var _objGetOwnProps = Obj["getOwnPropertyNames"];
|
|
function _getGlobal() {
|
|
var result;
|
|
if (typeof globalThis !== UNDEFINED) {
|
|
result = globalThis;
|
|
}
|
|
if (!result && typeof self !== UNDEFINED) {
|
|
result = self;
|
|
}
|
|
if (!result && typeof window !== UNDEFINED) {
|
|
result = window;
|
|
}
|
|
if (!result && typeof global !== UNDEFINED) {
|
|
result = global;
|
|
}
|
|
return result || {};
|
|
}
|
|
var _gbl = _getGlobal();
|
|
var _gblInst = _gbl[DynProtoGlobalSettings] || (_gbl[DynProtoGlobalSettings] = {
|
|
o: (_a$2 = {},
|
|
_a$2[strSetInstFuncs] = true,
|
|
_a$2[strUseBaseInst] = true,
|
|
_a$2),
|
|
n: 1000
|
|
});
|
|
function _hasOwnProperty(obj, prop) {
|
|
return obj && Obj[Prototype].hasOwnProperty.call(obj, prop);
|
|
}
|
|
function _isObjectOrArrayPrototype(target) {
|
|
return target && (target === Obj[Prototype] || target === Array[Prototype]);
|
|
}
|
|
function _isObjectArrayOrFunctionPrototype(target) {
|
|
return _isObjectOrArrayPrototype(target) || target === Function[Prototype];
|
|
}
|
|
function _getObjProto$1(target) {
|
|
var newProto;
|
|
if (target) {
|
|
if (_objGetPrototypeOf$1) {
|
|
return _objGetPrototypeOf$1(target);
|
|
}
|
|
var curProto = target[str__Proto$1] || target[Prototype] || (target[Constructor] ? target[Constructor][Prototype] : null);
|
|
newProto = target[DynProtoBaseProto] || curProto;
|
|
if (!_hasOwnProperty(target, DynProtoBaseProto)) {
|
|
delete target[DynProtoCurrent];
|
|
newProto = target[DynProtoBaseProto] = target[DynProtoCurrent] || target[DynProtoBaseProto];
|
|
target[DynProtoCurrent] = curProto;
|
|
}
|
|
}
|
|
return newProto;
|
|
}
|
|
function _forEachProp(target, func) {
|
|
var props = [];
|
|
if (_objGetOwnProps) {
|
|
props = _objGetOwnProps(target);
|
|
}
|
|
else {
|
|
for (var name_1 in target) {
|
|
if (typeof name_1 === "string" && _hasOwnProperty(target, name_1)) {
|
|
props.push(name_1);
|
|
}
|
|
}
|
|
}
|
|
if (props && props.length > 0) {
|
|
for (var lp = 0; lp < props.length; lp++) {
|
|
func(props[lp]);
|
|
}
|
|
}
|
|
}
|
|
function _isDynamicCandidate(target, funcName, skipOwn) {
|
|
return (funcName !== Constructor && typeof target[funcName] === strFunction && (skipOwn || _hasOwnProperty(target, funcName)));
|
|
}
|
|
function _throwTypeError(message) {
|
|
throw new TypeError("DynamicProto: " + message);
|
|
}
|
|
function _getInstanceFuncs(thisTarget) {
|
|
var instFuncs = {};
|
|
_forEachProp(thisTarget, function (name) {
|
|
if (!instFuncs[name] && _isDynamicCandidate(thisTarget, name, false)) {
|
|
instFuncs[name] = thisTarget[name];
|
|
}
|
|
});
|
|
return instFuncs;
|
|
}
|
|
function _hasVisited(values, value) {
|
|
for (var lp = values.length - 1; lp >= 0; lp--) {
|
|
if (values[lp] === value) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function _getBaseFuncs(classProto, thisTarget, instFuncs, useBaseInst) {
|
|
function _instFuncProxy(target, funcHost, funcName) {
|
|
var theFunc = funcHost[funcName];
|
|
if (theFunc[DynProxyTag] && useBaseInst) {
|
|
var instFuncTable = target[DynInstFuncTable] || {};
|
|
if (instFuncTable[DynAllowInstChkTag] !== false) {
|
|
theFunc = (instFuncTable[funcHost[DynClassName]] || {})[funcName] || theFunc;
|
|
}
|
|
}
|
|
return function () {
|
|
return theFunc.apply(target, arguments);
|
|
};
|
|
}
|
|
var baseFuncs = {};
|
|
_forEachProp(instFuncs, function (name) {
|
|
baseFuncs[name] = _instFuncProxy(thisTarget, instFuncs, name);
|
|
});
|
|
var baseProto = _getObjProto$1(classProto);
|
|
var visited = [];
|
|
while (baseProto && !_isObjectArrayOrFunctionPrototype(baseProto) && !_hasVisited(visited, baseProto)) {
|
|
_forEachProp(baseProto, function (name) {
|
|
if (!baseFuncs[name] && _isDynamicCandidate(baseProto, name, !_objGetPrototypeOf$1)) {
|
|
baseFuncs[name] = _instFuncProxy(thisTarget, baseProto, name);
|
|
}
|
|
});
|
|
visited.push(baseProto);
|
|
baseProto = _getObjProto$1(baseProto);
|
|
}
|
|
return baseFuncs;
|
|
}
|
|
function _getInstFunc(target, funcName, proto, currentDynProtoProxy) {
|
|
var instFunc = null;
|
|
if (target && _hasOwnProperty(proto, DynClassName)) {
|
|
var instFuncTable = target[DynInstFuncTable] || {};
|
|
instFunc = (instFuncTable[proto[DynClassName]] || {})[funcName];
|
|
if (!instFunc) {
|
|
_throwTypeError("Missing [" + funcName + "] " + strFunction);
|
|
}
|
|
if (!instFunc[DynInstChkTag] && instFuncTable[DynAllowInstChkTag] !== false) {
|
|
var canAddInst = !_hasOwnProperty(target, funcName);
|
|
var objProto = _getObjProto$1(target);
|
|
var visited = [];
|
|
while (canAddInst && objProto && !_isObjectArrayOrFunctionPrototype(objProto) && !_hasVisited(visited, objProto)) {
|
|
var protoFunc = objProto[funcName];
|
|
if (protoFunc) {
|
|
canAddInst = (protoFunc === currentDynProtoProxy);
|
|
break;
|
|
}
|
|
visited.push(objProto);
|
|
objProto = _getObjProto$1(objProto);
|
|
}
|
|
try {
|
|
if (canAddInst) {
|
|
target[funcName] = instFunc;
|
|
}
|
|
instFunc[DynInstChkTag] = 1;
|
|
}
|
|
catch (e) {
|
|
instFuncTable[DynAllowInstChkTag] = false;
|
|
}
|
|
}
|
|
}
|
|
return instFunc;
|
|
}
|
|
function _getProtoFunc(funcName, proto, currentDynProtoProxy) {
|
|
var protoFunc = proto[funcName];
|
|
if (protoFunc === currentDynProtoProxy) {
|
|
protoFunc = _getObjProto$1(proto)[funcName];
|
|
}
|
|
if (typeof protoFunc !== strFunction) {
|
|
_throwTypeError("[" + funcName + "] is not a " + strFunction);
|
|
}
|
|
return protoFunc;
|
|
}
|
|
function _populatePrototype(proto, className, target, baseInstFuncs, setInstanceFunc) {
|
|
function _createDynamicPrototype(proto, funcName) {
|
|
var dynProtoProxy = function () {
|
|
var instFunc = _getInstFunc(this, funcName, proto, dynProtoProxy) || _getProtoFunc(funcName, proto, dynProtoProxy);
|
|
return instFunc.apply(this, arguments);
|
|
};
|
|
dynProtoProxy[DynProxyTag] = 1;
|
|
return dynProtoProxy;
|
|
}
|
|
if (!_isObjectOrArrayPrototype(proto)) {
|
|
var instFuncTable = target[DynInstFuncTable] = target[DynInstFuncTable] || {};
|
|
var instFuncs_1 = instFuncTable[className] = (instFuncTable[className] || {});
|
|
if (instFuncTable[DynAllowInstChkTag] !== false) {
|
|
instFuncTable[DynAllowInstChkTag] = !!setInstanceFunc;
|
|
}
|
|
_forEachProp(target, function (name) {
|
|
if (_isDynamicCandidate(target, name, false) && target[name] !== baseInstFuncs[name]) {
|
|
instFuncs_1[name] = target[name];
|
|
delete target[name];
|
|
if (!_hasOwnProperty(proto, name) || (proto[name] && !proto[name][DynProxyTag])) {
|
|
proto[name] = _createDynamicPrototype(proto, name);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function _checkPrototype(classProto, thisTarget) {
|
|
if (_objGetPrototypeOf$1) {
|
|
var visited = [];
|
|
var thisProto = _getObjProto$1(thisTarget);
|
|
while (thisProto && !_isObjectArrayOrFunctionPrototype(thisProto) && !_hasVisited(visited, thisProto)) {
|
|
if (thisProto === classProto) {
|
|
return true;
|
|
}
|
|
visited.push(thisProto);
|
|
thisProto = _getObjProto$1(thisProto);
|
|
}
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
function _getObjName(target, unknownValue) {
|
|
if (_hasOwnProperty(target, Prototype)) {
|
|
return target.name || unknownValue || UnknownValue;
|
|
}
|
|
return (((target || {})[Constructor]) || {}).name || unknownValue || UnknownValue;
|
|
}
|
|
function dynamicProto(theClass, target, delegateFunc, options) {
|
|
if (!_hasOwnProperty(theClass, Prototype)) {
|
|
_throwTypeError("theClass is an invalid class definition.");
|
|
}
|
|
var classProto = theClass[Prototype];
|
|
if (!_checkPrototype(classProto, target)) {
|
|
_throwTypeError("[" + _getObjName(theClass) + "] not in hierarchy of [" + _getObjName(target) + "]");
|
|
}
|
|
var className = null;
|
|
if (_hasOwnProperty(classProto, DynClassName)) {
|
|
className = classProto[DynClassName];
|
|
}
|
|
else {
|
|
className = DynClassNamePrefix + _getObjName(theClass, "_") + "$" + _gblInst.n;
|
|
_gblInst.n++;
|
|
classProto[DynClassName] = className;
|
|
}
|
|
var perfOptions = dynamicProto[DynProtoDefaultOptions];
|
|
var useBaseInst = !!perfOptions[strUseBaseInst];
|
|
if (useBaseInst && options && options[strUseBaseInst] !== undefined) {
|
|
useBaseInst = !!options[strUseBaseInst];
|
|
}
|
|
var instFuncs = _getInstanceFuncs(target);
|
|
var baseFuncs = _getBaseFuncs(classProto, target, instFuncs, useBaseInst);
|
|
delegateFunc(target, baseFuncs);
|
|
var setInstanceFunc = !!_objGetPrototypeOf$1 && !!perfOptions[strSetInstFuncs];
|
|
if (setInstanceFunc && options) {
|
|
setInstanceFunc = !!options[strSetInstFuncs];
|
|
}
|
|
_populatePrototype(classProto, className, target, instFuncs, setInstanceFunc !== false);
|
|
}
|
|
dynamicProto[DynProtoDefaultOptions] = _gblInst.o;
|
|
|
|
var _DYN_INITIALIZE = "initialize";
|
|
var _DYN_NAME = "name";
|
|
var _DYN_IDENTIFIER = "identifier";
|
|
var _DYN_PUSH = "push";
|
|
var _DYN_IS_INITIALIZED = "isInitialized";
|
|
var _DYN_CONFIG = "config";
|
|
var _DYN_LOGGER = "logger";
|
|
var _DYN_LENGTH = "length";
|
|
var _DYN_TIME = "time";
|
|
var _DYN_PROCESS_NEXT = "processNext";
|
|
var _DYN_GET_PROCESS_TEL_CONT0 = "getProcessTelContext";
|
|
var _DYN_GET_PLUGIN = "getPlugin";
|
|
var _DYN_SPLICE = "splice";
|
|
var _DYN_TEARDOWN = "teardown";
|
|
var _DYN_MESSAGE_ID = "messageId";
|
|
var _DYN_MESSAGE = "message";
|
|
var _DYN_IS_ASYNC = "isAsync";
|
|
var _DYN__DO_TEARDOWN = "_doTeardown";
|
|
var _DYN_UPDATE = "update";
|
|
var _DYN_GET_NEXT = "getNext";
|
|
var _DYN_DIAG_LOG = "diagLog";
|
|
var _DYN_SET_NEXT_PLUGIN = "setNextPlugin";
|
|
var _DYN_CREATE_NEW = "createNew";
|
|
var _DYN_INDEX_OF = "indexOf";
|
|
var _DYN_USER_AGENT = "userAgent";
|
|
var _DYN_SPLIT = "split";
|
|
var _DYN_NODE_TYPE = "nodeType";
|
|
var _DYN_APPLY = "apply";
|
|
var _DYN_REPLACE = "replace";
|
|
var _DYN_ENABLE_DEBUG_EXCEPTI4 = "enableDebugExceptions";
|
|
var _DYN_LOG_INTERNAL_MESSAGE = "logInternalMessage";
|
|
var _DYN_TO_LOWER_CASE = "toLowerCase";
|
|
var _DYN_CALL = "call";
|
|
var _DYN_TYPE = "type";
|
|
var _DYN_HANDLER = "handler";
|
|
var _DYN_IS_CHILD_EVT = "isChildEvt";
|
|
var _DYN_GET_CTX = "getCtx";
|
|
var _DYN_SET_CTX = "setCtx";
|
|
var _DYN_COMPLETE = "complete";
|
|
|
|
var STR_EMPTY$2 = "";
|
|
var STR_CORE = "core";
|
|
var STR_DISABLED = "disabled";
|
|
var STR_EXTENSION_CONFIG = "extensionConfig";
|
|
var STR_PROCESS_TELEMETRY = "processTelemetry";
|
|
var STR_PRIORITY = "priority";
|
|
var STR_ERROR_TO_CONSOLE = "errorToConsole";
|
|
var STR_WARN_TO_CONSOLE = "warnToConsole";
|
|
var STR_GET_PERF_MGR = "getPerfMgr";
|
|
|
|
var cStrStartsWith = "startsWith";
|
|
var strIndexOf = "indexOf";
|
|
var cStrTrim = "trim";
|
|
var strToString = "toString";
|
|
var str__Proto = "__proto__";
|
|
var strConstructor = "constructor";
|
|
var _objDefineProperty$1 = ObjDefineProperty;
|
|
var _objFreeze = ObjClass.freeze;
|
|
var _objKeys = ObjClass.keys;
|
|
var StringProto = String[strShimPrototype];
|
|
var _strTrim = StringProto[cStrTrim];
|
|
var _strStartsWith = StringProto[cStrStartsWith];
|
|
var _isArray = Array.isArray;
|
|
var _objToString = ObjProto[strToString];
|
|
var _fnToString = ObjHasOwnProperty[strToString];
|
|
var _objFunctionString = _fnToString[_DYN_CALL ](ObjClass);
|
|
var rCamelCase = /-([a-z])/g;
|
|
var rNormalizeInvalid = /([^\w\d_$])/g;
|
|
var rLeadingNumeric = /^(\d+[\w\d_$])/;
|
|
var _objGetPrototypeOf = Object["getPrototypeOf"];
|
|
function _getObjProto(target) {
|
|
if (target) {
|
|
if (_objGetPrototypeOf) {
|
|
return _objGetPrototypeOf(target);
|
|
}
|
|
var newProto = target[str__Proto] || target[strShimPrototype] || target[strConstructor];
|
|
if (newProto) {
|
|
return newProto;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
function isUndefined(value) {
|
|
return value === undefined || typeof value === strShimUndefined;
|
|
}
|
|
function isNullOrUndefined(value) {
|
|
return (value === null || isUndefined(value));
|
|
}
|
|
function hasOwnProperty(obj, prop) {
|
|
return !!(obj && ObjHasOwnProperty[_DYN_CALL ](obj, prop));
|
|
}
|
|
function isObject(value) {
|
|
return !!(value && typeof value === strShimObject);
|
|
}
|
|
function isFunction(value) {
|
|
return !!(value && typeof value === strShimFunction);
|
|
}
|
|
function normalizeJsName(name) {
|
|
var value = name;
|
|
if (value && isString(value)) {
|
|
value = value[_DYN_REPLACE ](rCamelCase, function (_all, letter) {
|
|
return letter.toUpperCase();
|
|
});
|
|
value = value[_DYN_REPLACE ](rNormalizeInvalid, "_");
|
|
value = value[_DYN_REPLACE ](rLeadingNumeric, function (_all, match) {
|
|
return "_" + match;
|
|
});
|
|
}
|
|
return value;
|
|
}
|
|
function objForEachKey(target, callbackfn) {
|
|
if (target) {
|
|
for (var prop in target) {
|
|
if (ObjHasOwnProperty[_DYN_CALL ](target, prop)) {
|
|
callbackfn[_DYN_CALL ](target, prop, target[prop]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function strStartsWith(value, checkValue) {
|
|
var result = false;
|
|
if (value && checkValue && !(result = value === checkValue)) {
|
|
result = _strStartsWith ? value[cStrStartsWith](checkValue) : _strStartsWithPoly(value, checkValue);
|
|
}
|
|
return result;
|
|
}
|
|
function _strStartsWithPoly(value, checkValue) {
|
|
var result = false;
|
|
var chkLen = checkValue ? checkValue[_DYN_LENGTH ] : 0;
|
|
if (value && chkLen && value[_DYN_LENGTH ] >= chkLen && !(result = value === checkValue)) {
|
|
for (var lp = 0; lp < chkLen; lp++) {
|
|
if (value[lp] !== checkValue[lp]) {
|
|
return false;
|
|
}
|
|
}
|
|
result = true;
|
|
}
|
|
return result;
|
|
}
|
|
function strContains(value, search) {
|
|
if (value && search) {
|
|
return value[_DYN_INDEX_OF ](search) !== -1;
|
|
}
|
|
return false;
|
|
}
|
|
var isArray = _isArray || _isArrayPoly;
|
|
function _isArrayPoly(obj) {
|
|
return !!(obj && _objToString[_DYN_CALL ](obj) === "[object Array]");
|
|
}
|
|
function isString(value) {
|
|
return typeof value === "string";
|
|
}
|
|
function isNumber(value) {
|
|
return typeof value === "number";
|
|
}
|
|
function isBoolean(value) {
|
|
return typeof value === "boolean";
|
|
}
|
|
function isPlainObject(value) {
|
|
var result = false;
|
|
if (value && typeof value === "object") {
|
|
var proto = _objGetPrototypeOf ? _objGetPrototypeOf(value) : _getObjProto(value);
|
|
if (!proto) {
|
|
result = true;
|
|
}
|
|
else {
|
|
if (proto[strConstructor] && ObjHasOwnProperty[_DYN_CALL ](proto, strConstructor)) {
|
|
proto = proto[strConstructor];
|
|
}
|
|
result = typeof proto === strShimFunction && _fnToString[_DYN_CALL ](proto) === _objFunctionString;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function arrForEach(arr, callbackfn, thisArg) {
|
|
var len = arr[_DYN_LENGTH ];
|
|
try {
|
|
for (var idx = 0; idx < len; idx++) {
|
|
if (idx in arr) {
|
|
if (callbackfn[_DYN_CALL ](thisArg || arr, arr[idx], idx, arr) === -1) {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
function arrIndexOf(arr, searchElement, fromIndex) {
|
|
if (arr) {
|
|
if (arr[strIndexOf]) {
|
|
return arr[strIndexOf](searchElement, fromIndex);
|
|
}
|
|
var len = arr[_DYN_LENGTH ];
|
|
var from = fromIndex || 0;
|
|
try {
|
|
for (var lp = Math.max(from >= 0 ? from : len - Math.abs(from), 0); lp < len; lp++) {
|
|
if (lp in arr && arr[lp] === searchElement) {
|
|
return lp;
|
|
}
|
|
}
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
return -1;
|
|
}
|
|
function strTrim(str) {
|
|
if (str) {
|
|
str = (_strTrim && str[cStrTrim]) ? str[cStrTrim]() : (str[_DYN_REPLACE ] ? str[_DYN_REPLACE ](/^\s+|(?=\s)\s+$/g, STR_EMPTY$2) : str);
|
|
}
|
|
return str;
|
|
}
|
|
var _objKeysHasDontEnumBug = !({ toString: null }).propertyIsEnumerable("toString");
|
|
var _objKeysDontEnums = [
|
|
"toString",
|
|
"toLocaleString",
|
|
"valueOf",
|
|
"hasOwnProperty",
|
|
"isPrototypeOf",
|
|
"propertyIsEnumerable",
|
|
"constructor"
|
|
];
|
|
function objKeys(obj) {
|
|
var objType = typeof obj;
|
|
if (objType !== strShimFunction && (objType !== strShimObject || obj === null)) {
|
|
throwTypeError("objKeys called on non-object");
|
|
}
|
|
if (!_objKeysHasDontEnumBug && _objKeys) {
|
|
return _objKeys(obj);
|
|
}
|
|
var result = [];
|
|
for (var prop in obj) {
|
|
if (obj && ObjHasOwnProperty[_DYN_CALL ](obj, prop)) {
|
|
result[_DYN_PUSH ](prop);
|
|
}
|
|
}
|
|
if (_objKeysHasDontEnumBug) {
|
|
var dontEnumsLength = _objKeysDontEnums[_DYN_LENGTH ];
|
|
for (var lp = 0; lp < dontEnumsLength; lp++) {
|
|
if (obj && ObjHasOwnProperty[_DYN_CALL ](obj, _objKeysDontEnums[lp])) {
|
|
result[_DYN_PUSH ](_objKeysDontEnums[lp]);
|
|
}
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function objDefineAccessors(target, prop, getProp, setProp) {
|
|
if (_objDefineProperty$1) {
|
|
try {
|
|
var descriptor = {
|
|
enumerable: true,
|
|
configurable: true
|
|
};
|
|
if (getProp) {
|
|
descriptor.get = getProp;
|
|
}
|
|
if (setProp) {
|
|
descriptor.set = setProp;
|
|
}
|
|
_objDefineProperty$1(target, prop, descriptor);
|
|
return true;
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function _doNothing(value) {
|
|
return value;
|
|
}
|
|
function deepFreeze(obj) {
|
|
if (_objFreeze) {
|
|
objForEachKey(obj, function (name, value) {
|
|
if (isArray(value) || isObject(value)) {
|
|
_objFreeze(value);
|
|
}
|
|
});
|
|
}
|
|
return objFreeze(obj);
|
|
}
|
|
var objFreeze = _objFreeze || _doNothing;
|
|
function dateNow() {
|
|
var dt = Date;
|
|
return dt.now ? dt.now() : new dt().getTime();
|
|
}
|
|
function setValue(target, field, value, valChk, srcChk) {
|
|
var theValue = value;
|
|
if (target) {
|
|
theValue = target[field];
|
|
if (theValue !== value && (!srcChk || srcChk(theValue)) && (!valChk || valChk(value))) {
|
|
theValue = value;
|
|
target[field] = theValue;
|
|
}
|
|
}
|
|
return theValue;
|
|
}
|
|
function getCfgValue(theValue, defaultValue) {
|
|
return !isNullOrUndefined(theValue) ? theValue : defaultValue;
|
|
}
|
|
function _createProxyFunction(source, funcName) {
|
|
var srcFunc = null;
|
|
var src = null;
|
|
if (isFunction(source)) {
|
|
srcFunc = source;
|
|
}
|
|
else {
|
|
src = source;
|
|
}
|
|
return function () {
|
|
var originalArguments = arguments;
|
|
if (srcFunc) {
|
|
src = srcFunc();
|
|
}
|
|
if (src) {
|
|
return src[funcName][_DYN_APPLY ](src, originalArguments);
|
|
}
|
|
};
|
|
}
|
|
function proxyFunctionAs(target, name, source, theFunc, overwriteTarget) {
|
|
if (target && name && source) {
|
|
if (overwriteTarget !== false || isUndefined(target[name])) {
|
|
target[name] = _createProxyFunction(source, theFunc);
|
|
}
|
|
}
|
|
}
|
|
function optimizeObject(theObject) {
|
|
if (theObject && ObjAssign) {
|
|
theObject = ObjClass(ObjAssign({}, theObject));
|
|
}
|
|
return theObject;
|
|
}
|
|
function objExtend(obj1, obj2, obj3, obj4, obj5, obj6) {
|
|
var theArgs = arguments;
|
|
var extended = theArgs[0] || {};
|
|
var argLen = theArgs[_DYN_LENGTH ];
|
|
var deep = false;
|
|
var idx = 1;
|
|
if (argLen > 0 && isBoolean(extended)) {
|
|
deep = extended;
|
|
extended = theArgs[idx] || {};
|
|
idx++;
|
|
}
|
|
if (!isObject(extended)) {
|
|
extended = {};
|
|
}
|
|
for (; idx < argLen; idx++) {
|
|
var arg = theArgs[idx];
|
|
var isArgArray = isArray(arg);
|
|
var isArgObj = isObject(arg);
|
|
for (var prop in arg) {
|
|
var propOk = (isArgArray && (prop in arg)) || (isArgObj && (ObjHasOwnProperty[_DYN_CALL ](arg, prop)));
|
|
if (!propOk) {
|
|
continue;
|
|
}
|
|
var newValue = arg[prop];
|
|
var isNewArray = void 0;
|
|
if (deep && newValue && ((isNewArray = isArray(newValue)) || isPlainObject(newValue))) {
|
|
var clone = extended[prop];
|
|
if (isNewArray) {
|
|
if (!isArray(clone)) {
|
|
clone = [];
|
|
}
|
|
}
|
|
else if (!isPlainObject(clone)) {
|
|
clone = {};
|
|
}
|
|
newValue = objExtend(deep, clone, newValue);
|
|
}
|
|
if (newValue !== undefined) {
|
|
extended[prop] = newValue;
|
|
}
|
|
}
|
|
}
|
|
return extended;
|
|
}
|
|
|
|
function createEnumStyle(values) {
|
|
var enumClass = {};
|
|
objForEachKey(values, function (field, value) {
|
|
enumClass[field] = value;
|
|
enumClass[value] = field;
|
|
});
|
|
return deepFreeze(enumClass);
|
|
}
|
|
|
|
var EventsDiscardedReason = createEnumStyle({
|
|
Unknown: 0 ,
|
|
NonRetryableStatus: 1 ,
|
|
InvalidEvent: 2 ,
|
|
SizeLimitExceeded: 3 ,
|
|
KillSwitch: 4 ,
|
|
QueueFull: 5
|
|
});
|
|
|
|
var strWindow = "window";
|
|
var strDocument = "document";
|
|
var strNavigator = "navigator";
|
|
var strLocation = "location";
|
|
var strConsole = "console";
|
|
var strPerformance = "performance";
|
|
var strJSON = "JSON";
|
|
var strCrypto = "crypto";
|
|
var strMsCrypto = "msCrypto";
|
|
var strReactNative = "ReactNative";
|
|
var strMsie = "msie";
|
|
var strTrident = "trident/";
|
|
var strXMLHttpRequest = "XMLHttpRequest";
|
|
var _isTrident = null;
|
|
var _navUserAgentCheck = null;
|
|
var _enableMocks = false;
|
|
var _useXDomainRequest = null;
|
|
var _beaconsSupported = null;
|
|
function _hasProperty(theClass, property) {
|
|
var supported = false;
|
|
if (theClass) {
|
|
try {
|
|
supported = property in theClass;
|
|
if (!supported) {
|
|
var proto = theClass[strShimPrototype];
|
|
if (proto) {
|
|
supported = property in proto;
|
|
}
|
|
}
|
|
}
|
|
catch (e) {
|
|
}
|
|
if (!supported) {
|
|
try {
|
|
var tmp = new theClass();
|
|
supported = !isUndefined(tmp[property]);
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
}
|
|
return supported;
|
|
}
|
|
function getGlobalInst(name) {
|
|
var gbl = getGlobal();
|
|
if (gbl && gbl[name]) {
|
|
return gbl[name];
|
|
}
|
|
if (name === strWindow && hasWindow()) {
|
|
return window;
|
|
}
|
|
return null;
|
|
}
|
|
function hasWindow() {
|
|
return Boolean(typeof window === strShimObject && window);
|
|
}
|
|
function getWindow() {
|
|
if (hasWindow()) {
|
|
return window;
|
|
}
|
|
return getGlobalInst(strWindow);
|
|
}
|
|
function hasDocument() {
|
|
return Boolean(typeof document === strShimObject && document);
|
|
}
|
|
function getDocument() {
|
|
if (hasDocument()) {
|
|
return document;
|
|
}
|
|
return getGlobalInst(strDocument);
|
|
}
|
|
function hasNavigator() {
|
|
return Boolean(typeof navigator === strShimObject && navigator);
|
|
}
|
|
function getNavigator() {
|
|
if (hasNavigator()) {
|
|
return navigator;
|
|
}
|
|
return getGlobalInst(strNavigator);
|
|
}
|
|
function getLocation(checkForMock) {
|
|
if (checkForMock && _enableMocks) {
|
|
var mockLocation = getGlobalInst("__mockLocation");
|
|
if (mockLocation) {
|
|
return mockLocation;
|
|
}
|
|
}
|
|
if (typeof location === strShimObject && location) {
|
|
return location;
|
|
}
|
|
return getGlobalInst(strLocation);
|
|
}
|
|
function getConsole() {
|
|
if (typeof console !== strShimUndefined) {
|
|
return console;
|
|
}
|
|
return getGlobalInst(strConsole);
|
|
}
|
|
function getPerformance() {
|
|
return getGlobalInst(strPerformance);
|
|
}
|
|
function hasJSON() {
|
|
return Boolean((typeof JSON === strShimObject && JSON) || getGlobalInst(strJSON) !== null);
|
|
}
|
|
function getJSON() {
|
|
if (hasJSON()) {
|
|
return JSON || getGlobalInst(strJSON);
|
|
}
|
|
return null;
|
|
}
|
|
function getCrypto() {
|
|
return getGlobalInst(strCrypto);
|
|
}
|
|
function getMsCrypto() {
|
|
return getGlobalInst(strMsCrypto);
|
|
}
|
|
function isReactNative() {
|
|
var nav = getNavigator();
|
|
if (nav && nav.product) {
|
|
return nav.product === strReactNative;
|
|
}
|
|
return false;
|
|
}
|
|
function isIE() {
|
|
var nav = getNavigator();
|
|
if (nav && (nav[_DYN_USER_AGENT ] !== _navUserAgentCheck || _isTrident === null)) {
|
|
_navUserAgentCheck = nav[_DYN_USER_AGENT ];
|
|
var userAgent = (_navUserAgentCheck || STR_EMPTY$2)[_DYN_TO_LOWER_CASE ]();
|
|
_isTrident = (strContains(userAgent, strMsie) || strContains(userAgent, strTrident));
|
|
}
|
|
return _isTrident;
|
|
}
|
|
function dumpObj(object) {
|
|
var objectTypeDump = Object[strShimPrototype].toString[_DYN_CALL ](object);
|
|
var propertyValueDump = STR_EMPTY$2;
|
|
if (objectTypeDump === "[object Error]") {
|
|
propertyValueDump = "{ stack: '" + object.stack + "', message: '" + object.message + "', name: '" + object[_DYN_NAME ] + "'";
|
|
}
|
|
else if (hasJSON()) {
|
|
propertyValueDump = getJSON().stringify(object);
|
|
}
|
|
return objectTypeDump + propertyValueDump;
|
|
}
|
|
function isBeaconsSupported() {
|
|
if (_beaconsSupported === null) {
|
|
_beaconsSupported = hasNavigator() && Boolean(getNavigator().sendBeacon);
|
|
}
|
|
return _beaconsSupported;
|
|
}
|
|
function isFetchSupported(withKeepAlive) {
|
|
var isSupported = false;
|
|
try {
|
|
isSupported = !!getGlobalInst("fetch");
|
|
var request = getGlobalInst("Request");
|
|
if (isSupported && withKeepAlive && request) {
|
|
isSupported = _hasProperty(request, "keepalive");
|
|
}
|
|
}
|
|
catch (e) {
|
|
}
|
|
return isSupported;
|
|
}
|
|
function useXDomainRequest() {
|
|
if (_useXDomainRequest === null) {
|
|
_useXDomainRequest = (typeof XDomainRequest !== strShimUndefined);
|
|
if (_useXDomainRequest && isXhrSupported()) {
|
|
_useXDomainRequest = _useXDomainRequest && !_hasProperty(getGlobalInst(strXMLHttpRequest), "withCredentials");
|
|
}
|
|
}
|
|
return _useXDomainRequest;
|
|
}
|
|
function isXhrSupported() {
|
|
var isSupported = false;
|
|
try {
|
|
var xmlHttpRequest = getGlobalInst(strXMLHttpRequest);
|
|
isSupported = !!xmlHttpRequest;
|
|
}
|
|
catch (e) {
|
|
}
|
|
return isSupported;
|
|
}
|
|
|
|
var _aiNamespace = null;
|
|
function _getExtensionNamespace() {
|
|
var target = getGlobalInst("Microsoft");
|
|
if (target) {
|
|
_aiNamespace = target["ApplicationInsights"];
|
|
}
|
|
return _aiNamespace;
|
|
}
|
|
function getDebugExt(config) {
|
|
var ns = _aiNamespace;
|
|
if (!ns && config.disableDbgExt !== true) {
|
|
ns = _aiNamespace || _getExtensionNamespace();
|
|
}
|
|
return ns ? ns["ChromeDbgExt"] : null;
|
|
}
|
|
|
|
var AiNonUserActionablePrefix = "AI (Internal): ";
|
|
var AiUserActionablePrefix = "AI: ";
|
|
var AIInternalMessagePrefix = "AITR_";
|
|
function _sanitizeDiagnosticText(text) {
|
|
if (text) {
|
|
return "\"" + text[_DYN_REPLACE ](/\"/g, STR_EMPTY$2) + "\"";
|
|
}
|
|
return STR_EMPTY$2;
|
|
}
|
|
function _logToConsole(func, message) {
|
|
var theConsole = getConsole();
|
|
if (!!theConsole) {
|
|
var logFunc = "log";
|
|
if (theConsole[func]) {
|
|
logFunc = func;
|
|
}
|
|
if (isFunction(theConsole[logFunc])) {
|
|
theConsole[logFunc](message);
|
|
}
|
|
}
|
|
}
|
|
var _InternalLogMessage = /** @class */ (function () {
|
|
function _InternalLogMessage(msgId, msg, isUserAct, properties) {
|
|
if (isUserAct === void 0) { isUserAct = false; }
|
|
var _self = this;
|
|
_self[_DYN_MESSAGE_ID ] = msgId;
|
|
_self[_DYN_MESSAGE ] =
|
|
(isUserAct ? AiUserActionablePrefix : AiNonUserActionablePrefix) +
|
|
msgId;
|
|
var strProps = STR_EMPTY$2;
|
|
if (hasJSON()) {
|
|
strProps = getJSON().stringify(properties);
|
|
}
|
|
var diagnosticText = (msg ? " message:" + _sanitizeDiagnosticText(msg) : STR_EMPTY$2) +
|
|
(properties ? " props:" + _sanitizeDiagnosticText(strProps) : STR_EMPTY$2);
|
|
_self[_DYN_MESSAGE ] += diagnosticText;
|
|
}
|
|
_InternalLogMessage.dataType = "MessageData";
|
|
return _InternalLogMessage;
|
|
}());
|
|
function safeGetLogger(core, config) {
|
|
return (core || {})[_DYN_LOGGER ] || new DiagnosticLogger(config);
|
|
}
|
|
var DiagnosticLogger = /** @class */ (function () {
|
|
function DiagnosticLogger(config) {
|
|
this.identifier = "DiagnosticLogger";
|
|
this.queue = [];
|
|
var _messageCount = 0;
|
|
var _messageLogged = {};
|
|
var _loggingLevelConsole;
|
|
var _loggingLevelTelemetry;
|
|
var _maxInternalMessageLimit;
|
|
var _enableDebug;
|
|
dynamicProto(DiagnosticLogger, this, function (_self) {
|
|
_setDefaultsFromConfig(config || {});
|
|
_self.consoleLoggingLevel = function () { return _loggingLevelConsole; };
|
|
_self.telemetryLoggingLevel = function () { return _loggingLevelTelemetry; };
|
|
_self.maxInternalMessageLimit = function () { return _maxInternalMessageLimit; };
|
|
_self[_DYN_ENABLE_DEBUG_EXCEPTI4 ] = function () { return _enableDebug; };
|
|
_self.throwInternal = function (severity, msgId, msg, properties, isUserAct) {
|
|
if (isUserAct === void 0) { isUserAct = false; }
|
|
var message = new _InternalLogMessage(msgId, msg, isUserAct, properties);
|
|
if (_enableDebug) {
|
|
throw dumpObj(message);
|
|
}
|
|
else {
|
|
var logFunc = severity === 1 ? STR_ERROR_TO_CONSOLE : STR_WARN_TO_CONSOLE;
|
|
if (!isUndefined(message[_DYN_MESSAGE ])) {
|
|
if (isUserAct) {
|
|
var messageKey = +message[_DYN_MESSAGE_ID ];
|
|
if (!_messageLogged[messageKey] && _loggingLevelConsole >= severity) {
|
|
_self[logFunc](message[_DYN_MESSAGE ]);
|
|
_messageLogged[messageKey] = true;
|
|
}
|
|
}
|
|
else {
|
|
if (_loggingLevelConsole >= severity) {
|
|
_self[logFunc](message[_DYN_MESSAGE ]);
|
|
}
|
|
}
|
|
_logInternalMessage(severity, message);
|
|
}
|
|
else {
|
|
_debugExtMsg("throw" + (severity === 1 ? "Critical" : "Warning"), message);
|
|
}
|
|
}
|
|
};
|
|
_self[STR_WARN_TO_CONSOLE ] = function (message) {
|
|
_logToConsole("warn", message);
|
|
_debugExtMsg("warning", message);
|
|
};
|
|
_self[STR_ERROR_TO_CONSOLE ] = function (message) {
|
|
_logToConsole("error", message);
|
|
_debugExtMsg("error", message);
|
|
};
|
|
_self.resetInternalMessageCount = function () {
|
|
_messageCount = 0;
|
|
_messageLogged = {};
|
|
};
|
|
_self[_DYN_LOG_INTERNAL_MESSAGE ] = _logInternalMessage;
|
|
function _logInternalMessage(severity, message) {
|
|
if (_areInternalMessagesThrottled()) {
|
|
return;
|
|
}
|
|
var logMessage = true;
|
|
var messageKey = AIInternalMessagePrefix + message[_DYN_MESSAGE_ID ];
|
|
if (_messageLogged[messageKey]) {
|
|
logMessage = false;
|
|
}
|
|
else {
|
|
_messageLogged[messageKey] = true;
|
|
}
|
|
if (logMessage) {
|
|
if (severity <= _loggingLevelTelemetry) {
|
|
_self.queue[_DYN_PUSH ](message);
|
|
_messageCount++;
|
|
_debugExtMsg((severity === 1 ? "error" : "warn"), message);
|
|
}
|
|
if (_messageCount === _maxInternalMessageLimit) {
|
|
var throttleLimitMessage = "Internal events throttle limit per PageView reached for this app.";
|
|
var throttleMessage = new _InternalLogMessage(23 , throttleLimitMessage, false);
|
|
_self.queue[_DYN_PUSH ](throttleMessage);
|
|
if (severity === 1 ) {
|
|
_self[STR_ERROR_TO_CONSOLE ](throttleLimitMessage);
|
|
}
|
|
else {
|
|
_self[STR_WARN_TO_CONSOLE ](throttleLimitMessage);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function _setDefaultsFromConfig(config) {
|
|
_loggingLevelConsole = getCfgValue(config.loggingLevelConsole, 0);
|
|
_loggingLevelTelemetry = getCfgValue(config.loggingLevelTelemetry, 1);
|
|
_maxInternalMessageLimit = getCfgValue(config.maxMessageLimit, 25);
|
|
_enableDebug = getCfgValue(config.enableDebug, getCfgValue(config[_DYN_ENABLE_DEBUG_EXCEPTI4 ], false));
|
|
}
|
|
function _areInternalMessagesThrottled() {
|
|
return _messageCount >= _maxInternalMessageLimit;
|
|
}
|
|
function _debugExtMsg(name, data) {
|
|
var dbgExt = getDebugExt(config || {});
|
|
if (dbgExt && dbgExt[_DYN_DIAG_LOG ]) {
|
|
dbgExt[_DYN_DIAG_LOG ](name, data);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
DiagnosticLogger.__ieDyn=1;
|
|
return DiagnosticLogger;
|
|
}());
|
|
function _getLogger(logger) {
|
|
return (logger || new DiagnosticLogger());
|
|
}
|
|
function _throwInternal(logger, severity, msgId, msg, properties, isUserAct) {
|
|
if (isUserAct === void 0) { isUserAct = false; }
|
|
_getLogger(logger).throwInternal(severity, msgId, msg, properties, isUserAct);
|
|
}
|
|
function _warnToConsole(logger, message) {
|
|
_getLogger(logger)[STR_WARN_TO_CONSOLE ](message);
|
|
}
|
|
|
|
var strExecutionContextKey = "ctx";
|
|
var strParentContextKey = "ParentContextKey";
|
|
var strChildrenContextKey = "ChildrenContextKey";
|
|
var PerfEvent = /** @class */ (function () {
|
|
function PerfEvent(name, payloadDetails, isAsync) {
|
|
var _self = this;
|
|
var accessorDefined = false;
|
|
_self.start = dateNow();
|
|
_self[_DYN_NAME ] = name;
|
|
_self[_DYN_IS_ASYNC ] = isAsync;
|
|
_self[_DYN_IS_CHILD_EVT ] = function () { return false; };
|
|
if (isFunction(payloadDetails)) {
|
|
var theDetails_1;
|
|
accessorDefined = objDefineAccessors(_self, "payload", function () {
|
|
if (!theDetails_1 && isFunction(payloadDetails)) {
|
|
theDetails_1 = payloadDetails();
|
|
payloadDetails = null;
|
|
}
|
|
return theDetails_1;
|
|
});
|
|
}
|
|
_self[_DYN_GET_CTX ] = function (key) {
|
|
if (key) {
|
|
if (key === PerfEvent[strParentContextKey] || key === PerfEvent[strChildrenContextKey]) {
|
|
return _self[key];
|
|
}
|
|
return (_self[strExecutionContextKey] || {})[key];
|
|
}
|
|
return null;
|
|
};
|
|
_self[_DYN_SET_CTX ] = function (key, value) {
|
|
if (key) {
|
|
if (key === PerfEvent[strParentContextKey]) {
|
|
if (!_self[key]) {
|
|
_self[_DYN_IS_CHILD_EVT ] = function () { return true; };
|
|
}
|
|
_self[key] = value;
|
|
}
|
|
else if (key === PerfEvent[strChildrenContextKey]) {
|
|
_self[key] = value;
|
|
}
|
|
else {
|
|
var ctx = _self[strExecutionContextKey] = _self[strExecutionContextKey] || {};
|
|
ctx[key] = value;
|
|
}
|
|
}
|
|
};
|
|
_self[_DYN_COMPLETE ] = function () {
|
|
var childTime = 0;
|
|
var childEvts = _self[_DYN_GET_CTX ](PerfEvent[strChildrenContextKey]);
|
|
if (isArray(childEvts)) {
|
|
for (var lp = 0; lp < childEvts[_DYN_LENGTH ]; lp++) {
|
|
var childEvt = childEvts[lp];
|
|
if (childEvt) {
|
|
childTime += childEvt[_DYN_TIME ];
|
|
}
|
|
}
|
|
}
|
|
_self[_DYN_TIME ] = dateNow() - _self.start;
|
|
_self.exTime = _self[_DYN_TIME ] - childTime;
|
|
_self[_DYN_COMPLETE ] = function () { };
|
|
if (!accessorDefined && isFunction(payloadDetails)) {
|
|
_self.payload = payloadDetails();
|
|
}
|
|
};
|
|
}
|
|
PerfEvent.ParentContextKey = "parent";
|
|
PerfEvent.ChildrenContextKey = "childEvts";
|
|
return PerfEvent;
|
|
}());
|
|
var doPerfActiveKey = "CoreUtils.doPerf";
|
|
function doPerf(mgrSource, getSource, func, details, isAsync) {
|
|
if (mgrSource) {
|
|
var perfMgr = mgrSource;
|
|
if (perfMgr[STR_GET_PERF_MGR]) {
|
|
perfMgr = perfMgr[STR_GET_PERF_MGR]();
|
|
}
|
|
if (perfMgr) {
|
|
var perfEvt = void 0;
|
|
var currentActive = perfMgr[_DYN_GET_CTX ](doPerfActiveKey);
|
|
try {
|
|
perfEvt = perfMgr.create(getSource(), details, isAsync);
|
|
if (perfEvt) {
|
|
if (currentActive && perfEvt[_DYN_SET_CTX ]) {
|
|
perfEvt[_DYN_SET_CTX ](PerfEvent[strParentContextKey], currentActive);
|
|
if (currentActive[_DYN_GET_CTX ] && currentActive[_DYN_SET_CTX ]) {
|
|
var children = currentActive[_DYN_GET_CTX ](PerfEvent[strChildrenContextKey]);
|
|
if (!children) {
|
|
children = [];
|
|
currentActive[_DYN_SET_CTX ](PerfEvent[strChildrenContextKey], children);
|
|
}
|
|
children[_DYN_PUSH ](perfEvt);
|
|
}
|
|
}
|
|
perfMgr[_DYN_SET_CTX ](doPerfActiveKey, perfEvt);
|
|
return func(perfEvt);
|
|
}
|
|
}
|
|
catch (ex) {
|
|
if (perfEvt && perfEvt[_DYN_SET_CTX ]) {
|
|
perfEvt[_DYN_SET_CTX ]("exception", ex);
|
|
}
|
|
}
|
|
finally {
|
|
if (perfEvt) {
|
|
perfMgr.fire(perfEvt);
|
|
}
|
|
perfMgr[_DYN_SET_CTX ](doPerfActiveKey, currentActive);
|
|
}
|
|
}
|
|
}
|
|
return func();
|
|
}
|
|
|
|
var UInt32Mask = 0x100000000;
|
|
var MaxUInt32 = 0xffffffff;
|
|
var _mwcSeeded = false;
|
|
var _mwcW = 123456789;
|
|
var _mwcZ = 987654321;
|
|
function _mwcSeed(seedValue) {
|
|
if (seedValue < 0) {
|
|
seedValue >>>= 0;
|
|
}
|
|
_mwcW = (123456789 + seedValue) & MaxUInt32;
|
|
_mwcZ = (987654321 - seedValue) & MaxUInt32;
|
|
_mwcSeeded = true;
|
|
}
|
|
function _autoSeedMwc() {
|
|
try {
|
|
var now = dateNow() & 0x7fffffff;
|
|
_mwcSeed(((Math.random() * UInt32Mask) ^ now) + now);
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
function random32(signed) {
|
|
var value = 0;
|
|
var c = getCrypto() || getMsCrypto();
|
|
if (c && c.getRandomValues) {
|
|
value = c.getRandomValues(new Uint32Array(1))[0] & MaxUInt32;
|
|
}
|
|
if (value === 0 && isIE()) {
|
|
if (!_mwcSeeded) {
|
|
_autoSeedMwc();
|
|
}
|
|
value = mwcRandom32() & MaxUInt32;
|
|
}
|
|
if (value === 0) {
|
|
value = Math.floor((UInt32Mask * Math.random()) | 0);
|
|
}
|
|
if (!signed) {
|
|
value >>>= 0;
|
|
}
|
|
return value;
|
|
}
|
|
function mwcRandom32(signed) {
|
|
_mwcZ = (36969 * (_mwcZ & 0xFFFF) + (_mwcZ >> 16)) & MaxUInt32;
|
|
_mwcW = (18000 * (_mwcW & 0xFFFF) + (_mwcW >> 16)) & MaxUInt32;
|
|
var value = (((_mwcZ << 16) + (_mwcW & 0xFFFF)) >>> 0) & MaxUInt32 | 0;
|
|
if (!signed) {
|
|
value >>>= 0;
|
|
}
|
|
return value;
|
|
}
|
|
function newId(maxLength) {
|
|
if (maxLength === void 0) { maxLength = 22; }
|
|
var base64chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
var number = random32() >>> 0;
|
|
var chars = 0;
|
|
var result = STR_EMPTY$2;
|
|
while (result[_DYN_LENGTH ] < maxLength) {
|
|
chars++;
|
|
result += base64chars.charAt(number & 0x3F);
|
|
number >>>= 6;
|
|
if (chars === 5) {
|
|
number = (((random32() << 2) & 0xFFFFFFFF) | (number & 0x03)) >>> 0;
|
|
chars = 0;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
var _objDefineProperty = ObjDefineProperty;
|
|
var version = '2.8.15';
|
|
var instanceName = "." + newId(6);
|
|
var _dataUid = 0;
|
|
function _createAccessor(target, prop, value) {
|
|
if (_objDefineProperty) {
|
|
try {
|
|
_objDefineProperty(target, prop, {
|
|
value: value,
|
|
enumerable: false,
|
|
configurable: true
|
|
});
|
|
return true;
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
function _canAcceptData(target) {
|
|
return target[_DYN_NODE_TYPE ] === 1 || target[_DYN_NODE_TYPE ] === 9 || !(+target[_DYN_NODE_TYPE ]);
|
|
}
|
|
function _getCache(data, target) {
|
|
var theCache = target[data.id];
|
|
if (!theCache) {
|
|
theCache = {};
|
|
try {
|
|
if (_canAcceptData(target)) {
|
|
if (!_createAccessor(target, data.id, theCache)) {
|
|
target[data.id] = theCache;
|
|
}
|
|
}
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
return theCache;
|
|
}
|
|
function createUniqueNamespace(name, includeVersion) {
|
|
if (includeVersion === void 0) { includeVersion = false; }
|
|
return normalizeJsName(name + (_dataUid++) + (includeVersion ? "." + version : STR_EMPTY$2) + instanceName);
|
|
}
|
|
function createElmNodeData(name) {
|
|
var data = {
|
|
id: createUniqueNamespace("_aiData-" + (name || STR_EMPTY$2) + "." + version),
|
|
accept: function (target) {
|
|
return _canAcceptData(target);
|
|
},
|
|
get: function (target, name, defValue, addDefault) {
|
|
var theCache = target[data.id];
|
|
if (!theCache) {
|
|
if (addDefault) {
|
|
theCache = _getCache(data, target);
|
|
theCache[normalizeJsName(name)] = defValue;
|
|
}
|
|
return defValue;
|
|
}
|
|
return theCache[normalizeJsName(name)];
|
|
},
|
|
kill: function (target, name) {
|
|
if (target && target[name]) {
|
|
try {
|
|
delete target[name];
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
}
|
|
};
|
|
return data;
|
|
}
|
|
|
|
var strOnPrefix = "on";
|
|
var strAttachEvent = "attachEvent";
|
|
var strAddEventHelper = "addEventListener";
|
|
var strDetachEvent = "detachEvent";
|
|
var strRemoveEventListener = "removeEventListener";
|
|
var strEvents = "events";
|
|
var strVisibilityChangeEvt = "visibilitychange";
|
|
var strPageHide = "pagehide";
|
|
var strPageShow = "pageshow";
|
|
var strUnload = "unload";
|
|
var strBeforeUnload = "beforeunload";
|
|
var strPageHideNamespace = createUniqueNamespace("aiEvtPageHide");
|
|
var strPageShowNamespace = createUniqueNamespace("aiEvtPageShow");
|
|
var rRemoveEmptyNs = /\.[\.]+/g;
|
|
var rRemoveTrailingEmptyNs = /[\.]+$/;
|
|
var _guid = 1;
|
|
var elmNodeData = createElmNodeData("events");
|
|
var eventNamespace = /^([^.]*)(?:\.(.+)|)/;
|
|
function _normalizeNamespace(name) {
|
|
if (name && name[_DYN_REPLACE ]) {
|
|
return name[_DYN_REPLACE ](/^[\s\.]+|(?=[\s\.])[\.\s]+$/g, STR_EMPTY$2);
|
|
}
|
|
return name;
|
|
}
|
|
function _getEvtNamespace(eventName, evtNamespace) {
|
|
var _a;
|
|
if (evtNamespace) {
|
|
var theNamespace_1 = STR_EMPTY$2;
|
|
if (isArray(evtNamespace)) {
|
|
theNamespace_1 = STR_EMPTY$2;
|
|
arrForEach(evtNamespace, function (name) {
|
|
name = _normalizeNamespace(name);
|
|
if (name) {
|
|
if (name[0] !== ".") {
|
|
name = "." + name;
|
|
}
|
|
theNamespace_1 += name;
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
theNamespace_1 = _normalizeNamespace(evtNamespace);
|
|
}
|
|
if (theNamespace_1) {
|
|
if (theNamespace_1[0] !== ".") {
|
|
theNamespace_1 = "." + theNamespace_1;
|
|
}
|
|
eventName = (eventName || STR_EMPTY$2) + theNamespace_1;
|
|
}
|
|
}
|
|
var parsedEvent = (eventNamespace.exec(eventName || STR_EMPTY$2) || []);
|
|
return _a = {},
|
|
_a[_DYN_TYPE ] = parsedEvent[1],
|
|
_a.ns = ((parsedEvent[2] || STR_EMPTY$2).replace(rRemoveEmptyNs, ".").replace(rRemoveTrailingEmptyNs, STR_EMPTY$2)[_DYN_SPLIT ](".").sort()).join("."),
|
|
_a;
|
|
}
|
|
function _getRegisteredEvents(target, evtName, addDefault) {
|
|
if (addDefault === void 0) { addDefault = true; }
|
|
var aiEvts = elmNodeData.get(target, strEvents, {}, addDefault);
|
|
var registeredEvents = aiEvts[evtName];
|
|
if (!registeredEvents) {
|
|
registeredEvents = aiEvts[evtName] = [];
|
|
}
|
|
return registeredEvents;
|
|
}
|
|
function _doDetach(obj, evtName, handlerRef, useCapture) {
|
|
if (obj && evtName && evtName[_DYN_TYPE ]) {
|
|
if (obj[strRemoveEventListener]) {
|
|
obj[strRemoveEventListener](evtName[_DYN_TYPE ], handlerRef, useCapture);
|
|
}
|
|
else if (obj[strDetachEvent]) {
|
|
obj[strDetachEvent](strOnPrefix + evtName[_DYN_TYPE ], handlerRef);
|
|
}
|
|
}
|
|
}
|
|
function _doAttach(obj, evtName, handlerRef, useCapture) {
|
|
var result = false;
|
|
if (obj && evtName && evtName[_DYN_TYPE ] && handlerRef) {
|
|
if (obj[strAddEventHelper]) {
|
|
obj[strAddEventHelper](evtName[_DYN_TYPE ], handlerRef, useCapture);
|
|
result = true;
|
|
}
|
|
else if (obj[strAttachEvent]) {
|
|
obj[strAttachEvent](strOnPrefix + evtName[_DYN_TYPE ], handlerRef);
|
|
result = true;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function _doUnregister(target, events, evtName, unRegFn) {
|
|
var idx = events[_DYN_LENGTH ];
|
|
while (idx--) {
|
|
var theEvent = events[idx];
|
|
if (theEvent) {
|
|
if (!evtName.ns || evtName.ns === theEvent.evtName.ns) {
|
|
if (!unRegFn || unRegFn(theEvent)) {
|
|
_doDetach(target, theEvent.evtName, theEvent[_DYN_HANDLER ], theEvent.capture);
|
|
events[_DYN_SPLICE ](idx, 1);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function _unregisterEvents(target, evtName, unRegFn) {
|
|
if (evtName[_DYN_TYPE ]) {
|
|
_doUnregister(target, _getRegisteredEvents(target, evtName[_DYN_TYPE ]), evtName, unRegFn);
|
|
}
|
|
else {
|
|
var eventCache = elmNodeData.get(target, strEvents, {});
|
|
objForEachKey(eventCache, function (evtType, events) {
|
|
_doUnregister(target, events, evtName, unRegFn);
|
|
});
|
|
if (objKeys(eventCache)[_DYN_LENGTH ] === 0) {
|
|
elmNodeData.kill(target, strEvents);
|
|
}
|
|
}
|
|
}
|
|
function mergeEvtNamespace(theNamespace, namespaces) {
|
|
var newNamespaces;
|
|
if (namespaces) {
|
|
if (isArray(namespaces)) {
|
|
newNamespaces = [theNamespace].concat(namespaces);
|
|
}
|
|
else {
|
|
newNamespaces = [theNamespace, namespaces];
|
|
}
|
|
newNamespaces = (_getEvtNamespace("xx", newNamespaces).ns)[_DYN_SPLIT ](".");
|
|
}
|
|
else {
|
|
newNamespaces = theNamespace;
|
|
}
|
|
return newNamespaces;
|
|
}
|
|
function eventOn(target, eventName, handlerRef, evtNamespace, useCapture) {
|
|
var _a;
|
|
if (useCapture === void 0) { useCapture = false; }
|
|
var result = false;
|
|
if (target) {
|
|
try {
|
|
var evtName = _getEvtNamespace(eventName, evtNamespace);
|
|
result = _doAttach(target, evtName, handlerRef, useCapture);
|
|
if (result && elmNodeData.accept(target)) {
|
|
var registeredEvent = (_a = {
|
|
guid: _guid++,
|
|
evtName: evtName
|
|
},
|
|
_a[_DYN_HANDLER ] = handlerRef,
|
|
_a.capture = useCapture,
|
|
_a);
|
|
_getRegisteredEvents(target, evtName.type)[_DYN_PUSH ](registeredEvent);
|
|
}
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
function eventOff(target, eventName, handlerRef, evtNamespace, useCapture) {
|
|
if (useCapture === void 0) { useCapture = false; }
|
|
if (target) {
|
|
try {
|
|
var evtName_1 = _getEvtNamespace(eventName, evtNamespace);
|
|
var found_1 = false;
|
|
_unregisterEvents(target, evtName_1, function (regEvent) {
|
|
if ((evtName_1.ns && !handlerRef) || regEvent[_DYN_HANDLER ] === handlerRef) {
|
|
found_1 = true;
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
if (!found_1) {
|
|
_doDetach(target, evtName_1, handlerRef, useCapture);
|
|
}
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
}
|
|
function addEventHandler(eventName, callback, evtNamespace) {
|
|
var result = false;
|
|
var w = getWindow();
|
|
if (w) {
|
|
result = eventOn(w, eventName, callback, evtNamespace);
|
|
result = eventOn(w["body"], eventName, callback, evtNamespace) || result;
|
|
}
|
|
var doc = getDocument();
|
|
if (doc) {
|
|
result = eventOn(doc, eventName, callback, evtNamespace) || result;
|
|
}
|
|
return result;
|
|
}
|
|
function removeEventHandler(eventName, callback, evtNamespace) {
|
|
var w = getWindow();
|
|
if (w) {
|
|
eventOff(w, eventName, callback, evtNamespace);
|
|
eventOff(w["body"], eventName, callback, evtNamespace);
|
|
}
|
|
var doc = getDocument();
|
|
if (doc) {
|
|
eventOff(doc, eventName, callback, evtNamespace);
|
|
}
|
|
}
|
|
function _addEventListeners(events, listener, excludeEvents, evtNamespace) {
|
|
var added = false;
|
|
if (listener && events && events[_DYN_LENGTH ] > 0) {
|
|
arrForEach(events, function (name) {
|
|
if (name) {
|
|
if (!excludeEvents || arrIndexOf(excludeEvents, name) === -1) {
|
|
added = addEventHandler(name, listener, evtNamespace) || added;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
return added;
|
|
}
|
|
function addEventListeners(events, listener, excludeEvents, evtNamespace) {
|
|
var added = false;
|
|
if (listener && events && isArray(events)) {
|
|
added = _addEventListeners(events, listener, excludeEvents, evtNamespace);
|
|
if (!added && excludeEvents && excludeEvents[_DYN_LENGTH ] > 0) {
|
|
added = _addEventListeners(events, listener, null, evtNamespace);
|
|
}
|
|
}
|
|
return added;
|
|
}
|
|
function removeEventListeners(events, listener, evtNamespace) {
|
|
if (events && isArray(events)) {
|
|
arrForEach(events, function (name) {
|
|
if (name) {
|
|
removeEventHandler(name, listener, evtNamespace);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function addPageUnloadEventListener(listener, excludeEvents, evtNamespace) {
|
|
return addEventListeners([strBeforeUnload, strUnload, strPageHide], listener, excludeEvents, evtNamespace);
|
|
}
|
|
function removePageUnloadEventListener(listener, evtNamespace) {
|
|
removeEventListeners([strBeforeUnload, strUnload, strPageHide], listener, evtNamespace);
|
|
}
|
|
function addPageHideEventListener(listener, excludeEvents, evtNamespace) {
|
|
function _handlePageVisibility(evt) {
|
|
var doc = getDocument();
|
|
if (listener && doc && doc.visibilityState === "hidden") {
|
|
listener(evt);
|
|
}
|
|
}
|
|
var newNamespaces = mergeEvtNamespace(strPageHideNamespace, evtNamespace);
|
|
var pageUnloadAdded = _addEventListeners([strPageHide], listener, excludeEvents, newNamespaces);
|
|
if (!excludeEvents || arrIndexOf(excludeEvents, strVisibilityChangeEvt) === -1) {
|
|
pageUnloadAdded = _addEventListeners([strVisibilityChangeEvt], _handlePageVisibility, excludeEvents, newNamespaces) || pageUnloadAdded;
|
|
}
|
|
if (!pageUnloadAdded && excludeEvents) {
|
|
pageUnloadAdded = addPageHideEventListener(listener, null, evtNamespace);
|
|
}
|
|
return pageUnloadAdded;
|
|
}
|
|
function removePageHideEventListener(listener, evtNamespace) {
|
|
var newNamespaces = mergeEvtNamespace(strPageHideNamespace, evtNamespace);
|
|
removeEventListeners([strPageHide], listener, newNamespaces);
|
|
removeEventListeners([strVisibilityChangeEvt], null, newNamespaces);
|
|
}
|
|
function addPageShowEventListener(listener, excludeEvents, evtNamespace) {
|
|
function _handlePageVisibility(evt) {
|
|
var doc = getDocument();
|
|
if (listener && doc && doc.visibilityState === "visible") {
|
|
listener(evt);
|
|
}
|
|
}
|
|
var newNamespaces = mergeEvtNamespace(strPageShowNamespace, evtNamespace);
|
|
var pageShowAdded = _addEventListeners([strPageShow], listener, excludeEvents, newNamespaces);
|
|
pageShowAdded = _addEventListeners([strVisibilityChangeEvt], _handlePageVisibility, excludeEvents, newNamespaces) || pageShowAdded;
|
|
if (!pageShowAdded && excludeEvents) {
|
|
pageShowAdded = addPageShowEventListener(listener, null, evtNamespace);
|
|
}
|
|
return pageShowAdded;
|
|
}
|
|
function removePageShowEventListener(listener, evtNamespace) {
|
|
var newNamespaces = mergeEvtNamespace(strPageShowNamespace, evtNamespace);
|
|
removeEventListeners([strPageShow], listener, newNamespaces);
|
|
removeEventListeners([strVisibilityChangeEvt], null, newNamespaces);
|
|
}
|
|
|
|
function perfNow() {
|
|
var perf = getPerformance();
|
|
if (perf && perf.now) {
|
|
return perf.now();
|
|
}
|
|
return dateNow();
|
|
}
|
|
|
|
var pluginStateData = createElmNodeData("plugin");
|
|
function _getPluginState(plugin) {
|
|
return pluginStateData.get(plugin, "state", {}, true);
|
|
}
|
|
|
|
var strTelemetryPluginChain = "TelemetryPluginChain";
|
|
var strHasRunFlags = "_hasRun";
|
|
var strGetTelCtx = "_getTelCtx";
|
|
var _chainId = 0;
|
|
function _getNextProxyStart(proxy, core, startAt) {
|
|
while (proxy) {
|
|
if (proxy[_DYN_GET_PLUGIN ]() === startAt) {
|
|
return proxy;
|
|
}
|
|
proxy = proxy[_DYN_GET_NEXT ]();
|
|
}
|
|
return createTelemetryProxyChain([startAt], core[_DYN_CONFIG ] || {}, core);
|
|
}
|
|
function _createInternalContext(telemetryChain, config, core, startAt) {
|
|
var _nextProxy = null;
|
|
var _onComplete = [];
|
|
if (startAt !== null) {
|
|
_nextProxy = startAt ? _getNextProxyStart(telemetryChain, core, startAt) : telemetryChain;
|
|
}
|
|
var context = {
|
|
_next: _moveNext,
|
|
ctx: {
|
|
core: function () {
|
|
return core;
|
|
},
|
|
diagLog: function () {
|
|
return safeGetLogger(core, config);
|
|
},
|
|
getCfg: function () {
|
|
return config;
|
|
},
|
|
getExtCfg: _getExtCfg,
|
|
getConfig: _getConfig,
|
|
hasNext: function () {
|
|
return !!_nextProxy;
|
|
},
|
|
getNext: function () {
|
|
return _nextProxy;
|
|
},
|
|
setNext: function (nextPlugin) {
|
|
_nextProxy = nextPlugin;
|
|
},
|
|
iterate: _iterateChain,
|
|
onComplete: _addOnComplete
|
|
}
|
|
};
|
|
function _addOnComplete(onComplete, that) {
|
|
var args = [];
|
|
for (var _i = 2; _i < arguments.length; _i++) {
|
|
args[_i - 2] = arguments[_i];
|
|
}
|
|
if (onComplete) {
|
|
_onComplete[_DYN_PUSH ]({
|
|
func: onComplete,
|
|
self: !isUndefined(that) ? that : context.ctx,
|
|
args: args
|
|
});
|
|
}
|
|
}
|
|
function _moveNext() {
|
|
var nextProxy = _nextProxy;
|
|
_nextProxy = nextProxy ? nextProxy[_DYN_GET_NEXT ]() : null;
|
|
if (!nextProxy) {
|
|
var onComplete = _onComplete;
|
|
if (onComplete && onComplete[_DYN_LENGTH ] > 0) {
|
|
arrForEach(onComplete, function (completeDetails) {
|
|
try {
|
|
completeDetails.func[_DYN_CALL ](completeDetails.self, completeDetails.args);
|
|
}
|
|
catch (e) {
|
|
_throwInternal(core[_DYN_LOGGER ], 2 , 73 , "Unexpected Exception during onComplete - " + dumpObj(e));
|
|
}
|
|
});
|
|
_onComplete = [];
|
|
}
|
|
}
|
|
return nextProxy;
|
|
}
|
|
function _getExtCfg(identifier, defaultValue, mergeDefault) {
|
|
if (defaultValue === void 0) { defaultValue = {}; }
|
|
if (mergeDefault === void 0) { mergeDefault = 0 ; }
|
|
var theConfig;
|
|
if (config) {
|
|
var extConfig = config[STR_EXTENSION_CONFIG ];
|
|
if (extConfig && identifier) {
|
|
theConfig = extConfig[identifier];
|
|
}
|
|
}
|
|
if (!theConfig) {
|
|
theConfig = defaultValue;
|
|
}
|
|
else if (isObject(defaultValue)) {
|
|
if (mergeDefault !== 0 ) {
|
|
var newConfig_1 = objExtend(true, defaultValue, theConfig);
|
|
if (config && mergeDefault === 2 ) {
|
|
objForEachKey(defaultValue, function (field) {
|
|
if (isNullOrUndefined(newConfig_1[field])) {
|
|
var cfgValue = config[field];
|
|
if (!isNullOrUndefined(cfgValue)) {
|
|
newConfig_1[field] = cfgValue;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
theConfig = newConfig_1;
|
|
}
|
|
}
|
|
return theConfig;
|
|
}
|
|
function _getConfig(identifier, field, defaultValue) {
|
|
if (defaultValue === void 0) { defaultValue = false; }
|
|
var theValue;
|
|
var extConfig = _getExtCfg(identifier, null);
|
|
if (extConfig && !isNullOrUndefined(extConfig[field])) {
|
|
theValue = extConfig[field];
|
|
}
|
|
else if (config && !isNullOrUndefined(config[field])) {
|
|
theValue = config[field];
|
|
}
|
|
return !isNullOrUndefined(theValue) ? theValue : defaultValue;
|
|
}
|
|
function _iterateChain(cb) {
|
|
var nextPlugin;
|
|
while (!!(nextPlugin = context._next())) {
|
|
var plugin = nextPlugin[_DYN_GET_PLUGIN ]();
|
|
if (plugin) {
|
|
cb(plugin);
|
|
}
|
|
}
|
|
}
|
|
return context;
|
|
}
|
|
function createProcessTelemetryContext(telemetryChain, config, core, startAt) {
|
|
var internalContext = _createInternalContext(telemetryChain, config, core, startAt);
|
|
var context = internalContext.ctx;
|
|
function _processNext(env) {
|
|
var nextPlugin = internalContext._next();
|
|
nextPlugin && nextPlugin[STR_PROCESS_TELEMETRY ](env, context);
|
|
return !nextPlugin;
|
|
}
|
|
function _createNew(plugins, startAt) {
|
|
if (plugins === void 0) { plugins = null; }
|
|
if (isArray(plugins)) {
|
|
plugins = createTelemetryProxyChain(plugins, config, core, startAt);
|
|
}
|
|
return createProcessTelemetryContext(plugins || context[_DYN_GET_NEXT ](), config, core, startAt);
|
|
}
|
|
context[_DYN_PROCESS_NEXT ] = _processNext;
|
|
context[_DYN_CREATE_NEW ] = _createNew;
|
|
return context;
|
|
}
|
|
function createProcessTelemetryUnloadContext(telemetryChain, core, startAt) {
|
|
var config = core[_DYN_CONFIG ] || {};
|
|
var internalContext = _createInternalContext(telemetryChain, config, core, startAt);
|
|
var context = internalContext.ctx;
|
|
function _processNext(unloadState) {
|
|
var nextPlugin = internalContext._next();
|
|
nextPlugin && nextPlugin.unload(context, unloadState);
|
|
return !nextPlugin;
|
|
}
|
|
function _createNew(plugins, startAt) {
|
|
if (plugins === void 0) { plugins = null; }
|
|
if (isArray(plugins)) {
|
|
plugins = createTelemetryProxyChain(plugins, config, core, startAt);
|
|
}
|
|
return createProcessTelemetryUnloadContext(plugins || context[_DYN_GET_NEXT ](), core, startAt);
|
|
}
|
|
context[_DYN_PROCESS_NEXT ] = _processNext;
|
|
context[_DYN_CREATE_NEW ] = _createNew;
|
|
return context;
|
|
}
|
|
function createProcessTelemetryUpdateContext(telemetryChain, core, startAt) {
|
|
var config = core[_DYN_CONFIG ] || {};
|
|
var internalContext = _createInternalContext(telemetryChain, config, core, startAt);
|
|
var context = internalContext.ctx;
|
|
function _processNext(updateState) {
|
|
return context.iterate(function (plugin) {
|
|
if (isFunction(plugin[_DYN_UPDATE ])) {
|
|
plugin[_DYN_UPDATE ](context, updateState);
|
|
}
|
|
});
|
|
}
|
|
function _createNew(plugins, startAt) {
|
|
if (plugins === void 0) { plugins = null; }
|
|
if (isArray(plugins)) {
|
|
plugins = createTelemetryProxyChain(plugins, config, core, startAt);
|
|
}
|
|
return createProcessTelemetryUpdateContext(plugins || context[_DYN_GET_NEXT ](), core, startAt);
|
|
}
|
|
context[_DYN_PROCESS_NEXT ] = _processNext;
|
|
context[_DYN_CREATE_NEW ] = _createNew;
|
|
return context;
|
|
}
|
|
function createTelemetryProxyChain(plugins, config, core, startAt) {
|
|
var firstProxy = null;
|
|
var add = startAt ? false : true;
|
|
if (isArray(plugins) && plugins[_DYN_LENGTH ] > 0) {
|
|
var lastProxy_1 = null;
|
|
arrForEach(plugins, function (thePlugin) {
|
|
if (!add && startAt === thePlugin) {
|
|
add = true;
|
|
}
|
|
if (add && thePlugin && isFunction(thePlugin[STR_PROCESS_TELEMETRY ])) {
|
|
var newProxy = createTelemetryPluginProxy(thePlugin, config, core);
|
|
if (!firstProxy) {
|
|
firstProxy = newProxy;
|
|
}
|
|
if (lastProxy_1) {
|
|
lastProxy_1._setNext(newProxy);
|
|
}
|
|
lastProxy_1 = newProxy;
|
|
}
|
|
});
|
|
}
|
|
if (startAt && !firstProxy) {
|
|
return createTelemetryProxyChain([startAt], config, core);
|
|
}
|
|
return firstProxy;
|
|
}
|
|
function createTelemetryPluginProxy(plugin, config, core) {
|
|
var nextProxy = null;
|
|
var hasProcessTelemetry = isFunction(plugin[STR_PROCESS_TELEMETRY ]);
|
|
var hasSetNext = isFunction(plugin[_DYN_SET_NEXT_PLUGIN ]);
|
|
var chainId;
|
|
if (plugin) {
|
|
chainId = plugin[_DYN_IDENTIFIER ] + "-" + plugin[STR_PRIORITY ] + "-" + _chainId++;
|
|
}
|
|
else {
|
|
chainId = "Unknown-0-" + _chainId++;
|
|
}
|
|
var proxyChain = {
|
|
getPlugin: function () {
|
|
return plugin;
|
|
},
|
|
getNext: function () {
|
|
return nextProxy;
|
|
},
|
|
processTelemetry: _processTelemetry,
|
|
unload: _unloadPlugin,
|
|
update: _updatePlugin,
|
|
_id: chainId,
|
|
_setNext: function (nextPlugin) {
|
|
nextProxy = nextPlugin;
|
|
}
|
|
};
|
|
function _getTelCtx() {
|
|
var itemCtx;
|
|
if (plugin && isFunction(plugin[strGetTelCtx])) {
|
|
itemCtx = plugin[strGetTelCtx]();
|
|
}
|
|
if (!itemCtx) {
|
|
itemCtx = createProcessTelemetryContext(proxyChain, config, core);
|
|
}
|
|
return itemCtx;
|
|
}
|
|
function _processChain(itemCtx, processPluginFn, name, details, isAsync) {
|
|
var hasRun = false;
|
|
var identifier = plugin ? plugin[_DYN_IDENTIFIER ] : strTelemetryPluginChain;
|
|
var hasRunContext = itemCtx[strHasRunFlags];
|
|
if (!hasRunContext) {
|
|
hasRunContext = itemCtx[strHasRunFlags] = {};
|
|
}
|
|
itemCtx.setNext(nextProxy);
|
|
if (plugin) {
|
|
doPerf(itemCtx[STR_CORE ](), function () { return identifier + ":" + name; }, function () {
|
|
hasRunContext[chainId] = true;
|
|
try {
|
|
var nextId = nextProxy ? nextProxy._id : STR_EMPTY$2;
|
|
if (nextId) {
|
|
hasRunContext[nextId] = false;
|
|
}
|
|
hasRun = processPluginFn(itemCtx);
|
|
}
|
|
catch (error) {
|
|
var hasNextRun = nextProxy ? hasRunContext[nextProxy._id] : true;
|
|
if (hasNextRun) {
|
|
hasRun = true;
|
|
}
|
|
if (!nextProxy || !hasNextRun) {
|
|
_throwInternal(itemCtx[_DYN_DIAG_LOG ](), 1 , 73 , "Plugin [" + identifier + "] failed during " + name + " - " + dumpObj(error) + ", run flags: " + dumpObj(hasRunContext));
|
|
}
|
|
}
|
|
}, details, isAsync);
|
|
}
|
|
return hasRun;
|
|
}
|
|
function _processTelemetry(env, itemCtx) {
|
|
itemCtx = itemCtx || _getTelCtx();
|
|
function _callProcessTelemetry(itemCtx) {
|
|
if (!plugin || !hasProcessTelemetry) {
|
|
return false;
|
|
}
|
|
var pluginState = _getPluginState(plugin);
|
|
if (pluginState[_DYN_TEARDOWN ] || pluginState[STR_DISABLED]) {
|
|
return false;
|
|
}
|
|
if (hasSetNext) {
|
|
plugin[_DYN_SET_NEXT_PLUGIN ](nextProxy);
|
|
}
|
|
plugin[STR_PROCESS_TELEMETRY ](env, itemCtx);
|
|
return true;
|
|
}
|
|
if (!_processChain(itemCtx, _callProcessTelemetry, "processTelemetry", function () { return ({ item: env }); }, !(env.sync))) {
|
|
itemCtx[_DYN_PROCESS_NEXT ](env);
|
|
}
|
|
}
|
|
function _unloadPlugin(unloadCtx, unloadState) {
|
|
function _callTeardown() {
|
|
var hasRun = false;
|
|
if (plugin) {
|
|
var pluginState = _getPluginState(plugin);
|
|
var pluginCore = plugin[STR_CORE] || pluginState[STR_CORE ];
|
|
if (plugin && (!pluginCore || pluginCore === unloadCtx.core()) && !pluginState[_DYN_TEARDOWN ]) {
|
|
pluginState[STR_CORE ] = null;
|
|
pluginState[_DYN_TEARDOWN ] = true;
|
|
pluginState[_DYN_IS_INITIALIZED ] = false;
|
|
if (plugin[_DYN_TEARDOWN ] && plugin[_DYN_TEARDOWN ](unloadCtx, unloadState) === true) {
|
|
hasRun = true;
|
|
}
|
|
}
|
|
}
|
|
return hasRun;
|
|
}
|
|
if (!_processChain(unloadCtx, _callTeardown, "unload", function () { }, unloadState[_DYN_IS_ASYNC ])) {
|
|
unloadCtx[_DYN_PROCESS_NEXT ](unloadState);
|
|
}
|
|
}
|
|
function _updatePlugin(updateCtx, updateState) {
|
|
function _callUpdate() {
|
|
var hasRun = false;
|
|
if (plugin) {
|
|
var pluginState = _getPluginState(plugin);
|
|
var pluginCore = plugin[STR_CORE] || pluginState[STR_CORE ];
|
|
if (plugin && (!pluginCore || pluginCore === updateCtx.core()) && !pluginState[_DYN_TEARDOWN ]) {
|
|
if (plugin[_DYN_UPDATE ] && plugin[_DYN_UPDATE ](updateCtx, updateState) === true) {
|
|
hasRun = true;
|
|
}
|
|
}
|
|
}
|
|
return hasRun;
|
|
}
|
|
if (!_processChain(updateCtx, _callUpdate, "update", function () { }, false)) {
|
|
updateCtx[_DYN_PROCESS_NEXT ](updateState);
|
|
}
|
|
}
|
|
return objFreeze(proxyChain);
|
|
}
|
|
|
|
function createUnloadHandlerContainer() {
|
|
var handlers = [];
|
|
function _addHandler(handler) {
|
|
if (handler) {
|
|
handlers[_DYN_PUSH ](handler);
|
|
}
|
|
}
|
|
function _runHandlers(unloadCtx, unloadState) {
|
|
arrForEach(handlers, function (handler) {
|
|
try {
|
|
handler(unloadCtx, unloadState);
|
|
}
|
|
catch (e) {
|
|
_throwInternal(unloadCtx[_DYN_DIAG_LOG ](), 2 , 73 , "Unexpected error calling unload handler - " + dumpObj(e));
|
|
}
|
|
});
|
|
handlers = [];
|
|
}
|
|
return {
|
|
add: _addHandler,
|
|
run: _runHandlers
|
|
};
|
|
}
|
|
|
|
var strGetPlugin = "getPlugin";
|
|
var BaseTelemetryPlugin = /** @class */ (function () {
|
|
function BaseTelemetryPlugin() {
|
|
var _self = this;
|
|
var _isinitialized;
|
|
var _rootCtx;
|
|
var _nextPlugin;
|
|
var _unloadHandlerContainer;
|
|
var _hooks;
|
|
_initDefaults();
|
|
dynamicProto(BaseTelemetryPlugin, _self, function (_self) {
|
|
_self[_DYN_INITIALIZE ] = function (config, core, extensions, pluginChain) {
|
|
_setDefaults(config, core, pluginChain);
|
|
_isinitialized = true;
|
|
};
|
|
_self[_DYN_TEARDOWN ] = function (unloadCtx, unloadState) {
|
|
var _a;
|
|
var core = _self[STR_CORE ];
|
|
if (!core || (unloadCtx && core !== unloadCtx[STR_CORE ]())) {
|
|
return;
|
|
}
|
|
var result;
|
|
var unloadDone = false;
|
|
var theUnloadCtx = unloadCtx || createProcessTelemetryUnloadContext(null, core, _nextPlugin && _nextPlugin[strGetPlugin] ? _nextPlugin[strGetPlugin]() : _nextPlugin);
|
|
var theUnloadState = unloadState || (_a = {
|
|
reason: 0
|
|
},
|
|
_a[_DYN_IS_ASYNC ] = false,
|
|
_a);
|
|
function _unloadCallback() {
|
|
if (!unloadDone) {
|
|
unloadDone = true;
|
|
_unloadHandlerContainer.run(theUnloadCtx, unloadState);
|
|
var oldHooks = _hooks;
|
|
_hooks = [];
|
|
arrForEach(oldHooks, function (fn) {
|
|
fn.rm();
|
|
});
|
|
if (result === true) {
|
|
theUnloadCtx[_DYN_PROCESS_NEXT ](theUnloadState);
|
|
}
|
|
_initDefaults();
|
|
}
|
|
}
|
|
if (!_self[_DYN__DO_TEARDOWN ] || _self[_DYN__DO_TEARDOWN ](theUnloadCtx, theUnloadState, _unloadCallback) !== true) {
|
|
_unloadCallback();
|
|
}
|
|
else {
|
|
result = true;
|
|
}
|
|
return result;
|
|
};
|
|
_self[_DYN_UPDATE ] = function (updateCtx, updateState) {
|
|
var core = _self[STR_CORE ];
|
|
if (!core || (updateCtx && core !== updateCtx[STR_CORE ]())) {
|
|
return;
|
|
}
|
|
var result;
|
|
var updateDone = false;
|
|
var theUpdateCtx = updateCtx || createProcessTelemetryUpdateContext(null, core, _nextPlugin && _nextPlugin[strGetPlugin] ? _nextPlugin[strGetPlugin]() : _nextPlugin);
|
|
var theUpdateState = updateState || {
|
|
reason: 0
|
|
};
|
|
function _updateCallback() {
|
|
if (!updateDone) {
|
|
updateDone = true;
|
|
_setDefaults(theUpdateCtx.getCfg(), theUpdateCtx.core(), theUpdateCtx[_DYN_GET_NEXT ]());
|
|
}
|
|
}
|
|
if (!_self._doUpdate || _self._doUpdate(theUpdateCtx, theUpdateState, _updateCallback) !== true) {
|
|
_updateCallback();
|
|
}
|
|
else {
|
|
result = true;
|
|
}
|
|
return result;
|
|
};
|
|
_self._addHook = function (hooks) {
|
|
if (hooks) {
|
|
if (isArray(hooks)) {
|
|
_hooks = _hooks.concat(hooks);
|
|
}
|
|
else {
|
|
_hooks[_DYN_PUSH ](hooks);
|
|
}
|
|
}
|
|
};
|
|
proxyFunctionAs(_self, "_addUnloadCb", function () { return _unloadHandlerContainer; }, "add");
|
|
});
|
|
_self[_DYN_DIAG_LOG ] = function (itemCtx) {
|
|
return _getTelCtx(itemCtx)[_DYN_DIAG_LOG ]();
|
|
};
|
|
_self[_DYN_IS_INITIALIZED ] = function () {
|
|
return _isinitialized;
|
|
};
|
|
_self.setInitialized = function (isInitialized) {
|
|
_isinitialized = isInitialized;
|
|
};
|
|
_self[_DYN_SET_NEXT_PLUGIN ] = function (next) {
|
|
_nextPlugin = next;
|
|
};
|
|
_self[_DYN_PROCESS_NEXT ] = function (env, itemCtx) {
|
|
if (itemCtx) {
|
|
itemCtx[_DYN_PROCESS_NEXT ](env);
|
|
}
|
|
else if (_nextPlugin && isFunction(_nextPlugin[STR_PROCESS_TELEMETRY ])) {
|
|
_nextPlugin[STR_PROCESS_TELEMETRY ](env, null);
|
|
}
|
|
};
|
|
_self._getTelCtx = _getTelCtx;
|
|
function _getTelCtx(currentCtx) {
|
|
if (currentCtx === void 0) { currentCtx = null; }
|
|
var itemCtx = currentCtx;
|
|
if (!itemCtx) {
|
|
var rootCtx = _rootCtx || createProcessTelemetryContext(null, {}, _self[STR_CORE ]);
|
|
if (_nextPlugin && _nextPlugin[strGetPlugin]) {
|
|
itemCtx = rootCtx[_DYN_CREATE_NEW ](null, _nextPlugin[strGetPlugin]);
|
|
}
|
|
else {
|
|
itemCtx = rootCtx[_DYN_CREATE_NEW ](null, _nextPlugin);
|
|
}
|
|
}
|
|
return itemCtx;
|
|
}
|
|
function _setDefaults(config, core, pluginChain) {
|
|
if (config) {
|
|
setValue(config, STR_EXTENSION_CONFIG, [], null, isNullOrUndefined);
|
|
}
|
|
if (!pluginChain && core) {
|
|
pluginChain = core[_DYN_GET_PROCESS_TEL_CONT0 ]()[_DYN_GET_NEXT ]();
|
|
}
|
|
var nextPlugin = _nextPlugin;
|
|
if (_nextPlugin && _nextPlugin[strGetPlugin]) {
|
|
nextPlugin = _nextPlugin[strGetPlugin]();
|
|
}
|
|
_self[STR_CORE ] = core;
|
|
_rootCtx = createProcessTelemetryContext(pluginChain, config, core, nextPlugin);
|
|
}
|
|
function _initDefaults() {
|
|
_isinitialized = false;
|
|
_self[STR_CORE ] = null;
|
|
_rootCtx = null;
|
|
_nextPlugin = null;
|
|
_hooks = [];
|
|
_unloadHandlerContainer = createUnloadHandlerContainer();
|
|
}
|
|
}
|
|
BaseTelemetryPlugin.__ieDyn=1;
|
|
return BaseTelemetryPlugin;
|
|
}());
|
|
|
|
var STR_EMPTY$1 = "";
|
|
|
|
var _a$1;
|
|
var Version = '3.2.13';
|
|
var FullVersionString = "1DS-Web-JS-" + Version;
|
|
var strDisabledPropertyName = "Microsoft_ApplicationInsights_BypassAjaxInstrumentation";
|
|
var strWithCredentials = "withCredentials";
|
|
var strTimeout = "timeout";
|
|
var _fieldTypeEventPropMap = (_a$1 = {},
|
|
_a$1[0 ] = 0 ,
|
|
_a$1[2 ] = 6 ,
|
|
_a$1[1 ] = 1 ,
|
|
_a$1[3 ] = 7 ,
|
|
_a$1[4096 | 2 ] = 6 ,
|
|
_a$1[4096 | 1 ] = 1 ,
|
|
_a$1[4096 | 3 ] = 7 ,
|
|
_a$1);
|
|
Boolean(getDocument());
|
|
Boolean(getWindow());
|
|
function isValueAssigned(value) {
|
|
return !(value === STR_EMPTY$1 || isNullOrUndefined(value));
|
|
}
|
|
function getTenantId(apiKey) {
|
|
if (apiKey) {
|
|
var indexTenantId = apiKey.indexOf("-");
|
|
if (indexTenantId > -1) {
|
|
return apiKey.substring(0, indexTenantId);
|
|
}
|
|
}
|
|
return STR_EMPTY$1;
|
|
}
|
|
function sanitizeProperty(name, property, stringifyObjects) {
|
|
if ((!property && !isValueAssigned(property)) || typeof name !== "string") {
|
|
return null;
|
|
}
|
|
var propType = typeof property;
|
|
if (propType === "string" || propType === "number" || propType === "boolean" || isArray(property)) {
|
|
property = { value: property };
|
|
}
|
|
else if (propType === "object" && !ObjHasOwnProperty.call(property, "value")) {
|
|
property = { value: stringifyObjects ? JSON.stringify(property) : property };
|
|
}
|
|
else if (isNullOrUndefined(property.value)
|
|
|| property.value === STR_EMPTY$1 || (!isString(property.value)
|
|
&& !isNumber(property.value) && !isBoolean(property.value)
|
|
&& !isArray(property.value))) {
|
|
return null;
|
|
}
|
|
if (isArray(property.value) &&
|
|
!isArrayValid(property.value)) {
|
|
return null;
|
|
}
|
|
if (!isNullOrUndefined(property.kind)) {
|
|
if (isArray(property.value) || !isValueKind(property.kind)) {
|
|
return null;
|
|
}
|
|
property.value = property.value.toString();
|
|
}
|
|
return property;
|
|
}
|
|
function getCommonSchemaMetaData(value, kind, type) {
|
|
var encodedTypeValue = -1;
|
|
if (!isUndefined(value)) {
|
|
if (kind > 0) {
|
|
if (kind === 32) {
|
|
encodedTypeValue = (1 << 13);
|
|
}
|
|
else if (kind <= 13) {
|
|
encodedTypeValue = (kind << 5);
|
|
}
|
|
}
|
|
if (isDataType(type)) {
|
|
if (encodedTypeValue === -1) {
|
|
encodedTypeValue = 0;
|
|
}
|
|
encodedTypeValue |= type;
|
|
}
|
|
else {
|
|
var propType = _fieldTypeEventPropMap[getFieldValueType(value)] || -1;
|
|
if (encodedTypeValue !== -1 && propType !== -1) {
|
|
encodedTypeValue |= propType;
|
|
}
|
|
else if (propType === 6 ) {
|
|
encodedTypeValue = propType;
|
|
}
|
|
}
|
|
}
|
|
return encodedTypeValue;
|
|
}
|
|
function extend(obj, obj2, obj3, obj4, obj5) {
|
|
var extended = {};
|
|
var deep = false;
|
|
var i = 0;
|
|
var length = arguments.length;
|
|
var objProto = Object[strShimPrototype];
|
|
var theArgs = arguments;
|
|
if (objProto.toString.call(theArgs[0]) === "[object Boolean]") {
|
|
deep = theArgs[0];
|
|
i++;
|
|
}
|
|
for (; i < length; i++) {
|
|
var obj = theArgs[i];
|
|
objForEachKey(obj, function (prop, value) {
|
|
if (deep && value && isObject(value)) {
|
|
if (isArray(value)) {
|
|
extended[prop] = extended[prop] || [];
|
|
arrForEach(value, function (arrayValue, arrayIndex) {
|
|
if (arrayValue && isObject(arrayValue)) {
|
|
extended[prop][arrayIndex] = extend(true, extended[prop][arrayIndex], arrayValue);
|
|
}
|
|
else {
|
|
extended[prop][arrayIndex] = arrayValue;
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
extended[prop] = extend(true, extended[prop], value);
|
|
}
|
|
}
|
|
else {
|
|
extended[prop] = value;
|
|
}
|
|
});
|
|
}
|
|
return extended;
|
|
}
|
|
var getTime = perfNow;
|
|
function isValueKind(value) {
|
|
if (value === 0 || ((value > 0 && value <= 13 ) || value === 32 )) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function isDataType(value) {
|
|
if (value >= 0 && value <= 9) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function isArrayValid(value) {
|
|
return value.length > 0;
|
|
}
|
|
function setProcessTelemetryTimings(event, identifier) {
|
|
var evt = event;
|
|
evt.timings = evt.timings || {};
|
|
evt.timings.processTelemetryStart = evt.timings.processTelemetryStart || {};
|
|
evt.timings.processTelemetryStart[identifier] = getTime();
|
|
}
|
|
function getFieldValueType(value) {
|
|
var theType = 0 ;
|
|
if (value !== null && value !== undefined) {
|
|
var objType = typeof value;
|
|
if (objType === "string") {
|
|
theType = 1 ;
|
|
}
|
|
else if (objType === "number") {
|
|
theType = 2 ;
|
|
}
|
|
else if (objType === "boolean") {
|
|
theType = 3 ;
|
|
}
|
|
else if (objType === strShimObject) {
|
|
theType = 4 ;
|
|
if (isArray(value)) {
|
|
theType = 4096 ;
|
|
if (value.length > 0) {
|
|
theType |= getFieldValueType(value[0]);
|
|
}
|
|
}
|
|
else if (ObjHasOwnProperty.call(value, "value")) {
|
|
theType = 8192 | getFieldValueType(value.value);
|
|
}
|
|
}
|
|
}
|
|
return theType;
|
|
}
|
|
function isChromium() {
|
|
return !!getGlobalInst("chrome");
|
|
}
|
|
function openXhr(method, urlString, withCredentials, disabled, isSync, timeout) {
|
|
if (disabled === void 0) { disabled = false; }
|
|
if (isSync === void 0) { isSync = false; }
|
|
function _wrapSetXhrProp(xhr, prop, value) {
|
|
try {
|
|
xhr[prop] = value;
|
|
}
|
|
catch (e) {
|
|
}
|
|
}
|
|
var xhr = new XMLHttpRequest();
|
|
if (disabled) {
|
|
_wrapSetXhrProp(xhr, strDisabledPropertyName, disabled);
|
|
}
|
|
if (withCredentials) {
|
|
_wrapSetXhrProp(xhr, strWithCredentials, withCredentials);
|
|
}
|
|
xhr.open(method, urlString, !isSync);
|
|
if (withCredentials) {
|
|
_wrapSetXhrProp(xhr, strWithCredentials, withCredentials);
|
|
}
|
|
if (!isSync && timeout) {
|
|
_wrapSetXhrProp(xhr, strTimeout, timeout);
|
|
}
|
|
return xhr;
|
|
}
|
|
|
|
var RT_PROFILE = "REAL_TIME";
|
|
var NRT_PROFILE = "NEAR_REAL_TIME";
|
|
var BE_PROFILE = "BEST_EFFORT";
|
|
|
|
var STR_EMPTY = "";
|
|
var STR_POST_METHOD = "POST";
|
|
var STR_DISABLED_PROPERTY_NAME = "Microsoft_ApplicationInsights_BypassAjaxInstrumentation";
|
|
var STR_DROPPED = "drop";
|
|
var STR_SENDING = "send";
|
|
var STR_REQUEUE = "requeue";
|
|
var STR_RESPONSE_FAIL = "rspFail";
|
|
var STR_OTHER = "oth";
|
|
var DEFAULT_CACHE_CONTROL = "no-cache, no-store";
|
|
var DEFAULT_CONTENT_TYPE = "application/x-json-stream";
|
|
var STR_CACHE_CONTROL = "cache-control";
|
|
var STR_CONTENT_TYPE_HEADER = "content-type";
|
|
var STR_KILL_TOKENS_HEADER = "kill-tokens";
|
|
var STR_KILL_DURATION_HEADER = "kill-duration";
|
|
var STR_KILL_DURATION_SECONDS_HEADER = "kill-duration-seconds";
|
|
var STR_TIME_DELTA_HEADER = "time-delta-millis";
|
|
var STR_CLIENT_VERSION = "client-version";
|
|
var STR_CLIENT_ID = "client-id";
|
|
var STR_TIME_DELTA_TO_APPLY = "time-delta-to-apply-millis";
|
|
var STR_UPLOAD_TIME = "upload-time";
|
|
var STR_API_KEY = "apikey";
|
|
var STR_MSA_DEVICE_TICKET = "AuthMsaDeviceTicket";
|
|
var STR_AUTH_XTOKEN = "AuthXToken";
|
|
var STR_NO_RESPONSE_BODY = "NoResponseBody";
|
|
var STR_MSFPC = "msfpc";
|
|
var STR_TRACE = "trace";
|
|
var STR_USER = "user";
|
|
|
|
function _getEventMsfpc(theEvent) {
|
|
var intWeb = ((theEvent.ext || {})["intweb"]);
|
|
if (intWeb && isValueAssigned(intWeb[STR_MSFPC])) {
|
|
return intWeb[STR_MSFPC];
|
|
}
|
|
return null;
|
|
}
|
|
function _getMsfpc(theEvents) {
|
|
var msfpc = null;
|
|
for (var lp = 0; msfpc === null && lp < theEvents.length; lp++) {
|
|
msfpc = _getEventMsfpc(theEvents[lp]);
|
|
}
|
|
return msfpc;
|
|
}
|
|
var EventBatch = /** @class */ (function () {
|
|
function EventBatch(iKey, addEvents) {
|
|
var events = addEvents ? [].concat(addEvents) : [];
|
|
var _self = this;
|
|
var _msfpc = _getMsfpc(events);
|
|
_self.iKey = function () {
|
|
return iKey;
|
|
};
|
|
_self.Msfpc = function () {
|
|
return _msfpc || STR_EMPTY;
|
|
};
|
|
_self.count = function () {
|
|
return events.length;
|
|
};
|
|
_self.events = function () {
|
|
return events;
|
|
};
|
|
_self.addEvent = function (theEvent) {
|
|
if (theEvent) {
|
|
events.push(theEvent);
|
|
if (!_msfpc) {
|
|
_msfpc = _getEventMsfpc(theEvent);
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
};
|
|
_self.split = function (fromEvent, numEvents) {
|
|
var theEvents;
|
|
if (fromEvent < events.length) {
|
|
var cnt = events.length - fromEvent;
|
|
if (!isNullOrUndefined(numEvents)) {
|
|
cnt = numEvents < cnt ? numEvents : cnt;
|
|
}
|
|
theEvents = events.splice(fromEvent, cnt);
|
|
_msfpc = _getMsfpc(events);
|
|
}
|
|
return new EventBatch(iKey, theEvents);
|
|
};
|
|
}
|
|
EventBatch.create = function (iKey, theEvents) {
|
|
return new EventBatch(iKey, theEvents);
|
|
};
|
|
return EventBatch;
|
|
}());
|
|
|
|
var ClockSkewManager = /** @class */ (function () {
|
|
function ClockSkewManager() {
|
|
var _allowRequestSending = true;
|
|
var _shouldAddClockSkewHeaders = true;
|
|
var _isFirstRequest = true;
|
|
var _clockSkewHeaderValue = "use-collector-delta";
|
|
var _clockSkewSet = false;
|
|
dynamicProto(ClockSkewManager, this, function (_self) {
|
|
_self.allowRequestSending = function () {
|
|
return _allowRequestSending;
|
|
};
|
|
_self.firstRequestSent = function () {
|
|
if (_isFirstRequest) {
|
|
_isFirstRequest = false;
|
|
if (!_clockSkewSet) {
|
|
_allowRequestSending = false;
|
|
}
|
|
}
|
|
};
|
|
_self.shouldAddClockSkewHeaders = function () {
|
|
return _shouldAddClockSkewHeaders;
|
|
};
|
|
_self.getClockSkewHeaderValue = function () {
|
|
return _clockSkewHeaderValue;
|
|
};
|
|
_self.setClockSkew = function (timeDeltaInMillis) {
|
|
if (!_clockSkewSet) {
|
|
if (timeDeltaInMillis) {
|
|
_clockSkewHeaderValue = timeDeltaInMillis;
|
|
_shouldAddClockSkewHeaders = true;
|
|
_clockSkewSet = true;
|
|
}
|
|
else {
|
|
_shouldAddClockSkewHeaders = false;
|
|
}
|
|
_allowRequestSending = true;
|
|
}
|
|
};
|
|
});
|
|
}
|
|
ClockSkewManager.__ieDyn=1;
|
|
return ClockSkewManager;
|
|
}());
|
|
var EVTClockSkewManager = ClockSkewManager;
|
|
|
|
var SecToMsMultiplier = 1000;
|
|
var KillSwitch = /** @class */ (function () {
|
|
function KillSwitch() {
|
|
var _killedTokenDictionary = {};
|
|
function _normalizeTenants(values) {
|
|
var result = [];
|
|
if (values) {
|
|
arrForEach(values, function (value) {
|
|
result.push(strTrim(value));
|
|
});
|
|
}
|
|
return result;
|
|
}
|
|
dynamicProto(KillSwitch, this, function (_self) {
|
|
_self.setKillSwitchTenants = function (killTokens, killDuration) {
|
|
if (killTokens && killDuration) {
|
|
try {
|
|
var killedTokens = _normalizeTenants(killTokens.split(","));
|
|
if (killDuration === "this-request-only") {
|
|
return killedTokens;
|
|
}
|
|
var durationMs = parseInt(killDuration, 10) * SecToMsMultiplier;
|
|
for (var i = 0; i < killedTokens.length; ++i) {
|
|
_killedTokenDictionary[killedTokens[i]] = dateNow() + durationMs;
|
|
}
|
|
}
|
|
catch (ex) {
|
|
return [];
|
|
}
|
|
}
|
|
return [];
|
|
};
|
|
_self.isTenantKilled = function (tenantToken) {
|
|
var killDictionary = _killedTokenDictionary;
|
|
var name = strTrim(tenantToken);
|
|
if (killDictionary[name] !== undefined && killDictionary[name] > dateNow()) {
|
|
return true;
|
|
}
|
|
delete killDictionary[name];
|
|
return false;
|
|
};
|
|
});
|
|
}
|
|
KillSwitch.__ieDyn=1;
|
|
return KillSwitch;
|
|
}());
|
|
var EVTKillSwitch = KillSwitch;
|
|
|
|
var RandomizationLowerThreshold = 0.8;
|
|
var RandomizationUpperThreshold = 1.2;
|
|
var BaseBackoff = 3000;
|
|
var MaxBackoff = 600000;
|
|
function retryPolicyShouldRetryForStatus(httpStatusCode) {
|
|
return !((httpStatusCode >= 300 && httpStatusCode < 500 && httpStatusCode != 408 && httpStatusCode != 429)
|
|
|| (httpStatusCode == 501)
|
|
|| (httpStatusCode == 505));
|
|
}
|
|
function retryPolicyGetMillisToBackoffForRetry(retriesSoFar) {
|
|
var waitDuration = 0;
|
|
var minBackoff = BaseBackoff * RandomizationLowerThreshold;
|
|
var maxBackoff = BaseBackoff * RandomizationUpperThreshold;
|
|
var randomBackoff = Math.floor(Math.random() * (maxBackoff - minBackoff)) + minBackoff;
|
|
waitDuration = Math.pow(2, retriesSoFar) * randomBackoff;
|
|
return Math.min(waitDuration, MaxBackoff);
|
|
}
|
|
|
|
var _MAX_STRING_JOINS = 20;
|
|
var RequestSizeLimitBytes = 3984588;
|
|
var BeaconRequestSizeLimitBytes = 65000;
|
|
var MaxRecordSize = 2000000;
|
|
var MaxBeaconRecordSize = Math.min(MaxRecordSize, BeaconRequestSizeLimitBytes);
|
|
var metadata = "metadata";
|
|
var f = "f";
|
|
var rCheckDot = /\./;
|
|
var Serializer = /** @class */ (function () {
|
|
function Serializer(perfManager, valueSanitizer, stringifyObjects, enableCompoundKey) {
|
|
var strData = "data";
|
|
var strBaseData = "baseData";
|
|
var strExt = "ext";
|
|
var _checkForCompoundkey = !!enableCompoundKey;
|
|
var _processSubMetaData = true;
|
|
var _theSanitizer = valueSanitizer;
|
|
var _isReservedCache = {};
|
|
dynamicProto(Serializer, this, function (_self) {
|
|
_self.createPayload = function (retryCnt, isTeardown, isSync, isReducedPayload, sendReason, sendType) {
|
|
return {
|
|
apiKeys: [],
|
|
payloadBlob: STR_EMPTY,
|
|
overflow: null,
|
|
sizeExceed: [],
|
|
failedEvts: [],
|
|
batches: [],
|
|
numEvents: 0,
|
|
retryCnt: retryCnt,
|
|
isTeardown: isTeardown,
|
|
isSync: isSync,
|
|
isBeacon: isReducedPayload,
|
|
sendType: sendType,
|
|
sendReason: sendReason
|
|
};
|
|
};
|
|
_self.appendPayload = function (payload, theBatch, maxEventsPerBatch) {
|
|
var canAddEvents = payload && theBatch && !payload.overflow;
|
|
if (canAddEvents) {
|
|
doPerf(perfManager, function () { return "Serializer:appendPayload"; }, function () {
|
|
var theEvents = theBatch.events();
|
|
var payloadBlob = payload.payloadBlob;
|
|
var payloadEvents = payload.numEvents;
|
|
var eventsAdded = false;
|
|
var sizeExceeded = [];
|
|
var failedEvts = [];
|
|
var isBeaconPayload = payload.isBeacon;
|
|
var requestMaxSize = isBeaconPayload ? BeaconRequestSizeLimitBytes : RequestSizeLimitBytes;
|
|
var recordMaxSize = isBeaconPayload ? MaxBeaconRecordSize : MaxRecordSize;
|
|
var lp = 0;
|
|
var joinCount = 0;
|
|
while (lp < theEvents.length) {
|
|
var theEvent = theEvents[lp];
|
|
if (theEvent) {
|
|
if (payloadEvents >= maxEventsPerBatch) {
|
|
payload.overflow = theBatch.split(lp);
|
|
break;
|
|
}
|
|
var eventBlob = _self.getEventBlob(theEvent);
|
|
if (eventBlob && eventBlob.length <= recordMaxSize) {
|
|
var blobLength = eventBlob.length;
|
|
var currentSize = payloadBlob.length;
|
|
if (currentSize + blobLength > requestMaxSize) {
|
|
payload.overflow = theBatch.split(lp);
|
|
break;
|
|
}
|
|
if (payloadBlob) {
|
|
payloadBlob += "\n";
|
|
}
|
|
payloadBlob += eventBlob;
|
|
joinCount++;
|
|
if (joinCount > _MAX_STRING_JOINS) {
|
|
payloadBlob.substr(0, 1);
|
|
joinCount = 0;
|
|
}
|
|
eventsAdded = true;
|
|
payloadEvents++;
|
|
}
|
|
else {
|
|
if (eventBlob) {
|
|
sizeExceeded.push(theEvent);
|
|
}
|
|
else {
|
|
failedEvts.push(theEvent);
|
|
}
|
|
theEvents.splice(lp, 1);
|
|
lp--;
|
|
}
|
|
}
|
|
lp++;
|
|
}
|
|
if (sizeExceeded && sizeExceeded.length > 0) {
|
|
payload.sizeExceed.push(EventBatch.create(theBatch.iKey(), sizeExceeded));
|
|
}
|
|
if (failedEvts && failedEvts.length > 0) {
|
|
payload.failedEvts.push(EventBatch.create(theBatch.iKey(), failedEvts));
|
|
}
|
|
if (eventsAdded) {
|
|
payload.batches.push(theBatch);
|
|
payload.payloadBlob = payloadBlob;
|
|
payload.numEvents = payloadEvents;
|
|
var apiKey = theBatch.iKey();
|
|
if (arrIndexOf(payload.apiKeys, apiKey) === -1) {
|
|
payload.apiKeys.push(apiKey);
|
|
}
|
|
}
|
|
}, function () { return ({ payload: payload, theBatch: { iKey: theBatch.iKey(), evts: theBatch.events() }, max: maxEventsPerBatch }); });
|
|
}
|
|
return canAddEvents;
|
|
};
|
|
_self.getEventBlob = function (eventData) {
|
|
try {
|
|
return doPerf(perfManager, function () { return "Serializer.getEventBlob"; }, function () {
|
|
var serializedEvent = {};
|
|
serializedEvent.name = eventData.name;
|
|
serializedEvent.time = eventData.time;
|
|
serializedEvent.ver = eventData.ver;
|
|
serializedEvent.iKey = "o:" + getTenantId(eventData.iKey);
|
|
var serializedExt = {};
|
|
var eventExt = eventData[strExt];
|
|
if (eventExt) {
|
|
serializedEvent[strExt] = serializedExt;
|
|
objForEachKey(eventExt, function (key, value) {
|
|
var data = serializedExt[key] = {};
|
|
_processPathKeys(value, data, "ext." + key, true, null, null, true);
|
|
});
|
|
}
|
|
var serializedData = serializedEvent[strData] = {};
|
|
serializedData.baseType = eventData.baseType;
|
|
var serializedBaseData = serializedData[strBaseData] = {};
|
|
_processPathKeys(eventData.baseData, serializedBaseData, strBaseData, false, [strBaseData], function (pathKeys, name, value) {
|
|
_addJSONPropertyMetaData(serializedExt, pathKeys, name, value);
|
|
}, _processSubMetaData);
|
|
_processPathKeys(eventData.data, serializedData, strData, false, [], function (pathKeys, name, value) {
|
|
_addJSONPropertyMetaData(serializedExt, pathKeys, name, value);
|
|
}, _processSubMetaData);
|
|
return JSON.stringify(serializedEvent);
|
|
}, function () { return ({ item: eventData }); });
|
|
}
|
|
catch (e) {
|
|
return null;
|
|
}
|
|
};
|
|
function _isReservedField(path, name) {
|
|
var result = _isReservedCache[path];
|
|
if (result === undefined) {
|
|
if (path.length >= 7) {
|
|
result = strStartsWith(path, "ext.metadata") || strStartsWith(path, "ext.web");
|
|
}
|
|
_isReservedCache[path] = result;
|
|
}
|
|
return result;
|
|
}
|
|
function _processPathKeys(srcObj, target, thePath, checkReserved, metadataPathKeys, metadataCallback, processSubKeys) {
|
|
objForEachKey(srcObj, function (key, srcValue) {
|
|
var prop = null;
|
|
if (srcValue || isValueAssigned(srcValue)) {
|
|
var path = thePath;
|
|
var name_1 = key;
|
|
var theMetaPathKeys = metadataPathKeys;
|
|
var destObj = target;
|
|
if (_checkForCompoundkey && !checkReserved && rCheckDot.test(key)) {
|
|
var subKeys = key.split(".");
|
|
var keyLen = subKeys.length;
|
|
if (keyLen > 1) {
|
|
if (theMetaPathKeys) {
|
|
theMetaPathKeys = theMetaPathKeys.slice();
|
|
}
|
|
for (var lp = 0; lp < keyLen - 1; lp++) {
|
|
var subKey = subKeys[lp];
|
|
destObj = destObj[subKey] = destObj[subKey] || {};
|
|
path += "." + subKey;
|
|
if (theMetaPathKeys) {
|
|
theMetaPathKeys.push(subKey);
|
|
}
|
|
}
|
|
name_1 = subKeys[keyLen - 1];
|
|
}
|
|
}
|
|
var isReserved = checkReserved && _isReservedField(path);
|
|
if (!isReserved && _theSanitizer && _theSanitizer.handleField(path, name_1)) {
|
|
prop = _theSanitizer.value(path, name_1, srcValue, stringifyObjects);
|
|
}
|
|
else {
|
|
prop = sanitizeProperty(name_1, srcValue, stringifyObjects);
|
|
}
|
|
if (prop) {
|
|
var newValue = prop.value;
|
|
destObj[name_1] = newValue;
|
|
if (metadataCallback) {
|
|
metadataCallback(theMetaPathKeys, name_1, prop);
|
|
}
|
|
if (processSubKeys && typeof newValue === "object" && !isArray(newValue)) {
|
|
var newPath = theMetaPathKeys;
|
|
if (newPath) {
|
|
newPath = newPath.slice();
|
|
newPath.push(name_1);
|
|
}
|
|
_processPathKeys(srcValue, newValue, path + "." + name_1, checkReserved, newPath, metadataCallback, processSubKeys);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
Serializer.__ieDyn=1;
|
|
return Serializer;
|
|
}());
|
|
function _addJSONPropertyMetaData(json, propKeys, name, propertyValue) {
|
|
if (propertyValue && json) {
|
|
var encodedTypeValue = getCommonSchemaMetaData(propertyValue.value, propertyValue.kind, propertyValue.propertyType);
|
|
if (encodedTypeValue > -1) {
|
|
var metaData = json[metadata];
|
|
if (!metaData) {
|
|
metaData = json[metadata] = { f: {} };
|
|
}
|
|
var metaTarget = metaData[f];
|
|
if (!metaTarget) {
|
|
metaTarget = metaData[f] = {};
|
|
}
|
|
if (propKeys) {
|
|
for (var lp = 0; lp < propKeys.length; lp++) {
|
|
var key = propKeys[lp];
|
|
if (!metaTarget[key]) {
|
|
metaTarget[key] = { f: {} };
|
|
}
|
|
var newTarget = metaTarget[key][f];
|
|
if (!newTarget) {
|
|
newTarget = metaTarget[key][f] = {};
|
|
}
|
|
metaTarget = newTarget;
|
|
}
|
|
}
|
|
metaTarget = metaTarget[name] = {};
|
|
if (isArray(propertyValue.value)) {
|
|
metaTarget["a"] = {
|
|
t: encodedTypeValue
|
|
};
|
|
}
|
|
else {
|
|
metaTarget["t"] = encodedTypeValue;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
var _a;
|
|
var strSendAttempt = "sendAttempt";
|
|
var _noResponseQs = "&" + STR_NO_RESPONSE_BODY + "=true";
|
|
var _eventActionMap = (_a = {},
|
|
_a[1 ] = STR_REQUEUE,
|
|
_a[100 ] = STR_REQUEUE,
|
|
_a[200 ] = "sent",
|
|
_a[8004 ] = STR_DROPPED,
|
|
_a[8003 ] = STR_DROPPED,
|
|
_a);
|
|
var _collectorQsHeaders = {};
|
|
var _collectorHeaderToQs = {};
|
|
function _addCollectorHeaderQsMapping(qsName, headerName, allowQs) {
|
|
_collectorQsHeaders[qsName] = headerName;
|
|
if (allowQs !== false) {
|
|
_collectorHeaderToQs[headerName] = qsName;
|
|
}
|
|
}
|
|
_addCollectorHeaderQsMapping(STR_MSA_DEVICE_TICKET, STR_MSA_DEVICE_TICKET, false);
|
|
_addCollectorHeaderQsMapping(STR_CLIENT_VERSION, STR_CLIENT_VERSION);
|
|
_addCollectorHeaderQsMapping(STR_CLIENT_ID, "Client-Id");
|
|
_addCollectorHeaderQsMapping(STR_API_KEY, STR_API_KEY);
|
|
_addCollectorHeaderQsMapping(STR_TIME_DELTA_TO_APPLY, STR_TIME_DELTA_TO_APPLY);
|
|
_addCollectorHeaderQsMapping(STR_UPLOAD_TIME, STR_UPLOAD_TIME);
|
|
_addCollectorHeaderQsMapping(STR_AUTH_XTOKEN, STR_AUTH_XTOKEN);
|
|
function _getResponseText(xhr) {
|
|
try {
|
|
return xhr.responseText;
|
|
}
|
|
catch (e) {
|
|
}
|
|
return STR_EMPTY;
|
|
}
|
|
function _hasHeader(headers, header) {
|
|
var hasHeader = false;
|
|
if (headers && header) {
|
|
var keys = objKeys(headers);
|
|
if (keys && keys.length > 0) {
|
|
var lowerHeader = header.toLowerCase();
|
|
for (var lp = 0; lp < keys.length; lp++) {
|
|
var value = keys[lp];
|
|
if (value && hasOwnProperty(header, value) &&
|
|
value.toLowerCase() === lowerHeader) {
|
|
hasHeader = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return hasHeader;
|
|
}
|
|
function _addRequestDetails(details, name, value, useHeaders) {
|
|
if (name && value && value.length > 0) {
|
|
if (useHeaders && _collectorQsHeaders[name]) {
|
|
details.hdrs[_collectorQsHeaders[name]] = value;
|
|
details.useHdrs = true;
|
|
}
|
|
else {
|
|
details.url += "&" + name + "=" + value;
|
|
}
|
|
}
|
|
}
|
|
function _prependTransports(theTransports, newTransports) {
|
|
if (newTransports) {
|
|
if (isNumber(newTransports)) {
|
|
theTransports = [newTransports].concat(theTransports);
|
|
}
|
|
else if (isArray(newTransports)) {
|
|
theTransports = newTransports.concat(theTransports);
|
|
}
|
|
}
|
|
return theTransports;
|
|
}
|
|
var HttpManager = /** @class */ (function () {
|
|
function HttpManager(maxEventsPerBatch, maxConnections, maxRequestRetriesBeforeBackoff, actions, timeoutOverride) {
|
|
this._responseHandlers = [];
|
|
var _urlString = "?cors=true&" + STR_CONTENT_TYPE_HEADER.toLowerCase() + "=" + DEFAULT_CONTENT_TYPE;
|
|
var _killSwitch = new EVTKillSwitch();
|
|
var _paused = false;
|
|
var _clockSkewManager = new EVTClockSkewManager();
|
|
var _useBeacons = false;
|
|
var _outstandingRequests = 0;
|
|
var _postManager;
|
|
var _logger;
|
|
var _sendInterfaces;
|
|
var _core;
|
|
var _customHttpInterface = true;
|
|
var _queryStringParameters = [];
|
|
var _headers = {};
|
|
var _batchQueue = [];
|
|
var _serializer = null;
|
|
var _enableEventTimings = false;
|
|
var _cookieMgr;
|
|
var _isUnloading = false;
|
|
var _useHeaders = false;
|
|
var _xhrTimeout;
|
|
var _disableXhrSync;
|
|
var _disableFetchKeepAlive;
|
|
var _canHaveReducedPayload;
|
|
var _addNoResponse;
|
|
dynamicProto(HttpManager, this, function (_self) {
|
|
var _sendCredentials = true;
|
|
_self.initialize = function (endpointUrl, core, postChannel, httpInterface, channelConfig) {
|
|
var _a;
|
|
if (!channelConfig) {
|
|
channelConfig = {};
|
|
}
|
|
_urlString = endpointUrl + _urlString;
|
|
_useHeaders = !isUndefined(channelConfig.avoidOptions) ? !channelConfig.avoidOptions : true;
|
|
_core = core;
|
|
_cookieMgr = core.getCookieMgr();
|
|
_enableEventTimings = !_core.config.disableEventTimings;
|
|
var enableCompoundKey = !!_core.config.enableCompoundKey;
|
|
_postManager = postChannel;
|
|
_logger = _postManager.diagLog();
|
|
var valueSanitizer = channelConfig.valueSanitizer;
|
|
var stringifyObjects = channelConfig.stringifyObjects;
|
|
if (!isUndefined(channelConfig.enableCompoundKey)) {
|
|
enableCompoundKey = !!channelConfig.enableCompoundKey;
|
|
}
|
|
_xhrTimeout = channelConfig.xhrTimeout;
|
|
_disableXhrSync = !!channelConfig.disableXhrSync;
|
|
_disableFetchKeepAlive = !!channelConfig.disableFetchKeepAlive;
|
|
_addNoResponse = channelConfig.addNoResponse !== false;
|
|
_useBeacons = !isReactNative();
|
|
_serializer = new Serializer(_core, valueSanitizer, stringifyObjects, enableCompoundKey);
|
|
if (!isNullOrUndefined(channelConfig.useSendBeacon)) {
|
|
_useBeacons = !!channelConfig.useSendBeacon;
|
|
}
|
|
var syncHttpInterface = httpInterface;
|
|
var beaconHttpInterface = channelConfig.alwaysUseXhrOverride ? httpInterface : null;
|
|
var fetchSyncHttpInterface = channelConfig.alwaysUseXhrOverride ? httpInterface : null;
|
|
var beaconUnloadTransports = [3 , 2 ];
|
|
if (!httpInterface) {
|
|
_customHttpInterface = false;
|
|
var location_1 = getLocation();
|
|
if (location_1 && location_1.protocol && location_1.protocol.toLowerCase() === "file:") {
|
|
_sendCredentials = false;
|
|
}
|
|
var theTransports = [];
|
|
if (isReactNative()) {
|
|
theTransports = [2 , 1 ];
|
|
beaconUnloadTransports = [2 , 1 , 3 ];
|
|
}
|
|
else {
|
|
theTransports = [1 , 2 , 3 ];
|
|
}
|
|
theTransports = _prependTransports(theTransports, channelConfig.transports);
|
|
httpInterface = _getSenderInterface(theTransports, false);
|
|
if (!httpInterface) {
|
|
_warnToConsole(_logger, "No available transport to send events");
|
|
}
|
|
syncHttpInterface = _getSenderInterface(theTransports, true);
|
|
}
|
|
if (!beaconHttpInterface) {
|
|
beaconUnloadTransports = _prependTransports(beaconUnloadTransports, channelConfig.unloadTransports);
|
|
beaconHttpInterface = _getSenderInterface(beaconUnloadTransports, true);
|
|
}
|
|
_canHaveReducedPayload = !_customHttpInterface && ((_useBeacons && isBeaconsSupported()) || (!_disableFetchKeepAlive && isFetchSupported(true)));
|
|
_sendInterfaces = (_a = {},
|
|
_a[0 ] = httpInterface,
|
|
_a[1 ] = syncHttpInterface || _getSenderInterface([1 , 2 , 3 ], true),
|
|
_a[2 ] = beaconHttpInterface || syncHttpInterface || _getSenderInterface([1 ], true),
|
|
_a[3 ] = fetchSyncHttpInterface || _getSenderInterface([2 , 3 ], true) || syncHttpInterface || _getSenderInterface([1 ], true),
|
|
_a);
|
|
};
|
|
function _getSenderInterface(transports, syncSupport) {
|
|
var transportType = 0 ;
|
|
var sendPostFunc = null;
|
|
var lp = 0;
|
|
while (sendPostFunc == null && lp < transports.length) {
|
|
transportType = transports[lp];
|
|
if (transportType === 1 ) {
|
|
if (useXDomainRequest()) {
|
|
sendPostFunc = _xdrSendPost;
|
|
}
|
|
else if (isXhrSupported()) {
|
|
sendPostFunc = _xhrSendPost;
|
|
}
|
|
}
|
|
else if (transportType === 2 && isFetchSupported(syncSupport) && (!syncSupport || (syncSupport && !_disableFetchKeepAlive))) {
|
|
sendPostFunc = _fetchSendPost;
|
|
}
|
|
else if (_useBeacons && transportType === 3 && isBeaconsSupported()) {
|
|
sendPostFunc = _beaconSendPost;
|
|
}
|
|
lp++;
|
|
}
|
|
if (sendPostFunc) {
|
|
return {
|
|
_transport: transportType,
|
|
_isSync: syncSupport,
|
|
sendPOST: sendPostFunc
|
|
};
|
|
}
|
|
return null;
|
|
}
|
|
_self["_getDbgPlgTargets"] = function () {
|
|
return [_sendInterfaces[0 ], _killSwitch, _serializer, _sendInterfaces];
|
|
};
|
|
function _xdrSendPost(payload, oncomplete, sync) {
|
|
var xdr = new XDomainRequest();
|
|
xdr.open(STR_POST_METHOD, payload.urlString);
|
|
if (payload.timeout) {
|
|
xdr.timeout = payload.timeout;
|
|
}
|
|
xdr.onload = function () {
|
|
var response = _getResponseText(xdr);
|
|
_doOnComplete(oncomplete, 200, {}, response);
|
|
_handleCollectorResponse(response);
|
|
};
|
|
xdr.onerror = function () {
|
|
_doOnComplete(oncomplete, 400, {});
|
|
};
|
|
xdr.ontimeout = function () {
|
|
_doOnComplete(oncomplete, 500, {});
|
|
};
|
|
xdr.onprogress = function () { };
|
|
if (sync) {
|
|
xdr.send(payload.data);
|
|
}
|
|
else {
|
|
timeoutOverride.set(function () {
|
|
xdr.send(payload.data);
|
|
}, 0);
|
|
}
|
|
}
|
|
function _fetchSendPost(payload, oncomplete, sync) {
|
|
var _a;
|
|
var theUrl = payload.urlString;
|
|
var ignoreResponse = false;
|
|
var responseHandled = false;
|
|
var requestInit = (_a = {
|
|
body: payload.data,
|
|
method: STR_POST_METHOD
|
|
},
|
|
_a[STR_DISABLED_PROPERTY_NAME] = true,
|
|
_a);
|
|
if (sync) {
|
|
requestInit.keepalive = true;
|
|
if (payload._sendReason === 2 ) {
|
|
ignoreResponse = true;
|
|
if (_addNoResponse) {
|
|
theUrl += _noResponseQs;
|
|
}
|
|
}
|
|
}
|
|
if (_sendCredentials) {
|
|
requestInit.credentials = "include";
|
|
}
|
|
if (payload.headers && objKeys(payload.headers).length > 0) {
|
|
requestInit.headers = payload.headers;
|
|
}
|
|
fetch(theUrl, requestInit).then(function (response) {
|
|
var headerMap = {};
|
|
var responseText = STR_EMPTY;
|
|
var headers = response.headers;
|
|
if (headers) {
|
|
headers["forEach"](function (value, name) {
|
|
headerMap[name] = value;
|
|
});
|
|
}
|
|
if (response.body) {
|
|
response.text().then(function (text) {
|
|
responseText = text;
|
|
});
|
|
}
|
|
if (!responseHandled) {
|
|
responseHandled = true;
|
|
_doOnComplete(oncomplete, response.status, headerMap, responseText);
|
|
_handleCollectorResponse(responseText);
|
|
}
|
|
})["catch"](function (error) {
|
|
if (!responseHandled) {
|
|
responseHandled = true;
|
|
_doOnComplete(oncomplete, 0, {});
|
|
}
|
|
});
|
|
if (ignoreResponse && !responseHandled) {
|
|
responseHandled = true;
|
|
_doOnComplete(oncomplete, 200, {});
|
|
}
|
|
if (!responseHandled && payload.timeout > 0) {
|
|
timeoutOverride.set(function () {
|
|
if (!responseHandled) {
|
|
responseHandled = true;
|
|
_doOnComplete(oncomplete, 500, {});
|
|
}
|
|
}, payload.timeout);
|
|
}
|
|
}
|
|
function _xhrSendPost(payload, oncomplete, sync) {
|
|
var theUrl = payload.urlString;
|
|
function _appendHeader(theHeaders, xhr, name) {
|
|
if (!theHeaders[name] && xhr && xhr.getResponseHeader) {
|
|
var value = xhr.getResponseHeader(name);
|
|
if (value) {
|
|
theHeaders[name] = strTrim(value);
|
|
}
|
|
}
|
|
return theHeaders;
|
|
}
|
|
function _getAllResponseHeaders(xhr) {
|
|
var theHeaders = {};
|
|
if (!xhr.getAllResponseHeaders) {
|
|
theHeaders = _appendHeader(theHeaders, xhr, STR_TIME_DELTA_HEADER);
|
|
theHeaders = _appendHeader(theHeaders, xhr, STR_KILL_DURATION_HEADER);
|
|
theHeaders = _appendHeader(theHeaders, xhr, STR_KILL_DURATION_SECONDS_HEADER);
|
|
}
|
|
else {
|
|
theHeaders = _convertAllHeadersToMap(xhr.getAllResponseHeaders());
|
|
}
|
|
return theHeaders;
|
|
}
|
|
function xhrComplete(xhr, responseTxt) {
|
|
_doOnComplete(oncomplete, xhr.status, _getAllResponseHeaders(xhr), responseTxt);
|
|
}
|
|
if (sync && payload.disableXhrSync) {
|
|
sync = false;
|
|
}
|
|
var xhrRequest = openXhr(STR_POST_METHOD, theUrl, _sendCredentials, true, sync, payload.timeout);
|
|
objForEachKey(payload.headers, function (name, value) {
|
|
xhrRequest.setRequestHeader(name, value);
|
|
});
|
|
xhrRequest.onload = function () {
|
|
var response = _getResponseText(xhrRequest);
|
|
xhrComplete(xhrRequest, response);
|
|
_handleCollectorResponse(response);
|
|
};
|
|
xhrRequest.onerror = function () {
|
|
xhrComplete(xhrRequest);
|
|
};
|
|
xhrRequest.ontimeout = function () {
|
|
xhrComplete(xhrRequest);
|
|
};
|
|
xhrRequest.send(payload.data);
|
|
}
|
|
function _doOnComplete(oncomplete, status, headers, response) {
|
|
try {
|
|
oncomplete(status, headers, response);
|
|
}
|
|
catch (e) {
|
|
_throwInternal(_logger, 2 , 518 , dumpObj(e));
|
|
}
|
|
}
|
|
function _beaconSendPost(payload, oncomplete, sync) {
|
|
var internalPayloadData = payload;
|
|
var status = 200;
|
|
var thePayload = internalPayloadData._thePayload;
|
|
var theUrl = payload.urlString + (_addNoResponse ? _noResponseQs : STR_EMPTY);
|
|
try {
|
|
var nav_1 = getNavigator();
|
|
if (!nav_1.sendBeacon(theUrl, payload.data)) {
|
|
if (thePayload) {
|
|
var droppedBatches_1 = [];
|
|
arrForEach(thePayload.batches, function (theBatch) {
|
|
if (droppedBatches_1 && theBatch && theBatch.count() > 0) {
|
|
var theEvents = theBatch.events();
|
|
for (var lp = 0; lp < theEvents.length; lp++) {
|
|
if (!nav_1.sendBeacon(theUrl, _serializer.getEventBlob(theEvents[lp]))) {
|
|
droppedBatches_1.push(theBatch.split(lp));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
droppedBatches_1.push(theBatch.split(0));
|
|
}
|
|
});
|
|
_sendBatchesNotification(droppedBatches_1, 8003 , thePayload.sendType, true);
|
|
}
|
|
else {
|
|
status = 0;
|
|
}
|
|
}
|
|
}
|
|
catch (ex) {
|
|
_warnToConsole(_logger, "Failed to send telemetry using sendBeacon API. Ex:" + dumpObj(ex));
|
|
status = 0;
|
|
}
|
|
finally {
|
|
_doOnComplete(oncomplete, status, {}, STR_EMPTY);
|
|
}
|
|
}
|
|
function _isBeaconPayload(sendType) {
|
|
return sendType === 2 || sendType === 3 ;
|
|
}
|
|
function _adjustSendType(sendType) {
|
|
if (_isUnloading && _isBeaconPayload(sendType)) {
|
|
sendType = 2 ;
|
|
}
|
|
return sendType;
|
|
}
|
|
_self.addQueryStringParameter = function (name, value) {
|
|
for (var i = 0; i < _queryStringParameters.length; i++) {
|
|
if (_queryStringParameters[i].name === name) {
|
|
_queryStringParameters[i].value = value;
|
|
return;
|
|
}
|
|
}
|
|
_queryStringParameters.push({ name: name, value: value });
|
|
};
|
|
_self.addHeader = function (name, value) {
|
|
_headers[name] = value;
|
|
};
|
|
_self.canSendRequest = function () {
|
|
return _hasIdleConnection() && _clockSkewManager.allowRequestSending();
|
|
};
|
|
_self.sendQueuedRequests = function (sendType, sendReason) {
|
|
if (isUndefined(sendType)) {
|
|
sendType = 0 ;
|
|
}
|
|
if (_isUnloading) {
|
|
sendType = _adjustSendType(sendType);
|
|
sendReason = 2 ;
|
|
}
|
|
if (_canSendPayload(_batchQueue, sendType, 0)) {
|
|
_sendBatches(_clearQueue(), 0, false, sendType, sendReason || 0 );
|
|
}
|
|
};
|
|
_self.isCompletelyIdle = function () {
|
|
return !_paused && _outstandingRequests === 0 && _batchQueue.length === 0;
|
|
};
|
|
_self.setUnloading = function (value) {
|
|
_isUnloading = value;
|
|
};
|
|
_self.addBatch = function (theBatch) {
|
|
if (theBatch && theBatch.count() > 0) {
|
|
if (_killSwitch.isTenantKilled(theBatch.iKey())) {
|
|
return false;
|
|
}
|
|
_batchQueue.push(theBatch);
|
|
}
|
|
return true;
|
|
};
|
|
_self.teardown = function () {
|
|
if (_batchQueue.length > 0) {
|
|
_sendBatches(_clearQueue(), 0, true, 2 , 2 );
|
|
}
|
|
};
|
|
_self.pause = function () {
|
|
_paused = true;
|
|
};
|
|
_self.resume = function () {
|
|
_paused = false;
|
|
_self.sendQueuedRequests(0 , 4 );
|
|
};
|
|
_self.sendSynchronousBatch = function (batch, sendType, sendReason) {
|
|
if (batch && batch.count() > 0) {
|
|
if (isNullOrUndefined(sendType)) {
|
|
sendType = 1 ;
|
|
}
|
|
if (_isUnloading) {
|
|
sendType = _adjustSendType(sendType);
|
|
sendReason = 2 ;
|
|
}
|
|
_sendBatches([batch], 0, false, sendType, sendReason || 0 );
|
|
}
|
|
};
|
|
function _hasIdleConnection() {
|
|
return !_paused && _outstandingRequests < maxConnections;
|
|
}
|
|
function _clearQueue() {
|
|
var theQueue = _batchQueue;
|
|
_batchQueue = [];
|
|
return theQueue;
|
|
}
|
|
function _canSendPayload(theBatches, sendType, retryCnt) {
|
|
var result = false;
|
|
if (theBatches && theBatches.length > 0 && !_paused && _sendInterfaces[sendType] && _serializer) {
|
|
result = (sendType !== 0 ) || (_hasIdleConnection() && (retryCnt > 0 || _clockSkewManager.allowRequestSending()));
|
|
}
|
|
return result;
|
|
}
|
|
function _createDebugBatches(theBatches) {
|
|
var values = {};
|
|
if (theBatches) {
|
|
arrForEach(theBatches, function (theBatch, idx) {
|
|
values[idx] = {
|
|
iKey: theBatch.iKey(),
|
|
evts: theBatch.events()
|
|
};
|
|
});
|
|
}
|
|
return values;
|
|
}
|
|
function _sendBatches(theBatches, retryCount, isTeardown, sendType, sendReason) {
|
|
if (!theBatches || theBatches.length === 0) {
|
|
return;
|
|
}
|
|
if (_paused) {
|
|
_sendBatchesNotification(theBatches, 1 , sendType);
|
|
return;
|
|
}
|
|
sendType = _adjustSendType(sendType);
|
|
try {
|
|
var orgBatches_1 = theBatches;
|
|
var isSynchronous_1 = sendType !== 0 ;
|
|
doPerf(_core, function () { return "HttpManager:_sendBatches"; }, function (perfEvt) {
|
|
if (perfEvt) {
|
|
theBatches = theBatches.slice(0);
|
|
}
|
|
var droppedBatches = [];
|
|
var thePayload = null;
|
|
var serializationStart = getTime();
|
|
var sendInterface = _sendInterfaces[sendType] || (isSynchronous_1 ? _sendInterfaces[1 ] : _sendInterfaces[0 ]);
|
|
var sendTransport = sendInterface && sendInterface._transport;
|
|
var isReducedPayload = _canHaveReducedPayload && (_isUnloading || _isBeaconPayload(sendType) || (sendTransport === 3 || (sendInterface._isSync && sendTransport === 2 )));
|
|
while (_canSendPayload(theBatches, sendType, retryCount)) {
|
|
var theBatch = theBatches.shift();
|
|
if (theBatch && theBatch.count() > 0) {
|
|
if (!_killSwitch.isTenantKilled(theBatch.iKey())) {
|
|
thePayload = thePayload || _serializer.createPayload(retryCount, isTeardown, isSynchronous_1, isReducedPayload, sendReason, sendType);
|
|
if (!_serializer.appendPayload(thePayload, theBatch, maxEventsPerBatch)) {
|
|
_doPayloadSend(thePayload, serializationStart, getTime(), sendReason);
|
|
serializationStart = getTime();
|
|
theBatches = [theBatch].concat(theBatches);
|
|
thePayload = null;
|
|
}
|
|
else if (thePayload.overflow !== null) {
|
|
theBatches = [thePayload.overflow].concat(theBatches);
|
|
thePayload.overflow = null;
|
|
_doPayloadSend(thePayload, serializationStart, getTime(), sendReason);
|
|
serializationStart = getTime();
|
|
thePayload = null;
|
|
}
|
|
}
|
|
else {
|
|
droppedBatches.push(theBatch);
|
|
}
|
|
}
|
|
}
|
|
if (thePayload) {
|
|
_doPayloadSend(thePayload, serializationStart, getTime(), sendReason);
|
|
}
|
|
if (theBatches.length > 0) {
|
|
_batchQueue = theBatches.concat(_batchQueue);
|
|
}
|
|
_sendBatchesNotification(droppedBatches, 8004 , sendType);
|
|
}, function () { return ({ batches: _createDebugBatches(orgBatches_1), retryCount: retryCount, isTeardown: isTeardown, isSynchronous: isSynchronous_1, sendReason: sendReason, useSendBeacon: _isBeaconPayload(sendType), sendType: sendType }); }, !isSynchronous_1);
|
|
}
|
|
catch (ex) {
|
|
_throwInternal(_logger, 2 , 48 , "Unexpected Exception sending batch: " + dumpObj(ex));
|
|
}
|
|
}
|
|
function _buildRequestDetails(thePayload, useHeaders) {
|
|
var requestDetails = {
|
|
url: _urlString,
|
|
hdrs: {},
|
|
useHdrs: false
|
|
};
|
|
if (!useHeaders) {
|
|
objForEachKey(_headers, function (name, value) {
|
|
if (_collectorHeaderToQs[name]) {
|
|
_addRequestDetails(requestDetails, _collectorHeaderToQs[name], value, false);
|
|
}
|
|
else {
|
|
requestDetails.hdrs[name] = value;
|
|
requestDetails.useHdrs = true;
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
requestDetails.hdrs = extend(requestDetails.hdrs, _headers);
|
|
requestDetails.useHdrs = (objKeys(requestDetails.hdrs).length > 0);
|
|
}
|
|
_addRequestDetails(requestDetails, STR_CLIENT_ID, "NO_AUTH", useHeaders);
|
|
_addRequestDetails(requestDetails, STR_CLIENT_VERSION, FullVersionString, useHeaders);
|
|
var apiQsKeys = STR_EMPTY;
|
|
arrForEach(thePayload.apiKeys, function (apiKey) {
|
|
if (apiQsKeys.length > 0) {
|
|
apiQsKeys += ",";
|
|
}
|
|
apiQsKeys += apiKey;
|
|
});
|
|
_addRequestDetails(requestDetails, STR_API_KEY, apiQsKeys, useHeaders);
|
|
_addRequestDetails(requestDetails, STR_UPLOAD_TIME, dateNow().toString(), useHeaders);
|
|
var msfpc = _getMsfpc(thePayload);
|
|
if (isValueAssigned(msfpc)) {
|
|
requestDetails.url += "&ext.intweb.msfpc=" + msfpc;
|
|
}
|
|
if (_clockSkewManager.shouldAddClockSkewHeaders()) {
|
|
_addRequestDetails(requestDetails, STR_TIME_DELTA_TO_APPLY, _clockSkewManager.getClockSkewHeaderValue(), useHeaders);
|
|
}
|
|
if (_core.getWParam) {
|
|
var wParam = _core.getWParam();
|
|
if (wParam >= 0) {
|
|
requestDetails.url += "&w=" + wParam;
|
|
}
|
|
}
|
|
for (var i = 0; i < _queryStringParameters.length; i++) {
|
|
requestDetails.url += "&" + _queryStringParameters[i].name + "=" + _queryStringParameters[i].value;
|
|
}
|
|
return requestDetails;
|
|
}
|
|
function _setTimingValue(timings, name, value) {
|
|
timings[name] = timings[name] || {};
|
|
timings[name][_postManager.identifier] = value;
|
|
}
|
|
function _doPayloadSend(thePayload, serializationStart, serializationCompleted, sendReason) {
|
|
if (thePayload && thePayload.payloadBlob && thePayload.payloadBlob.length > 0) {
|
|
var useSendHook_1 = !!_self.sendHook;
|
|
var sendInterface_1 = _sendInterfaces[thePayload.sendType];
|
|
if (!_isBeaconPayload(thePayload.sendType) && thePayload.isBeacon && thePayload.sendReason === 2 ) {
|
|
sendInterface_1 = _sendInterfaces[2 ] || _sendInterfaces[3 ] || sendInterface_1;
|
|
}
|
|
var useHeaders_1 = _useHeaders;
|
|
if (thePayload.isBeacon || sendInterface_1._transport === 3 ) {
|
|
useHeaders_1 = false;
|
|
}
|
|
var requestDetails_1 = _buildRequestDetails(thePayload, useHeaders_1);
|
|
useHeaders_1 = useHeaders_1 || requestDetails_1.useHdrs;
|
|
var sendEventStart_1 = getTime();
|
|
doPerf(_core, function () { return "HttpManager:_doPayloadSend"; }, function () {
|
|
for (var batchLp = 0; batchLp < thePayload.batches.length; batchLp++) {
|
|
var theBatch = thePayload.batches[batchLp];
|
|
var theEvents = theBatch.events();
|
|
for (var evtLp = 0; evtLp < theEvents.length; evtLp++) {
|
|
var telemetryItem = theEvents[evtLp];
|
|
if (_enableEventTimings) {
|
|
var timings = telemetryItem.timings = telemetryItem.timings || {};
|
|
_setTimingValue(timings, "sendEventStart", sendEventStart_1);
|
|
_setTimingValue(timings, "serializationStart", serializationStart);
|
|
_setTimingValue(timings, "serializationCompleted", serializationCompleted);
|
|
}
|
|
telemetryItem[strSendAttempt] > 0 ? telemetryItem[strSendAttempt]++ : telemetryItem[strSendAttempt] = 1;
|
|
}
|
|
}
|
|
_sendBatchesNotification(thePayload.batches, (1000 + (sendReason || 0 )), thePayload.sendType, true);
|
|
var orgPayloadData = {
|
|
data: thePayload.payloadBlob,
|
|
urlString: requestDetails_1.url,
|
|
headers: requestDetails_1.hdrs,
|
|
_thePayload: thePayload,
|
|
_sendReason: sendReason,
|
|
timeout: _xhrTimeout,
|
|
disableXhrSync: _disableXhrSync,
|
|
disableFetchKeepAlive: _disableFetchKeepAlive
|
|
};
|
|
if (useHeaders_1) {
|
|
if (!_hasHeader(orgPayloadData.headers, STR_CACHE_CONTROL)) {
|
|
orgPayloadData.headers[STR_CACHE_CONTROL] = DEFAULT_CACHE_CONTROL;
|
|
}
|
|
if (!_hasHeader(orgPayloadData.headers, STR_CONTENT_TYPE_HEADER)) {
|
|
orgPayloadData.headers[STR_CONTENT_TYPE_HEADER] = DEFAULT_CONTENT_TYPE;
|
|
}
|
|
}
|
|
var sender = null;
|
|
if (sendInterface_1) {
|
|
sender = function (payload) {
|
|
_clockSkewManager.firstRequestSent();
|
|
var onComplete = function (status, headers) {
|
|
_retryRequestIfNeeded(status, headers, thePayload, sendReason);
|
|
};
|
|
var isSync = thePayload.isTeardown || thePayload.isSync;
|
|
try {
|
|
sendInterface_1.sendPOST(payload, onComplete, isSync);
|
|
if (_self.sendListener) {
|
|
_self.sendListener(orgPayloadData, payload, isSync, thePayload.isBeacon);
|
|
}
|
|
}
|
|
catch (ex) {
|
|
_warnToConsole(_logger, "Unexpected exception sending payload. Ex:" + dumpObj(ex));
|
|
_doOnComplete(onComplete, 0, {});
|
|
}
|
|
};
|
|
}
|
|
doPerf(_core, function () { return "HttpManager:_doPayloadSend.sender"; }, function () {
|
|
if (sender) {
|
|
if (thePayload.sendType === 0 ) {
|
|
_outstandingRequests++;
|
|
}
|
|
if (useSendHook_1 && !thePayload.isBeacon && sendInterface_1._transport !== 3 ) {
|
|
var hookData_1 = {
|
|
data: orgPayloadData.data,
|
|
urlString: orgPayloadData.urlString,
|
|
headers: extend({}, orgPayloadData.headers),
|
|
timeout: orgPayloadData.timeout,
|
|
disableXhrSync: orgPayloadData.disableXhrSync,
|
|
disableFetchKeepAlive: orgPayloadData.disableFetchKeepAlive
|
|
};
|
|
var senderCalled_1 = false;
|
|
doPerf(_core, function () { return "HttpManager:_doPayloadSend.sendHook"; }, function () {
|
|
try {
|
|
_self.sendHook(hookData_1, function (payload) {
|
|
senderCalled_1 = true;
|
|
if (!_customHttpInterface && !payload._thePayload) {
|
|
payload._thePayload = payload._thePayload || orgPayloadData._thePayload;
|
|
payload._sendReason = payload._sendReason || orgPayloadData._sendReason;
|
|
}
|
|
sender(payload);
|
|
}, thePayload.isSync || thePayload.isTeardown);
|
|
}
|
|
catch (ex) {
|
|
if (!senderCalled_1) {
|
|
sender(orgPayloadData);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
else {
|
|
sender(orgPayloadData);
|
|
}
|
|
}
|
|
});
|
|
}, function () { return ({ thePayload: thePayload, serializationStart: serializationStart, serializationCompleted: serializationCompleted, sendReason: sendReason }); }, thePayload.isSync);
|
|
}
|
|
if (thePayload.sizeExceed && thePayload.sizeExceed.length > 0) {
|
|
_sendBatchesNotification(thePayload.sizeExceed, 8003 , thePayload.sendType);
|
|
}
|
|
if (thePayload.failedEvts && thePayload.failedEvts.length > 0) {
|
|
_sendBatchesNotification(thePayload.failedEvts, 8002 , thePayload.sendType);
|
|
}
|
|
}
|
|
function _addEventCompletedTimings(theEvents, sendEventCompleted) {
|
|
if (_enableEventTimings) {
|
|
arrForEach(theEvents, function (theEvent) {
|
|
var timings = theEvent.timings = theEvent.timings || {};
|
|
_setTimingValue(timings, "sendEventCompleted", sendEventCompleted);
|
|
});
|
|
}
|
|
}
|
|
function _retryRequestIfNeeded(status, headers, thePayload, sendReason) {
|
|
var reason = 9000 ;
|
|
var droppedBatches = null;
|
|
var isRetrying = false;
|
|
var backOffTrans = false;
|
|
try {
|
|
var shouldRetry = true;
|
|
if (typeof status !== strShimUndefined) {
|
|
if (headers) {
|
|
_clockSkewManager.setClockSkew(headers[STR_TIME_DELTA_HEADER]);
|
|
var killDuration = headers[STR_KILL_DURATION_HEADER] || headers["kill-duration-seconds"];
|
|
arrForEach(_killSwitch.setKillSwitchTenants(headers[STR_KILL_TOKENS_HEADER], killDuration), function (killToken) {
|
|
arrForEach(thePayload.batches, function (theBatch) {
|
|
if (theBatch.iKey() === killToken) {
|
|
droppedBatches = droppedBatches || [];
|
|
var removedEvents = theBatch.split(0);
|
|
thePayload.numEvents -= removedEvents.count();
|
|
droppedBatches.push(removedEvents);
|
|
}
|
|
});
|
|
});
|
|
}
|
|
if (status == 200 || status == 204) {
|
|
reason = 200 ;
|
|
return;
|
|
}
|
|
if (!retryPolicyShouldRetryForStatus(status) || thePayload.numEvents <= 0) {
|
|
shouldRetry = false;
|
|
}
|
|
reason = 9000 + (status % 1000);
|
|
}
|
|
if (shouldRetry) {
|
|
reason = 100 ;
|
|
var retryCount_1 = thePayload.retryCnt;
|
|
if (thePayload.sendType === 0 ) {
|
|
if (retryCount_1 < maxRequestRetriesBeforeBackoff) {
|
|
isRetrying = true;
|
|
_doAction(function () {
|
|
if (thePayload.sendType === 0 ) {
|
|
_outstandingRequests--;
|
|
}
|
|
_sendBatches(thePayload.batches, retryCount_1 + 1, thePayload.isTeardown, _isUnloading ? 2 : thePayload.sendType, 5 );
|
|
}, _isUnloading, retryPolicyGetMillisToBackoffForRetry(retryCount_1));
|
|
}
|
|
else {
|
|
backOffTrans = true;
|
|
if (_isUnloading) {
|
|
reason = 8001 ;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
finally {
|
|
if (!isRetrying) {
|
|
_clockSkewManager.setClockSkew();
|
|
_handleRequestFinished(thePayload, reason, sendReason, backOffTrans);
|
|
}
|
|
_sendBatchesNotification(droppedBatches, 8004 , thePayload.sendType);
|
|
}
|
|
}
|
|
function _handleRequestFinished(thePayload, batchReason, sendReason, backOffTrans) {
|
|
try {
|
|
if (backOffTrans) {
|
|
_postManager._backOffTransmission();
|
|
}
|
|
if (batchReason === 200 ) {
|
|
if (!backOffTrans && !thePayload.isSync) {
|
|
_postManager._clearBackOff();
|
|
}
|
|
_addCompleteTimings(thePayload.batches);
|
|
}
|
|
_sendBatchesNotification(thePayload.batches, batchReason, thePayload.sendType, true);
|
|
}
|
|
finally {
|
|
if (thePayload.sendType === 0 ) {
|
|
_outstandingRequests--;
|
|
if (sendReason !== 5 ) {
|
|
_self.sendQueuedRequests(thePayload.sendType, sendReason);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
function _addCompleteTimings(theBatches) {
|
|
if (_enableEventTimings) {
|
|
var sendEventCompleted_1 = getTime();
|
|
arrForEach(theBatches, function (theBatch) {
|
|
if (theBatch && theBatch.count() > 0) {
|
|
_addEventCompletedTimings(theBatch.events(), sendEventCompleted_1);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function _doAction(cb, isSync, interval) {
|
|
if (isSync) {
|
|
cb();
|
|
}
|
|
else {
|
|
timeoutOverride.set(cb, interval);
|
|
}
|
|
}
|
|
function _convertAllHeadersToMap(headersString) {
|
|
var headers = {};
|
|
if (isString(headersString)) {
|
|
var headersArray = strTrim(headersString).split(/[\r\n]+/);
|
|
arrForEach(headersArray, function (headerEntry) {
|
|
if (headerEntry) {
|
|
var idx = headerEntry.indexOf(": ");
|
|
if (idx !== -1) {
|
|
var header = strTrim(headerEntry.substring(0, idx)).toLowerCase();
|
|
var value = strTrim(headerEntry.substring(idx + 1));
|
|
headers[header] = value;
|
|
}
|
|
else {
|
|
headers[strTrim(headerEntry)] = 1;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
return headers;
|
|
}
|
|
function _getMsfpc(thePayload) {
|
|
for (var lp = 0; lp < thePayload.batches.length; lp++) {
|
|
var msfpc = thePayload.batches[lp].Msfpc();
|
|
if (msfpc) {
|
|
return encodeURIComponent(msfpc);
|
|
}
|
|
}
|
|
return STR_EMPTY;
|
|
}
|
|
function _handleCollectorResponse(responseText) {
|
|
var responseHandlers = _self._responseHandlers;
|
|
try {
|
|
for (var i = 0; i < responseHandlers.length; i++) {
|
|
try {
|
|
responseHandlers[i](responseText);
|
|
}
|
|
catch (e) {
|
|
_throwInternal(_logger, 1 , 519 , "Response handler failed: " + e);
|
|
}
|
|
}
|
|
if (responseText) {
|
|
var response = JSON.parse(responseText);
|
|
if (isValueAssigned(response.webResult) && isValueAssigned(response.webResult[STR_MSFPC])) {
|
|
_cookieMgr.set("MSFPC", response.webResult[STR_MSFPC], 365 * 86400);
|
|
}
|
|
}
|
|
}
|
|
catch (ex) {
|
|
}
|
|
}
|
|
function _sendBatchesNotification(theBatches, batchReason, sendType, sendSync) {
|
|
if (theBatches && theBatches.length > 0 && actions) {
|
|
var theAction_1 = actions[_getNotificationAction(batchReason)];
|
|
if (theAction_1) {
|
|
var isSyncRequest_1 = sendType !== 0 ;
|
|
doPerf(_core, function () { return "HttpManager:_sendBatchesNotification"; }, function () {
|
|
_doAction(function () {
|
|
try {
|
|
theAction_1.call(actions, theBatches, batchReason, isSyncRequest_1, sendType);
|
|
}
|
|
catch (e) {
|
|
_throwInternal(_logger, 1 , 74 , "send request notification failed: " + e);
|
|
}
|
|
}, sendSync || isSyncRequest_1, 0);
|
|
}, function () { return ({ batches: _createDebugBatches(theBatches), reason: batchReason, isSync: isSyncRequest_1, sendSync: sendSync, sendType: sendType }); }, !isSyncRequest_1);
|
|
}
|
|
}
|
|
}
|
|
function _getNotificationAction(reason) {
|
|
var action = _eventActionMap[reason];
|
|
if (!isValueAssigned(action)) {
|
|
action = STR_OTHER;
|
|
if (reason >= 9000 && reason <= 9999 ) {
|
|
action = STR_RESPONSE_FAIL;
|
|
}
|
|
else if (reason >= 8000 && reason <= 8999 ) {
|
|
action = STR_DROPPED;
|
|
}
|
|
else if (reason >= 1000 && reason <= 1999 ) {
|
|
action = STR_SENDING;
|
|
}
|
|
}
|
|
return action;
|
|
}
|
|
});
|
|
}
|
|
HttpManager.__ieDyn=1;
|
|
return HttpManager;
|
|
}());
|
|
|
|
function defaultSetTimeout(callback, ms) {
|
|
var args = [];
|
|
for (var _i = 2; _i < arguments.length; _i++) {
|
|
args[_i - 2] = arguments[_i];
|
|
}
|
|
return setTimeout(callback, ms, args);
|
|
}
|
|
function defaultClearTimeout(timeoutId) {
|
|
clearTimeout(timeoutId);
|
|
}
|
|
function createTimeoutWrapper(argSetTimeout, argClearTimeout) {
|
|
return {
|
|
set: argSetTimeout || defaultSetTimeout,
|
|
clear: argClearTimeout || defaultClearTimeout
|
|
};
|
|
}
|
|
|
|
var FlushCheckTimer = 0.250;
|
|
var MaxNumberEventPerBatch = 500;
|
|
var EventsDroppedAtOneTime = 20;
|
|
var MaxSendAttempts = 6;
|
|
var MaxSyncUnloadSendAttempts = 2;
|
|
var MaxBackoffCount = 4;
|
|
var MaxConnections = 2;
|
|
var MaxRequestRetriesBeforeBackoff = 1;
|
|
var strEventsDiscarded = "eventsDiscarded";
|
|
var strOverrideInstrumentationKey = "overrideInstrumentationKey";
|
|
var strMaxEventRetryAttempts = "maxEventRetryAttempts";
|
|
var strMaxUnloadEventRetryAttempts = "maxUnloadEventRetryAttempts";
|
|
var strAddUnloadCb = "addUnloadCb";
|
|
var PostChannel = /** @class */ (function (_super) {
|
|
__extendsFn(PostChannel, _super);
|
|
function PostChannel() {
|
|
var _this = _super.call(this) || this;
|
|
_this.identifier = "PostChannel";
|
|
_this.priority = 1011;
|
|
_this.version = '3.2.13';
|
|
var _config;
|
|
var _isTeardownCalled = false;
|
|
var _flushCallbackQueue = [];
|
|
var _flushCallbackTimerId = null;
|
|
var _paused = false;
|
|
var _immediateQueueSize = 0;
|
|
var _immediateQueueSizeLimit = 500;
|
|
var _queueSize = 0;
|
|
var _queueSizeLimit = 10000;
|
|
var _profiles = {};
|
|
var _currentProfile = RT_PROFILE;
|
|
var _scheduledTimerId = null;
|
|
var _immediateTimerId = null;
|
|
var _currentBackoffCount = 0;
|
|
var _timerCount = 0;
|
|
var _xhrOverride;
|
|
var _httpManager;
|
|
var _batchQueues = {};
|
|
var _autoFlushEventsLimit;
|
|
var _autoFlushBatchLimit;
|
|
var _delayedBatchSendLatency = -1;
|
|
var _delayedBatchReason;
|
|
var _optimizeObject = true;
|
|
var _isPageUnloadTriggered = false;
|
|
var _maxEventSendAttempts = MaxSendAttempts;
|
|
var _maxUnloadEventSendAttempts = MaxSyncUnloadSendAttempts;
|
|
var _evtNamespace;
|
|
var _timeoutWrapper;
|
|
dynamicProto(PostChannel, _this, function (_self, _base) {
|
|
_initDefaults();
|
|
_self["_getDbgPlgTargets"] = function () {
|
|
return [_httpManager];
|
|
};
|
|
_self.initialize = function (coreConfig, core, extensions) {
|
|
doPerf(core, function () { return "PostChannel:initialize"; }, function () {
|
|
var extendedCore = core;
|
|
_base.initialize(coreConfig, core, extensions);
|
|
try {
|
|
var hasAddUnloadCb = !!core[strAddUnloadCb];
|
|
_evtNamespace = mergeEvtNamespace(createUniqueNamespace(_self.identifier), core.evtNamespace && core.evtNamespace());
|
|
var ctx = _self._getTelCtx();
|
|
coreConfig.extensionConfig[_self.identifier] = coreConfig.extensionConfig[_self.identifier] || {};
|
|
_config = ctx.getExtCfg(_self.identifier);
|
|
_timeoutWrapper = createTimeoutWrapper(_config.setTimeoutOverride, _config.clearTimeoutOverride);
|
|
_optimizeObject = !_config.disableOptimizeObj && isChromium();
|
|
_hookWParam(extendedCore);
|
|
if (_config.eventsLimitInMem > 0) {
|
|
_queueSizeLimit = _config.eventsLimitInMem;
|
|
}
|
|
if (_config.immediateEventLimit > 0) {
|
|
_immediateQueueSizeLimit = _config.immediateEventLimit;
|
|
}
|
|
if (_config.autoFlushEventsLimit > 0) {
|
|
_autoFlushEventsLimit = _config.autoFlushEventsLimit;
|
|
}
|
|
if (isNumber(_config[strMaxEventRetryAttempts])) {
|
|
_maxEventSendAttempts = _config[strMaxEventRetryAttempts];
|
|
}
|
|
if (isNumber(_config[strMaxUnloadEventRetryAttempts])) {
|
|
_maxUnloadEventSendAttempts = _config[strMaxUnloadEventRetryAttempts];
|
|
}
|
|
_setAutoLimits();
|
|
if (_config.httpXHROverride && _config.httpXHROverride.sendPOST) {
|
|
_xhrOverride = _config.httpXHROverride;
|
|
}
|
|
if (isValueAssigned(coreConfig.anonCookieName)) {
|
|
_httpManager.addQueryStringParameter("anoncknm", coreConfig.anonCookieName);
|
|
}
|
|
_httpManager.sendHook = _config.payloadPreprocessor;
|
|
_httpManager.sendListener = _config.payloadListener;
|
|
var endpointUrl = _config.overrideEndpointUrl ? _config.overrideEndpointUrl : coreConfig.endpointUrl;
|
|
_self._notificationManager = core.getNotifyMgr();
|
|
_httpManager.initialize(endpointUrl, _self.core, _self, _xhrOverride, _config);
|
|
var excludePageUnloadEvents = coreConfig.disablePageUnloadEvents || [];
|
|
addPageUnloadEventListener(_handleUnloadEvents, excludePageUnloadEvents, _evtNamespace);
|
|
addPageHideEventListener(_handleUnloadEvents, excludePageUnloadEvents, _evtNamespace);
|
|
addPageShowEventListener(_handleShowEvents, coreConfig.disablePageShowEvents, _evtNamespace);
|
|
}
|
|
catch (e) {
|
|
_self.setInitialized(false);
|
|
throw e;
|
|
}
|
|
}, function () { return ({ coreConfig: coreConfig, core: core, extensions: extensions }); });
|
|
};
|
|
_self.processTelemetry = function (ev, itemCtx) {
|
|
setProcessTelemetryTimings(ev, _self.identifier);
|
|
itemCtx = _self._getTelCtx(itemCtx);
|
|
var channelConfig = itemCtx.getExtCfg(_self.identifier);
|
|
var disableTelemetry = !!_config.disableTelemetry;
|
|
if (channelConfig) {
|
|
disableTelemetry = disableTelemetry || !!channelConfig.disableTelemetry;
|
|
}
|
|
var event = ev;
|
|
if (!disableTelemetry && !_isTeardownCalled) {
|
|
if (_config[strOverrideInstrumentationKey]) {
|
|
event.iKey = _config[strOverrideInstrumentationKey];
|
|
}
|
|
if (channelConfig && channelConfig[strOverrideInstrumentationKey]) {
|
|
event.iKey = channelConfig[strOverrideInstrumentationKey];
|
|
}
|
|
_addEventToQueues(event, true);
|
|
if (_isPageUnloadTriggered) {
|
|
_releaseAllQueues(2 , 2 );
|
|
}
|
|
else {
|
|
_scheduleTimer();
|
|
}
|
|
}
|
|
_self.processNext(event, itemCtx);
|
|
};
|
|
_self._doTeardown = function (unloadCtx, unloadState) {
|
|
_releaseAllQueues(2 , 2 );
|
|
_isTeardownCalled = true;
|
|
_httpManager.teardown();
|
|
removePageUnloadEventListener(null, _evtNamespace);
|
|
removePageHideEventListener(null, _evtNamespace);
|
|
removePageShowEventListener(null, _evtNamespace);
|
|
_initDefaults();
|
|
};
|
|
function _hookWParam(extendedCore) {
|
|
var existingGetWParamMethod = extendedCore.getWParam;
|
|
extendedCore.getWParam = function () {
|
|
var wparam = 0;
|
|
if (_config.ignoreMc1Ms0CookieProcessing) {
|
|
wparam = wparam | 2;
|
|
}
|
|
return wparam | existingGetWParamMethod();
|
|
};
|
|
}
|
|
function _handleUnloadEvents(evt) {
|
|
var theEvt = evt || getWindow().event;
|
|
if (theEvt.type !== "beforeunload") {
|
|
_isPageUnloadTriggered = true;
|
|
_httpManager.setUnloading(_isPageUnloadTriggered);
|
|
}
|
|
_releaseAllQueues(2 , 2 );
|
|
}
|
|
function _handleShowEvents(evt) {
|
|
_isPageUnloadTriggered = false;
|
|
_httpManager.setUnloading(_isPageUnloadTriggered);
|
|
}
|
|
function _addEventToQueues(event, append) {
|
|
if (!event.sendAttempt) {
|
|
event.sendAttempt = 0;
|
|
}
|
|
if (!event.latency) {
|
|
event.latency = 1 ;
|
|
}
|
|
if (event.ext && event.ext[STR_TRACE]) {
|
|
delete (event.ext[STR_TRACE]);
|
|
}
|
|
if (event.ext && event.ext[STR_USER] && event.ext[STR_USER]["id"]) {
|
|
delete (event.ext[STR_USER]["id"]);
|
|
}
|
|
if (_optimizeObject) {
|
|
event.ext = optimizeObject(event.ext);
|
|
if (event.baseData) {
|
|
event.baseData = optimizeObject(event.baseData);
|
|
}
|
|
if (event.data) {
|
|
event.data = optimizeObject(event.data);
|
|
}
|
|
}
|
|
if (event.sync) {
|
|
if (_currentBackoffCount || _paused) {
|
|
event.latency = 3 ;
|
|
event.sync = false;
|
|
}
|
|
else {
|
|
if (_httpManager) {
|
|
if (_optimizeObject) {
|
|
event = optimizeObject(event);
|
|
}
|
|
_httpManager.sendSynchronousBatch(EventBatch.create(event.iKey, [event]), event.sync === true ? 1 : event.sync, 3 );
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
var evtLatency = event.latency;
|
|
var queueSize = _queueSize;
|
|
var queueLimit = _queueSizeLimit;
|
|
if (evtLatency === 4 ) {
|
|
queueSize = _immediateQueueSize;
|
|
queueLimit = _immediateQueueSizeLimit;
|
|
}
|
|
var eventDropped = false;
|
|
if (queueSize < queueLimit) {
|
|
eventDropped = !_addEventToProperQueue(event, append);
|
|
}
|
|
else {
|
|
var dropLatency = 1 ;
|
|
var dropNumber = EventsDroppedAtOneTime;
|
|
if (evtLatency === 4 ) {
|
|
dropLatency = 4 ;
|
|
dropNumber = 1;
|
|
}
|
|
eventDropped = true;
|
|
if (_dropEventWithLatencyOrLess(event.iKey, event.latency, dropLatency, dropNumber)) {
|
|
eventDropped = !_addEventToProperQueue(event, append);
|
|
}
|
|
}
|
|
if (eventDropped) {
|
|
_notifyEvents(strEventsDiscarded, [event], EventsDiscardedReason.QueueFull);
|
|
}
|
|
}
|
|
_self.setEventQueueLimits = function (eventLimit, autoFlushLimit) {
|
|
_queueSizeLimit = eventLimit > 0 ? eventLimit : 10000;
|
|
_autoFlushEventsLimit = autoFlushLimit > 0 ? autoFlushLimit : 0;
|
|
_setAutoLimits();
|
|
var doFlush = _queueSize > eventLimit;
|
|
if (!doFlush && _autoFlushBatchLimit > 0) {
|
|
for (var latency = 1 ; !doFlush && latency <= 3 ; latency++) {
|
|
var batchQueue = _batchQueues[latency];
|
|
if (batchQueue && batchQueue.batches) {
|
|
arrForEach(batchQueue.batches, function (theBatch) {
|
|
if (theBatch && theBatch.count() >= _autoFlushBatchLimit) {
|
|
doFlush = true;
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
_performAutoFlush(true, doFlush);
|
|
};
|
|
_self.pause = function () {
|
|
_clearScheduledTimer();
|
|
_paused = true;
|
|
_httpManager.pause();
|
|
};
|
|
_self.resume = function () {
|
|
_paused = false;
|
|
_httpManager.resume();
|
|
_scheduleTimer();
|
|
};
|
|
_self.addResponseHandler = function (responseHandler) {
|
|
_httpManager._responseHandlers.push(responseHandler);
|
|
};
|
|
_self._loadTransmitProfiles = function (profiles) {
|
|
_resetTransmitProfiles();
|
|
objForEachKey(profiles, function (profileName, profileValue) {
|
|
var profLen = profileValue.length;
|
|
if (profLen >= 2) {
|
|
var directValue = (profLen > 2 ? profileValue[2] : 0);
|
|
profileValue.splice(0, profLen - 2);
|
|
if (profileValue[1] < 0) {
|
|
profileValue[0] = -1;
|
|
}
|
|
if (profileValue[1] > 0 && profileValue[0] > 0) {
|
|
var timerMultiplier = profileValue[0] / profileValue[1];
|
|
profileValue[0] = Math.ceil(timerMultiplier) * profileValue[1];
|
|
}
|
|
if (directValue >= 0 && profileValue[1] >= 0 && directValue > profileValue[1]) {
|
|
directValue = profileValue[1];
|
|
}
|
|
profileValue.push(directValue);
|
|
_profiles[profileName] = profileValue;
|
|
}
|
|
});
|
|
};
|
|
_self.flush = function (async, callback, sendReason) {
|
|
if (async === void 0) { async = true; }
|
|
if (!_paused) {
|
|
sendReason = sendReason || 1 ;
|
|
if (async) {
|
|
if (_flushCallbackTimerId == null) {
|
|
_clearScheduledTimer();
|
|
_queueBatches(1 , 0 , sendReason);
|
|
_flushCallbackTimerId = _createTimer(function () {
|
|
_flushCallbackTimerId = null;
|
|
_flushImpl(callback, sendReason);
|
|
}, 0);
|
|
}
|
|
else {
|
|
_flushCallbackQueue.push(callback);
|
|
}
|
|
}
|
|
else {
|
|
var cleared = _clearScheduledTimer();
|
|
_sendEventsForLatencyAndAbove(1 , 1 , sendReason);
|
|
if (callback !== null && callback !== undefined) {
|
|
callback();
|
|
}
|
|
if (cleared) {
|
|
_scheduleTimer();
|
|
}
|
|
}
|
|
}
|
|
};
|
|
_self.setMsaAuthTicket = function (ticket) {
|
|
_httpManager.addHeader(STR_MSA_DEVICE_TICKET, ticket);
|
|
};
|
|
_self.hasEvents = _hasEvents;
|
|
_self._setTransmitProfile = function (profileName) {
|
|
if (_currentProfile !== profileName && _profiles[profileName] !== undefined) {
|
|
_clearScheduledTimer();
|
|
_currentProfile = profileName;
|
|
_scheduleTimer();
|
|
}
|
|
};
|
|
function _sendEventsForLatencyAndAbove(latency, sendType, sendReason) {
|
|
var queued = _queueBatches(latency, sendType, sendReason);
|
|
_httpManager.sendQueuedRequests(sendType, sendReason);
|
|
return queued;
|
|
}
|
|
function _hasEvents() {
|
|
return _queueSize > 0;
|
|
}
|
|
function _scheduleTimer() {
|
|
if (_delayedBatchSendLatency >= 0 && _queueBatches(_delayedBatchSendLatency, 0 , _delayedBatchReason)) {
|
|
_httpManager.sendQueuedRequests(0 , _delayedBatchReason);
|
|
}
|
|
if (_immediateQueueSize > 0 && !_immediateTimerId && !_paused) {
|
|
var immediateTimeOut = _profiles[_currentProfile][2];
|
|
if (immediateTimeOut >= 0) {
|
|
_immediateTimerId = _createTimer(function () {
|
|
_immediateTimerId = null;
|
|
_sendEventsForLatencyAndAbove(4 , 0 , 1 );
|
|
_scheduleTimer();
|
|
}, immediateTimeOut);
|
|
}
|
|
}
|
|
var timeOut = _profiles[_currentProfile][1];
|
|
if (!_scheduledTimerId && !_flushCallbackTimerId && timeOut >= 0 && !_paused) {
|
|
if (_hasEvents()) {
|
|
_scheduledTimerId = _createTimer(function () {
|
|
_scheduledTimerId = null;
|
|
_sendEventsForLatencyAndAbove(_timerCount === 0 ? 3 : 1 , 0 , 1 );
|
|
_timerCount++;
|
|
_timerCount %= 2;
|
|
_scheduleTimer();
|
|
}, timeOut);
|
|
}
|
|
else {
|
|
_timerCount = 0;
|
|
}
|
|
}
|
|
}
|
|
_self._backOffTransmission = function () {
|
|
if (_currentBackoffCount < MaxBackoffCount) {
|
|
_currentBackoffCount++;
|
|
_clearScheduledTimer();
|
|
_scheduleTimer();
|
|
}
|
|
};
|
|
_self._clearBackOff = function () {
|
|
if (_currentBackoffCount) {
|
|
_currentBackoffCount = 0;
|
|
_clearScheduledTimer();
|
|
_scheduleTimer();
|
|
}
|
|
};
|
|
function _initDefaults() {
|
|
_config = null;
|
|
_isTeardownCalled = false;
|
|
_flushCallbackQueue = [];
|
|
_flushCallbackTimerId = null;
|
|
_paused = false;
|
|
_immediateQueueSize = 0;
|
|
_immediateQueueSizeLimit = 500;
|
|
_queueSize = 0;
|
|
_queueSizeLimit = 10000;
|
|
_profiles = {};
|
|
_currentProfile = RT_PROFILE;
|
|
_scheduledTimerId = null;
|
|
_immediateTimerId = null;
|
|
_currentBackoffCount = 0;
|
|
_timerCount = 0;
|
|
_xhrOverride = null;
|
|
_batchQueues = {};
|
|
_autoFlushEventsLimit = undefined;
|
|
_autoFlushBatchLimit = 0;
|
|
_delayedBatchSendLatency = -1;
|
|
_delayedBatchReason = null;
|
|
_optimizeObject = true;
|
|
_isPageUnloadTriggered = false;
|
|
_maxEventSendAttempts = MaxSendAttempts;
|
|
_maxUnloadEventSendAttempts = MaxSyncUnloadSendAttempts;
|
|
_evtNamespace = null;
|
|
_timeoutWrapper = createTimeoutWrapper();
|
|
_httpManager = new HttpManager(MaxNumberEventPerBatch, MaxConnections, MaxRequestRetriesBeforeBackoff, {
|
|
requeue: _requeueEvents,
|
|
send: _sendingEvent,
|
|
sent: _eventsSentEvent,
|
|
drop: _eventsDropped,
|
|
rspFail: _eventsResponseFail,
|
|
oth: _otherEvent
|
|
}, _timeoutWrapper);
|
|
_initializeProfiles();
|
|
_clearQueues();
|
|
_setAutoLimits();
|
|
}
|
|
function _createTimer(theTimerFunc, timeOut) {
|
|
if (timeOut === 0 && _currentBackoffCount) {
|
|
timeOut = 1;
|
|
}
|
|
var timerMultiplier = 1000;
|
|
if (_currentBackoffCount) {
|
|
timerMultiplier = retryPolicyGetMillisToBackoffForRetry(_currentBackoffCount - 1);
|
|
}
|
|
return _timeoutWrapper.set(theTimerFunc, timeOut * timerMultiplier);
|
|
}
|
|
function _clearScheduledTimer() {
|
|
if (_scheduledTimerId !== null) {
|
|
_timeoutWrapper.clear(_scheduledTimerId);
|
|
_scheduledTimerId = null;
|
|
_timerCount = 0;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function _releaseAllQueues(sendType, sendReason) {
|
|
_clearScheduledTimer();
|
|
if (_flushCallbackTimerId) {
|
|
_timeoutWrapper.clear(_flushCallbackTimerId);
|
|
_flushCallbackTimerId = null;
|
|
}
|
|
if (!_paused) {
|
|
_sendEventsForLatencyAndAbove(1 , sendType, sendReason);
|
|
}
|
|
}
|
|
function _clearQueues() {
|
|
_batchQueues[4 ] = {
|
|
batches: [],
|
|
iKeyMap: {}
|
|
};
|
|
_batchQueues[3 ] = {
|
|
batches: [],
|
|
iKeyMap: {}
|
|
};
|
|
_batchQueues[2 ] = {
|
|
batches: [],
|
|
iKeyMap: {}
|
|
};
|
|
_batchQueues[1 ] = {
|
|
batches: [],
|
|
iKeyMap: {}
|
|
};
|
|
}
|
|
function _getEventBatch(iKey, latency, create) {
|
|
var batchQueue = _batchQueues[latency];
|
|
if (!batchQueue) {
|
|
latency = 1 ;
|
|
batchQueue = _batchQueues[latency];
|
|
}
|
|
var eventBatch = batchQueue.iKeyMap[iKey];
|
|
if (!eventBatch && create) {
|
|
eventBatch = EventBatch.create(iKey);
|
|
batchQueue.batches.push(eventBatch);
|
|
batchQueue.iKeyMap[iKey] = eventBatch;
|
|
}
|
|
return eventBatch;
|
|
}
|
|
function _performAutoFlush(isAsync, doFlush) {
|
|
if (_httpManager.canSendRequest() && !_currentBackoffCount) {
|
|
if (_autoFlushEventsLimit > 0 && _queueSize > _autoFlushEventsLimit) {
|
|
doFlush = true;
|
|
}
|
|
if (doFlush && _flushCallbackTimerId == null) {
|
|
_self.flush(isAsync, null, 20 );
|
|
}
|
|
}
|
|
}
|
|
function _addEventToProperQueue(event, append) {
|
|
if (_optimizeObject) {
|
|
event = optimizeObject(event);
|
|
}
|
|
var latency = event.latency;
|
|
var eventBatch = _getEventBatch(event.iKey, latency, true);
|
|
if (eventBatch.addEvent(event)) {
|
|
if (latency !== 4 ) {
|
|
_queueSize++;
|
|
if (append && event.sendAttempt === 0) {
|
|
_performAutoFlush(!event.sync, _autoFlushBatchLimit > 0 && eventBatch.count() >= _autoFlushBatchLimit);
|
|
}
|
|
}
|
|
else {
|
|
_immediateQueueSize++;
|
|
}
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
function _dropEventWithLatencyOrLess(iKey, latency, currentLatency, dropNumber) {
|
|
while (currentLatency <= latency) {
|
|
var eventBatch = _getEventBatch(iKey, latency, true);
|
|
if (eventBatch && eventBatch.count() > 0) {
|
|
var droppedEvents = eventBatch.split(0, dropNumber);
|
|
var droppedCount = droppedEvents.count();
|
|
if (droppedCount > 0) {
|
|
if (currentLatency === 4 ) {
|
|
_immediateQueueSize -= droppedCount;
|
|
}
|
|
else {
|
|
_queueSize -= droppedCount;
|
|
}
|
|
_notifyBatchEvents(strEventsDiscarded, [droppedEvents], EventsDiscardedReason.QueueFull);
|
|
return true;
|
|
}
|
|
}
|
|
currentLatency++;
|
|
}
|
|
_resetQueueCounts();
|
|
return false;
|
|
}
|
|
function _resetQueueCounts() {
|
|
var immediateQueue = 0;
|
|
var normalQueue = 0;
|
|
var _loop_1 = function (latency) {
|
|
var batchQueue = _batchQueues[latency];
|
|
if (batchQueue && batchQueue.batches) {
|
|
arrForEach(batchQueue.batches, function (theBatch) {
|
|
if (latency === 4 ) {
|
|
immediateQueue += theBatch.count();
|
|
}
|
|
else {
|
|
normalQueue += theBatch.count();
|
|
}
|
|
});
|
|
}
|
|
};
|
|
for (var latency = 1 ; latency <= 4 ; latency++) {
|
|
_loop_1(latency);
|
|
}
|
|
_queueSize = normalQueue;
|
|
_immediateQueueSize = immediateQueue;
|
|
}
|
|
function _queueBatches(latency, sendType, sendReason) {
|
|
var eventsQueued = false;
|
|
var isAsync = sendType === 0 ;
|
|
if (!isAsync || _httpManager.canSendRequest()) {
|
|
doPerf(_self.core, function () { return "PostChannel._queueBatches"; }, function () {
|
|
var droppedEvents = [];
|
|
var latencyToProcess = 4 ;
|
|
while (latencyToProcess >= latency) {
|
|
var batchQueue = _batchQueues[latencyToProcess];
|
|
if (batchQueue && batchQueue.batches && batchQueue.batches.length > 0) {
|
|
arrForEach(batchQueue.batches, function (theBatch) {
|
|
if (!_httpManager.addBatch(theBatch)) {
|
|
droppedEvents = droppedEvents.concat(theBatch.events());
|
|
}
|
|
else {
|
|
eventsQueued = eventsQueued || (theBatch && theBatch.count() > 0);
|
|
}
|
|
if (latencyToProcess === 4 ) {
|
|
_immediateQueueSize -= theBatch.count();
|
|
}
|
|
else {
|
|
_queueSize -= theBatch.count();
|
|
}
|
|
});
|
|
batchQueue.batches = [];
|
|
batchQueue.iKeyMap = {};
|
|
}
|
|
latencyToProcess--;
|
|
}
|
|
if (droppedEvents.length > 0) {
|
|
_notifyEvents(strEventsDiscarded, droppedEvents, EventsDiscardedReason.KillSwitch);
|
|
}
|
|
if (eventsQueued && _delayedBatchSendLatency >= latency) {
|
|
_delayedBatchSendLatency = -1;
|
|
_delayedBatchReason = 0 ;
|
|
}
|
|
}, function () { return ({ latency: latency, sendType: sendType, sendReason: sendReason }); }, !isAsync);
|
|
}
|
|
else {
|
|
_delayedBatchSendLatency = _delayedBatchSendLatency >= 0 ? Math.min(_delayedBatchSendLatency, latency) : latency;
|
|
_delayedBatchReason = Math.max(_delayedBatchReason, sendReason);
|
|
}
|
|
return eventsQueued;
|
|
}
|
|
function _flushImpl(callback, sendReason) {
|
|
_sendEventsForLatencyAndAbove(1 , 0 , sendReason);
|
|
_resetQueueCounts();
|
|
_waitForIdleManager(function () {
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
if (_flushCallbackQueue.length > 0) {
|
|
_flushCallbackTimerId = _createTimer(function () {
|
|
_flushCallbackTimerId = null;
|
|
_flushImpl(_flushCallbackQueue.shift(), sendReason);
|
|
}, 0);
|
|
}
|
|
else {
|
|
_flushCallbackTimerId = null;
|
|
_scheduleTimer();
|
|
}
|
|
});
|
|
}
|
|
function _waitForIdleManager(callback) {
|
|
if (_httpManager.isCompletelyIdle()) {
|
|
callback();
|
|
}
|
|
else {
|
|
_flushCallbackTimerId = _createTimer(function () {
|
|
_flushCallbackTimerId = null;
|
|
_waitForIdleManager(callback);
|
|
}, FlushCheckTimer);
|
|
}
|
|
}
|
|
function _resetTransmitProfiles() {
|
|
_clearScheduledTimer();
|
|
_initializeProfiles();
|
|
_currentProfile = RT_PROFILE;
|
|
_scheduleTimer();
|
|
}
|
|
function _initializeProfiles() {
|
|
_profiles = {};
|
|
_profiles[RT_PROFILE] = [2, 1, 0];
|
|
_profiles[NRT_PROFILE] = [6, 3, 0];
|
|
_profiles[BE_PROFILE] = [18, 9, 0];
|
|
}
|
|
function _requeueEvents(batches, reason) {
|
|
var droppedEvents = [];
|
|
var maxSendAttempts = _maxEventSendAttempts;
|
|
if (_isPageUnloadTriggered) {
|
|
maxSendAttempts = _maxUnloadEventSendAttempts;
|
|
}
|
|
arrForEach(batches, function (theBatch) {
|
|
if (theBatch && theBatch.count() > 0) {
|
|
arrForEach(theBatch.events(), function (theEvent) {
|
|
if (theEvent) {
|
|
if (theEvent.sync) {
|
|
theEvent.latency = 4 ;
|
|
theEvent.sync = false;
|
|
}
|
|
if (theEvent.sendAttempt < maxSendAttempts) {
|
|
setProcessTelemetryTimings(theEvent, _self.identifier);
|
|
_addEventToQueues(theEvent, false);
|
|
}
|
|
else {
|
|
droppedEvents.push(theEvent);
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
if (droppedEvents.length > 0) {
|
|
_notifyEvents(strEventsDiscarded, droppedEvents, EventsDiscardedReason.NonRetryableStatus);
|
|
}
|
|
if (_isPageUnloadTriggered) {
|
|
_releaseAllQueues(2 , 2 );
|
|
}
|
|
}
|
|
function _callNotification(evtName, theArgs) {
|
|
var manager = (_self._notificationManager || {});
|
|
var notifyFunc = manager[evtName];
|
|
if (notifyFunc) {
|
|
try {
|
|
notifyFunc.apply(manager, theArgs);
|
|
}
|
|
catch (e) {
|
|
_throwInternal(_self.diagLog(), 1 , 74 , evtName + " notification failed: " + e);
|
|
}
|
|
}
|
|
}
|
|
function _notifyEvents(evtName, theEvents) {
|
|
var extraArgs = [];
|
|
for (var _i = 2; _i < arguments.length; _i++) {
|
|
extraArgs[_i - 2] = arguments[_i];
|
|
}
|
|
if (theEvents && theEvents.length > 0) {
|
|
_callNotification(evtName, [theEvents].concat(extraArgs));
|
|
}
|
|
}
|
|
function _notifyBatchEvents(evtName, batches) {
|
|
var extraArgs = [];
|
|
for (var _i = 2; _i < arguments.length; _i++) {
|
|
extraArgs[_i - 2] = arguments[_i];
|
|
}
|
|
if (batches && batches.length > 0) {
|
|
arrForEach(batches, function (theBatch) {
|
|
if (theBatch && theBatch.count() > 0) {
|
|
_callNotification(evtName, [theBatch.events()].concat(extraArgs));
|
|
}
|
|
});
|
|
}
|
|
}
|
|
function _sendingEvent(batches, reason, isSyncRequest) {
|
|
if (batches && batches.length > 0) {
|
|
_callNotification("eventsSendRequest", [(reason >= 1000 && reason <= 1999 ?
|
|
reason - 1000 :
|
|
0 ), isSyncRequest !== true]);
|
|
}
|
|
}
|
|
function _eventsSentEvent(batches, reason) {
|
|
_notifyBatchEvents("eventsSent", batches, reason);
|
|
_scheduleTimer();
|
|
}
|
|
function _eventsDropped(batches, reason) {
|
|
_notifyBatchEvents(strEventsDiscarded, batches, (reason >= 8000 && reason <= 8999 ?
|
|
reason - 8000 :
|
|
EventsDiscardedReason.Unknown));
|
|
}
|
|
function _eventsResponseFail(batches) {
|
|
_notifyBatchEvents(strEventsDiscarded, batches, EventsDiscardedReason.NonRetryableStatus);
|
|
_scheduleTimer();
|
|
}
|
|
function _otherEvent(batches, reason) {
|
|
_notifyBatchEvents(strEventsDiscarded, batches, EventsDiscardedReason.Unknown);
|
|
_scheduleTimer();
|
|
}
|
|
function _setAutoLimits() {
|
|
if (!_config || !_config.disableAutoBatchFlushLimit) {
|
|
_autoFlushBatchLimit = Math.max(MaxNumberEventPerBatch * (MaxConnections + 1), _queueSizeLimit / 6);
|
|
}
|
|
else {
|
|
_autoFlushBatchLimit = 0;
|
|
}
|
|
}
|
|
objDefineAccessors(_self, "_setTimeoutOverride", function () { return _timeoutWrapper.set; }, function (value) {
|
|
_timeoutWrapper = createTimeoutWrapper(value, _timeoutWrapper.clear);
|
|
});
|
|
objDefineAccessors(_self, "_clearTimeoutOverride", function () { return _timeoutWrapper.clear; }, function (value) {
|
|
_timeoutWrapper = createTimeoutWrapper(_timeoutWrapper.set, value);
|
|
});
|
|
});
|
|
return _this;
|
|
}
|
|
PostChannel.__ieDyn=1;
|
|
return PostChannel;
|
|
}(BaseTelemetryPlugin));
|
|
var PostChannel$1 = PostChannel;
|
|
|
|
exports.BE_PROFILE = BE_PROFILE;
|
|
exports.NRT_PROFILE = NRT_PROFILE;
|
|
exports.PostChannel = PostChannel$1;
|
|
exports.RT_PROFILE = RT_PROFILE;
|
|
|
|
}));
|