@adopture/next
Version:
Next.js SDK for Adopture feature adoption tracking with SSR support
3 lines • 12 kB
JavaScript
;var chunk2N3CGLIH_js=require('./chunk-2N3CGLIH.js'),sdkCore=require('@adopture/sdk-core'),headers=require('next/headers');var x="https://api.adopture.com",f={SERVER:{API_URL:"ADOPTURE_API_URL",API_KEY:"ADOPTURE_API_KEY",PROJECT_ID:"ADOPTURE_PROJECT_ID",ENVIRONMENT:"ADOPTURE_ENVIRONMENT",DEBUG:"ADOPTURE_DEBUG"}};function l(t,e){let r;try{t==="NEXT_PUBLIC_ADOPTURE_API_KEY"?r=process.env.NEXT_PUBLIC_ADOPTURE_API_KEY:t==="NEXT_PUBLIC_ADOPTURE_API_URL"?r=process.env.NEXT_PUBLIC_ADOPTURE_API_URL:t==="NEXT_PUBLIC_ADOPTURE_PROJECT_ID"?r=process.env.NEXT_PUBLIC_ADOPTURE_PROJECT_ID:t==="NEXT_PUBLIC_ADOPTURE_ENVIRONMENT"?r=process.env.NEXT_PUBLIC_ADOPTURE_ENVIRONMENT:t==="NEXT_PUBLIC_ADOPTURE_DEBUG"?r=process.env.NEXT_PUBLIC_ADOPTURE_DEBUG:typeof process<"u"&&process.env&&(r=process.env[t]);}catch{r=void 0;}return r||e}async function T(t={}){let e={apiUrl:l(f.SERVER.API_URL,x),apiKey:l(f.SERVER.API_KEY),projectId:l(f.SERVER.PROJECT_ID),environment:l(f.SERVER.ENVIRONMENT),debug:l(f.SERVER.DEBUG)==="true"},r=Object.fromEntries(Object.entries(e).filter(([,o])=>o!==void 0)),n=null;try{let{loadConfigFile:o,convertConfigFileToServerConfig:c}=await import('./config-loader-QCJFXTJ7.js'),w=await o();w&&(n=c(w));}catch{}let s={...{apiUrl:x,batchSize:50,flushInterval:5e3,retryAttempts:3,retryDelay:1e3,sessionTimeout:30*60*1e3,persistUser:true,autoTrackSessions:true,autoTrackLifecycle:true,lifecycleDeduplication:true,enableEdgeRuntime:true,requestTimeout:5e3}};return n&&Object.keys(n).length>0&&(s=chunk2N3CGLIH_js.f(s,{},n)),t&&Object.keys(t).length>0&&(s=chunk2N3CGLIH_js.f(s,{},t)),Object.keys(r).length>0&&(s=chunk2N3CGLIH_js.f(s,{},r)),s}function m(t){let e=[];return t.apiKey||e.push("API key is required"),t.apiUrl||e.push("API URL is required"),t.apiKey&&!t.apiKey.match(/^ad_(live|test)_[a-zA-Z0-9]+$/)&&e.push("Invalid API key format. Expected format: ad_live_xxx or ad_test_xxx"),{isValid:e.length===0,errors:e}}function O(t){let e=t.match(/^ad_(live|test)_(.+)$/);return e&&e[2]?e[2].substring(0,8):null}function y(t){return t.startsWith("ad_live_")?"live":t.startsWith("ad_test_")?"test":null}function N(){return l("NODE_ENV")==="development"}function V(){return l("NODE_ENV")==="production"}function a(){return Date.now()}function L(t){return new Promise(e=>setTimeout(e,t))}async function D(t,e=3,r=1e3){let n;for(let i=1;i<=e;i++)try{return await t()}catch(s){if(n=s,i===e)throw n;let o=r*Math.pow(2,i-1);await L(o);}throw n}function S(t,e){return Promise.race([t,new Promise((r,n)=>{setTimeout(()=>{n(new Error(`Operation timed out after ${e}ms`));},e);})])}function d(t){let e=["password","token","secret","key","auth","credential"],r={};for(let[n,i]of Object.entries(t)){let s=n.toLowerCase();e.some(c=>s.includes(c))?r[n]="[REDACTED]":typeof i=="object"&&i!==null?r[n]=d(i):r[n]=i;}return r}function k(t){return t.split("?")[0].split("#")[0].replace(/\/\[[^\]]+\]/g,"/*")}function z(t,e,r){if(!e&&!r)return false;let n=k(t);return r&&r.length>0?!r.some(i=>U(n,i)):e&&e.length>0?e.some(i=>U(n,i)):false}function U(t,e){let r=e.replace(/\*/g,".*").replace(/\//g,"\\/");return new RegExp(`^${r}$`).test(t)}function P(t,e,r){if(r){let i=r(t);if(i)return i}let n=t.get("authorization");if(n){let i=n.match(/user[_-]?id[=:]([a-zA-Z0-9-_]+)/i);if(i)return i[1]}if(e){let i=e.userId||e.user_id||e["user-id"];if(i)return i}return null}var I=class{constructor(e=3e5){this.cache=new Map;this.defaultTTL=e;}set(e,r,n){let i=a()+(n??this.defaultTTL);this.cache.set(e,{value:r,expiry:i});}get(e){let r=this.cache.get(e);if(r){if(a()>r.expiry){this.cache.delete(e);return}return r.value}}has(e){return this.get(e)!==void 0}delete(e){return this.cache.delete(e)}clear(){this.cache.clear();}cleanup(){let e=a();for(let[r,n]of this.cache.entries())e>n.expiry&&this.cache.delete(r);}size(){return this.cleanup(),this.cache.size}forEach(e){let r=a();for(let[n,i]of this.cache.entries())r<=i.expiry?e(i.value,n):this.cache.delete(n);}};var h=class{constructor(){this.config=null;this.isInitialized=false;this.events=[];this.sessionId=sdkCore.generateSessionId();}async init(e={}){if(!this.isInitialized)try{this.config=await T(e);let r=m(this.config);if(!r.isValid)throw new Error(`Invalid configuration: ${r.errors.join(", ")}`);if(this.config.apiKey&&!this.config.projectId&&(this.config.projectId="35207190-2644-4230-b088-9ada94638e5d"),this.config.apiKey&&!this.config.environment){let n=y(this.config.apiKey);this.config.environment=n||void 0;}this.isInitialized=!0,this.config.debug&&console.log("[ADOPTURE-SERVER] Server tracker initialized");}catch(r){throw console.error("[ADOPTURE-SERVER] Failed to initialize:",r),r}}async track(e,r,n){if(!this.isInitialized)throw new Error("Server tracker not initialized");let i=sdkCore.validateFeatureId(e);if(!i.isValid)throw new Error(`Invalid feature ID: ${i.error}`);let s=sdkCore.validateUserId(r);if(!s.isValid)throw new Error(`Invalid user ID: ${s.error}`);let o={featureId:e,userId:r,timestamp:a(),metadata:n?d(n):{},sessionId:this.sessionId,eventId:sdkCore.generateEventId()};await this.sendEvent("track",o),this.config?.debug&&console.log("[ADOPTURE-SERVER] Track event sent:",o);}async trackAdoption(e){if(!this.isInitialized)throw new Error("Server tracker not initialized");let r=sdkCore.validateFeatureId(e.featureId);if(!r.isValid)throw new Error(`Invalid feature ID: ${r.error}`);let n=sdkCore.validateUserId(e.userId);if(!n.isValid)throw new Error(`Invalid user ID: ${n.error}`);let i={...e,timestamp:e.timestamp||a(),metadata:e.metadata?d(e.metadata):{},sessionId:e.sessionId||this.sessionId,eventId:e.eventId||sdkCore.generateEventId()};await this.sendEvent("adoption",i),this.config?.debug&&console.log("[ADOPTURE-SERVER] Adoption event sent:",i);}async expose(e,r,n="server",i){if(!this.isInitialized)throw new Error("Server tracker not initialized");let s=sdkCore.validateFeatureId(e);if(!s.isValid)throw new Error(`Invalid feature ID: ${s.error}`);let o=sdkCore.validateUserId(r);if(!o.isValid)throw new Error(`Invalid user ID: ${o.error}`);let c={featureId:e,userId:r,exposureChannel:n,exposedAt:a(),metadata:i?d(i):{},eventId:sdkCore.generateEventId()};await this.sendEvent("exposure",c),this.config?.debug&&console.log("[ADOPTURE-SERVER] Exposure event sent:",c);}async identify(e,r){if(!this.isInitialized)throw new Error("Server tracker not initialized");let n=sdkCore.validateUserId(e);if(!n.isValid)throw new Error(`Invalid user ID: ${n.error}`);let i={userId:e,properties:r?d(r):{},timestamp:a(),sessionId:this.sessionId,eventId:sdkCore.generateEventId()};await this.sendEvent("identify",i),this.config?.debug&&console.log("[ADOPTURE-SERVER] Identify event sent:",i);}async flush(){this.config?.debug&&console.log("[ADOPTURE-SERVER] Flush called (no-op for server tracker)");}isReady(){return this.isInitialized}getConfig(){return this.config}generateBootstrapData(e,r){return this.config?{config:{apiUrl:this.config.apiUrl,apiKey:this.config.apiKey,projectId:this.config.projectId,environment:this.config.environment,debug:this.config.debug,batchSize:this.config.batchSize,flushInterval:this.config.flushInterval,retryAttempts:this.config.retryAttempts,retryDelay:this.config.retryDelay,sessionTimeout:this.config.sessionTimeout,persistUser:this.config.persistUser,autoTrackSessions:this.config.autoTrackSessions,autoTrackLifecycle:this.config.autoTrackLifecycle,lifecycleDeduplication:this.config.lifecycleDeduplication},initialUserId:e,initialUserProperties:r,sessionId:this.sessionId,timestamp:a()}:null}async sendEvent(e,r){if(!this.config)throw new Error("Configuration not loaded");({projectId:this.config.projectId,environment:this.config.environment});try{await S(D(async()=>{let s={projectId:this.config.projectId||"35207190-2644-4230-b088-9ada94638e5d",featureId:r.featureId,userId:r.userId,eventType:"feature_exposed",sessionId:r.sessionId,metadata:r.metadata||{}},o=await fetch(`${this.config.apiUrl}/trpc/featureAdoption.trackEvent`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${this.config.apiKey}`,"User-Agent":"adopture-next-server/0.1.0"},body:JSON.stringify(s)});if(!o.ok){let c=await o.text();throw new Error(`HTTP ${o.status}: ${c}`)}return o.json()},this.config.retryAttempts,this.config.retryDelay),this.config.requestTimeout||5e3);}catch(i){throw this.config.debug&&console.error("[ADOPTURE-SERVER] Failed to send event:",i),i}}};function C(t){let e=new h;return t&&e.init(t).catch(r=>{console.error("[ADOPTURE-SERVER] Failed to initialize tracker:",r);}),e}var A=null;function u(t){return A||(A=C(t)),A}async function K(t){let e=u(t);return await e.init(t),e}async function _(t,e,r){"use server";try{let n=u();if(!n.isReady())throw new Error("Server tracker not initialized");let i=e||await p();if(!i)throw new Error("User ID is required for server-side tracking");return await n.track(t,i,r),{success:!0}}catch(n){return console.error("[ADOPTURE-SERVER-ACTION] Track failed:",n),{success:false,error:n instanceof Error?n.message:"Unknown error"}}}async function M(t){"use server";try{let e=u();if(!e.isReady())throw new Error("Server tracker not initialized");let r=t.userId||await p();if(!r)throw new Error("User ID is required for server-side tracking");return await e.trackAdoption({...t,userId:r}),{success:!0}}catch(e){return console.error("[ADOPTURE-SERVER-ACTION] Track adoption failed:",e),{success:false,error:e instanceof Error?e.message:"Unknown error"}}}async function $(t,e="server-action",r,n){"use server";try{let i=u();if(!i.isReady())throw new Error("Server tracker not initialized");let s=r||await p();if(!s)throw new Error("User ID is required for server-side tracking");return await i.expose(t,s,e,n),{success:!0}}catch(i){return console.error("[ADOPTURE-SERVER-ACTION] Expose failed:",i),{success:false,error:i instanceof Error?i.message:"Unknown error"}}}async function X(t,e){"use server";try{let r=u();if(!r.isReady())throw new Error("Server tracker not initialized");return await r.identify(t,e),{success:!0}}catch(r){return console.error("[ADOPTURE-SERVER-ACTION] Identify failed:",r),{success:false,error:r instanceof Error?r.message:"Unknown error"}}}async function J(t){"use server";try{let e=u();await e.init(t);let r=await p();return {success:!0,bootstrapData:e.generateBootstrapData(r||void 0)}}catch(e){return console.error("[ADOPTURE-SERVER-ACTION] Initialize failed:",e),{success:false,error:e instanceof Error?e.message:"Unknown error"}}}async function q(){"use server";try{let t=u();return {isReady:t.isReady(),config:t.getConfig()}}catch(t){return console.error("[ADOPTURE-SERVER-ACTION] Get status failed:",t),{isReady:false,error:t instanceof Error?t.message:"Unknown error"}}}async function p(){try{let t=await headers.headers(),e=await headers.cookies(),r={};return e.getAll().forEach(n=>{r[n.name]=n.value;}),P(t,r)||null}catch{return null}}function b(t,e){return async(...r)=>{"use server";let n=Date.now(),i=false,s=null;try{let o=await t(...r);return i=!0,o}catch(o){throw s=o,i=false,o}finally{if(i&&e.trackOnSuccess!==false||!i&&e.trackOnError===true)try{let o=e.extractUserId?.(...r)||await p();if(o){let c={...e.extractMetadata?.(...r)||{},success:i,duration:Date.now()-n,...s&&{error:s.message}};await _(e.featureId,o,c);}}catch(o){console.error("[ADOPTURE-SERVER-ACTION] Failed to track action:",o);}}}}function G(t){return function(e,r,n){if(!n.value)return n;let i=n.value;return n.value=b(i,t),n}}
exports.NextServerTracker=h;exports.TTLCache=I;exports.createServerTracker=C;exports.exposeFeature=$;exports.extractEnvironmentFromApiKey=y;exports.extractProjectIdFromApiKey=O;exports.extractRoute=k;exports.extractUserId=P;exports.getServerTracker=u;exports.getTrackerStatus=q;exports.identifyUser=X;exports.initServerTracker=K;exports.initializeTracker=J;exports.isDevelopment=N;exports.isProduction=V;exports.loadServerConfig=T;exports.shouldExcludeRoute=z;exports.track=G;exports.trackAdoption=M;exports.trackFeature=_;exports.validateConfig=m;exports.withTracking=b;//# sourceMappingURL=server.js.map
//# sourceMappingURL=server.js.map