@adopture/next
Version:
Next.js SDK for Adopture feature adoption tracking with SSR support
3 lines • 4.16 kB
JavaScript
import {NextResponse}from'next/server';function c(){return Date.now()}function d(e){let n=["password","token","secret","key","auth","credential"],t={};for(let[r,a]of Object.entries(e)){let o=r.toLowerCase();n.some(s=>o.includes(s))?t[r]="[REDACTED]":typeof a=="object"&&a!==null?t[r]=d(a):t[r]=a;}return t}function T(e){return e.split("?")[0].split("#")[0].replace(/\/\[[^\]]+\]/g,"/*")}function h(e,n,t){if(!n&&!t)return false;let r=T(e);return t&&t.length>0?!t.some(a=>m(r,a)):n&&n.length>0?n.some(a=>m(r,a)):false}function m(e,n){let t=n.replace(/\*/g,".*").replace(/\//g,"\\/");return new RegExp(`^${t}$`).test(e)}function x(e){return async function(t){let r=c(),a=t.nextUrl.pathname;if(h(a,e.excludeRoutes,e.includeRoutes))return NextResponse.next();let o=e.userIdExtractor?.(t)||w(t.headers),i={...e.metadataExtractor?.(t)||{},pathname:a,method:t.method,userAgent:t.headers.get("user-agent")||"",referer:t.headers.get("referer")||"",ip:b(t),country:t.geo?.country||"",city:t.geo?.city||"",region:t.geo?.region||""},s,l=true,f=null;try{s=NextResponse.next();}catch(u){l=false,f=u instanceof Error?u.message:"Unknown error",s=NextResponse.next();}if(e.enableRouteTracking&&o){let u={featureId:`route-${a.replace(/[^a-zA-Z0-9_.-]/g,"-")}`,userId:o,metadata:d({...i,success:l,error:f,duration:c()-r}),timestamp:r};y(e,"route",u).catch(p=>{console.error("[ADOPTURE-MIDDLEWARE] Failed to send route event:",p);});}if(e.enablePerformanceTracking&&o){let u={featureId:"middleware:performance",userId:o,metadata:d({...i,responseTime:c()-r,success:l,error:f}),timestamp:r};y(e,"performance",u).catch(p=>{console.error("[ADOPTURE-MIDDLEWARE] Failed to send performance event:",p);});}return s.headers.set("x-adopture-request-id",k()),s.headers.set("x-adopture-timestamp",r.toString()),o&&s.headers.set("x-adopture-user-id",o),s}}async function y(e,n,t){let r={type:n,event:t,timestamp:c(),source:"middleware"};try{let a={projectId:"35207190-2644-4230-b088-9ada94638e5d",featureId:t.featureId||`route-${r.type}`,userId:t.userId||"anonymous",eventType:"feature_exposed",sessionId:t.sessionId||`middleware-${Date.now()}`,metadata:t.metadata||{}},o=await fetch(`${e.apiUrl||"http://localhost:3001"}/trpc/featureAdoption.trackEvent`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e.apiKey}`,"User-Agent":"adopture-next-middleware/0.1.0"},body:JSON.stringify(a)});if(!o.ok){let i=await o.text();throw new Error(`HTTP ${o.status}: ${i}`)}}catch(a){throw a}}function w(e){let n=e.get("authorization");if(n){let a=n.match(/Bearer\s+(.+)/i);if(a)try{let o=a[1].split(".");if(o.length===3){let i=JSON.parse(atob(o[1]));return i.sub||i.userId||i.user_id||null}}catch{}}let t=e.get("x-user-id")||e.get("x-user")||e.get("user-id");if(t)return t;let r=e.get("cookie");if(r){let a=P(r);return a.userId||a.user_id||a["user-id"]||null}return null}function b(e){let n=e.headers.get("x-forwarded-for");if(n)return n.split(",")[0].trim();let t=e.headers.get("x-real-ip");if(t)return t;let r=e.headers.get("cf-connecting-ip");return r||e.ip||"unknown"}function P(e){let n={};return e.split(";").forEach(t=>{let[r,...a]=t.split("=");r&&a.length>0&&(n[r.trim()]=a.join("=").trim());}),n}function k(){return Math.random().toString(36).substring(2)+Date.now().toString(36)}function S(e,n){return x({apiKey:e,enableRouteTracking:n?.enableRouteTracking??true,enablePerformanceTracking:n?.enablePerformanceTracking??false,excludeRoutes:n?.excludeRoutes})}function A(e,n){return async function(r){return await x(n)(r),e(r)}}var C={basic:e=>({apiKey:e,enableRouteTracking:true,enablePerformanceTracking:false}),api:e=>({apiKey:e,enableRouteTracking:true,enablePerformanceTracking:true,includeRoutes:["/api/*"]}),pages:e=>({apiKey:e,enableRouteTracking:true,enablePerformanceTracking:false,excludeRoutes:["/api/*","/_next/*","/favicon.ico"]}),full:e=>({apiKey:e,enableRouteTracking:true,enablePerformanceTracking:true,excludeRoutes:["/_next/*","/favicon.ico"]})};
export{x as createAdoptureMiddleware,C as middlewarePresets,S as simpleAdoptureMiddleware,A as withAdoptureTracking};//# sourceMappingURL=middleware.mjs.map
//# sourceMappingURL=middleware.mjs.map