@addilytics/wintercg
v0.0.1
Published
Addilytics server capture and bundled browser relay for WinterCG handlers.
Readme
@addilytics/wintercg
Wraps Web Request handlers, including Cloudflare Workers, Deno, Bun, and edge runtimes. The wrapper
preserves the handler's argument tuple, whether it receives one argument or several.
import { withAddilytics } from '@addilytics/wintercg';
export default {
fetch: withAddilytics(handler, {
endpoint: 'https://addilytics.example',
siteKey: 'ak_...'
})
};For a runtime that stores its scheduler somewhere other than the handler arguments, pass a resolver:
const wrapped = withAddilytics(handler, {
endpoint: 'https://addilytics.example',
siteKey: 'ak_...',
waitUntil: (platform) => platform.context.waitUntil.bind(platform.context)
});The default server mode counts only requests that execute this handler. For an application with a
client router, use the tracker from addilytics/browser in the router's committed-navigation hook.
The tracker is compiled into your application and posts to the relay owned by the wrapper. There is
no hosted script and the site key stays in server code.
const analytics = withAddilytics(handler, {
endpoint: 'https://addilytics.example',
mode: 'client',
siteKey: env.ADDILYTICS_KEY
});import { createBrowserTracker } from '@addilytics/wintercg/browser';
const tracker = createBrowserTracker({ mode: 'client' });
void tracker.pageview();
export const trackCommittedNavigation = (url: URL, key: string) =>
tracker.pageview(url, { navigationKey: key });
window.addEventListener('pageshow', (event) => {
if (event.persisted) void tracker.pageview(location.href, { force: true });
});Call trackCommittedNavigation from the router's official post-navigation hook. Do not treat a
loader, prefetch, or data request as a navigation.
client mode disables automatic document pageviews and lets the browser count the initial load,
so prerendered pages and CDN hits are covered. Use hybrid on both sides when every initial document
reaches the server. Hybrid mode keeps the server pageview and skips the browser's first callback.
Hash-only changes are ignored unless trackHashChanges is true. If you change the browser
endpoint, set the same path as relayPath on the wrapper.
