@macroui/event-tracker 1.3.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/event-tracker.cjs +4252 -879
- package/dist/event-tracker.cjs.map +1 -0
- package/dist/event-tracker.js +4252 -879
- package/dist/event-tracker.js.map +1 -0
- package/dist/event-tracker.min.js +2 -1
- package/dist/event-tracker.min.js.map +1 -0
- package/dist/event-tracker.mjs +4212 -880
- package/dist/event-tracker.mjs.map +1 -0
- package/dist/plugin/debug-sender.cjs +53 -2
- package/dist/plugin/debug-sender.mjs +53 -2
- package/dist/plugin/experiment.cjs +181 -0
- package/dist/plugin/experiment.cjs.map +1 -0
- package/dist/plugin/experiment.mjs +178 -0
- package/dist/plugin/experiment.mjs.map +1 -0
- package/dist/plugin/indexeddb-sender.cjs +51 -2
- package/dist/plugin/indexeddb-sender.mjs +51 -2
- package/dist/plugin/otel-bridge.cjs +164 -0
- package/dist/plugin/otel-bridge.cjs.map +1 -0
- package/dist/plugin/otel-bridge.mjs +162 -0
- package/dist/plugin/otel-bridge.mjs.map +1 -0
- package/dist/plugin/predictive-batcher.cjs +61 -0
- package/dist/plugin/predictive-batcher.cjs.map +1 -0
- package/dist/plugin/predictive-batcher.mjs +58 -0
- package/dist/plugin/predictive-batcher.mjs.map +1 -0
- package/dist/plugin/webview-bridge.cjs +83 -31
- package/dist/plugin/webview-bridge.mjs +83 -31
- package/dist/stats.cjs +148 -0
- package/dist/stats.cjs.map +1 -0
- package/dist/stats.mjs +145 -0
- package/dist/stats.mjs.map +1 -0
- package/dist/types/core/env.d.ts +2 -0
- package/dist/types/core/failed-queue.d.ts +19 -2
- package/dist/types/core/idle.d.ts +23 -0
- package/dist/types/core/payload-signer.d.ts +31 -0
- package/dist/types/core/pii.d.ts +46 -0
- package/dist/types/core/platform.d.ts +23 -0
- package/dist/types/core/privacy.d.ts +42 -0
- package/dist/types/core/replay.d.ts +41 -0
- package/dist/types/core/retry-policy.d.ts +11 -8
- package/dist/types/core/send-pipeline.d.ts +5 -1
- package/dist/types/core/stats.d.ts +77 -0
- package/dist/types/core/tracker.d.ts +7 -1
- package/dist/types/core/wasm-crypto.d.ts +28 -0
- package/dist/types/edge/index.d.ts +41 -0
- package/dist/types/federation.d.ts +34 -0
- package/dist/types/index.d.ts +42 -1
- package/dist/types/plugins/audience-sync/index.d.ts +67 -0
- package/dist/types/plugins/cross-domain/index.d.ts +20 -0
- package/dist/types/plugins/csp-compliant/index.d.ts +17 -0
- package/dist/types/plugins/experiment/index.d.ts +43 -0
- package/dist/types/plugins/otel-bridge/index.d.ts +22 -0
- package/dist/types/plugins/otel-exporter/index.d.ts +50 -0
- package/dist/types/plugins/pii-detector/index.d.ts +8 -0
- package/dist/types/plugins/predictive-batcher/index.d.ts +29 -0
- package/dist/types/plugins/privacy/index.d.ts +19 -0
- package/dist/types/plugins/rate-limiter/index.d.ts +41 -0
- package/dist/types/plugins/schema-registry/index.d.ts +41 -0
- package/dist/types/plugins/webview-bridge/index.d.ts +33 -9
- package/dist/types/send/ajax-sender.d.ts +6 -1
- package/dist/types/send/batch-sender.d.ts +12 -1
- package/dist/types/send/encode.d.ts +13 -1
- package/dist/types/send/offscreen-sender.d.ts +25 -0
- package/dist/types/send/sender.d.ts +20 -3
- package/dist/types/send/ws-sender.d.ts +38 -0
- package/dist/types/types/config.d.ts +17 -1
- package/dist/types/types/index.d.ts +1 -1
- package/package.json +1 -1
- package/dist/types/types.test-d.d.ts +0 -5
- package/dist/types.test-d.ts +0 -103
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.cjs","sources":["../node_modules/tslib/tslib.es6.js","../src/core/stats.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/**\n * Sender 失败统计(v1.2.0)\n *\n * - 每个 sender 维护 attempts / success / failure / total_duration\n * - SDK 全局汇总\n * - 用户可 sdk.getStats() 查\n * - 自动每 60s 输出到 console(debug 模式)\n */\n\nimport type { SendType } from '../types/index.js';\n\nexport interface SenderStat {\n /** sender 名称(image / beacon / ajax / batch) */\n name: string;\n /** 尝试次数 */\n attempts: number;\n /** 成功次数 */\n success: number;\n /** 失败次数 */\n failure: number;\n /** 累计耗时(ms) */\n total_duration: number;\n /** 平均耗时(ms) */\n avg_duration: number;\n /** 最大单次耗时(ms) */\n max_duration: number;\n /** 最近一次失败原因 */\n last_error?: string;\n /** 最近一次失败时间戳 */\n last_error_at?: number;\n}\n\nexport interface StatsSnapshot {\n /** SDK 启动后累计发送次数 */\n total: number;\n /** 成功累计 */\n success: number;\n /** 失败累计 */\n failure: number;\n /** 重试累计 */\n retry: number;\n /** in-flight(当前未完成) */\n in_flight: number;\n /** flush 累计 */\n flush_count: number;\n /** 上次 flush 时间 */\n last_flush_at?: number;\n /** 每个 sender 统计 */\n by_sender: Record<string, SenderStat>;\n /** 时间戳 */\n taken_at: number;\n}\n\nexport class StatsCollector {\n private total = 0;\n private success = 0;\n private failure = 0;\n private retry = 0;\n private in_flight = 0;\n private flushCount = 0;\n private lastFlushAt?: number;\n private bySender: Map<string, SenderStat> = new Map();\n\n /** 记录一次发送开始 */\n recordStart(senderName: string): number {\n this.total++;\n this.in_flight++;\n const s = this.getOrCreate(senderName);\n s.attempts++;\n return Date.now();\n }\n\n /** 记录一次发送成功 */\n recordSuccess(senderName: string, startTs: number): void {\n this.success++;\n this.in_flight = Math.max(0, this.in_flight - 1);\n const s = this.getOrCreate(senderName);\n const dur = Date.now() - startTs;\n s.total_duration += dur;\n s.avg_duration = s.total_duration / s.attempts;\n if (dur > s.max_duration) s.max_duration = dur;\n }\n\n /** 记录一次发送失败 */\n recordFailure(senderName: string, startTs: number, err: Error): void {\n this.failure++;\n this.in_flight = Math.max(0, this.in_flight - 1);\n const s = this.getOrCreate(senderName);\n s.failure++;\n s.last_error = err.message;\n s.last_error_at = Date.now();\n }\n\n /** 记录一次重试 */\n recordRetry(): void {\n this.retry++;\n }\n\n /** 记录一次 flush */\n recordFlush(): void {\n this.flushCount++;\n this.lastFlushAt = Date.now();\n }\n\n /** 拍快照 */\n snapshot(): StatsSnapshot {\n const by_sender: Record<string, SenderStat> = {};\n for (const [k, v] of this.bySender) {\n by_sender[k] = { ...v };\n }\n return {\n total: this.total,\n success: this.success,\n failure: this.failure,\n retry: this.retry,\n in_flight: this.in_flight,\n flush_count: this.flushCount,\n last_flush_at: this.lastFlushAt,\n by_sender,\n taken_at: Date.now(),\n };\n }\n\n /** 重置 */\n reset(): void {\n this.total = 0;\n this.success = 0;\n this.failure = 0;\n this.retry = 0;\n this.in_flight = 0;\n this.flushCount = 0;\n this.lastFlushAt = undefined;\n this.bySender.clear();\n }\n\n /** 列出所有 sender 名 */\n listSenders(): string[] {\n return Array.from(this.bySender.keys());\n }\n\n private getOrCreate(name: string): SenderStat {\n let s = this.bySender.get(name);\n if (!s) {\n s = {\n name,\n attempts: 0,\n success: 0,\n failure: 0,\n total_duration: 0,\n avg_duration: 0,\n max_duration: 0,\n };\n this.bySender.set(name, s);\n }\n return s;\n }\n}\n\n/** 全局单例 */\nexport const GLOBAL_STATS = new StatsCollector();"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/stats.mjs
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/******************************************************************************
|
|
2
|
+
Copyright (c) Microsoft Corporation.
|
|
3
|
+
|
|
4
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
5
|
+
purpose with or without fee is hereby granted.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
8
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
9
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
10
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
11
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
12
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
13
|
+
PERFORMANCE OF THIS SOFTWARE.
|
|
14
|
+
***************************************************************************** */
|
|
15
|
+
/* global Reflect, Promise, SuppressedError, Symbol, Iterator */
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
var __assign = function() {
|
|
19
|
+
__assign = Object.assign || function __assign(t) {
|
|
20
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
21
|
+
s = arguments[i];
|
|
22
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
|
23
|
+
}
|
|
24
|
+
return t;
|
|
25
|
+
};
|
|
26
|
+
return __assign.apply(this, arguments);
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
30
|
+
var e = new Error(message);
|
|
31
|
+
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Sender 失败统计(v1.2.0)
|
|
36
|
+
*
|
|
37
|
+
* - 每个 sender 维护 attempts / success / failure / total_duration
|
|
38
|
+
* - SDK 全局汇总
|
|
39
|
+
* - 用户可 sdk.getStats() 查
|
|
40
|
+
* - 自动每 60s 输出到 console(debug 模式)
|
|
41
|
+
*/
|
|
42
|
+
var StatsCollector = /** @class */ (function () {
|
|
43
|
+
function StatsCollector() {
|
|
44
|
+
this.total = 0;
|
|
45
|
+
this.success = 0;
|
|
46
|
+
this.failure = 0;
|
|
47
|
+
this.retry = 0;
|
|
48
|
+
this.in_flight = 0;
|
|
49
|
+
this.flushCount = 0;
|
|
50
|
+
this.bySender = new Map();
|
|
51
|
+
}
|
|
52
|
+
/** 记录一次发送开始 */
|
|
53
|
+
StatsCollector.prototype.recordStart = function (senderName) {
|
|
54
|
+
this.total++;
|
|
55
|
+
this.in_flight++;
|
|
56
|
+
var s = this.getOrCreate(senderName);
|
|
57
|
+
s.attempts++;
|
|
58
|
+
return Date.now();
|
|
59
|
+
};
|
|
60
|
+
/** 记录一次发送成功 */
|
|
61
|
+
StatsCollector.prototype.recordSuccess = function (senderName, startTs) {
|
|
62
|
+
this.success++;
|
|
63
|
+
this.in_flight = Math.max(0, this.in_flight - 1);
|
|
64
|
+
var s = this.getOrCreate(senderName);
|
|
65
|
+
var dur = Date.now() - startTs;
|
|
66
|
+
s.total_duration += dur;
|
|
67
|
+
s.avg_duration = s.total_duration / s.attempts;
|
|
68
|
+
if (dur > s.max_duration)
|
|
69
|
+
s.max_duration = dur;
|
|
70
|
+
};
|
|
71
|
+
/** 记录一次发送失败 */
|
|
72
|
+
StatsCollector.prototype.recordFailure = function (senderName, startTs, err) {
|
|
73
|
+
this.failure++;
|
|
74
|
+
this.in_flight = Math.max(0, this.in_flight - 1);
|
|
75
|
+
var s = this.getOrCreate(senderName);
|
|
76
|
+
s.failure++;
|
|
77
|
+
s.last_error = err.message;
|
|
78
|
+
s.last_error_at = Date.now();
|
|
79
|
+
};
|
|
80
|
+
/** 记录一次重试 */
|
|
81
|
+
StatsCollector.prototype.recordRetry = function () {
|
|
82
|
+
this.retry++;
|
|
83
|
+
};
|
|
84
|
+
/** 记录一次 flush */
|
|
85
|
+
StatsCollector.prototype.recordFlush = function () {
|
|
86
|
+
this.flushCount++;
|
|
87
|
+
this.lastFlushAt = Date.now();
|
|
88
|
+
};
|
|
89
|
+
/** 拍快照 */
|
|
90
|
+
StatsCollector.prototype.snapshot = function () {
|
|
91
|
+
var by_sender = {};
|
|
92
|
+
for (var _i = 0, _a = this.bySender; _i < _a.length; _i++) {
|
|
93
|
+
var _b = _a[_i], k = _b[0], v = _b[1];
|
|
94
|
+
by_sender[k] = __assign({}, v);
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
total: this.total,
|
|
98
|
+
success: this.success,
|
|
99
|
+
failure: this.failure,
|
|
100
|
+
retry: this.retry,
|
|
101
|
+
in_flight: this.in_flight,
|
|
102
|
+
flush_count: this.flushCount,
|
|
103
|
+
last_flush_at: this.lastFlushAt,
|
|
104
|
+
by_sender: by_sender,
|
|
105
|
+
taken_at: Date.now(),
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
/** 重置 */
|
|
109
|
+
StatsCollector.prototype.reset = function () {
|
|
110
|
+
this.total = 0;
|
|
111
|
+
this.success = 0;
|
|
112
|
+
this.failure = 0;
|
|
113
|
+
this.retry = 0;
|
|
114
|
+
this.in_flight = 0;
|
|
115
|
+
this.flushCount = 0;
|
|
116
|
+
this.lastFlushAt = undefined;
|
|
117
|
+
this.bySender.clear();
|
|
118
|
+
};
|
|
119
|
+
/** 列出所有 sender 名 */
|
|
120
|
+
StatsCollector.prototype.listSenders = function () {
|
|
121
|
+
return Array.from(this.bySender.keys());
|
|
122
|
+
};
|
|
123
|
+
StatsCollector.prototype.getOrCreate = function (name) {
|
|
124
|
+
var s = this.bySender.get(name);
|
|
125
|
+
if (!s) {
|
|
126
|
+
s = {
|
|
127
|
+
name: name,
|
|
128
|
+
attempts: 0,
|
|
129
|
+
success: 0,
|
|
130
|
+
failure: 0,
|
|
131
|
+
total_duration: 0,
|
|
132
|
+
avg_duration: 0,
|
|
133
|
+
max_duration: 0,
|
|
134
|
+
};
|
|
135
|
+
this.bySender.set(name, s);
|
|
136
|
+
}
|
|
137
|
+
return s;
|
|
138
|
+
};
|
|
139
|
+
return StatsCollector;
|
|
140
|
+
}());
|
|
141
|
+
/** 全局单例 */
|
|
142
|
+
var GLOBAL_STATS = new StatsCollector();
|
|
143
|
+
|
|
144
|
+
export { GLOBAL_STATS, StatsCollector };
|
|
145
|
+
//# sourceMappingURL=stats.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.mjs","sources":["../node_modules/tslib/tslib.es6.js","../src/core/stats.ts"],"sourcesContent":["/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\r\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\r\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\r\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\r\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\r\n var _, done = false;\r\n for (var i = decorators.length - 1; i >= 0; i--) {\r\n var context = {};\r\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\r\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\r\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\r\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\r\n if (kind === \"accessor\") {\r\n if (result === void 0) continue;\r\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\r\n if (_ = accept(result.get)) descriptor.get = _;\r\n if (_ = accept(result.set)) descriptor.set = _;\r\n if (_ = accept(result.init)) initializers.unshift(_);\r\n }\r\n else if (_ = accept(result)) {\r\n if (kind === \"field\") initializers.unshift(_);\r\n else descriptor[key] = _;\r\n }\r\n }\r\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\r\n done = true;\r\n};\r\n\r\nexport function __runInitializers(thisArg, initializers, value) {\r\n var useValue = arguments.length > 2;\r\n for (var i = 0; i < initializers.length; i++) {\r\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\r\n }\r\n return useValue ? value : void 0;\r\n};\r\n\r\nexport function __propKey(x) {\r\n return typeof x === \"symbol\" ? x : \"\".concat(x);\r\n};\r\n\r\nexport function __setFunctionName(f, name, prefix) {\r\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\r\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\r\n};\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\r\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n var desc = Object.getOwnPropertyDescriptor(m, k);\r\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\r\n desc = { enumerable: true, get: function() { return m[k]; } };\r\n }\r\n Object.defineProperty(o, k2, desc);\r\n}) : (function(o, m, k, k2) {\r\n if (k2 === undefined) k2 = k;\r\n o[k2] = m[k];\r\n});\r\n\r\nexport function __exportStar(m, o) {\r\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\n/** @deprecated */\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n}\r\n\r\nexport function __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || Array.prototype.slice.call(from));\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\r\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nvar __setModuleDefault = Object.create ? (function(o, v) {\r\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\r\n}) : function(o, v) {\r\n o[\"default\"] = v;\r\n};\r\n\r\nvar ownKeys = function(o) {\r\n ownKeys = Object.getOwnPropertyNames || function (o) {\r\n var ar = [];\r\n for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;\r\n return ar;\r\n };\r\n return ownKeys(o);\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== \"default\") __createBinding(result, mod, k[i]);\r\n __setModuleDefault(result, mod);\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\r\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\r\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\r\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\r\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\r\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\r\n}\r\n\r\nexport function __classPrivateFieldIn(state, receiver) {\r\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\r\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\r\n}\r\n\r\nexport function __addDisposableResource(env, value, async) {\r\n if (value !== null && value !== void 0) {\r\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\r\n var dispose, inner;\r\n if (async) {\r\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\r\n dispose = value[Symbol.asyncDispose];\r\n }\r\n if (dispose === void 0) {\r\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\r\n dispose = value[Symbol.dispose];\r\n if (async) inner = dispose;\r\n }\r\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\r\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\r\n env.stack.push({ value: value, dispose: dispose, async: async });\r\n }\r\n else if (async) {\r\n env.stack.push({ async: true });\r\n }\r\n return value;\r\n\r\n}\r\n\r\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\r\n\r\nexport function __disposeResources(env) {\r\n function fail(e) {\r\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\r\n env.hasError = true;\r\n }\r\n var r, s = 0;\r\n function next() {\r\n while (r = env.stack.pop()) {\r\n try {\r\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\r\n if (r.dispose) {\r\n var result = r.dispose.call(r.value);\r\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\r\n }\r\n else s |= 1;\r\n }\r\n catch (e) {\r\n fail(e);\r\n }\r\n }\r\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\r\n if (env.hasError) throw env.error;\r\n }\r\n return next();\r\n}\r\n\r\nexport function __rewriteRelativeImportExtension(path, preserveJsx) {\r\n if (typeof path === \"string\" && /^\\.\\.?\\//.test(path)) {\r\n return path.replace(/\\.(tsx)$|((?:\\.d)?)((?:\\.[^./]+?)?)\\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {\r\n return tsx ? preserveJsx ? \".jsx\" : \".js\" : d && (!ext || !cm) ? m : (d + ext + \".\" + cm.toLowerCase() + \"js\");\r\n });\r\n }\r\n return path;\r\n}\r\n\r\nexport default {\r\n __extends: __extends,\r\n __assign: __assign,\r\n __rest: __rest,\r\n __decorate: __decorate,\r\n __param: __param,\r\n __esDecorate: __esDecorate,\r\n __runInitializers: __runInitializers,\r\n __propKey: __propKey,\r\n __setFunctionName: __setFunctionName,\r\n __metadata: __metadata,\r\n __awaiter: __awaiter,\r\n __generator: __generator,\r\n __createBinding: __createBinding,\r\n __exportStar: __exportStar,\r\n __values: __values,\r\n __read: __read,\r\n __spread: __spread,\r\n __spreadArrays: __spreadArrays,\r\n __spreadArray: __spreadArray,\r\n __await: __await,\r\n __asyncGenerator: __asyncGenerator,\r\n __asyncDelegator: __asyncDelegator,\r\n __asyncValues: __asyncValues,\r\n __makeTemplateObject: __makeTemplateObject,\r\n __importStar: __importStar,\r\n __importDefault: __importDefault,\r\n __classPrivateFieldGet: __classPrivateFieldGet,\r\n __classPrivateFieldSet: __classPrivateFieldSet,\r\n __classPrivateFieldIn: __classPrivateFieldIn,\r\n __addDisposableResource: __addDisposableResource,\r\n __disposeResources: __disposeResources,\r\n __rewriteRelativeImportExtension: __rewriteRelativeImportExtension,\r\n};\r\n","/**\n * Sender 失败统计(v1.2.0)\n *\n * - 每个 sender 维护 attempts / success / failure / total_duration\n * - SDK 全局汇总\n * - 用户可 sdk.getStats() 查\n * - 自动每 60s 输出到 console(debug 模式)\n */\n\nimport type { SendType } from '../types/index.js';\n\nexport interface SenderStat {\n /** sender 名称(image / beacon / ajax / batch) */\n name: string;\n /** 尝试次数 */\n attempts: number;\n /** 成功次数 */\n success: number;\n /** 失败次数 */\n failure: number;\n /** 累计耗时(ms) */\n total_duration: number;\n /** 平均耗时(ms) */\n avg_duration: number;\n /** 最大单次耗时(ms) */\n max_duration: number;\n /** 最近一次失败原因 */\n last_error?: string;\n /** 最近一次失败时间戳 */\n last_error_at?: number;\n}\n\nexport interface StatsSnapshot {\n /** SDK 启动后累计发送次数 */\n total: number;\n /** 成功累计 */\n success: number;\n /** 失败累计 */\n failure: number;\n /** 重试累计 */\n retry: number;\n /** in-flight(当前未完成) */\n in_flight: number;\n /** flush 累计 */\n flush_count: number;\n /** 上次 flush 时间 */\n last_flush_at?: number;\n /** 每个 sender 统计 */\n by_sender: Record<string, SenderStat>;\n /** 时间戳 */\n taken_at: number;\n}\n\nexport class StatsCollector {\n private total = 0;\n private success = 0;\n private failure = 0;\n private retry = 0;\n private in_flight = 0;\n private flushCount = 0;\n private lastFlushAt?: number;\n private bySender: Map<string, SenderStat> = new Map();\n\n /** 记录一次发送开始 */\n recordStart(senderName: string): number {\n this.total++;\n this.in_flight++;\n const s = this.getOrCreate(senderName);\n s.attempts++;\n return Date.now();\n }\n\n /** 记录一次发送成功 */\n recordSuccess(senderName: string, startTs: number): void {\n this.success++;\n this.in_flight = Math.max(0, this.in_flight - 1);\n const s = this.getOrCreate(senderName);\n const dur = Date.now() - startTs;\n s.total_duration += dur;\n s.avg_duration = s.total_duration / s.attempts;\n if (dur > s.max_duration) s.max_duration = dur;\n }\n\n /** 记录一次发送失败 */\n recordFailure(senderName: string, startTs: number, err: Error): void {\n this.failure++;\n this.in_flight = Math.max(0, this.in_flight - 1);\n const s = this.getOrCreate(senderName);\n s.failure++;\n s.last_error = err.message;\n s.last_error_at = Date.now();\n }\n\n /** 记录一次重试 */\n recordRetry(): void {\n this.retry++;\n }\n\n /** 记录一次 flush */\n recordFlush(): void {\n this.flushCount++;\n this.lastFlushAt = Date.now();\n }\n\n /** 拍快照 */\n snapshot(): StatsSnapshot {\n const by_sender: Record<string, SenderStat> = {};\n for (const [k, v] of this.bySender) {\n by_sender[k] = { ...v };\n }\n return {\n total: this.total,\n success: this.success,\n failure: this.failure,\n retry: this.retry,\n in_flight: this.in_flight,\n flush_count: this.flushCount,\n last_flush_at: this.lastFlushAt,\n by_sender,\n taken_at: Date.now(),\n };\n }\n\n /** 重置 */\n reset(): void {\n this.total = 0;\n this.success = 0;\n this.failure = 0;\n this.retry = 0;\n this.in_flight = 0;\n this.flushCount = 0;\n this.lastFlushAt = undefined;\n this.bySender.clear();\n }\n\n /** 列出所有 sender 名 */\n listSenders(): string[] {\n return Array.from(this.bySender.keys());\n }\n\n private getOrCreate(name: string): SenderStat {\n let s = this.bySender.get(name);\n if (!s) {\n s = {\n name,\n attempts: 0,\n success: 0,\n failure: 0,\n total_duration: 0,\n avg_duration: 0,\n max_duration: 0,\n };\n this.bySender.set(name, s);\n }\n return s;\n }\n}\n\n/** 全局单例 */\nexport const GLOBAL_STATS = new StatsCollector();"],"names":[],"mappings":"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","x_google_ignoreList":[0]}
|
package/dist/types/core/env.d.ts
CHANGED
|
@@ -8,3 +8,5 @@ export declare function hasCookie(): boolean;
|
|
|
8
8
|
export declare function hasBeacon(): boolean;
|
|
9
9
|
export declare function hasFetch(): boolean;
|
|
10
10
|
export declare function hasImage(): boolean;
|
|
11
|
+
export declare function hasCompressionStream(): boolean;
|
|
12
|
+
export declare function hasBroadcastChannel(): boolean;
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* 失败队列(v1.2.0)
|
|
3
|
+
*
|
|
3
4
|
* - 失败事件写入 localStorage(et_failed_queue)
|
|
4
|
-
* - 下次启动时优先 flush
|
|
5
|
+
* - 下次启动时优先 flush(drain)
|
|
5
6
|
* - 上限 50 条
|
|
7
|
+
* - 单飞锁:同一时刻只有一个 drain 在跑
|
|
8
|
+
* - AbortSignal 支持:drain 中断后保留队列
|
|
6
9
|
*/
|
|
7
10
|
import type { EventData } from '../types/index.js';
|
|
8
11
|
import { encodeBatch } from '../send/encode.js';
|
|
9
12
|
export declare class FailedQueue {
|
|
10
13
|
private config;
|
|
14
|
+
private draining;
|
|
15
|
+
private drainPromise;
|
|
16
|
+
private drainAbort;
|
|
11
17
|
constructor(config?: {
|
|
12
18
|
max?: number;
|
|
13
19
|
encryptor?: (s: string) => string | Promise<string>;
|
|
@@ -20,5 +26,16 @@ export declare class FailedQueue {
|
|
|
20
26
|
clear(): void;
|
|
21
27
|
/** 取走全部(同时清空) */
|
|
22
28
|
takeAll(): EventData[];
|
|
29
|
+
/** 队列大小 */
|
|
30
|
+
size(): number;
|
|
31
|
+
/**
|
|
32
|
+
* 单飞 drain:同一时刻只有一个 drain 在跑,后续 drain 直接复用 promise
|
|
33
|
+
* @param sender 实际发送函数
|
|
34
|
+
* @returns Promise<number> 实际发送成功条数
|
|
35
|
+
*/
|
|
36
|
+
drain(sender: (events: EventData[]) => Promise<number>): Promise<number>;
|
|
37
|
+
/** 取消正在跑的 drain(保留队列) */
|
|
38
|
+
abortDrain(reason?: string): void;
|
|
39
|
+
private _drain;
|
|
23
40
|
}
|
|
24
41
|
export { encodeBatch };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idle Scheduler(v1.3.0)
|
|
3
|
+
*
|
|
4
|
+
* - 用 requestIdleCallback(fallback setTimeout)调度低优先级任务
|
|
5
|
+
* - 首屏 TTI 不阻塞
|
|
6
|
+
* - 适用场景:preset property 计算 / 插件 install / stage 注册
|
|
7
|
+
*/
|
|
8
|
+
export type IdleCallback = (deadline: {
|
|
9
|
+
didTimeout: boolean;
|
|
10
|
+
timeRemaining: () => number;
|
|
11
|
+
}) => void;
|
|
12
|
+
export interface IdleScheduler {
|
|
13
|
+
schedule(fn: IdleCallback, opts?: {
|
|
14
|
+
timeout?: number;
|
|
15
|
+
}): number;
|
|
16
|
+
cancel(handle: number): void;
|
|
17
|
+
}
|
|
18
|
+
export declare function createIdleScheduler(): IdleScheduler;
|
|
19
|
+
export declare const globalIdleScheduler: IdleScheduler;
|
|
20
|
+
/**
|
|
21
|
+
* 当浏览器空闲时再跑(timeout fallback 200ms)
|
|
22
|
+
*/
|
|
23
|
+
export declare function whenIdle(fn: IdleCallback, timeout?: number): () => void;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Payload 完整性签名(v1.3.0)
|
|
3
|
+
*
|
|
4
|
+
* - 用 identity_secret 对 payload 做 HMAC-SHA256
|
|
5
|
+
* - 通过 X-Payload-Sig 头传到服务端
|
|
6
|
+
* - 服务端用同一 secret 校验
|
|
7
|
+
* - 支持异步签名(Web Crypto)
|
|
8
|
+
*/
|
|
9
|
+
export interface SignOptions {
|
|
10
|
+
secret: string;
|
|
11
|
+
/** salt(可选,时间戳 / distinct_id 拼接) */
|
|
12
|
+
salt?: string;
|
|
13
|
+
}
|
|
14
|
+
/** 异步 HMAC-SHA256 */
|
|
15
|
+
export declare function hmacSign(payload: string, opts: SignOptions): Promise<string>;
|
|
16
|
+
/** 同步 fallback(仅 Node crypto 环境) */
|
|
17
|
+
export declare function hmacSignSync(payload: string, opts: SignOptions): string;
|
|
18
|
+
/** 验证签名 */
|
|
19
|
+
export declare function hmacVerify(payload: string, signature: string, opts: SignOptions): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* 在 SendContext 上挂载签名 + 自动给 AJAX 请求加 X-Payload-Sig
|
|
22
|
+
*/
|
|
23
|
+
export interface SignedContext {
|
|
24
|
+
config: {
|
|
25
|
+
identity_secret?: string;
|
|
26
|
+
};
|
|
27
|
+
logger?: {
|
|
28
|
+
warn: (msg: string, e?: unknown) => void;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
export declare function signPayload(payload: string, ctx: SignedContext, distinctId?: string): Promise<string | null>;
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PII 自动检测与脱敏(v1.3.0)
|
|
3
|
+
*
|
|
4
|
+
* - 正则检测身份证 / 手机号 / 邮箱 / 银行卡 / IP
|
|
5
|
+
* - 默认行为:hash(保留可关联性)
|
|
6
|
+
* - 可配置:drop / mask / hash / passthrough
|
|
7
|
+
* - 仅在 sendDataStage 中对 properties 字段做处理
|
|
8
|
+
*/
|
|
9
|
+
export type PiiAction = 'drop' | 'mask' | 'hash' | 'pass';
|
|
10
|
+
export interface PiiPattern {
|
|
11
|
+
name: string;
|
|
12
|
+
/** 正则 */
|
|
13
|
+
re: RegExp;
|
|
14
|
+
action: PiiAction;
|
|
15
|
+
}
|
|
16
|
+
export declare const DEFAULT_PATTERNS: PiiPattern[];
|
|
17
|
+
export interface PiiOptions {
|
|
18
|
+
/** 自定义模式(在默认之后追加) */
|
|
19
|
+
patterns?: PiiPattern[];
|
|
20
|
+
/** 全局关闭 */
|
|
21
|
+
enabled?: boolean;
|
|
22
|
+
/** 白名单字段名(不处理) */
|
|
23
|
+
excludeKeys?: string[];
|
|
24
|
+
}
|
|
25
|
+
/** 简单 hash(fnv1a) */
|
|
26
|
+
export declare function fnv1a(s: string): string;
|
|
27
|
+
/** 脱敏:保留前 1 后 1 */
|
|
28
|
+
export declare function maskValue(v: string): string;
|
|
29
|
+
export declare class PiiDetector {
|
|
30
|
+
private patterns;
|
|
31
|
+
private exclude;
|
|
32
|
+
constructor(opts?: PiiOptions);
|
|
33
|
+
/** 对单个值做检测 */
|
|
34
|
+
scan(value: unknown): {
|
|
35
|
+
value: unknown;
|
|
36
|
+
hits: Array<{
|
|
37
|
+
name: string;
|
|
38
|
+
action: PiiAction;
|
|
39
|
+
}>;
|
|
40
|
+
};
|
|
41
|
+
/** 对整棵 properties 做扫描(递归) */
|
|
42
|
+
scanProperties(props: Record<string, unknown>): {
|
|
43
|
+
properties: Record<string, unknown>;
|
|
44
|
+
hits: number;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 平台适配层(v1.2.0)
|
|
3
|
+
*
|
|
4
|
+
* - 探测运行时:web / React Native / Node
|
|
5
|
+
* - 提供平台特定的 KVStore fallback(Node 用 Map,RN 用 AsyncStorage shim)
|
|
6
|
+
* - 默认 sender 在非 web 下做适配(beacon/image 禁用)
|
|
7
|
+
*/
|
|
8
|
+
import type { KVStore } from '../storage/store.js';
|
|
9
|
+
export type Platform = 'web' | 'rn' | 'node' | 'unknown';
|
|
10
|
+
export declare function detectPlatform(): Platform;
|
|
11
|
+
/**
|
|
12
|
+
* 自适应 KVStore
|
|
13
|
+
* - web:交给上层默认(cookie/localStorage)
|
|
14
|
+
* - rn:尝试 global.AsyncStorage,否则 MemoryStore
|
|
15
|
+
* - node:MemoryStore(后续可挂 fs adapter)
|
|
16
|
+
*/
|
|
17
|
+
export declare function platformStore(): KVStore;
|
|
18
|
+
/**
|
|
19
|
+
* 平台相关的 sender 过滤:
|
|
20
|
+
* - web:全部 sender 可用
|
|
21
|
+
* - rn/node:禁用 image/beacon(无 navigator),仅 ajax
|
|
22
|
+
*/
|
|
23
|
+
export declare function isPlatformSenderEnabled(name: string): boolean;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Privacy & Consent 管理(v1.3.0)
|
|
3
|
+
*
|
|
4
|
+
* - privacy_mode: 'off' | 'balanced' | 'strict'
|
|
5
|
+
* off: 不脱敏
|
|
6
|
+
* balanced: 按 excludeKeys 白名单 + 加密
|
|
7
|
+
* strict: 强制脱敏 IP/UA/distinct_id,事件打 PII 标记
|
|
8
|
+
* - Consent: grant(scope) / revoke(scope) / has(scope)
|
|
9
|
+
* scope: 'analytics' | 'personalization' | 'marketing' | 'all'
|
|
10
|
+
* 未授权时事件直接 drop + stats.dropped++
|
|
11
|
+
*/
|
|
12
|
+
import type { Logger } from './logger.js';
|
|
13
|
+
export type PrivacyMode = 'off' | 'balanced' | 'strict';
|
|
14
|
+
export type ConsentScope = 'analytics' | 'personalization' | 'marketing' | 'all';
|
|
15
|
+
export interface PrivacyState {
|
|
16
|
+
mode: PrivacyMode;
|
|
17
|
+
scopes: Set<ConsentScope>;
|
|
18
|
+
}
|
|
19
|
+
export declare class PrivacyManager {
|
|
20
|
+
private logger;
|
|
21
|
+
private state;
|
|
22
|
+
private storage;
|
|
23
|
+
private listeners;
|
|
24
|
+
constructor(logger: Logger);
|
|
25
|
+
setMode(mode: PrivacyMode): void;
|
|
26
|
+
getMode(): PrivacyMode;
|
|
27
|
+
/** 授权某个 scope */
|
|
28
|
+
grant(scope: ConsentScope): void;
|
|
29
|
+
/** 撤销某个 scope */
|
|
30
|
+
revoke(scope: ConsentScope): void;
|
|
31
|
+
/** 检查是否授权 */
|
|
32
|
+
has(scope: ConsentScope): boolean;
|
|
33
|
+
/** 是否应该上报此事件 */
|
|
34
|
+
shouldTrack(scope?: ConsentScope): boolean;
|
|
35
|
+
/** 订阅 state 变化 */
|
|
36
|
+
subscribe(fn: (s: PrivacyState) => void): () => void;
|
|
37
|
+
/** strict 模式下脱敏 properties */
|
|
38
|
+
applyPrivacy(props: Record<string, unknown>, mode?: PrivacyMode): Record<string, unknown>;
|
|
39
|
+
private loadFromStorage;
|
|
40
|
+
private persist;
|
|
41
|
+
private emit;
|
|
42
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Replay Engine(v1.3.0)
|
|
3
|
+
*
|
|
4
|
+
* - 把历史事件序列(JSON)喂回 SDK,重放真实交互链路
|
|
5
|
+
* - 基于时间戳的同步调度(speed 可调)
|
|
6
|
+
* - 输出每个 event 的回调 + 整体进度
|
|
7
|
+
* - 支持 pause/resume/seek
|
|
8
|
+
*/
|
|
9
|
+
export interface ReplayEvent {
|
|
10
|
+
type: string;
|
|
11
|
+
event?: string;
|
|
12
|
+
time: number;
|
|
13
|
+
properties?: Record<string, unknown>;
|
|
14
|
+
distinct_id?: string;
|
|
15
|
+
[k: string]: unknown;
|
|
16
|
+
}
|
|
17
|
+
export interface ReplayOptions {
|
|
18
|
+
/** 速率倍率(1 = 实时,2 = 2x) */
|
|
19
|
+
speed?: number;
|
|
20
|
+
/** 是否调用真实的 sdk.track(默认 true;false = dryRun 仅回调) */
|
|
21
|
+
callRealTrack?: boolean;
|
|
22
|
+
/** 起始时间偏移(ms),跳过前面这段时间 */
|
|
23
|
+
startOffsetMs?: number;
|
|
24
|
+
/** 进度回调 */
|
|
25
|
+
onProgress?: (info: {
|
|
26
|
+
current: number;
|
|
27
|
+
total: number;
|
|
28
|
+
percent: number;
|
|
29
|
+
}) => void;
|
|
30
|
+
/** 每条事件回调 */
|
|
31
|
+
onEvent?: (ev: ReplayEvent, i: number) => void;
|
|
32
|
+
/** 完成回调 */
|
|
33
|
+
onEnd?: () => void;
|
|
34
|
+
}
|
|
35
|
+
export interface ReplayHandle {
|
|
36
|
+
pause(): void;
|
|
37
|
+
resume(): void;
|
|
38
|
+
seek(index: number): void;
|
|
39
|
+
stop(): void;
|
|
40
|
+
}
|
|
41
|
+
export declare function createReplay(events: ReplayEvent[], opts?: ReplayOptions): ReplayHandle;
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 失败重试 +
|
|
3
|
-
*
|
|
4
|
-
* -
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
2
|
+
* 失败重试 + 退避(v1.2.0)
|
|
3
|
+
*
|
|
4
|
+
* - 指数退避(base 1s, cap 30s)
|
|
5
|
+
* - 全抖动(full jitter):sleep = random(0, base * 2^attempt)
|
|
6
|
+
* - 可配置 retry jitter type(off / equal / full / decorrelated)
|
|
7
|
+
* - 超过 max_retry_count / max_retry_duration 放弃
|
|
7
8
|
*/
|
|
8
9
|
import type { TrackerConfig } from '../types/index.js';
|
|
9
10
|
import type { Logger } from './logger.js';
|
|
@@ -11,6 +12,7 @@ export interface RetryConfig {
|
|
|
11
12
|
max_retry_count: number;
|
|
12
13
|
max_retry_duration: number;
|
|
13
14
|
}
|
|
15
|
+
export type JitterType = 'off' | 'equal' | 'full' | 'decorrelated';
|
|
14
16
|
/** 重试执行结果 */
|
|
15
17
|
export interface RetryResult {
|
|
16
18
|
ok: boolean;
|
|
@@ -20,9 +22,10 @@ export interface RetryResult {
|
|
|
20
22
|
export declare class RetryPolicy {
|
|
21
23
|
private config;
|
|
22
24
|
private logger;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
25
|
+
private jitter;
|
|
26
|
+
constructor(config: TrackerConfig, logger: Logger, jitter?: JitterType);
|
|
27
|
+
/** 计算本次重试要 sleep 多久(指数退避 + 抖动) */
|
|
28
|
+
backoff(attempt: number, baseMs?: number, capMs?: number): number;
|
|
26
29
|
/**
|
|
27
30
|
* 带重试执行 send 函数
|
|
28
31
|
* @param send 单次发送
|
|
@@ -12,6 +12,7 @@ import type { FailedQueue } from './failed-queue.js';
|
|
|
12
12
|
import type { BatchSender } from '../send/batch-sender.js';
|
|
13
13
|
import type { Sender } from '../send/sender.js';
|
|
14
14
|
import { Logger } from './logger.js';
|
|
15
|
+
import type { StatsCollector } from './stats.js';
|
|
15
16
|
export declare class SendPipeline {
|
|
16
17
|
private config;
|
|
17
18
|
private registry;
|
|
@@ -20,13 +21,16 @@ export declare class SendPipeline {
|
|
|
20
21
|
private retryPolicy;
|
|
21
22
|
private failedQueue;
|
|
22
23
|
private logger;
|
|
24
|
+
private stats?;
|
|
23
25
|
private pending;
|
|
24
26
|
private senders;
|
|
25
27
|
private batchSender?;
|
|
26
28
|
private abortControllers;
|
|
27
|
-
constructor(config: TrackerConfig, registry: PluginRegistry, identity: IdentityManager, presetProps: PresetPropertyBuilder, retryPolicy: RetryPolicy, failedQueue: FailedQueue, logger: Logger);
|
|
29
|
+
constructor(config: TrackerConfig, registry: PluginRegistry, identity: IdentityManager, presetProps: PresetPropertyBuilder, retryPolicy: RetryPolicy, failedQueue: FailedQueue, logger: Logger, stats?: StatsCollector | undefined);
|
|
28
30
|
setSenders(senders: Sender[]): void;
|
|
29
31
|
setBatchSender(b: BatchSender): void;
|
|
32
|
+
/** 构造共享的 SendContext(含 stats + logger + config) */
|
|
33
|
+
private makeCtx;
|
|
30
34
|
/** 构造事件对象 */
|
|
31
35
|
buildEvent(type: EventData['type'], opts?: {
|
|
32
36
|
event?: string;
|