@teamsparta/cross-platform-logger
Version:
```typescript import * as CPL from "@teamsparta/cross-platform-logger";
124 lines (118 loc) • 3.55 kB
JavaScript
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 };