UNPKG

@teamsparta/cross-platform-logger

Version:

```typescript import * as CPL from "@teamsparta/cross-platform-logger";

124 lines (118 loc) 3.55 kB
import { NextResponse } from 'next/server'; // src/next/server/capture.ts // src/next/server/shared.ts var UTM_KEYS = [ "utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term" ]; var LOG_PREFIX = "[cross-platform-logger:utm]"; function extractUtm(searchParams) { const utm = {}; for (const key of UTM_KEYS) { const v = searchParams.get(key); if (v) utm[key] = v; } return utm; } // src/next/server/collector.ts var COLLECTOR_URL = "https://tce36hzglxtruslk4f64xhpe5e0yeqnb.lambda-url.ap-northeast-2.on.aws/"; async function sendCapture(payload, token) { const r = await fetch(COLLECTOR_URL, { method: "PUT", headers: { "content-type": "application/json", authorization: `Bearer ${token}` }, body: JSON.stringify(payload) }); if (!r.ok) { const snippet = await r.text().catch(() => ""); throw new Error(`utm persist failed: ${r.status} ${snippet.slice(0, 200)}`); } } // src/next/server/capture.ts var CAPTURE_DEFAULTS = { cookieDomain: ".spartaclub.kr", anonCookieName: "sparta_anon_id", anonCookieMaxAge: 60 * 60 * 24 * 180 }; async function applyUtmCapture(req, res, cfg) { let anonId = req.cookies.get(cfg.anonCookieName)?.value; if (!anonId) { anonId = crypto.randomUUID(); res.cookies.set(cfg.anonCookieName, anonId, { domain: cfg.cookieDomain, maxAge: cfg.anonCookieMaxAge, httpOnly: true, sameSite: "lax", secure: true, path: "/" }); } const url = new URL(req.url); const utm = extractUtm(url.searchParams); if (Object.keys(utm).length === 0) return; const userId = cfg.getUserId ? await cfg.getUserId(req) : void 0; const payload = { userId, anonId, utm, url: req.url, referrer: req.headers.get("referer") ?? void 0, capturedAt: (/* @__PURE__ */ new Date()).toISOString() }; await sendCapture(payload, cfg.token); } function withUtmCapture(middleware, opts) { if (!opts.token) { throw new Error(`${LOG_PREFIX} withUtmCapture: opts.token is required`); } const cfg = { ...CAPTURE_DEFAULTS, ...opts }; return async function utmCaptureWrappedMiddleware(req, event) { const inner = await middleware(req, event); const res = inner instanceof NextResponse ? inner : NextResponse.next(); const capturePromise = applyUtmCapture(req, res, cfg).catch( (e) => console.error(LOG_PREFIX, "capture failed:", e) ); if (event && typeof event.waitUntil === "function") { event.waitUntil(capturePromise); } else { await capturePromise; } return res; }; } var COOKIE_DEFAULTS = { cookieDomain: ".spartaclub.kr", utmCookieName: "utm_last", utmCookieMaxAge: 60 * 60 * 24 * 7 }; function applyUtmCookie(req, res, cfg) { const url = new URL(req.url); const utm = extractUtm(url.searchParams); if (Object.keys(utm).length === 0) return; res.cookies.set(cfg.utmCookieName, JSON.stringify(utm), { domain: cfg.cookieDomain, maxAge: cfg.utmCookieMaxAge, sameSite: "lax", secure: true, path: "/" }); } function withUtmCookie(middleware, opts = {}) { const cfg = { ...COOKIE_DEFAULTS, ...opts }; return async function utmCookieWrappedMiddleware(req, event) { const inner = await middleware(req, event); const res = inner instanceof NextResponse ? inner : NextResponse.next(); try { applyUtmCookie(req, res, cfg); } catch (e) { console.error(LOG_PREFIX, "cookie set failed:", e); } return res; }; } export { withUtmCapture, withUtmCookie };