stitchkit 0.115.0 → 0.117.0
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/CHANGELOG.md +67 -0
- package/dist/agent-runtime/coding-tool-paths.d.ts.map +1 -1
- package/dist/agent-runtime/run-acquisition.d.ts +9 -2
- package/dist/agent-runtime/run-acquisition.d.ts.map +1 -1
- package/dist/agent-runtime/run-execution.d.ts +3 -0
- package/dist/agent-runtime/run-execution.d.ts.map +1 -1
- package/dist/agent-runtime/run-failure.d.ts +4 -1
- package/dist/agent-runtime/run-failure.d.ts.map +1 -1
- package/dist/agent-runtime/run-store-retry.d.ts +8 -0
- package/dist/agent-runtime/run-store-retry.d.ts.map +1 -0
- package/dist/agent-runtime/run-terminal.d.ts.map +1 -1
- package/dist/agent-runtime/run-unacquired.d.ts +19 -0
- package/dist/agent-runtime/run-unacquired.d.ts.map +1 -0
- package/dist/agent-runtime/store-conformance.d.ts +8 -0
- package/dist/agent-runtime/store-conformance.d.ts.map +1 -1
- package/dist/agent-runtime/store-driver-contract.d.ts +5 -0
- package/dist/agent-runtime/store-driver-contract.d.ts.map +1 -1
- package/dist/agent-runtime/terminal-commit.d.ts +34 -4
- package/dist/agent-runtime/terminal-commit.d.ts.map +1 -1
- package/dist/entrypoints/agent-runtime/coding-tools.js +4 -4
- package/dist/entrypoints/agent-runtime/harness.js +4 -4
- package/dist/entrypoints/agent-runtime/sandbox.js +4 -4
- package/dist/entrypoints/agent-runtime/sqlite/bun.js +7 -7
- package/dist/entrypoints/agent-runtime/sqlite/node.js +7 -7
- package/dist/entrypoints/agent-runtime/testing.js +26 -8
- package/dist/entrypoints/agent-runtime.d.ts +1 -1
- package/dist/entrypoints/agent-runtime.d.ts.map +1 -1
- package/dist/entrypoints/agent-runtime.js +17 -15
- package/dist/entrypoints/application/diagnostic-journal.js +1 -1
- package/dist/entrypoints/application/directory-inbox.js +3 -3
- package/dist/entrypoints/cli/publish.js +2 -2
- package/dist/entrypoints/cli.js +3 -3
- package/dist/entrypoints/files.js +2 -2
- package/dist/entrypoints/primitives.js +51 -154
- package/dist/entrypoints/server.js +6 -6
- package/dist/entrypoints/telegram/grammy.js +2 -2
- package/dist/entrypoints/telegram.d.ts +1 -1
- package/dist/entrypoints/telegram.d.ts.map +1 -1
- package/dist/entrypoints/telegram.js +203 -70
- package/dist/entrypoints/tools.js +3 -3
- package/dist/entrypoints/tracking/contract.d.ts +11 -0
- package/dist/entrypoints/tracking/contract.d.ts.map +1 -0
- package/dist/entrypoints/tracking/contract.js +162 -0
- package/dist/entrypoints/tracking/performance.d.ts +8 -0
- package/dist/entrypoints/tracking/performance.d.ts.map +1 -0
- package/dist/entrypoints/tracking/performance.js +181 -0
- package/dist/entrypoints/tracking/server.d.ts +1 -0
- package/dist/entrypoints/tracking/server.d.ts.map +1 -1
- package/dist/entrypoints/tracking/server.js +40 -12
- package/dist/entrypoints/tracking.d.ts +4 -3
- package/dist/entrypoints/tracking.d.ts.map +1 -1
- package/dist/entrypoints/tracking.js +43 -143
- package/dist/entrypoints/xlsx.d.ts +4 -0
- package/dist/entrypoints/xlsx.d.ts.map +1 -0
- package/dist/entrypoints/xlsx.js +406 -0
- package/dist/{index-crmswbrt.js → index-073nw9qr.js} +8 -8
- package/dist/index-1f40z584.js +7 -0
- package/dist/{index-nregbbsc.js → index-6f49krb5.js} +1 -1
- package/dist/{index-fdk4r4r6.js → index-75ns2ybj.js} +1 -1
- package/dist/{index-x0ddbj85.js → index-arjmb6de.js} +36 -1
- package/dist/{index-944x38nv.js → index-cycp3r3e.js} +125 -182
- package/dist/{index-dx5cm9pc.js → index-ghtpfz4z.js} +9 -9
- package/dist/{index-n3v695sb.js → index-hdjmdwsj.js} +277 -96
- package/dist/{index-7yx8j6ay.js → index-n5sv4z0w.js} +12 -3
- package/dist/{index-zqkz4af9.js → index-nqxrm176.js} +1 -1
- package/dist/{index-j8kf56wx.js → index-q968hy6y.js} +1 -1
- package/dist/index-qezhmp51.js +242 -0
- package/dist/index-vv1sch8a.js +94 -0
- package/dist/{index-3qqdqwxe.js → index-w7jq3fz9.js} +25 -5
- package/dist/{index-fggxgbrk.js → index-xx1j310k.js} +165 -102
- package/dist/internal/contained-files.d.ts +10 -0
- package/dist/internal/contained-files.d.ts.map +1 -1
- package/dist/internal/exclusive-lock.d.ts.map +1 -1
- package/dist/primitives/decimal.d.ts +10 -0
- package/dist/primitives/decimal.d.ts.map +1 -1
- package/dist/primitives/index.d.ts +3 -1
- package/dist/primitives/index.d.ts.map +1 -1
- package/dist/primitives/money.d.ts +20 -0
- package/dist/primitives/money.d.ts.map +1 -1
- package/dist/primitives/quantity.d.ts.map +1 -1
- package/dist/primitives/rounding.d.ts +40 -0
- package/dist/primitives/rounding.d.ts.map +1 -0
- package/dist/telegram/budget-transformer.d.ts +6 -3
- package/dist/telegram/budget-transformer.d.ts.map +1 -1
- package/dist/telegram/not-dispatched.d.ts +2 -2
- package/dist/telegram/not-dispatched.d.ts.map +1 -1
- package/dist/telegram/outbound-budget.d.ts +72 -20
- package/dist/telegram/outbound-budget.d.ts.map +1 -1
- package/dist/telegram/outbound-cost.d.ts +5 -0
- package/dist/telegram/outbound-cost.d.ts.map +1 -0
- package/dist/telegram/outbound-pauses.d.ts +17 -0
- package/dist/telegram/outbound-pauses.d.ts.map +1 -0
- package/dist/telegram/outbound-queue.d.ts +17 -0
- package/dist/telegram/outbound-queue.d.ts.map +1 -0
- package/dist/tools/cli/view.d.ts +7 -1
- package/dist/tools/cli/view.d.ts.map +1 -1
- package/dist/tracking/attribution.d.ts +1 -1
- package/dist/tracking/attribution.d.ts.map +1 -1
- package/dist/tracking/client-visit.d.ts +3 -1
- package/dist/tracking/client-visit.d.ts.map +1 -1
- package/dist/tracking/client.d.ts.map +1 -1
- package/dist/tracking/performance/collector.d.ts +61 -0
- package/dist/tracking/performance/collector.d.ts.map +1 -0
- package/dist/tracking/performance/schema.d.ts +45 -0
- package/dist/tracking/performance/schema.d.ts.map +1 -0
- package/dist/tracking/performance/summary.d.ts +12 -0
- package/dist/tracking/performance/summary.d.ts.map +1 -0
- package/dist/tracking/privacy.d.ts +5 -0
- package/dist/tracking/privacy.d.ts.map +1 -0
- package/dist/tracking/server/telemetry-health.d.ts +31 -0
- package/dist/tracking/server/telemetry-health.d.ts.map +1 -0
- package/dist/xlsx/cells.d.ts +17 -0
- package/dist/xlsx/cells.d.ts.map +1 -0
- package/dist/xlsx/render.d.ts +11 -0
- package/dist/xlsx/render.d.ts.map +1 -0
- package/dist/xlsx/schema.d.ts +119 -0
- package/dist/xlsx/schema.d.ts.map +1 -0
- package/dist/xlsx/zip.d.ts +13 -0
- package/dist/xlsx/zip.d.ts.map +1 -0
- package/llms/agent-runtime.2.txt +40 -16
- package/llms/agent-runtime.3.txt +17 -0
- package/llms/agent-runtime.txt +6 -3
- package/llms/cli.txt +3 -1
- package/llms/primitives.txt +21 -0
- package/llms/stitchkit.txt +9 -6
- package/llms/telegram.txt +39 -12
- package/llms/tracking-contract.txt +32 -0
- package/llms/tracking-performance.txt +21 -0
- package/llms/tracking-server.txt +1 -0
- package/llms/tracking.txt +75 -12
- package/llms/{upgrading-0.104.0-0.115.0.txt → upgrading-0.105.0-0.117.0.txt} +73 -124
- package/llms/{upgrading-0.44.0-0.61.0.txt → upgrading-0.44.0-0.62.0.txt} +120 -3
- package/llms/{upgrading-0.62.0-0.78.0.txt → upgrading-0.63.0-0.83.0.txt} +181 -120
- package/llms/{upgrading-0.79.0-0.103.13.txt → upgrading-0.84.0-0.104.0.txt} +124 -181
- package/llms/upgrading.txt +4 -4
- package/llms/xlsx.txt +107 -0
- package/llms-full.txt +390 -34
- package/llms.txt +15 -11
- package/package.json +27 -9
- package/dist/{index-z3d6smer.js → index-tdpmfks8.js} +5 -5
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_BOT_USER_AGENT_PATTERN2
|
|
3
|
+
} from "../../index-1f40z584.js";
|
|
4
|
+
import {
|
|
5
|
+
sendUnloadBeacon2,
|
|
6
|
+
redactTrackingText2
|
|
7
|
+
} from "../../index-vv1sch8a.js";
|
|
8
|
+
|
|
9
|
+
// src/tracking/performance/collector.ts
|
|
10
|
+
var DEFAULT_EARLY_DELAY_MS = 5000;
|
|
11
|
+
var IDLE_TIMEOUT_MS = 2000;
|
|
12
|
+
var PENDING_KEY = "stitchkit:performance:pending";
|
|
13
|
+
var MAX_PENDING = 20;
|
|
14
|
+
var MAX_MS = 3600000;
|
|
15
|
+
var MAX_CLS = 100;
|
|
16
|
+
var RESTORED_NAVIGATIONS = new Set(["back-forward-cache", "restore"]);
|
|
17
|
+
var LAB_AGENT = /lighthouse|gtmetrix/i;
|
|
18
|
+
function isLabUserAgent(userAgent) {
|
|
19
|
+
return LAB_AGENT.test(userAgent) || DEFAULT_BOT_USER_AGENT_PATTERN2.test(userAgent);
|
|
20
|
+
}
|
|
21
|
+
var INACTIVE = { stop: () => {
|
|
22
|
+
return;
|
|
23
|
+
} };
|
|
24
|
+
var running;
|
|
25
|
+
function sessionStore() {
|
|
26
|
+
try {
|
|
27
|
+
return typeof sessionStorage === "undefined" ? undefined : sessionStorage;
|
|
28
|
+
} catch {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function loadId() {
|
|
33
|
+
const bytes = crypto.getRandomValues(new Uint8Array(16));
|
|
34
|
+
return Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
35
|
+
}
|
|
36
|
+
function browserHost() {
|
|
37
|
+
const agent = Reflect.get(navigator, "userAgentData");
|
|
38
|
+
const mobile = agent === undefined ? undefined : Reflect.get(Object(agent), "mobile");
|
|
39
|
+
return {
|
|
40
|
+
userAgent: navigator.userAgent,
|
|
41
|
+
automated: navigator.webdriver === true,
|
|
42
|
+
mobile: typeof mobile === "boolean" ? mobile : /Mobi|Android/i.test(navigator.userAgent),
|
|
43
|
+
now: () => Date.now(),
|
|
44
|
+
route: () => location.pathname,
|
|
45
|
+
afterLoad(work) {
|
|
46
|
+
const idle = () => {
|
|
47
|
+
if (typeof requestIdleCallback === "function") {
|
|
48
|
+
requestIdleCallback(work, { timeout: IDLE_TIMEOUT_MS });
|
|
49
|
+
} else {
|
|
50
|
+
setTimeout(work, 0);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
if (document.readyState === "complete")
|
|
54
|
+
idle();
|
|
55
|
+
else
|
|
56
|
+
addEventListener("load", idle, { once: true });
|
|
57
|
+
},
|
|
58
|
+
onHidden(work) {
|
|
59
|
+
document.addEventListener("visibilitychange", () => {
|
|
60
|
+
if (document.visibilityState === "hidden")
|
|
61
|
+
work();
|
|
62
|
+
});
|
|
63
|
+
addEventListener("pagehide", work);
|
|
64
|
+
},
|
|
65
|
+
after: (delayMs, work) => void setTimeout(work, delayMs),
|
|
66
|
+
beacon: (url, body) => sendUnloadBeacon2(url, body),
|
|
67
|
+
storage: sessionStore()
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
function readPending(host) {
|
|
71
|
+
try {
|
|
72
|
+
const stored = JSON.parse(host.storage?.getItem(PENDING_KEY) ?? "[]");
|
|
73
|
+
if (!Array.isArray(stored))
|
|
74
|
+
return [];
|
|
75
|
+
return stored.filter((entry) => typeof entry === "string");
|
|
76
|
+
} catch {
|
|
77
|
+
return [];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
function writePending(host, pending) {
|
|
81
|
+
try {
|
|
82
|
+
if (pending.length === 0)
|
|
83
|
+
host.storage?.removeItem(PENDING_KEY);
|
|
84
|
+
else
|
|
85
|
+
host.storage?.setItem(PENDING_KEY, JSON.stringify(pending.slice(-MAX_PENDING)));
|
|
86
|
+
} catch {}
|
|
87
|
+
}
|
|
88
|
+
function samePage(body, id) {
|
|
89
|
+
return body.includes(`"id":"${id}"`);
|
|
90
|
+
}
|
|
91
|
+
function createPerformanceCollector(config) {
|
|
92
|
+
if (running)
|
|
93
|
+
return running;
|
|
94
|
+
if (config.host === undefined && typeof document === "undefined")
|
|
95
|
+
return INACTIVE;
|
|
96
|
+
const host = config.host ?? browserHost();
|
|
97
|
+
if (host.automated || isLabUserAgent(host.userAgent))
|
|
98
|
+
return INACTIVE;
|
|
99
|
+
const route = redactTrackingText2(host.route());
|
|
100
|
+
const id = loadId();
|
|
101
|
+
const vitals = {
|
|
102
|
+
lcpMs: null,
|
|
103
|
+
inpMs: null,
|
|
104
|
+
fcpMs: null,
|
|
105
|
+
ttfbMs: null,
|
|
106
|
+
cls: null
|
|
107
|
+
};
|
|
108
|
+
let navigationType = null;
|
|
109
|
+
let stopped = false;
|
|
110
|
+
let finalSent = false;
|
|
111
|
+
let lastSent;
|
|
112
|
+
const send = (kind) => {
|
|
113
|
+
if (stopped || Object.values(vitals).every((value) => value === null))
|
|
114
|
+
return;
|
|
115
|
+
const measured = `${kind}:${JSON.stringify(vitals)}`;
|
|
116
|
+
if (measured === lastSent || kind === "early" && finalSent)
|
|
117
|
+
return;
|
|
118
|
+
if (kind === "final")
|
|
119
|
+
finalSent = true;
|
|
120
|
+
const sample = {
|
|
121
|
+
schemaVersion: 1,
|
|
122
|
+
id,
|
|
123
|
+
kind,
|
|
124
|
+
route,
|
|
125
|
+
buildId: config.buildId,
|
|
126
|
+
visitId: config.visitId?.() ?? null,
|
|
127
|
+
deviceClass: host.mobile ? "mobile" : "desktop",
|
|
128
|
+
navigationType,
|
|
129
|
+
vitals: { ...vitals },
|
|
130
|
+
capturedAt: host.now()
|
|
131
|
+
};
|
|
132
|
+
const body = JSON.stringify(sample);
|
|
133
|
+
lastSent = measured;
|
|
134
|
+
if (host.beacon(config.url, body))
|
|
135
|
+
return;
|
|
136
|
+
const others = readPending(host).filter((pending) => !samePage(pending, id));
|
|
137
|
+
writePending(host, [...others, body]);
|
|
138
|
+
};
|
|
139
|
+
const replayPending = () => {
|
|
140
|
+
writePending(host, readPending(host).filter((body) => !host.beacon(config.url, body)));
|
|
141
|
+
};
|
|
142
|
+
const observe = (library) => {
|
|
143
|
+
const record = (field, limit, metric) => {
|
|
144
|
+
if (metric.navigationType && RESTORED_NAVIGATIONS.has(metric.navigationType))
|
|
145
|
+
return;
|
|
146
|
+
vitals[field] = Math.min(limit, Math.max(0, metric.value));
|
|
147
|
+
navigationType ??= metric.navigationType ?? null;
|
|
148
|
+
};
|
|
149
|
+
const options = { reportAllChanges: true };
|
|
150
|
+
library.onLCP((metric) => record("lcpMs", MAX_MS, metric), options);
|
|
151
|
+
library.onINP((metric) => record("inpMs", MAX_MS, metric), options);
|
|
152
|
+
library.onCLS((metric) => record("cls", MAX_CLS, metric), options);
|
|
153
|
+
library.onFCP((metric) => record("fcpMs", MAX_MS, metric), options);
|
|
154
|
+
library.onTTFB((metric) => record("ttfbMs", MAX_MS, metric), options);
|
|
155
|
+
};
|
|
156
|
+
host.onHidden(() => send("final"));
|
|
157
|
+
host.afterLoad(() => {
|
|
158
|
+
if (stopped)
|
|
159
|
+
return;
|
|
160
|
+
replayPending();
|
|
161
|
+
const load = config.loadVitals ?? (() => import("web-vitals"));
|
|
162
|
+
load().then((library) => {
|
|
163
|
+
observe(library);
|
|
164
|
+
host.after(config.earlyDelayMs ?? DEFAULT_EARLY_DELAY_MS, () => send("early"));
|
|
165
|
+
}, () => {
|
|
166
|
+
return;
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
const collector = {
|
|
170
|
+
stop() {
|
|
171
|
+
stopped = true;
|
|
172
|
+
running = undefined;
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
running = collector;
|
|
176
|
+
return collector;
|
|
177
|
+
}
|
|
178
|
+
export {
|
|
179
|
+
createPerformanceCollector,
|
|
180
|
+
isLabUserAgent
|
|
181
|
+
};
|
|
@@ -11,5 +11,6 @@ export { DEFAULT_BOT_USER_AGENT_PATTERN, isBotUserAgent } from '../../tracking/s
|
|
|
11
11
|
export { type DispositionEvent, type DispositionInput, type DispositionResult, dispositionTrackingBatch, type KnownVisit, } from '../../tracking/server/disposition.js';
|
|
12
12
|
export { hashTrackingEvent } from '../../tracking/server/hash.js';
|
|
13
13
|
export { createPresenceRegistry, type PresenceEntry, type PresenceRegistry, } from '../../tracking/server/presence.js';
|
|
14
|
+
export { type TrackingOutboxReport, type TrackingTelemetryHealth, trackingTelemetryHealth, } from '../../tracking/server/telemetry-health.js';
|
|
14
15
|
export { type ActiveVisit, type FindActiveVisitQuery, type IssuedVisitLease, type IssueVisitLeaseOptions, issueVisitLease, type TrackingVisitStore, type VisitActor, type VisitOutboxHealth, type VisitOwnership, } from '../../tracking/server/visit-lease.js';
|
|
15
16
|
//# sourceMappingURL=server.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/entrypoints/tracking/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,8BAA8B,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3F,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,wBAAwB,EACxB,KAAK,UAAU,GAChB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EACL,sBAAsB,EACtB,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,mCAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/entrypoints/tracking/server.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAUH,YAAY,EACV,mBAAmB,EACnB,sBAAsB,EACtB,iBAAiB,GAClB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,gBAAgB,GACjB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,8BAA8B,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3F,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,wBAAwB,EACxB,KAAK,UAAU,GAChB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EACL,sBAAsB,EACtB,KAAK,aAAa,EAClB,KAAK,gBAAgB,GACtB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,uBAAuB,GACxB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,eAAe,EACf,KAAK,kBAAkB,EACvB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,mCAAmC,CAAC"}
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_BOT_USER_AGENT_PATTERN2,
|
|
3
|
+
isBotUserAgent2
|
|
4
|
+
} from "../../index-1f40z584.js";
|
|
5
|
+
|
|
1
6
|
// src/tracking/server/active-interval.ts
|
|
2
7
|
var UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
3
8
|
function activeIntervalOf(event, serverNow, {
|
|
@@ -23,11 +28,6 @@ function activeIntervalOf(event, serverNow, {
|
|
|
23
28
|
endedAt: serverNow
|
|
24
29
|
};
|
|
25
30
|
}
|
|
26
|
-
// src/tracking/server/bot.ts
|
|
27
|
-
var DEFAULT_BOT_USER_AGENT_PATTERN = /bot|crawl|spider|slurp|mediapartners|facebookexternalhit|bingpreview|yandex|baidu|duckduckbot|uptimerobot|pingdom|gtmetrix|pagespeed|lighthouse|headlesschrome/i;
|
|
28
|
-
function isBotUserAgent(userAgent, pattern = DEFAULT_BOT_USER_AGENT_PATTERN) {
|
|
29
|
-
return userAgent ? pattern.test(userAgent) : false;
|
|
30
|
-
}
|
|
31
31
|
// src/tracking/server/hash.ts
|
|
32
32
|
import { createHash } from "node:crypto";
|
|
33
33
|
function hashTrackingEvent(event) {
|
|
@@ -41,9 +41,9 @@ function dispositionTrackingBatch({
|
|
|
41
41
|
existing,
|
|
42
42
|
actorOwnerId,
|
|
43
43
|
userAgent,
|
|
44
|
-
botPattern =
|
|
44
|
+
botPattern = DEFAULT_BOT_USER_AGENT_PATTERN2
|
|
45
45
|
}) {
|
|
46
|
-
if (
|
|
46
|
+
if (isBotUserAgent2(userAgent, botPattern)) {
|
|
47
47
|
return {
|
|
48
48
|
accepted: [],
|
|
49
49
|
dispositions: events.map((event) => ({
|
|
@@ -115,20 +115,47 @@ function createPresenceRegistry(options = {}) {
|
|
|
115
115
|
clear: () => active.clear()
|
|
116
116
|
};
|
|
117
117
|
}
|
|
118
|
+
// src/tracking/server/telemetry-health.ts
|
|
119
|
+
function trackingTelemetryHealth(reports, baselines = new Map) {
|
|
120
|
+
const latest = new Map;
|
|
121
|
+
const queued = new Map;
|
|
122
|
+
for (const report of reports) {
|
|
123
|
+
queued.set(report.stream, report.queued);
|
|
124
|
+
if (report.state !== "available")
|
|
125
|
+
continue;
|
|
126
|
+
latest.set(report.stream, Math.max(latest.get(report.stream) ?? 0, report.dropped));
|
|
127
|
+
}
|
|
128
|
+
let dropped = 0;
|
|
129
|
+
for (const [stream, reported] of latest) {
|
|
130
|
+
dropped += Math.max(0, reported - (baselines.get(stream) ?? 0));
|
|
131
|
+
}
|
|
132
|
+
const count = (state) => reports.filter((report) => report.state === state).length;
|
|
133
|
+
const unavailable = count("unavailable");
|
|
134
|
+
const unknown = count("unknown");
|
|
135
|
+
const degraded = dropped > 0 || unavailable > 0;
|
|
136
|
+
return {
|
|
137
|
+
status: reports.length === 0 ? "unknown" : degraded ? "degraded" : unknown > 0 ? "unknown" : "ok",
|
|
138
|
+
observedVisits: reports.length - unknown,
|
|
139
|
+
unknownVisits: unknown,
|
|
140
|
+
unavailable,
|
|
141
|
+
queued: [...queued.values()].reduce((sum, count) => sum + count, 0),
|
|
142
|
+
dropped
|
|
143
|
+
};
|
|
144
|
+
}
|
|
118
145
|
// src/tracking/server/visit-lease.ts
|
|
119
146
|
async function issueVisitLease(store, actor, entry, {
|
|
120
147
|
ownership,
|
|
121
148
|
idleMs = 30 * 60 * 1000,
|
|
122
149
|
now = () => new Date,
|
|
123
150
|
randomUUID = () => crypto.randomUUID(),
|
|
124
|
-
botPattern =
|
|
151
|
+
botPattern = DEFAULT_BOT_USER_AGENT_PATTERN2
|
|
125
152
|
}) {
|
|
126
153
|
if (ownership === "adopting" && !store.adopt) {
|
|
127
154
|
throw new Error("issueVisitLease: ownership 'adopting' requires store.adopt");
|
|
128
155
|
}
|
|
129
156
|
const at = now();
|
|
130
157
|
const expiresAt = new Date(at.getTime() + idleMs).toISOString();
|
|
131
|
-
if (
|
|
158
|
+
if (isBotUserAgent2(actor.userAgent, botPattern)) {
|
|
132
159
|
return { visitId: randomUUID(), expiresAt, outcome: "bot", adopted: null };
|
|
133
160
|
}
|
|
134
161
|
const health = {
|
|
@@ -163,11 +190,12 @@ async function issueVisitLease(store, actor, entry, {
|
|
|
163
190
|
});
|
|
164
191
|
}
|
|
165
192
|
export {
|
|
166
|
-
DEFAULT_BOT_USER_AGENT_PATTERN,
|
|
193
|
+
DEFAULT_BOT_USER_AGENT_PATTERN2 as DEFAULT_BOT_USER_AGENT_PATTERN,
|
|
167
194
|
activeIntervalOf,
|
|
168
195
|
createPresenceRegistry,
|
|
169
196
|
dispositionTrackingBatch,
|
|
170
197
|
hashTrackingEvent,
|
|
171
|
-
isBotUserAgent,
|
|
172
|
-
issueVisitLease
|
|
198
|
+
isBotUserAgent2 as isBotUserAgent,
|
|
199
|
+
issueVisitLease,
|
|
200
|
+
trackingTelemetryHealth
|
|
173
201
|
};
|
|
@@ -4,20 +4,21 @@
|
|
|
4
4
|
* with one bounded retry, the page-leave beacon that actually arrives, visible
|
|
5
5
|
* time, scroll milestones, declarative clicks, attribution, and the client
|
|
6
6
|
* that composes them. No React, no DOM at import time, no event vocabulary of
|
|
7
|
-
* its own
|
|
7
|
+
* its own, and no `zod`: this runs on every page. The wire shapes are
|
|
8
|
+
* `stitchkit/tracking/contract`, the server half `stitchkit/tracking/server`.
|
|
9
|
+
* → ADR 0166, ADR 0280.
|
|
8
10
|
*/
|
|
9
11
|
export { type AttributionStorage, parseReferrer, parseUtmFromSearch, type ReferrerRule, type ResolveAttributionInput, type ResolvedAttribution, resolveAttribution, } from '../tracking/attribution.js';
|
|
10
12
|
export { sendUnloadBeacon } from '../tracking/beacon.js';
|
|
11
13
|
export { type ClickTarget, type ResolveTrackedClickOptions, resolveTrackedClick, type TrackedClick, type TrackedClickAttributes, } from '../tracking/clicks.js';
|
|
12
14
|
export { type BuiltinTrackingEventTypes, CONVENTIONAL_TRACKING_EVENT_TYPES, createTrackingClient, type EventsWithMetadata, type EventsWithoutMetadata, type TrackFn, type TrackingClient, type TrackingClientConfig, } from '../tracking/client.js';
|
|
13
|
-
export { createTrackingContract, type TrackingContractConfig, type TrackingContractEndpoints, } from '../tracking/contract.js';
|
|
14
15
|
export { deliverTrackingBatch, type TrackingDeliveryOptions, type TrackingDeliveryOutcome, } from '../tracking/delivery.js';
|
|
15
16
|
export { browserTrackingHost, type TrackingHost, type TrackingPageContext, } from '../tracking/host.js';
|
|
16
17
|
export { createOncePerPage, type OncePerPage } from '../tracking/once-per-page.js';
|
|
17
18
|
export { createTrackingOutbox, type TrackingOutbox, type TrackingOutboxEvents, type TrackingOutboxHealth, type TrackingOutboxMeta, type TrackingOutboxOptions, type TrackingOutboxRecord, type TrackingOutboxStorage, type TrackingQueuedEvent, } from '../tracking/outbox.js';
|
|
18
19
|
export { indexedDbOutboxStorage } from '../tracking/outbox-storage-indexeddb.js';
|
|
19
20
|
export { memoryOutboxStorage } from '../tracking/outbox-storage-memory.js';
|
|
20
|
-
export {
|
|
21
|
+
export { redactTrackingText, redactTrackingValue } from '../tracking/privacy.js';
|
|
21
22
|
export { createScrollMilestones, type ScrollMilestones, scrollDepthPercent, } from '../tracking/scroll.js';
|
|
22
23
|
export { createSequenceReserve, type SequenceReserve, type SequenceReserveOptions, } from '../tracking/sequence-reserve.js';
|
|
23
24
|
export { createVisibleTimeMeter, type VisibleHeartbeat, type VisibleInterval, type VisibleTimeMeter, type VisibleTimeMeterOptions, } from '../tracking/visible-time.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../../src/entrypoints/tracking.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../../src/entrypoints/tracking.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EACL,KAAK,kBAAkB,EACvB,aAAa,EACb,kBAAkB,EAClB,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,kBAAkB,GACnB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,0BAA0B,EAC/B,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,sBAAsB,GAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,yBAAyB,EAC9B,iCAAiC,EACjC,oBAAoB,EACpB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,OAAO,EACZ,KAAK,cAAc,EACnB,KAAK,oBAAoB,GAC1B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,KAAK,uBAAuB,EAC5B,KAAK,uBAAuB,GAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,mBAAmB,GACzB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,GACzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EACL,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,qBAAqB,EACrB,KAAK,eAAe,EACpB,KAAK,sBAAsB,GAC5B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,uBAAuB,GAC7B,MAAM,0BAA0B,CAAC"}
|
|
@@ -1,102 +1,37 @@
|
|
|
1
|
-
import"../index-m38ej7e5.js";
|
|
2
1
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
sendUnloadBeacon2,
|
|
3
|
+
redactTrackingText2,
|
|
4
|
+
redactTrackingValue2
|
|
5
|
+
} from "../index-vv1sch8a.js";
|
|
5
6
|
import {
|
|
6
7
|
ApiError2
|
|
7
8
|
} from "../index-kfjkb396.js";
|
|
9
|
+
import {
|
|
10
|
+
isRecord
|
|
11
|
+
} from "../index-9jfdm5tg.js";
|
|
8
12
|
|
|
9
13
|
// src/tracking/attribution.ts
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
// src/tracking/schemas.ts
|
|
13
|
-
import { z } from "zod";
|
|
14
|
-
var UtmDataSchema = z.object({
|
|
15
|
-
source: z.string().max(200).optional(),
|
|
16
|
-
medium: z.string().max(200).optional(),
|
|
17
|
-
campaign: z.string().max(200).optional(),
|
|
18
|
-
content: z.string().max(200).optional(),
|
|
19
|
-
term: z.string().max(200).optional()
|
|
20
|
-
});
|
|
21
|
-
var AttributionDataSchema = z.object({
|
|
22
|
-
utm: UtmDataSchema.optional(),
|
|
23
|
-
referrer: z.string().optional(),
|
|
24
|
-
landingPage: z.string().optional()
|
|
25
|
-
});
|
|
26
|
-
var DEFAULT_BUILD_ID_PATTERN = /^(dev|[a-f0-9]{7,40})$/;
|
|
27
|
-
var TrackingDispositionStatusSchema = z.enum([
|
|
28
|
-
"accepted",
|
|
29
|
-
"duplicate",
|
|
30
|
-
"identity-invalid",
|
|
31
|
-
"excluded-bot"
|
|
32
|
-
]);
|
|
33
|
-
var TrackingDispositionSchema = z.object({
|
|
34
|
-
eventId: z.uuid(),
|
|
35
|
-
status: TrackingDispositionStatusSchema
|
|
36
|
-
});
|
|
37
|
-
var TrackEventsResponseSchema = z.object({
|
|
38
|
-
accepted: z.number().int().nonnegative(),
|
|
39
|
-
dispositions: z.array(TrackingDispositionSchema)
|
|
40
|
-
});
|
|
41
|
-
var VisitBootstrapResponseSchema = z.object({
|
|
42
|
-
visitId: z.uuid(),
|
|
43
|
-
expiresAt: z.iso.datetime()
|
|
44
|
-
});
|
|
45
|
-
var TrackingOutboxStateSchema = z.enum(["available", "unavailable"]);
|
|
46
|
-
function trackingEventShape(eventTypes) {
|
|
47
|
-
return {
|
|
48
|
-
eventId: z.uuid(),
|
|
49
|
-
visitId: z.uuid(),
|
|
50
|
-
browserStreamId: z.uuid(),
|
|
51
|
-
browserSequence: z.number().int().nonnegative(),
|
|
52
|
-
type: z.enum(eventTypes),
|
|
53
|
-
page: z.string().max(2000),
|
|
54
|
-
metadata: z.record(z.string(), z.unknown()).optional(),
|
|
55
|
-
clientTimestamp: z.number()
|
|
56
|
-
};
|
|
14
|
+
function isOptionalText(value) {
|
|
15
|
+
return value === undefined || typeof value === "string";
|
|
57
16
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
previousVisitId: z.uuid().optional(),
|
|
62
|
-
origin: z.url().max(500),
|
|
63
|
-
landingPath: z.string().startsWith("/").max(300).regex(/^[^?#]*$/),
|
|
64
|
-
referrer: z.url().max(2000).optional(),
|
|
65
|
-
utm: UtmDataSchema.optional(),
|
|
66
|
-
displayMode: z.enum(["browser", "standalone"]),
|
|
67
|
-
screenWidth: z.number().int().positive().max(20000),
|
|
68
|
-
screenHeight: z.number().int().positive().max(20000),
|
|
69
|
-
buildId: z.string().regex(buildIdPattern),
|
|
70
|
-
outboxState: TrackingOutboxStateSchema,
|
|
71
|
-
outboxQueued: z.number().int().nonnegative().max(1000),
|
|
72
|
-
outboxDropped: z.number().int().nonnegative()
|
|
73
|
-
};
|
|
17
|
+
var MAX_UTM_LENGTH = 200;
|
|
18
|
+
function isUtmField(value) {
|
|
19
|
+
return value === undefined || typeof value === "string" && value.length <= MAX_UTM_LENGTH;
|
|
74
20
|
}
|
|
75
|
-
function
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
disposition: TrackingDispositionSchema,
|
|
89
|
-
entry: z.object(visitEntryContextShape(buildIdPattern)),
|
|
90
|
-
bootstrap: VisitBootstrapResponseSchema
|
|
91
|
-
};
|
|
21
|
+
function isUtm(value) {
|
|
22
|
+
if (value === undefined)
|
|
23
|
+
return true;
|
|
24
|
+
return isRecord(value) && ["source", "medium", "campaign", "content", "term"].every((field) => isUtmField(value[field]));
|
|
25
|
+
}
|
|
26
|
+
function isStoredTouch(value) {
|
|
27
|
+
if (!isRecord(value) || !Number.isFinite(value.capturedAt))
|
|
28
|
+
return false;
|
|
29
|
+
const { data } = value;
|
|
30
|
+
return isRecord(data) && isUtm(data.utm) && isOptionalText(data.referrer) && isOptionalText(data.landingPage);
|
|
31
|
+
}
|
|
32
|
+
function isStoredAttribution(value) {
|
|
33
|
+
return isRecord(value) && isStoredTouch(value.firstTouch) && isStoredTouch(value.currentTouch);
|
|
92
34
|
}
|
|
93
|
-
|
|
94
|
-
// src/tracking/attribution.ts
|
|
95
|
-
var StoredTouchSchema = z2.object({ data: AttributionDataSchema, capturedAt: z2.number() });
|
|
96
|
-
var StoredAttributionSchema = z2.object({
|
|
97
|
-
firstTouch: StoredTouchSchema,
|
|
98
|
-
currentTouch: StoredTouchSchema
|
|
99
|
-
});
|
|
100
35
|
function normalize(value) {
|
|
101
36
|
if (!value)
|
|
102
37
|
return;
|
|
@@ -133,12 +68,12 @@ function readStored(storage, key, now, ttlMs) {
|
|
|
133
68
|
const raw = storage.getItem(key);
|
|
134
69
|
if (!raw)
|
|
135
70
|
return null;
|
|
136
|
-
const parsed =
|
|
137
|
-
if (!parsed
|
|
71
|
+
const parsed = JSON.parse(raw);
|
|
72
|
+
if (!isStoredAttribution(parsed) || now - parsed.firstTouch.capturedAt > ttlMs) {
|
|
138
73
|
storage.removeItem(key);
|
|
139
74
|
return null;
|
|
140
75
|
}
|
|
141
|
-
return parsed
|
|
76
|
+
return parsed;
|
|
142
77
|
} catch {
|
|
143
78
|
return null;
|
|
144
79
|
}
|
|
@@ -194,12 +129,6 @@ function resolveAttribution({
|
|
|
194
129
|
});
|
|
195
130
|
return { firstTouch, currentTouch: firstTouch };
|
|
196
131
|
}
|
|
197
|
-
// src/tracking/beacon.ts
|
|
198
|
-
function sendUnloadBeacon(url, body, sender = typeof navigator === "undefined" ? undefined : navigator) {
|
|
199
|
-
if (!sender || typeof sender.sendBeacon !== "function")
|
|
200
|
-
return false;
|
|
201
|
-
return sender.sendBeacon(url, body);
|
|
202
|
-
}
|
|
203
132
|
// src/tracking/clicks.ts
|
|
204
133
|
function label(target) {
|
|
205
134
|
return (target?.textContent ?? "").trim().slice(0, 100) || undefined;
|
|
@@ -430,9 +359,9 @@ function bootstrapTrackingVisit(deps, renew) {
|
|
|
430
359
|
browserStreamId: visit.browserStreamId,
|
|
431
360
|
previousVisitId: visit.visitId ?? undefined,
|
|
432
361
|
origin: page.origin,
|
|
433
|
-
landingPath: page.pathname,
|
|
434
|
-
referrer: page.referrer
|
|
435
|
-
utm: touch?.currentTouch.utm?.source ? touch.currentTouch.utm : undefined,
|
|
362
|
+
landingPath: redactTrackingText2(page.pathname),
|
|
363
|
+
referrer: page.referrer ? redactTrackingText2(page.referrer) : undefined,
|
|
364
|
+
utm: touch?.currentTouch.utm?.source ? redactedUtm(touch.currentTouch.utm) : undefined,
|
|
436
365
|
displayMode: page.displayMode,
|
|
437
366
|
screenWidth: page.screenWidth,
|
|
438
367
|
screenHeight: page.screenHeight,
|
|
@@ -502,12 +431,15 @@ function createVisitSequences(outbox, visit, options, fail) {
|
|
|
502
431
|
} : undefined
|
|
503
432
|
});
|
|
504
433
|
}
|
|
434
|
+
function redactedUtm(utm) {
|
|
435
|
+
return Object.fromEntries(Object.entries(utm).map(([field, value]) => [field, redactTrackingText2(value)]));
|
|
436
|
+
}
|
|
505
437
|
function pageAttribution(host, storage, referrerMap, search, pathname) {
|
|
506
438
|
const page = host.page();
|
|
507
439
|
return resolveAttribution({
|
|
508
440
|
search,
|
|
509
441
|
pathname,
|
|
510
|
-
referrer: page.referrer,
|
|
442
|
+
referrer: redactTrackingText2(page.referrer),
|
|
511
443
|
hostname: page.hostname,
|
|
512
444
|
storage,
|
|
513
445
|
referrerMap,
|
|
@@ -523,7 +455,7 @@ function pageViewDraft(host, type, pathname, previous) {
|
|
|
523
455
|
title: page.title,
|
|
524
456
|
screenWidth: page.viewportWidth,
|
|
525
457
|
screenHeight: page.viewportHeight,
|
|
526
|
-
referrer: previous ? undefined : page.referrer
|
|
458
|
+
referrer: previous || !page.referrer ? undefined : redactTrackingText2(page.referrer)
|
|
527
459
|
},
|
|
528
460
|
clientTimestamp: host.wallClock()
|
|
529
461
|
};
|
|
@@ -633,10 +565,10 @@ function chunk(items, size) {
|
|
|
633
565
|
return chunks;
|
|
634
566
|
}
|
|
635
567
|
function unloadBeacon(unloadUrl) {
|
|
636
|
-
return (request) => unloadUrl === undefined ? false :
|
|
568
|
+
return (request) => unloadUrl === undefined ? false : sendUnloadBeacon2(unloadUrl, JSON.stringify(request));
|
|
637
569
|
}
|
|
638
570
|
function currentUtmOf(attribution) {
|
|
639
|
-
return attribution?.currentTouch.utm?.source ? attribution.currentTouch.utm : undefined;
|
|
571
|
+
return attribution?.currentTouch.utm?.source ? redactedUtm(attribution.currentTouch.utm) : undefined;
|
|
640
572
|
}
|
|
641
573
|
function trackingTimings(config) {
|
|
642
574
|
if (typeof config.buildId !== "string" || config.buildId.length === 0) {
|
|
@@ -815,30 +747,6 @@ function createTrackingClient(config) {
|
|
|
815
747
|
function asMetadata(value) {
|
|
816
748
|
return typeof value === "object" && value !== null ? { ...value } : undefined;
|
|
817
749
|
}
|
|
818
|
-
// src/tracking/contract.ts
|
|
819
|
-
function createTrackingContract(config) {
|
|
820
|
-
const schemas = createTrackingSchemas(config);
|
|
821
|
-
return defineContract2({ prefix: config.prefix ?? "tracking", scope: config.scope }, {
|
|
822
|
-
bootstrap: {
|
|
823
|
-
method: "POST",
|
|
824
|
-
path: "/visit",
|
|
825
|
-
expose: ["HTTP"],
|
|
826
|
-
desc: "Issue or renew a browser visit lease",
|
|
827
|
-
input: schemas.entry,
|
|
828
|
-
output: schemas.bootstrap
|
|
829
|
-
},
|
|
830
|
-
track: {
|
|
831
|
-
method: "POST",
|
|
832
|
-
path: "/events",
|
|
833
|
-
expose: ["HTTP"],
|
|
834
|
-
desc: "Batch track browser events",
|
|
835
|
-
input: schemas.request,
|
|
836
|
-
output: schemas.response,
|
|
837
|
-
safelistedBody: true,
|
|
838
|
-
maxJsonBodyBytes: config.maxJsonBodyBytes ?? 256 * 1024
|
|
839
|
-
}
|
|
840
|
-
});
|
|
841
|
-
}
|
|
842
750
|
// src/tracking/host.ts
|
|
843
751
|
function browserTrackingHost() {
|
|
844
752
|
return {
|
|
@@ -1055,7 +963,7 @@ function indexedDbOutboxStorage(name, factory = () => indexedDB) {
|
|
|
1055
963
|
delete: (eventId) => void events.delete(eventId),
|
|
1056
964
|
all: async () => {
|
|
1057
965
|
const raw = await requestResult(events.index("sequence").getAll());
|
|
1058
|
-
return raw.flatMap((value) =>
|
|
966
|
+
return raw.flatMap((value) => isRecord2(value) ? [value] : []);
|
|
1059
967
|
},
|
|
1060
968
|
count: () => requestResult(events.count())
|
|
1061
969
|
}
|
|
@@ -1072,7 +980,7 @@ function indexedDbOutboxStorage(name, factory = () => indexedDB) {
|
|
|
1072
980
|
}
|
|
1073
981
|
};
|
|
1074
982
|
}
|
|
1075
|
-
function
|
|
983
|
+
function isRecord2(value) {
|
|
1076
984
|
if (typeof value !== "object" || value === null)
|
|
1077
985
|
return false;
|
|
1078
986
|
const event = Reflect.get(value, "event");
|
|
@@ -1113,31 +1021,23 @@ function memoryOutboxStorage() {
|
|
|
1113
1021
|
};
|
|
1114
1022
|
}
|
|
1115
1023
|
export {
|
|
1116
|
-
AttributionDataSchema,
|
|
1117
1024
|
CONVENTIONAL_TRACKING_EVENT_TYPES,
|
|
1118
|
-
DEFAULT_BUILD_ID_PATTERN,
|
|
1119
|
-
TrackEventsResponseSchema,
|
|
1120
|
-
TrackingDispositionSchema,
|
|
1121
|
-
TrackingDispositionStatusSchema,
|
|
1122
|
-
TrackingOutboxStateSchema,
|
|
1123
|
-
UtmDataSchema,
|
|
1124
|
-
VisitBootstrapResponseSchema,
|
|
1125
1025
|
browserTrackingHost,
|
|
1126
1026
|
createOncePerPage,
|
|
1127
1027
|
createScrollMilestones,
|
|
1128
1028
|
createSequenceReserve,
|
|
1129
1029
|
createTrackingClient,
|
|
1130
|
-
createTrackingContract,
|
|
1131
1030
|
createTrackingOutbox,
|
|
1132
|
-
createTrackingSchemas,
|
|
1133
1031
|
createVisibleTimeMeter,
|
|
1134
1032
|
deliverTrackingBatch,
|
|
1135
1033
|
indexedDbOutboxStorage,
|
|
1136
1034
|
memoryOutboxStorage,
|
|
1137
1035
|
parseReferrer,
|
|
1138
1036
|
parseUtmFromSearch,
|
|
1037
|
+
redactTrackingText2 as redactTrackingText,
|
|
1038
|
+
redactTrackingValue2 as redactTrackingValue,
|
|
1139
1039
|
resolveAttribution,
|
|
1140
1040
|
resolveTrackedClick,
|
|
1141
1041
|
scrollDepthPercent,
|
|
1142
|
-
sendUnloadBeacon
|
|
1042
|
+
sendUnloadBeacon2 as sendUnloadBeacon
|
|
1143
1043
|
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { XlsxCellError } from '../xlsx/cells.js';
|
|
2
|
+
export { renderXlsx, XLSX_MEDIA_TYPE } from '../xlsx/render.js';
|
|
3
|
+
export { type XlsxColumn, XlsxColumnSchema, XlsxSheetSchema, type XlsxWorkbook, XlsxWorkbookSchema, } from '../xlsx/schema.js';
|
|
4
|
+
//# sourceMappingURL=xlsx.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xlsx.d.ts","sourceRoot":"","sources":["../../src/entrypoints/xlsx.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EACL,KAAK,UAAU,EACf,gBAAgB,EAChB,eAAe,EACf,KAAK,YAAY,EACjB,kBAAkB,GACnB,MAAM,gBAAgB,CAAC"}
|