@walkeros/server-source-aws 4.1.2 → 4.1.3-next-1780071196115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/dist/dev.js +1 -1
- package/dist/dev.js.map +1 -1
- package/dist/dev.mjs +1 -1
- package/dist/dev.mjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/walkerOS.json +3 -3
- package/package.json +3 -3
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var __defProp=Object.defineProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};import{requestToData}from"@walkeros/core";function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}var types_exports={},examples_exports={};__export(examples_exports,{createTrigger:()=>createTrigger,env:()=>env_exports,step:()=>step_exports,trigger:()=>trigger});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0}),noopFn=()=>{},noopLogger={error:noopFn,warn:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},json:noopFn,scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},step_exports={};__export(step_exports,{apiGatewayV1Post:()=>apiGatewayV1Post,lambdaGet:()=>lambdaGet,lambdaPost:()=>lambdaPost});var lambdaPost={title:"Lambda POST",description:"An API Gateway v2 HTTP POST with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{version:"2.0",requestContext:{http:{method:"POST",path:"/collect"},requestId:"req-123"},body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},apiGatewayV1Post={title:"API Gateway v1 POST",description:"A REST API Gateway v1 POST request with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{httpMethod:"POST",path:"/collect",requestContext:{requestId:"req-789",identity:{sourceIp:"203.0.113.42"}},queryStringParameters:null,body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},lambdaGet={title:"Lambda GET",description:"An API Gateway v2 HTTP GET with query parameters is parsed into an elb event payload.",trigger:{type:"GET"},in:{version:"2.0",requestContext:{http:{method:"GET",path:"/collect"},requestId:"req-456"},rawQueryString:"e=page+view&d=%7B%22title%22%3A%22Home%22%7D",isBase64Encoded:!1},out:[["elb",{e:"page view",d:'{"title":"Home"}'}]]};import{assign as o}from"@walkeros/core";import{assign as r,createLogger as a}from"@walkeros/core";import{assign as i,buildCacheContext as c,clone as u,compileCache as d,checkCache as l,storeCache as f,createIngest as p,debounce as g,emitStep as m,getId as h,getGrantedConsent as y,getNextSteps as w,isDefined as v,isFunction as b,isObject as k,processEventMapping as C,stepId as I,tryCatchAsync as q,useHooks as x}from"@walkeros/core";import{emitStep as O}from"@walkeros/core";import{isArray as j,FatalError as D}from"@walkeros/core";import{tryCatch as A,tryCatchAsync as $}from"@walkeros/core";import{createIngest as E,FatalError as M,getMappingValue as T,tryCatchAsync as _,getNextSteps as P,compileCache as z,checkCache as R,storeCache as B,applyUpdate as H,buildCacheContext as F}from"@walkeros/core";import{createIngest as K,emitStep as G,FatalError as W,isObject as N,stepId as U,tryCatchAsync as L,useHooks as V,getNextSteps as Y,compileCache as J,checkCache as Q,storeCache as X,buildCacheContext as Z,validateStepEntry as ee,processEventMapping as te}from"@walkeros/core";import{assign as He,getSpanId as Fe,isFunction as Ke,isString as Ge}from"@walkeros/core";import{isObject as We}from"@walkeros/core";import{createIngest as Ye,emitStep as Je,FatalError as Qe,getGrantedConsent as Xe,processEventMapping as Ze,tryCatchAsync as et,useHooks as tt}from"@walkeros/core";import{FatalError as ot,useHooks as st,tryCatchAsync as rt}from"@walkeros/core";import{emitStep as at,useHooks as it}from"@walkeros/core";import{compileMatcher as ut,emitStep as dt}from"@walkeros/core";var n_Commands={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function S(e,t2){const n2=e.status.startedAt;return{flowId:"default",stepId:t2.stepId,stepType:t2.stepType,phase:t2.phase,eventId:t2.eventId,timestamp:new Date(t2.now).toISOString(),elapsedMs:t2.now-n2}}function ne(e,t2){return e.storeId&&t2.stores[e.storeId]?t2.stores[e.storeId]:t2.stores.__cache}function oe(e){const t2={};for(const[n2,o2]of Object.entries(e)){const e2=o2.config?.next;"string"==typeof e2||Array.isArray(e2)&&e2.every(e3=>"string"==typeof e3)?t2[n2]={next:e2}:t2[n2]={}}return t2}function se(e,t2){const n2=e.config||{},o2=e[t2];return void 0!==o2?{config:{...n2,[t2]:o2},chainValue:o2}:{config:n2,chainValue:void 0}}function re(e,t2={}){if(!e)return[];if(Array.isArray(e))return e;const n2=[],o2=new Set;let s2=e;for(;s2&&t2[s2]&&!o2.has(s2);){o2.add(s2),n2.push(s2);const e2=t2[s2].next;if(Array.isArray(e2)){n2.push(...e2);break}s2=e2}return n2}async function ae(e,t2,n2){if(t2.init&&!t2.config.init){const o2=t2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:n2,ingest:K(n2),config:t2.config,env:de(t2.config.env)};s2.debug("init");const a2=await V(t2.init,"TransformerInit",e.hooks,e.logger)(r2);if(!1===a2)return!1;t2.config={...a2||t2.config,env:a2?.env||t2.config.env,init:!0},s2.debug("init done")}return!0}async function ie(e,t2,n2,o2,s2,r2){const a2=t2.type||"unknown",i2=e.logger.scope(`transformer:${a2}`),c2={collector:e,logger:i2,id:n2,ingest:s2,config:t2.config,env:{...de(t2.config.env),...r2?{respond:r2}:{}}};i2.debug("push",{event:o2.name});const u2="string"==typeof o2.id?o2.id:"",d2=Date.now(),l2=S(e,{stepId:U("transformer",n2),stepType:"transformer",phase:"in",eventId:u2,now:d2});G(e,l2);try{const s3=await V(t2.push,"TransformerPush",e.hooks,e.logger)(o2,c2),r3=Date.now(),a3=S(e,{stepId:U("transformer",n2),stepType:"transformer",phase:"out",eventId:u2,now:r3});return a3.durationMs=r3-d2,a3.outEvent=s3,G(e,a3),i2.debug("push done"),s3}catch(t3){const o3=Date.now(),s3=S(e,{stepId:U("transformer",n2),stepType:"transformer",phase:"error",eventId:u2,now:o3});throw s3.durationMs=o3-d2,s3.error=t3 instanceof Error?{name:t3.name,message:t3.message}:{message:String(t3)},G(e,s3),t3}}function ce(e,t2){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:K(t2)}async function ue(e,t2,n2,o2,s2,r2,a2){s2||(s2=K(n2[0]??"chain")),a2&&s2._meta&&(s2._meta.chainPath=a2);let i2=o2,c2=r2;for(const o3 of n2){const r3=t2[o3];if(!r3){e.logger.warn(`Transformer not found: ${o3}`);continue}if(s2&&s2._meta&&s2._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o3}`),{event:null,respond:c2};if(s2&&s2._meta&&(s2._meta.hops++,s2._meta.path.push(o3)),!await L(ae,t3=>{if(t3 instanceof W)throw t3;return e.status.failed++,e.logger.scope(`transformer:${r3.type||"unknown"}`).error("transformer init failed",{transformer:o3,error:t3}),!1})(e,r3,o3))return{event:null,respond:c2};if(a2&&void 0!==r3.config?.chainMocks?.[a2]){const t3=r3.config.chainMocks[a2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:a2}),i2=t3;continue}if(void 0!==r3.config?.mock){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),i2=r3.config.mock;continue}if(r3.config?.disabled)continue;const u2=r3.config?.cache,d2=u2?J(u2):void 0,l2=d2?ne(d2,e):void 0;let f2;if(d2&&l2){const e2=Z(s2,i2),t3=await Q(d2,l2,e2);if("HIT"===t3?.status&&t3.value){if(i2=t3.value,d2.stop)return{event:i2,respond:c2,stopped:!0};continue}"MISS"===t3?.status&&(f2={key:t3.key,ttl:t3.rule.ttl})}const p2=r3.config.before;if(p2){const n3=Y(p2,Z(s2,i2));if(1===n3.length){const o4=re(n3[0],oe(t2));if(o4.length>0){const n4=await ue(e,t2,o4,i2,s2,c2,a2);if(null===n4.event)return{event:null,respond:n4.respond??c2};if(n4.stopped)return{event:Array.isArray(n4.event)?n4.event[0]:n4.event,respond:n4.respond??c2,stopped:!0};n4.respond&&(c2=n4.respond),i2=Array.isArray(n4.event)?n4.event[0]:n4.event}}else n3.length>1&&await Promise.all(n3.map(n4=>L(ue,t3=>(e.logger.scope("transformer:many").error(`many branch ${n4} failed`,{error:t3}),{event:null,respond:void 0}))(e,t2,re(n4,oe(t2)),i2,ce(s2,n4),void 0,a2)))}const g2=await L(ie,t3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:t3}),!1))(e,r3,o3,i2,s2,c2);if(!1===g2)return{event:null,respond:c2};if(Array.isArray(g2)){const r4=n2.slice(n2.indexOf(o3)+1),u3=await Promise.all(g2.map(async n3=>{const o4=n3.event||i2,u4=ce(s2,"unknown");if(n3.next){const s3=Y(n3.next,Z(u4,o4));if(0===s3.length)return{event:o4,respond:c2};if(1===s3.length){const n4=re(s3[0],oe(t2));return n4.length>0?ue(e,t2,n4,o4,u4,c2,a2):{event:o4,respond:c2}}return(await Promise.all(s3.map(n4=>L(ue,t3=>(e.logger.scope("transformer:many").error(`many branch ${n4} failed`,{error:t3}),{event:null,respond:void 0}))(e,t2,re(n4,oe(t2)),o4,ce(u4,n4),void 0,a2)))).map(e2=>({event:e2.event,respond:void 0}))}return r4.length>0?ue(e,t2,r4,o4,u4,c2,a2):{event:o4,respond:c2}}));let d3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const t3=e2;if(t3.respond&&(d3=t3.respond),null===t3.event)continue;Array.isArray(t3.event)?l3.push(...t3.event):l3.push(t3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:d3}:1===l3.length?{event:l3[0],respond:d3}:{event:l3,respond:d3}}if(g2&&"object"==typeof g2){const{event:n3,respond:o4,next:r4}=g2;if(o4&&(c2=o4),void 0!==r4){const o5=Y(r4,Z(s2,i2));if(0===o5.length){n3&&(i2=n3);continue}if(1===o5.length){const u3=re(o5[0],oe(t2));return u3.length>0?ue(e,t2,u3,n3||i2,s2,c2,a2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}return await Promise.all(o5.map(o6=>L(ue,t3=>(e.logger.scope("transformer:many").error(`many branch ${o6} failed`,{error:t3}),{event:null,respond:void 0}))(e,t2,re(o6,oe(t2)),n3||i2,ce(s2,o6),void 0,a2))),{event:null,respond:void 0}}n3&&(i2=n3)}f2&&l2&&X(l2,f2.key,i2,f2.ttl);const m2=r3.config.next,h2="string"==typeof m2||Array.isArray(m2)&&m2.every(e2=>"string"==typeof e2),y2=void 0!==m2&&!h2;if((!g2||"object"==typeof g2&&!g2.next)&&y2){const n3=Y(r3.config.next,Z(s2,i2));if(1===n3.length){const o4=re(n3[0],oe(t2));return o4.length>0?ue(e,t2,o4,i2,s2,c2,a2):{event:i2,respond:c2}}return n3.length>1?(await Promise.all(n3.map(n4=>L(ue,t3=>(e.logger.scope("transformer:many").error(`many branch ${n4} failed`,{error:t3}),{event:null,respond:void 0}))(e,t2,re(n4,oe(t2)),i2,ce(s2,n4),void 0,a2))),{event:null,respond:void 0}):{event:i2,respond:c2}}}return{event:i2,respond:c2}}function de(e){return e&&N(e)?e:{}}function le(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e2=>"string"==typeof e2))}async function fe(e,t2,n2){if(!t2.on||!t2.queueOn?.length)return;const o2=t2.queueOn;t2.queueOn=[];const s2=n2||t2.config?.id||"unknown";for(const{type:n3,data:r2}of o2)await _(t2.on,t3=>{if(t3 instanceof M)throw t3;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s2,type:n3,error:t3})})(n3,r2)}function pe(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ge(e,t2,n2){const{code:o2,config:s2={},env:r2={},primary:a2,next:i2,before:c2,cache:u2}=n2,d2=u2,l2=d2?z({...d2,stop:d2.stop??!0}):void 0,f2=le(i2)?re(i2,oe(e.transformers)):void 0,p2=le(c2)?re(c2,oe(e.transformers)):void 0,g2=r2.push,m2=g2??e.push,h2=Boolean(g2),y2=async(n3,o3,r3)=>{let a3;const u3=p2??(void 0!==c2?(()=>{const t3=P(c2,F(r3.ingest));return 0===t3.length?[]:re(1===t3.length?t3[0]:t3,oe(e.transformers))})():[]);let d3=[n3];if(u3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o4=await ue(e,e.transformers,u3,n3,r3.ingest,r3.respond,`source.${t2}.before`);if(null===o4.event)return{ok:!0};if(o4.stopped)return o4.respond&&(r3.respond=o4.respond),{ok:!0};o4.respond&&(r3.respond=o4.respond),d3=Array.isArray(o4.event)?o4.event:[o4.event]}if(l2){const t3=ne(l2,e);if(t3){const n4=F(r3.ingest),o4=await R(l2,t3,n4);if(o4){if("HIT"===o4.status&&void 0!==o4.value&&l2.stop){let t4=o4.value;return o4.rule.update&&(t4=await H(t4,o4.rule.update,{...n4,cache:{status:"HIT"}},e)),r3.respond?.(t4),{ok:!0}}if("MISS"===o4.status&&l2.stop&&r3.respond){const s3=r3.respond,i3=o4.rule.update,c3={...n4,cache:{status:"MISS"}},u4=o4.key,d4=o4.rule.ttl,l3=n5=>{B(t3,u4,n5,d4),i3?a3=(async()=>{const t4=await H(n5,i3,c3,e);s3(t4)})():s3(n5)};r3.respond=l3}"MISS"!==o4.status||l2.stop||B(t3,o4.key,!0,o4.rule.ttl)}}}const g3=f2?{kind:"single",preChain:f2}:void 0!==i2?(()=>{const t3=P(i2,F(r3.ingest));return 0===t3.length?{kind:"single",preChain:[]}:1===t3.length?{kind:"single",preChain:re(t3[0],oe(e.transformers))}:{kind:"many",branches:t3.map(t4=>re(t4,oe(e.transformers)))}})():{kind:"single",preChain:[]};let y3={ok:!0};for(const n4 of d3)"many"===g3.kind?(await Promise.all(g3.branches.map((a4,i3)=>_(async()=>h2?m2(n4):m2(n4,{...o3,id:t2,ingest:ce(r3.ingest,`${t2}.${i3}`),respond:void 0,mapping:s2,preChain:a4}),t3=>(e.logger.scope("source:many").error(`many branch ${i3} failed`,{error:t3}),{ok:!0}))())),y3={ok:!0}):y3=h2?await m2(n4):await m2(n4,{...o3,id:t2,ingest:r3.ingest,respond:r3.respond,mapping:s2,preChain:g3.preChain});return a3&&await a3,y3},w2=async n3=>{const o3=E(t2);if(!s2.ingest||void 0===n3)return o3;const r3=await T(n3,s2.ingest,{collector:e});return{...o3,...r3,_meta:o3._meta}},v2=e.logger.scope("source").scope(t2),b2={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:v2,...r2,push:async(e2,n3={})=>{const o3={ingest:E(t2),respond:void 0};return y2(e2,n3,o3)}},k2={collector:e,logger:v2,id:t2,config:s2,env:b2,withScope:async(e2,t3,n3)=>{const o3={ingest:await w2(e2),respond:t3};return n3({...b2,push:(e3,t4={})=>y2(e3,t4,o3),ingest:o3.ingest,respond:o3.respond})}},C2=await _(o2,n3=>{if(n3 instanceof M)throw n3;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t2,error:n3})})(k2);if(!C2)return;const I2=C2.type||"unknown",q2=e.logger.scope(I2).scope(t2);return b2.logger=q2,a2&&(C2.config={...C2.config,primary:a2}),C2}function he(e,t2,n2,o2){if(n2 instanceof D)throw n2;e.logger.scope("on").error("on callback failed",{kind:t2,...o2,error:n2})}function ye(e,t2){return{collector:e,logger:e.logger.scope("on").scope(String(t2))}}function ve(e,t2,n2,o2,s2){if(!t2.on)return;const r2=t2.type||"unknown",a2=e.logger.scope(r2).scope("on").scope(o2),i2={collector:e,logger:a2,id:n2,config:t2.config,data:s2,env:Be(t2.env,t2.config.env)};A(t2.on,t3=>he(e,"destination",t3,{destId:n2,type:o2}))(o2,i2)}function be(e,t2,o2,s2){let r2;switch(t2){case n_Commands.Consent:r2=s2||e.consent;break;case n_Commands.Session:r2=e.session;break;case n_Commands.User:r2=s2||e.user;break;case n_Commands.Custom:r2=s2||e.custom;break;case n_Commands.Globals:r2=s2||e.globals;break;case n_Commands.Config:r2=s2||e.config;break;case n_Commands.Ready:case n_Commands.Run:default:r2=void 0}if(o2.length)switch(t2){case n_Commands.Consent:!function(e2,t3,o3){const s3=o3||e2.consent,r3=ye(e2,n_Commands.Consent);t3.forEach(t4=>{Object.keys(s3).filter(e3=>e3 in t4).forEach(n2=>{A(t4[n2],t5=>he(e2,"consent",t5,{key:n2}))(s3,r3)})})}(e,o2,s2);break;case n_Commands.Ready:!function(e2,t3){if(!e2.allowed)return;const o3=ye(e2,n_Commands.Ready);t3.forEach(t4=>{A(t4,t5=>he(e2,"ready",t5))(void 0,o3)})}(e,o2);break;case n_Commands.Run:!function(e2,t3){if(!e2.allowed)return;const o3=ye(e2,n_Commands.Run);t3.forEach(t4=>{A(t4,t5=>he(e2,"run",t5))(void 0,o3)})}(e,o2);break;case n_Commands.Session:!function(e2,t3){if(!e2.session)return;const o3=ye(e2,n_Commands.Session);t3.forEach(t4=>{A(t4,t5=>he(e2,"session",t5))(e2.session,o3)})}(e,o2);break;default:{const n2=ye(e,t2);o2.forEach(o3=>{"function"==typeof o3&&A(o3,n3=>he(e,"generic",n3,{type:t2}))(r2,n2)});break}}}function Ce(e,t2,n2,o2){if(!Number.isFinite(n2.max)||n2.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n2.max})`);if("dropNewest"===(n2.onOverflow??"dropOldest"))return e.length>=n2.max?(o2&&o2([t2]),{appended:!1,dropped:1}):(e.push(t2),{appended:!0,dropped:0});const s2=[];for(;e.length>=n2.max;)s2.push(e.shift());return e.push(t2),s2.length>0&&o2&&o2(s2),{appended:!0,dropped:s2.length}}var Ie=new WeakMap;function qe(e,t2,n2,o2){Ie.get(e)||(Ie.set(e,!0),t2.warn(n2,o2))}function xe(e){Ie.delete(e)}var Oe=Object.freeze({batched:!0});function Se(e){return e===Oe}function je(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function De(e,t2){return e.status.destinations[t2]||(e.status.destinations[t2]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t2]}function Ae(e,t2,n2,o2){e.dropped[t2]||(e.dropped[t2]={});const s2=e.dropped[t2];return s2[n2]=(s2[n2]??0)+o2,s2[n2]}function $e(e,t2,n2){if(!e)return[];if(Array.isArray(e)&&e.every(e2=>"string"==typeof e2))return re(e,t2);if("string"==typeof e)return re(e,t2);const o2=w(e,c(n2));return 0===o2.length?[]:1===o2.length?re(o2[0],t2):re(o2,t2)}async function Me(e,t2,n2={},o2){const{allowed:s2,consent:r2,globals:a2,user:g2}=e;if(!s2)return Pe({ok:!1});if(t2){const n3=e.config.queueMax;if(void 0===n3)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o3=Ce(e.queue,t2,{max:n3});if(o3.dropped>0){const t3=Ae(e.status,I("collector"),"queue",o3.dropped);qe(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n3,droppedCount:t3})}else e.queue.length<n3&&xe(e.queue);e.status.in++}o2||(o2=e.destinations);const h2=e.transformers?oe(e.transformers):{},w2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let w3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],t2&&w3.push(u(t2));const v3=n2.ingest?{...n2.ingest,_meta:{...n2.ingest._meta,path:[...n2.ingest._meta.path]}}:p("unknown");if(!w3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!w3.length&&s3.queueOn?.length){let t3=!1;try{t3=await Te(e,s3,o3)}catch(t4){e.status.failed++;const n3=s3.type||"unknown";e.logger.scope(n3).error("destination init failed",{error:t4 instanceof Error?t4.message:String(t4)})}return{id:o3,destination:s3,skipped:!t3}}const b3=[],k3=w3.filter(t3=>{const n3=y(s3.config.consent,r2,t3.consent);if(n3)return t3.consent=n3,b3.push(t3),!1;const a3=S(e,{stepId:I("destination",o3),stepType:"destination",phase:"skip",eventId:"string"==typeof t3.id?t3.id:"",now:Date.now()});return a3.skipReason="consent",r2&&(a3.consent={...r2}),s3.config.consent&&(a3.meta={required:{...s3.config.consent}}),m(e,a3),!0});if(k3.length>0){const t3=s3.queuePush,n3=s3.config.id||o3,r3={max:s3.config.queueMax??1e3};let a3=0;for(const e2 of k3)a3+=Ce(t3,e2,r3).dropped;if(a3>0){De(e,n3);const o4=Ae(e.status,I("destination",n3),"queue",a3);qe(t3,e.logger.scope(s3.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n3,cap:r3.max,droppedCount:o4})}else t3.length<r3.max&&xe(t3)}if(!b3.length)return{id:o3,destination:s3,queue:w3};let C2,x2,O2=!1;try{O2=await Te(e,s3,o3)}catch(t3){e.status.failed++;const n3=s3.type||"unknown";e.logger.scope(n3).error("destination init failed",{error:t3 instanceof Error?t3.message:String(t3)})}if(!O2)return{id:o3,destination:s3,queue:w3};s3.dlq||(s3.dlq=[]);const j2=$e(s3.config.before,h2,v3),D2=s3.config.next,A2=s3.config?.cache,$2=A2?d(A2):void 0,E2=$2?ne($2,e):void 0;let M2=0,T2=0;return await Promise.all(b3.map(async t3=>{let r3;if(t3.globals=i(a2,t3.globals),t3.user=i(g2,t3.user),$2?.stop&&E2){const e2=c(v3,t3),n3=await l($2,E2,e2);if("HIT"===n3?.status)return t3;"MISS"===n3?.status&&(r3={key:n3.key,ttl:n3.rule.ttl})}let u2=t3,d2=n2.respond;if(j2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await ue(e,e.transformers,j2,t3,v3,n2.respond,`destination.${o3}.before`);if(null===s4.event)return t3;s4.respond&&(d2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if($2&&!$2.stop&&E2){const e2=c(v3,u2),n3=await l($2,E2,e2);if("HIT"===n3?.status)return t3;"MISS"===n3?.status&&(r3={key:n3.key,ttl:n3.rule.ttl})}const p2=Date.now();let m2=!1;const y2=await q(_e,t4=>{const n3=s3.type||"unknown";e.logger.scope(n3).error("Push failed",{error:t4,event:u2.name}),C2=t4,m2=!0;const r4=s3.dlq,a3=s3.config.id||o3,i2={max:s3.config.dlqMax??100},c2=Ce(r4,[u2,t4],i2);if(c2.dropped>0){De(e,a3);const t5=Ae(e.status,I("destination",a3),"dlq",c2.dropped);qe(r4,e.logger.scope(s3.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:a3,cap:i2.max,droppedCount:t5})}else r4.length<i2.max&&xe(r4)})(e,s3,o3,u2,v3,d2);if(M2+=Date.now()-p2,r3&&E2&&void 0===s3.config.mock&&f(E2,r3.key,y2??!0,r3.ttl),void 0===y2||Se(y2)||(x2=y2),Se(y2)&&T2++,!m2&&D2){void 0!==y2&&(v3._response=y2);const t4=$e(D2,h2,v3);if(t4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n3=await ue(e,e.transformers,t4,u2,v3,d2,`destination.${o3}.next`);n3.respond&&(d2=n3.respond)}}return t3})),{id:o3,destination:s3,error:C2,response:x2,totalDuration:M2,batchedCount:T2,allowedCount:b3.length}})),v2={},b2={},k2={};for(const t3 of w2){if(t3.skipped)continue;const n3=t3.destination,o3={type:n3.type||"unknown",data:t3.response};De(e,t3.id);const s3=e.status.destinations[t3.id],r3=Date.now();if(s3.queuePushSize=n3.queuePush?.length??0,s3.dlqSize=n3.dlq?.length??0,t3.error)o3.error=t3.error,k2[t3.id]=o3,s3.failed++,s3.lastAt=r3,s3.duration+=t3.totalDuration||0,e.status.failed++;else if(t3.queue&&t3.queue.length)b2[t3.id]=o3;else{const n4=t3.batchedCount??0,a3=t3.allowedCount??0;(Math.max(0,a3-n4)>0||0===a3)&&(v2[t3.id]=o3,s3.count++,s3.lastAt=r3,s3.duration+=t3.totalDuration||0,e.status.out++)}}return Pe({event:t2,...Object.keys(v2).length&&{done:v2},...Object.keys(b2).length&&{queued:b2},...Object.keys(k2).length&&{failed:k2}})}async function Te(e,t2,n2){if(t2.init&&!t2.config.init){const o2=t2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:n2,config:t2.config,env:Be(t2.env,t2.config.env)};s2.debug("init");const a2=Date.now();let i2;m(e,S(e,{stepId:I("destination",n2),stepType:"destination",phase:"init",eventId:"",now:a2}));try{i2=await x(t2.init,"DestinationInit",e.hooks,e.logger)(r2)}catch(t3){const o3=Date.now(),s3=S(e,{stepId:I("destination",n2),stepType:"destination",phase:"error",eventId:"",now:o3});throw s3.durationMs=o3-a2,s3.error=t3 instanceof Error?{name:t3.name,message:t3.message}:{message:String(t3)},m(e,s3),t3}if(!1===i2)return i2;if(t2.config={...i2||t2.config,init:!0},t2.queueOn?.length){const o3=t2.queueOn;t2.queueOn=[];for(const{type:s3,data:r3}of o3)ve(e,t2,n2,s3,r3)}s2.debug("init done")}return!0}async function _e(e,t2,n2,o2,s2,r2){const{config:a2}=t2,i2=await C(o2,a2,e);if(i2.ignore)return!1;const c2=t2.type||"unknown",u2=e.logger.scope(c2),d2={collector:e,logger:u2,id:n2,config:a2,data:i2.data,rule:i2.mapping,ingest:s2,env:{...Be(t2.env,a2.env),...r2?{respond:r2}:{}}};if(void 0!==a2.mock)return u2.debug("mock",{event:i2.event.name}),a2.mock;const l2=i2.mapping,f2=i2.mappingKey||"* *";if(l2?.batch&&t2.pushBatch&&void 0===a2.mock){if(t2.batches=t2.batches||{},!t2.batches[f2]){const o4={key:f2,entries:[],events:[],data:[]},s3=je(l2.batch),r3=je(a2.batch),i3=s3.wait??r3.wait??3e4,c4=s3.size??r3.size??1e3,d4=s3.age??r3.age??3e4,p2=Be(t2.env,a2.env),h2=g(async()=>{const o5=t2.batches[f2].batched;if(0===o5.entries.length)return;const s4={key:o5.key,entries:o5.entries,events:o5.events,data:o5.data};o5.entries=[],o5.events=[],o5.data=[];const r4=s4.entries[0],i4={collector:e,logger:u2,id:n2,config:a2,data:void 0,rule:r4.rule,ingest:r4.ingest,env:{...p2,...r4.respond?{respond:r4.respond}:{}}};u2.debug("push batch",{events:s4.entries.length});const c5=t2.config.id||n2,d5=De(e,c5),l3=Date.now(),g2=S(e,{stepId:I("destination",n2),stepType:"destination",phase:"flush",eventId:"",now:l3});g2.batch={size:s4.entries.length,index:0},m(e,g2);let h3=!0;await q(x(t2.pushBatch,"DestinationPushBatch",e.hooks,e.logger),o6=>{h3=!1;const r5=Date.now(),a3=S(e,{stepId:I("destination",n2),stepType:"destination",phase:"error",eventId:"",now:r5});a3.durationMs=r5-l3,a3.error=o6 instanceof Error?{name:o6.name,message:o6.message}:{message:String(o6)},a3.batch={size:s4.entries.length,index:0},m(e,a3);const i5=t2.dlq=t2.dlq||[],f3={max:t2.config.dlqMax??100};let p3=0;for(const e2 of s4.entries)p3+=Ce(i5,[e2.event,o6],f3).dropped;if(p3>0){const t3=Ae(e.status,I("destination",c5),"dlq",p3);qe(i5,u2,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c5,cap:f3.max,droppedCount:t3})}else i5.length<f3.max&&xe(i5);d5.failed+=s4.entries.length,d5.dlqSize=i5.length,e.status.failed+=s4.entries.length,u2.error("Push batch failed",{error:o6 instanceof Error?o6.message:String(o6),entries:s4.entries.length})})(s4,i4),u2.debug("push batch done"),d5.inFlightBatch=Math.max(0,(d5.inFlightBatch??0)-s4.entries.length),h3&&(d5.count+=s4.entries.length,d5.lastAt=Date.now(),e.status.out+=s4.entries.length)},{wait:i3,size:c4,age:d4});t2.batches[f2]={batched:o4,batchFn:()=>{h2()},flush:async()=>{await h2.flush()}}}const o3=t2.batches[f2];o3.batched.entries.push({event:i2.event,ingest:s2,respond:r2,rule:l2,data:i2.data}),o3.batched.events.push(i2.event),v(i2.data)&&o3.batched.data.push(i2.data);const c3=t2.config.id||n2,d3=De(e,c3);return d3.inFlightBatch=(d3.inFlightBatch??0)+1,o3.batchFn(),Oe}{u2.debug("push",{event:i2.event.name});const o3="string"==typeof i2.event.id?i2.event.id:"",s3=Date.now(),r3=S(e,{stepId:I("destination",n2),stepType:"destination",phase:"in",eventId:o3,now:s3});i2.mappingKey&&(r3.mappingKey=i2.mappingKey),i2.event.consent&&(r3.consent={...i2.event.consent}),m(e,r3);try{const r4=await x(t2.push,"DestinationPush",e.hooks,e.logger)(i2.event,d2),a3=Date.now(),c3=S(e,{stepId:I("destination",n2),stepType:"destination",phase:"out",eventId:o3,now:a3});return c3.durationMs=a3-s3,c3.outEvent=r4,i2.mappingKey&&(c3.mappingKey=i2.mappingKey),m(e,c3),u2.debug("push done"),r4}catch(t3){const r4=Date.now(),a3=S(e,{stepId:I("destination",n2),stepType:"destination",phase:"error",eventId:o3,now:r4});throw a3.durationMs=r4-s3,a3.error=t3 instanceof Error?{name:t3.name,message:t3.message}:{message:String(t3)},i2.mappingKey&&(a3.mappingKey=i2.mappingKey),m(e,a3),t3}}}function Pe(e){return{ok:!e?.failed,...e}}function ze(e){const{code:t2,config:n2={},env:o2={},cache:s2}=e,{config:r2}=se(e,"before"),{config:a2}=se({...e,config:r2},"next"),i2={...t2.config,...n2,...a2};s2&&(i2.cache=s2);const c2=Be(t2.env,o2);return{...t2,config:i2,env:c2}}function Be(e,t2){return e||t2?t2?e&&k(e)&&k(t2)?{...e,...t2}:t2:e:{}}async function Ne(e,t2,n2){const o2=Object.entries(e).map(async([e2,o3])=>{const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",a2=n2.scope(r2),i2={id:e2,config:o3.config,env:o3.env??{},logger:a2};try{await Promise.race([s2(i2),new Promise((n3,o4)=>setTimeout(()=>o4(new Error(`${t2} '${e2}' destroy timed out`)),5e3))])}catch(n3){a2.error(`${t2} '${e2}' destroy failed: ${n3}`)}});await Promise.allSettled(o2)}async function Ue(e,t2,o2){let r2,a2,i2=!1;switch(t2){case n_Commands.Config:We(o2)&&(He(e.config,o2,{shallow:!1}),a2=o2,i2=!0);break;case n_Commands.Consent:if(We(o2)){const{update:t3}=function(e,t2){const n2={};return Object.entries(t2).forEach(([e2,t3])=>{n2[e2]=!!t3}),e.consent=o(e.consent,n2),{update:n2}}(e,o2);a2=t3,i2=!0}break;case n_Commands.Custom:We(o2)&&(e.custom=He(e.custom,o2),a2=o2,i2=!0);break;case n_Commands.Destination:We(o2)&&"code"in o2&&We(o2.code)&&(r2=await async function(e,t2){const{code:n2,config:o2={},env:s2={},before:r2,next:a2,cache:i2}=t2;if(!b(n2.push))return Pe({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c2=o2||{init:!1};let u2=r2?{...c2,before:r2}:{...c2};a2&&(u2={...u2,next:a2}),i2&&(u2={...u2,cache:i2});const d2={...n2,config:u2,env:Be(n2.env,s2)};let l2=d2.config.id;if(!l2)do{l2=h(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[l2]);return e.destinations[l2]=d2,!1!==d2.config.queue&&(d2.queuePush=[...e.queue]),Me(e,void 0,{},{[l2]:d2})}(e,o2));break;case n_Commands.Globals:We(o2)&&(e.globals=He(e.globals,o2),a2=o2,i2=!0);break;case n_Commands.Hook:if(We(o2)&&Ge(o2.name)&&Ke(o2.fn)){const{name:t3,fn:n2}=o2;e.hooks[t3]=n2,a2=o2,i2=!0}break;case n_Commands.On:if(We(o2)&&Ge(o2.type)){const{type:t3,rules:n2}=o2;await async function(e,t2,n2){const o2=e.on,s2=o2[t2]||[],r2=j(n2)?n2:[n2];r2.forEach(e2=>{s2.push(e2)}),o2[t2]=s2,be(e,t2,r2)}(e,t3,n2)}break;case n_Commands.Ready:i2=!0;break;case n_Commands.Run:r2=await async function(e,t2){return e.allowed=!0,e.timing=Date.now(),t2&&(t2.consent&&(e.consent=He(e.consent,t2.consent)),t2.user&&(e.user=He(e.user,t2.user)),t2.globals&&(e.globals=He(e.config.globalsStatic||{},t2.globals)),t2.custom&&(e.custom=He(e.custom,t2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await Me(e)}(e,o2),i2=!0;break;case n_Commands.Session:i2=!0;break;case n_Commands.Shutdown:await async function(e2){const t3=e2.logger;await Ne(e2.sources,"source",t3),await Ne(e2.destinations,"destination",t3),await Ne(e2.transformers,"transformer",t3),await Ne(e2.stores,"store",t3)}(e);break;case n_Commands.User:We(o2)&&(He(e.user,o2,{shallow:!1}),a2=o2,i2=!0)}return i2&&(await async function(e,t2,o2,s2){let r2,a2=o2||[];switch(o2||(a2=e.on[t2]||[]),t2){case n_Commands.Consent:r2=s2||e.consent;break;case n_Commands.Session:r2=e.session;break;case n_Commands.User:r2=s2||e.user;break;case n_Commands.Custom:r2=s2||e.custom;break;case n_Commands.Globals:r2=s2||e.globals;break;case n_Commands.Config:r2=s2||e.config;break;case n_Commands.Ready:case n_Commands.Run:default:r2=void 0}let i2=!1;for(const[n2,o3]of Object.entries(e.sources)){if(o3.config.require?.length){const e2=o3.config.require.indexOf(t2);-1!==e2&&o3.config.require.splice(e2,1)}o3.on&&(pe(o3)?!1===await $(o3.on,o4=>he(e,"source",o4,{sourceId:n2,type:t2}))(t2,r2)&&(i2=!0):(o3.queueOn=o3.queueOn||[],o3.queueOn.push({type:t2,data:r2})))}Object.entries(e.destinations).forEach(([n2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:t2,data:r2});ve(e,o3,n2,t2,r2)}});for(const[t3,n2]of Object.entries(e.sources))pe(n2)&&n2.queueOn?.length&&await fe(e,n2,t3);return Object.keys(e.pending.destinations).length>0&&await async function(e2,t3){for(const[n2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[n2]||e2.destinations[n2])continue;const s3=o3.config?.require;if(!s3)continue;const r3=s3.indexOf(t3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[n2];const a3=ze(o3);!1!==a3.config.queue&&(a3.queuePush=[...e2.queue]),e2.destinations[n2]=a3}}(e,t2),be(e,t2,a2,s2),!i2}(e,t2,void 0,a2),r2=await Me(e)),r2||Pe({ok:!0})}function Le(e,t2){if(!t2.name)throw new Error("Event name is required");const[n2,o2]=t2.name.split(" ");if(!n2||!o2)throw new Error("Event name is invalid");const{timestamp:s2=Date.now(),name:r2=`${n2} ${o2}`,data:a2={},context:i2={},globals:c2=e.globals,custom:u2={},user:d2=e.user,nested:l2=[],consent:f2=e.consent,id:p2=Fe(),trigger:g2="",entity:m2=n2,action:h2=o2,timing:y2=0,source:w2={type:"collector",schema:"4"}}=t2;return{name:r2,data:a2,context:i2,globals:c2,custom:u2,user:d2,nested:l2,consent:f2,id:p2,trigger:g2,entity:m2,action:h2,timestamp:s2,timing:y2,source:w2}}function ct(e={}){const t2=e.maxEntries??1e4,n2=e.lowWaterMark??.8,o2=e.sweepIntervalMs??6e4,s2=Math.floor(t2*n2),r2=new Map,a2={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let i2;return o2>0&&(i2=setInterval(function(){const e2=Date.now();let t3=0;for(const[n3,o3]of r2)void 0!==o3.expires&&o3.expires<=e2&&(r2.delete(n3),t3++);a2.evictions_ttl+=t3},o2),i2&&"function"==typeof i2.unref&&i2.unref()),{type:"memory",config:{},get(e2){const t3=r2.get(e2);if(t3)return void 0!==t3.expires&&t3.expires<=Date.now()?(r2.delete(e2),a2.evictions_ttl++,void a2.misses++):(r2.delete(e2),r2.set(e2,t3),a2.hits++,t3.value);a2.misses++},set(e2,n3,o3){const i3=!r2.has(e2);i3||r2.delete(e2),r2.set(e2,{value:n3,expires:void 0!==o3?Date.now()+o3:void 0}),a2.writes++,i3&&a2.populates++,r2.size>t2&&function(){if(r2.size<=t2)return;const e3=r2.size-s2;let n4=0;for(const t3 of r2.keys()){if(n4>=e3)break;r2.delete(t3),n4++}a2.evictions_entries+=n4}()},delete(e2){r2.delete(e2)&&a2.deletes++},get counters(){return{...a2}},destroy(){void 0!==i2&&(clearInterval(i2),i2=void 0),r2.clear()}}}function lt(e,t2){const{cacheConfig:n2,cacheStore:o2,namespace:s2,logger:r2,storeId:a2,collector:i2}=t2,c2=(e2,t3)=>{if(!i2)return;const n3=S(i2,{stepId:`store.${a2}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n3.meta={op:"cache",cached:"hit"===t3,status:t3,key:e2},dt(i2,n3)},u2={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},d2=n2.rules.map(e2=>({match:e2.match?ut(e2.match):()=>!0,ttl:e2.ttl})),l2=e2=>`${s2}:${e2}`;function f2(e2,t3){const n3=void 0===t3?{key:e2}:{key:e2,value:t3};return d2.find(e3=>e3.match(n3))}const p2=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...u2}},async get(t3){const n3=l2(t3),s3=await o2.get(n3);if(void 0!==s3)return u2.hits++,c2(t3,"hit"),s3;const r3=p2.get(n3);if(r3)return u2.inflight_dedups++,c2(t3,"hit"),r3;u2.misses++,c2(t3,"miss");const a3=(async()=>{try{const s4=await e.get(t3);if(void 0===s4)return;const r4=f2(t3,s4);if(r4)try{await o2.set(n3,s4,1e3*r4.ttl),u2.populates++}catch(e2){g2("set",t3,e2)}return s4}finally{p2.delete(n3)}})();return p2.set(n3,a3),a3},async set(t3,n3,s3){u2.writes++,await e.set(t3,n3,s3);const r3=f2(t3,n3);if(r3)try{await o2.set(l2(t3),n3,1e3*r3.ttl)}catch(e2){g2("set",t3,e2)}},async delete(t3){u2.deletes++,await e.delete(t3);try{await o2.delete(l2(t3))}catch(e2){g2("delete",t3,e2)}}};function g2(e2,t3,n3){const o3=`store-cache(${a2}): cache ${e2} failed for "${t3}"; backing succeeded, continuing`;r2?r2.warn(o3,{error:n3}):console.warn(o3,n3)}}function ft(e,t2,n2){const o2=`store.${n2}`,s2=it(t2.get,"StoreGet",e.hooks,e.logger),r2=it(t2.set,"StoreSet",e.hooks,e.logger),a2=it(t2.delete,"StoreDelete",e.hooks,e.logger);t2.get=async t3=>{const n3=Date.now(),r3=S(e,{stepId:o2,stepType:"store",phase:"in",eventId:"",now:n3});r3.meta={op:"get",key:t3},at(e,r3);try{const r4=await s2(t3),a3=Date.now(),i2=S(e,{stepId:o2,stepType:"store",phase:"out",eventId:"",now:a3});return i2.durationMs=a3-n3,i2.meta={op:"get",key:t3},at(e,i2),r4}catch(s3){const r4=Date.now(),a3=S(e,{stepId:o2,stepType:"store",phase:"error",eventId:"",now:r4});throw a3.durationMs=r4-n3,a3.meta={op:"get",key:t3},a3.error=s3 instanceof Error?{name:s3.name,message:s3.message}:{message:String(s3)},at(e,a3),s3}},t2.set=async(t3,n3,s3)=>{const a3=Date.now(),i2=S(e,{stepId:o2,stepType:"store",phase:"in",eventId:"",now:a3});i2.meta={op:"set",key:t3},at(e,i2);try{await r2(t3,n3,s3);const i3=Date.now(),c2=S(e,{stepId:o2,stepType:"store",phase:"out",eventId:"",now:i3});c2.durationMs=i3-a3,c2.meta={op:"set",key:t3},at(e,c2)}catch(n4){const s4=Date.now(),r3=S(e,{stepId:o2,stepType:"store",phase:"error",eventId:"",now:s4});throw r3.durationMs=s4-a3,r3.meta={op:"set",key:t3},r3.error=n4 instanceof Error?{name:n4.name,message:n4.message}:{message:String(n4)},at(e,r3),n4}},t2.delete=async t3=>{const n3=Date.now(),s3=S(e,{stepId:o2,stepType:"store",phase:"in",eventId:"",now:n3});s3.meta={op:"delete",key:t3},at(e,s3);try{await a2(t3);const s4=Date.now(),r3=S(e,{stepId:o2,stepType:"store",phase:"out",eventId:"",now:s4});r3.durationMs=s4-n3,r3.meta={op:"delete",key:t3},at(e,r3)}catch(s4){const r3=Date.now(),a3=S(e,{stepId:o2,stepType:"store",phase:"error",eventId:"",now:r3});throw a3.durationMs=r3-n3,a3.meta={op:"delete",key:t3},a3.error=s4 instanceof Error?{name:s4.name,message:s4.message}:{message:String(s4)},at(e,a3),s4}}}async function gt(e){const t2=r({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),n2={level:e.logger?.level,handler:e.logger?.handler},o2=a(n2),s2={...t2.globalsStatic,...e.globals},i2={allowed:!1,config:t2,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,hooks:e.hooks||{},observers:new Set,logger:o2,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var e2,t3;i2.push=function(e,t2){const n2=tt(async(n3,o2={})=>await et(async()=>{const s2=Date.now(),{id:r2,ingest:a2,respond:i2,mapping:c2,preChain:u2,include:d2,exclude:l2}=o2;let f2=i2,p2=n3;const g2=d2||l2?function(e2,t3,n4){let o3=e2;return t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>t3.includes(e3)))),n4&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!n4.includes(e3)))),o3}(e.destinations,d2,l2):void 0,m2=a2??Ye(r2||"unknown");if(c2){const t3=await Ze(p2,c2,e);if(t3.ignore)return Pe({ok:!0});if(c2.consent&&!Xe(c2.consent,e.consent,t3.event.consent))return Pe({ok:!0});p2=t3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n4=await ue(e,e.transformers,u2,p2,m2,f2,r2?`source.${r2}.next`:void 0);if(null===n4.event)return Pe({ok:!0});if(n4.stopped)return n4.respond&&(f2=n4.respond),Pe({ok:!0});if(n4.respond&&(f2=n4.respond),Array.isArray(n4.event)){const o3=await Promise.all(n4.event.map(async n5=>{const o4=t2(n5),s3=Le(e,o4);return Me(e,s3,{id:r2,ingest:m2,respond:f2},g2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const t3=e.status.sources[r2];t3.count+=n4.event.length,t3.lastAt=Date.now(),t3.duration+=Date.now()-s2}return o3[0]??Pe({ok:!0})}p2=n4.event}const h2=t2(p2),y2=Le(e,h2),w2=await Me(e,y2,{id:r2,ingest:m2,respond:f2},g2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const t3=e.status.sources[r2];t3.count++,t3.lastAt=Date.now(),t3.duration+=Date.now()-s2}return w2},t3=>{if(t3 instanceof Qe)throw t3;return e.status.failed++,e.logger.error("push failed",{event:n3,ingest:o2.ingest,error:t3}),Pe({ok:!1})})(),"Push",e.hooks,e.logger);return async(t3,o2)=>{const s2="string"==typeof t3.id?t3.id:"",r2=Date.now();Je(e,S(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s2,now:r2}));try{const a2=await n2(t3,o2),i2=Date.now(),c2=S(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:s2,now:i2});return c2.durationMs=i2-r2,c2.outEvent=a2,Je(e,c2),a2}catch(t4){const n3=Date.now(),o3=S(e,{stepId:"collector.push",stepType:"collector",phase:"error",eventId:s2,now:n3});throw o3.durationMs=n3-r2,o3.error=t4 instanceof Error?{name:t4.name,message:t4.message}:{message:String(t4)},Je(e,o3),t4}}}(i2,e2=>({timing:Math.round((Date.now()-i2.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.2"},...e2})),i2.command=(t3=Ue,st(async(n3,o3,s3)=>await rt(async()=>await t3(e2,n3,o3,s3),t4=>{if(t4 instanceof ot)throw t4;return e2.status.failed++,e2.logger.error("command failed",{command:n3,data:o3,error:t4}),Pe({ok:!1})})(),"Command",(e2=i2).hooks,e2.logger));const c2=e.stores||{};return i2.stores=await async function(e,t2={}){const n2={};for(const[o3,s3]of Object.entries(t2)){const{code:t3,config:r2={},env:a2={}}=s3,i2=e.logger.scope("store").scope(o3),c2={collector:e,logger:i2,id:o3,config:r2,env:a2},u2=await t3(c2);n2[o3]=u2}const o2=t2,s2=function(e2){const t3={};for(const n4 of Object.keys(e2))t3[n4]="WHITE";const n3=[],o3=[];function s3(r2){const a2=t3[r2];if("BLACK"===a2)return;if("GRAY"===a2){const e3=o3.indexOf(r2),t4=o3.slice(-1===e3?0:e3).concat(r2).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t4}`)}t3[r2]="GRAY",o3.push(r2);const i2=e2[r2].cache?.store;if(void 0!==i2){if(!(i2 in e2))throw new Error(`Store "${r2}" cache.store references "${i2}", which is not declared in flow.stores`);s3(i2)}o3.pop(),t3[r2]="BLACK",n3.push(r2)}for(const n4 of Object.keys(e2))"WHITE"===t3[n4]&&s3(n4);return n3}(o2);for(const t3 of s2){const s3=o2[t3].cache;if(!s3)continue;let r2,a2;void 0!==s3.store?(r2=n2[s3.store],a2=s3.store):(n2.__cache||(n2.__cache=ct()),r2=n2.__cache,a2="__cache");const i2=s3.namespace??t3;e.logger.scope("store-cache").scope(t3).info(`store "${t3}" caches with namespace "${i2}:" via ${a2}`),n2[t3]=lt(n2[t3],{storeId:t3,cacheConfig:s3,cacheStore:r2,namespace:i2,logger:e.logger.scope("store-cache").scope(t3),collector:e})}for(const[t3,o3]of Object.entries(n2))"__cache"!==t3&&ft(e,o3,t3);return n2}(i2,c2),function(e2,t3,n3){const o3=new Map;for(const[n4,s4]of Object.entries(e2))t3[n4]&&o3.set(s4,t3[n4]);if(0!==o3.size)for(const e3 of[n3.transformers,n3.destinations,n3.sources])if(e3)for(const t4 of Object.values(e3))s3(t4.env);function s3(e3){if(e3)for(const[t4,n4]of Object.entries(e3))if("object"==typeof n4&&null!==n4){const s4=o3.get(n4);s4&&(e3[t4]=s4)}}}(c2,i2.stores,e),i2.stores.__cache||(i2.stores.__cache=ct()),i2.destinations=await async function(e,t2={}){const n2={};for(const[o2,s2]of Object.entries(t2))s2.config?.require?.length?e.pending.destinations[o2]=s2:n2[o2]=ze(s2);return n2}(i2,e.destinations||{}),i2.transformers=await async function(e2,t3={}){const n3={};for(const[o3,s3]of Object.entries(t3)){const{code:t4,env:r2={}}=s3,a2=ee(s3,"Transformer");if(!a2.ok){e2.logger.warn(`Transformer ${o3} invalid (${a2.code}): ${a2.reason}. Skipping.`);continue}const{config:i3}=se(s3,"before"),{config:c3}=se({...s3,config:i3},"next"),u2=Object.keys(r2).length>0?{...c3,env:r2}:c3,{cache:d2}=s3,l2=d2?{...u2,cache:d2}:u2,f2=e2.logger.scope("transformer").scope(o3),p2={collector:e2,logger:f2,id:o3,ingest:K(o3),config:l2,env:r2},g2=t4??(e3=>{const t5=s3.mapping;if(t5){const n4=[];if(void 0!==t5.data&&n4.push("data"),t5.mapping)for(const[e4,o4]of Object.entries(t5.mapping))if("object"==typeof o4&&null!==o4)for(const[t6,s4]of Object.entries(o4)){if("object"!=typeof s4||null===s4)continue;const o5=s4;void 0!==o5.data&&n4.push(`mapping[${e4}][${t6}].data`),void 0!==o5.silent&&n4.push(`mapping[${e4}][${t6}].silent`)}return n4.length>0&&e3.collector.logger.warn(`Transformer ${o3}: \`${n4.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e3.config,push:async n5=>{const o4=await te(n5,t5,e3.collector);return!o4.ignore&&{event:o4.event}}}}return{type:"pass",config:e3.config,push:e4=>({event:e4})}}),m2=await g2(p2);void 0!==s3.before&&void 0===m2.config?.before&&(m2.config={...m2.config??{},before:s3.before}),void 0!==s3.next&&void 0===m2.config?.next&&(m2.config={...m2.config??{},next:s3.next}),n3[o3]=m2}return n3}(i2,e.transformers||{}),i2}async function mt(e){e=e||{};const t2=await gt(e),n2=(o2=t2,{type:"elb",config:{},push:async(e2,t3,n3,s3,r3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const n4=e2.replace("walker ","");return o2.command(n4,t3)}let a3;if("string"==typeof e2)a3={name:e2},t3&&"object"==typeof t3&&!Array.isArray(t3)&&(a3.data=t3);else{if(!e2||"object"!=typeof e2)return Pe({ok:!1});a3=e2,t3&&"object"==typeof t3&&!Array.isArray(t3)&&(a3.data={...a3.data||{},...t3})}return n3&&"object"==typeof n3&&(a3.context=n3),s3&&Array.isArray(s3)&&(a3.nested=s3),r3&&"object"==typeof r3&&(a3.custom=r3),o2.push(a3)}});var o2;t2.sources.elb=n2,await async function(e,t2={}){const n2={};for(const[o2,s2]of Object.entries(t2)){const t3=await ge(e,o2,s2);if(!t3)continue;const r2=s2.config?.require;t3.config={...t3.config,init:!1,...r2?{require:[...r2]}:{}},n2[o2]=t3}Object.assign(e.sources,n2);for(const t3 of Object.keys(n2)){const n3=e.sources[t3];let o2=!1;n3.init&&await _(n3.init.bind(n3),n4=>{if(n4 instanceof M)throw n4;o2=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t3,error:n4})})(),o2||(n3.config.init=!0,pe(n3)&&await fe(e,n3,t3))}return n2}(t2,e.sources||{});const{consent:s2,user:r2,globals:a2,custom:i2}=e;s2&&await t2.command("consent",s2),r2&&await t2.command("user",r2),a2&&Object.assign(t2.globals,a2),i2&&Object.assign(t2.custom,i2),t2.config.run&&await t2.command("run");let c2=n2.push;const u2=Object.values(t2.sources).filter(e2=>"elb"!==e2.type),d2=u2.find(e2=>e2.config.primary);return d2?c2=d2.push:u2.length>0&&(c2=u2[0].push),{collector:t2,elb:c2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await mt(config);flow={collector:result.collector,elb:result.elb}}const source=function(collector){for(const source of Object.values(collector.sources||{}))if("lambda"===source.type)return source}(flow.collector);if(!source)throw new Error("Lambda source not found in collector");const lambdaContext={awsRequestId:`test-${Date.now()}`},pushFn=source.push,lambdaResult=await pushFn(content,lambdaContext);let body;try{body=JSON.parse(lambdaResult.body||"{}")}catch{body=lambdaResult.body}const headers={};if(lambdaResult.headers)for(const[k2,v2]of Object.entries(lambdaResult.headers))void 0!==v2&&(headers[k2]=String(v2));return{statusCode:lambdaResult.statusCode,body:body,headers:headers}}}};function trigger(source){return async content=>{const lambdaEvent={...content};if(lambdaEvent.body&&"string"==typeof lambdaEvent.body){const body=JSON.parse(lambdaEvent.body);body.name&&!body.event&&(lambdaEvent.body=JSON.stringify({...body,event:body.name,name:void 0}))}return source.push(lambdaEvent,{awsRequestId:"test-req"})}}var lambda_default=async context=>{const{config:config={},env:env}=context,userSettings=config.settings||{},settings={...userSettings,cors:userSettings.cors??!0,timeout:userSettings.timeout??3e4,enablePixelTracking:userSettings.enablePixelTracking??!0,healthPath:userSettings.healthPath??"/health"};return{type:"lambda",config:{...config,settings:settings},push:async(event,lambdaContext)=>{const requestId=lambdaContext.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&¶ms.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);return settings.healthPath&&path===settings.healthPath?createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId):"OPTIONS"===parsed.method?createResponse(204,"",corsHeaders,requestId):await context.withScope(event,void 0,async scopeEnv=>{const envPush=scopeEnv.push;if("GET"===parsed.method){if(!settings.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=requestToData(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch{return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return await envPush({}),createResponse(200,{success:!0,requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:result?.event?.id}}catch(error){return logger?.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)})}catch(error){return env.logger?.error("Lambda handler error",{error:error,requestId:requestId,method:parsed?.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}};import{DeleteMessageCommand,GetQueueAttributesCommand as GetQueueAttributesCommand2,GetQueueUrlCommand,ReceiveMessageCommand}from"@aws-sdk/client-sqs";var DecoderError=class extends Error{constructor(message){super(message),this.name="DecoderError"}};import{SQSClient}from"@aws-sdk/client-sqs";import{CreateQueueCommand,GetQueueAttributesCommand,SQSClient as SQSClient2}from"@aws-sdk/client-sqs";import{SNSClient,SubscribeCommand}from"@aws-sdk/client-sns";import{resolveSetup}from"@walkeros/core";var DEFAULT_SETUP={region:"eu-central-1",fifoQueue:!1,visibilityTimeoutSeconds:30,messageRetentionSeconds:345600,maximumMessageSize:262144};function buildDlqAttributes(args){const attrs={};return attrs.MessageRetentionPeriod=String(1209600),args.kmsMasterKeyId&&(attrs.KmsMasterKeyId=args.kmsMasterKeyId),args.fifoQueue&&(attrs.FifoQueue="true",attrs.ContentBasedDeduplication="true"),attrs}async function ensureQueue(args){const{sqs:sqs,logger:logger,queueName:queueName,attributes:attributes,tags:tags}=args;let queueUrl,queueCreated=!1;try{queueUrl=(await sqs.send(new CreateQueueCommand({QueueName:queueName,Attributes:attributes,tags:tags}))).QueueUrl??"",queueCreated=!0,logger.info(`SQS queue "${queueName}" created.`)}catch(err){if(function(err){return!!function(err){return"object"==typeof err&&null!==err&&"string"==typeof err.name}(err)&&("QueueNameExists"===err.name||"QueueAlreadyExists"===err.name||"AWS.SimpleQueueService.QueueNameExists"===err.name)}(err)){const message=err instanceof Error?err.message:String(err);return logger.throw(`SQS queue "${queueName}" exists with different attributes (${message}). Setup will not mutate an existing queue's attributes. Delete or rename the queue, then re-run setup.`)}throw err}if(!queueUrl)return logger.throw(`SQS CreateQueueCommand returned no QueueUrl for "${queueName}".`);const attrsRes=await sqs.send(new GetQueueAttributesCommand({QueueUrl:queueUrl,AttributeNames:["QueueArn"]})),queueArn=attrsRes.Attributes?.QueueArn??"";return queueArn?{queueCreated:queueCreated,queueUrl:queueUrl,queueArn:queueArn}:logger.throw(`SQS GetQueueAttributesCommand returned no QueueArn for "${queueName}".`)}function dlqName(queueName,fifo){if(fifo){return`${queueName.endsWith(".fifo")?queueName.slice(0,-5):queueName}-dlq.fifo`}return`${queueName}-dlq`}var setup=async context=>{const{id:id,config:config,env:env,logger:logger}=context,merged=resolveSetup(config.setup,DEFAULT_SETUP);if(!merged)return void logger.debug("SQS source setup skipped (config.setup is falsy).");const options={...DEFAULT_SETUP,...merged},settings=config.settings;if(!settings)return logger.throw("setup: settings missing");const queueName=settings.queueName;if(!queueName)return logger.throw("setup: settings.queueName is missing");const region=options.region??"eu-central-1",sqs=new(env.AWS?.SQSClient??SQSClient2)({region:region});let dlqArn,dlqCreated=!1;if(options.deadLetterQueue?.arn)dlqArn=options.deadLetterQueue.arn;else if(options.deadLetterQueue?.create){const dlqResult=await ensureQueue({sqs:sqs,logger:logger,queueName:dlqName(queueName,options.fifoQueue??!1),attributes:buildDlqAttributes({fifoQueue:options.fifoQueue??!1,kmsMasterKeyId:options.kmsMasterKeyId}),tags:(parentTags=options.tags,{...parentTags??{},walkerOS:"dlq"})});dlqArn=dlqResult.queueArn,dlqCreated=dlqResult.queueCreated}var parentTags;const finalQueueName=options.fifoQueue?queueName.endsWith(".fifo")?queueName:`${queueName}.fifo`:queueName;var args;const mainAttrs=function(args){const{options:options,dlqArn:dlqArn,queuePolicy:queuePolicy}=args,attrs={};if(attrs.VisibilityTimeout=String(options.visibilityTimeoutSeconds??30),attrs.MessageRetentionPeriod=String(options.messageRetentionSeconds??345600),attrs.MaximumMessageSize=String(options.maximumMessageSize??262144),options.kmsMasterKeyId&&(attrs.KmsMasterKeyId=options.kmsMasterKeyId),options.fifoQueue&&(attrs.FifoQueue="true",attrs.ContentBasedDeduplication="true"),dlqArn){const maxReceiveCount=options.deadLetterQueue?.maxReceiveCount??5;attrs.RedrivePolicy=JSON.stringify({deadLetterTargetArn:dlqArn,maxReceiveCount:maxReceiveCount})}return queuePolicy&&(attrs.Policy=queuePolicy),attrs}({options:options,dlqArn:dlqArn,queuePolicy:options.subscribeToSnsTopic?(args={sourceId:id,topicArn:options.subscribeToSnsTopic.topicArn},JSON.stringify({Version:"2012-10-17",Statement:[{Sid:`walkerOSAllowSNSPublish-${args.sourceId}`,Effect:"Allow",Principal:{Service:"sns.amazonaws.com"},Action:"SQS:SendMessage",Resource:"*",Condition:{ArnEquals:{"aws:SourceArn":args.topicArn}}}]})):void 0}),mainResult=await ensureQueue({sqs:sqs,logger:logger,queueName:finalQueueName,attributes:mainAttrs,tags:options.tags});let subscriptionArn;if(options.subscribeToSnsTopic){const sns=new(env.AWS?.SNSClient??SNSClient)({region:region}),subAttrs={};options.subscribeToSnsTopic.rawMessageDelivery&&(subAttrs.RawMessageDelivery="true"),options.subscribeToSnsTopic.filterPolicy&&(subAttrs.FilterPolicy=JSON.stringify(options.subscribeToSnsTopic.filterPolicy));subscriptionArn=(await sns.send(new SubscribeCommand({TopicArn:options.subscribeToSnsTopic.topicArn,Protocol:"sqs",Endpoint:mainResult.queueArn,Attributes:Object.keys(subAttrs).length>0?subAttrs:void 0,ReturnSubscriptionArn:!0}))).SubscriptionArn??void 0,logger.info("SQS source setup: SNS subscription created",{topicArn:options.subscribeToSnsTopic.topicArn,subscriptionArn:subscriptionArn})}return{queueCreated:mainResult.queueCreated,queueUrl:mainResult.queueUrl,queueArn:mainResult.queueArn,dlqCreated:dlqArn?dlqCreated:void 0,dlqArn:dlqArn,subscriptionArn:subscriptionArn}};async function handleMessage(args){const{message:message,settings:settings,pushFn:pushFn,logger:logger}=args;try{const decoded=function(messageId,body,decoder){if("raw"===decoder)return Buffer.from(body,"utf8");if("text"===decoder)return body;try{return JSON.parse(body)}catch(err){throw new DecoderError(`SQS message ${messageId} JSON decode failed: ${err instanceof Error?err.message:String(err)}`)}}(message.id,message.body,settings.decoder??"json");if(null==decoded)return logger.debug("SQS message acked-and-dropped (decoder returned null)",{id:message.id}),void await message.ack();await pushFn((value=decoded,"object"==typeof value&&null!==value?value:"string"==typeof value?{data:{payload:value}}:Buffer.isBuffer(value)?{data:{payload:value.toString("base64")}}:{data:{payload:String(value)}})),await message.ack()}catch(err){const error=err instanceof Error?err.message:String(err);err instanceof DecoderError?logger.error("SQS message decode failed",{id:message.id,error:error}):logger.error("SQS message handler failed",{id:message.id,error:error}),"ack"===settings.onPushError?await message.ack():await message.nack()}var value}function isQueueDoesNotExist(err){if("object"!=typeof err||null===err)return!1;if(!("name"in err))return!1;const obj=err;return"QueueDoesNotExist"===obj.name||"AWS.SimpleQueueService.NonExistentQueue"===obj.name}function isFetchedMessage(value){if("object"!=typeof value||null===value)return!1;const obj=value;return"string"==typeof obj.MessageId&&"string"==typeof obj.ReceiptHandle&&"string"==typeof obj.Body}var sqs_default=async context=>{const{config:partialConfig={},env:env,logger:logger,id:id}=context,config=function(partial={},env,logger){const partialSettings=partial.settings??{},queueName="string"==typeof partialSettings.queueName?partialSettings.queueName:"";queueName||logger.throw("Config settings queueName missing");const region=partialSettings.region??"eu-central-1";let client=partialSettings.client;client||(client=new(env?.AWS?.SQSClient??SQSClient)({region:region,...partialSettings.config}));const settings={...partialSettings,client:client,queueName:queueName,region:region,queueUrl:partialSettings.queueUrl,config:partialSettings.config,decoder:partialSettings.decoder??"json",maxMessages:partialSettings.maxMessages??10,waitTimeSeconds:partialSettings.waitTimeSeconds??20,visibilityTimeout:partialSettings.visibilityTimeout,shutdownTimeoutMs:partialSettings.shutdownTimeoutMs??3e4,onPushError:partialSettings.onPushError??"nack"};return{...partial,settings:settings}}(partialConfig,env,logger),settings=config.settings;if(!settings.queueUrl)try{const res=await settings.client.send(new GetQueueUrlCommand({QueueName:settings.queueName}));if(!res.QueueUrl)return logger.throw(`SQS queue not found: ${settings.queueName}. Run "walkeros setup source.${id}" to create it.`);settings.queueUrl=res.QueueUrl}catch(err){if(isQueueDoesNotExist(err))return logger.throw(`SQS queue not found: ${settings.queueName}. Run "walkeros setup source.${id}" to create it.`);throw err}if(!settings.queueArn)try{const res=await settings.client.send(new GetQueueAttributesCommand2({QueueUrl:settings.queueUrl,AttributeNames:["QueueArn"]}));settings.queueArn=res.Attributes?.QueueArn}catch(err){logger.debug("SQS GetQueueAttributesCommand failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}let stopped=!1;const inFlight=new Set,loopPromise=(async()=>{for(;!stopped;)try{const messages=(await settings.client.send(new ReceiveMessageCommand({QueueUrl:settings.queueUrl,MaxNumberOfMessages:settings.maxMessages??10,WaitTimeSeconds:settings.waitTimeSeconds??20,VisibilityTimeout:settings.visibilityTimeout,MessageAttributeNames:["All"],AttributeNames:["All"]}))).Messages??[];for(const msg of messages){if(!isFetchedMessage(msg)){logger.warn("SQS received malformed message; skipping",{messageId:"string"==typeof msg.MessageId?msg.MessageId:void 0});continue}const fetched=msg,handler=handleMessage({message:{id:fetched.MessageId,body:fetched.Body,receiptHandle:fetched.ReceiptHandle,ack:async()=>{await settings.client.send(new DeleteMessageCommand({QueueUrl:settings.queueUrl??"",ReceiptHandle:fetched.ReceiptHandle}))},nack:async()=>{}},settings:settings,pushFn:env.push,logger:logger});inFlight.add(handler),handler.finally(()=>{inFlight.delete(handler)})}}catch(err){if(stopped)break;const error=err instanceof Error?err.message:String(err);if(isQueueDoesNotExist(err)){logger.error(`SQS queue "${settings.queueName}" not found at runtime. Run "walkeros setup source.${id}" to create it. Original: ${error}`),stopped=!0;break}logger.error("SQS receive error (will retry)",{error:error}),await new Promise(r2=>setTimeout(r2,1e3))}})();return{type:"sqs",config:config,setup:setup,push:async content=>{if(!content)return;const result={acked:!1,nacked:!1};return await handleMessage({message:{id:content.MessageId,body:content.Body,receiptHandle:content.ReceiptHandle,ack:async()=>{result.acked=!0},nack:async()=>{result.nacked=!0}},settings:settings,pushFn:env.push,logger:logger}),result},destroy:async()=>{stopped=!0;const timeoutMs=settings.shutdownTimeoutMs??3e4;let timer;try{await Promise.race([(async()=>{await loopPromise,await Promise.all(Array.from(inFlight))})(),new Promise(resolve=>{timer=setTimeout(()=>{logger.warn(`SQS source close timed out after ${timeoutMs}ms; forcing close.`),resolve()},timeoutMs)})])}finally{timer&&clearTimeout(timer),function(client,logger){const candidate=client;if("function"==typeof candidate.destroy)try{candidate.destroy()}catch(err){logger.debug("SQS client destroy failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}}(settings.client,logger)}}}},types_exports2={};export{types_exports as SourceLambda,types_exports2 as SourceSqs,examples_exports as examples,lambda_default as sourceLambda,sqs_default as sourceSqs};//# sourceMappingURL=index.mjs.map
|
|
1
|
+
var __defProp=Object.defineProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})};import{requestToData}from"@walkeros/core";function isAPIGatewayV2(event){return"version"in event&&"2.0"===event.version}function createResponse(statusCode,body,headers={},requestId){const responseHeaders={"Content-Type":"object"==typeof body?"application/json":"text/plain",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:statusCode,headers:responseHeaders,body:"object"==typeof body?JSON.stringify(body):String(body),isBase64Encoded:!1}}var types_exports={},examples_exports={};__export(examples_exports,{createTrigger:()=>createTrigger,env:()=>env_exports,step:()=>step_exports,trigger:()=>trigger});var env_exports={};__export(env_exports,{push:()=>push});var createMockElbFn=()=>()=>Promise.resolve({ok:!0}),noopFn=()=>{},noopLogger={error:noopFn,warn:noopFn,info:noopFn,debug:noopFn,throw:message=>{throw"string"==typeof message?new Error(message):message},json:noopFn,scope:()=>noopLogger},push={get push(){return createMockElbFn()},get command(){return createMockElbFn()},get elb(){return createMockElbFn()},logger:noopLogger},step_exports={};__export(step_exports,{apiGatewayV1Post:()=>apiGatewayV1Post,lambdaGet:()=>lambdaGet,lambdaPost:()=>lambdaPost});var lambdaPost={title:"Lambda POST",description:"An API Gateway v2 HTTP POST with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{version:"2.0",requestContext:{http:{method:"POST",path:"/collect"},requestId:"req-123"},body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},apiGatewayV1Post={title:"API Gateway v1 POST",description:"A REST API Gateway v1 POST request with a JSON body is converted into a walker elb event.",trigger:{type:"POST"},in:{httpMethod:"POST",path:"/collect",requestContext:{requestId:"req-789",identity:{sourceIp:"203.0.113.42"}},queryStringParameters:null,body:JSON.stringify({event:"page view",data:{title:"Home"}}),isBase64Encoded:!1},out:[["elb",{name:"page view",data:{title:"Home"}}]]},lambdaGet={title:"Lambda GET",description:"An API Gateway v2 HTTP GET with query parameters is parsed into an elb event payload.",trigger:{type:"GET"},in:{version:"2.0",requestContext:{http:{method:"GET",path:"/collect"},requestId:"req-456"},rawQueryString:"e=page+view&d=%7B%22title%22%3A%22Home%22%7D",isBase64Encoded:!1},out:[["elb",{e:"page view",d:'{"title":"Home"}'}]]};import{assign as o}from"@walkeros/core";import{assign as r,createLogger as a}from"@walkeros/core";import{assign as i,buildCacheContext as c,clone as u,compileCache as d,checkCache as l,storeCache as f,createIngest as p,debounce as g,emitStep as m,getId as h,getGrantedConsent as y,getNextSteps as w,isDefined as v,isFunction as b,isObject as k,processEventMapping as C,stepId as I,tryCatchAsync as q,useHooks as x,compileState as O,applyState as S}from"@walkeros/core";import{emitStep as j}from"@walkeros/core";import{isArray as A,FatalError as $}from"@walkeros/core";import{tryCatch as E,tryCatchAsync as M}from"@walkeros/core";import{createIngest as _,FatalError as T,getMappingValue as P,tryCatchAsync as z,getNextSteps as R,compileCache as B,checkCache as H,storeCache as F,applyUpdate as K,buildCacheContext as G,compileState as W,applyState as N}from"@walkeros/core";import{createIngest as U,emitStep as L,FatalError as V,isObject as Y,stepId as J,tryCatchAsync as Q,useHooks as X,getNextSteps as Z,compileCache as ee,checkCache as te,storeCache as ne,buildCacheContext as oe,validateStepEntry as se,processEventMapping as re,compileState as ae,applyState as ie}from"@walkeros/core";import{assign as Le,getSpanId as Ve,isFunction as Ye,isString as Je}from"@walkeros/core";import{isObject as Qe}from"@walkeros/core";import{createIngest as nt,emitStep as ot,FatalError as st,getGrantedConsent as rt,processEventMapping as at,tryCatchAsync as it,useHooks as ct}from"@walkeros/core";import{FatalError as dt,useHooks as lt,tryCatchAsync as ft}from"@walkeros/core";import{emitStep as pt,useHooks as gt}from"@walkeros/core";import{compileMatcher as ht,emitStep as yt}from"@walkeros/core";var n_Commands={Action:"action",Actions:"actions",Config:"config",Consent:"consent",Context:"context",Custom:"custom",Destination:"destination",Elb:"elb",Globals:"globals",Hook:"hook",Init:"init",Link:"link",On:"on",Prefix:"data-elb",Ready:"ready",Run:"run",Session:"session",Shutdown:"shutdown",User:"user",Walker:"walker"};function D(e,t2){const n2=e.status.startedAt;return{flowId:"default",stepId:t2.stepId,stepType:t2.stepType,phase:t2.phase,eventId:t2.eventId,timestamp:new Date(t2.now).toISOString(),elapsedMs:t2.now-n2}}function ce(e,t2){return e.storeId&&t2.stores[e.storeId]?t2.stores[e.storeId]:t2.stores.__cache}function ue(e,t2){return e?t2.stores[e]:t2.stores.__cache}function de(e){const t2={};for(const[n2,o2]of Object.entries(e)){const e2=o2.config?.next;"string"==typeof e2||Array.isArray(e2)&&e2.every(e3=>"string"==typeof e3)?t2[n2]={next:e2}:t2[n2]={}}return t2}function le(e,t2){const n2=e.config||{},o2=e[t2];return void 0!==o2?{config:{...n2,[t2]:o2},chainValue:o2}:{config:n2,chainValue:void 0}}function fe(e,t2={}){if(!e)return[];if(Array.isArray(e))return e;const n2=[],o2=new Set;let s2=e;for(;s2&&t2[s2]&&!o2.has(s2);){o2.add(s2),n2.push(s2);const e2=t2[s2].next;if(Array.isArray(e2)){n2.push(...e2);break}s2=e2}return n2}async function pe(e,t2,n2){if(t2.init&&!t2.config.init){const o2=t2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:n2,ingest:U(n2),config:t2.config,env:ye(t2.config.env)};s2.debug("init");const a2=await X(t2.init,"TransformerInit",e.hooks,e.logger)(r2);if(!1===a2)return!1;t2.config={...a2||t2.config,env:a2?.env||t2.config.env,init:!0},s2.debug("init done")}return!0}async function ge(e,t2,n2,o2,s2,r2){const a2=t2.type||"unknown",i2=e.logger.scope(`transformer:${a2}`),c2={collector:e,logger:i2,id:n2,ingest:s2,config:t2.config,env:{...ye(t2.config.env),...r2?{respond:r2}:{}}};i2.debug("push",{event:o2.name});const u2="string"==typeof o2.id?o2.id:"",d2=Date.now(),l2=D(e,{stepId:J("transformer",n2),stepType:"transformer",phase:"in",eventId:u2,now:d2});L(e,l2);try{const s3=await X(t2.push,"TransformerPush",e.hooks,e.logger)(o2,c2),r3=Date.now(),a3=D(e,{stepId:J("transformer",n2),stepType:"transformer",phase:"out",eventId:u2,now:r3});return a3.durationMs=r3-d2,a3.outEvent=s3,L(e,a3),i2.debug("push done"),s3}catch(t3){const o3=Date.now(),s3=D(e,{stepId:J("transformer",n2),stepType:"transformer",phase:"error",eventId:u2,now:o3});throw s3.durationMs=o3-d2,s3.error=t3 instanceof Error?{name:t3.name,message:t3.message}:{message:String(t3)},L(e,s3),t3}}function me(e,t2){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:U(t2)}async function he(e,t2,n2,o2,s2,r2,a2){s2||(s2=U(n2[0]??"chain")),a2&&s2._meta&&(s2._meta.chainPath=a2);let i2=o2,c2=r2;for(const o3 of n2){const r3=t2[o3];if(!r3){e.logger.warn(`Transformer not found: ${o3}`);continue}if(s2&&s2._meta&&s2._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o3}`),{event:null,respond:c2};if(s2&&s2._meta&&(s2._meta.hops++,s2._meta.path.push(o3)),!await Q(pe,t3=>{if(t3 instanceof V)throw t3;return e.status.failed++,e.logger.scope(`transformer:${r3.type||"unknown"}`).error("transformer init failed",{transformer:o3,error:t3}),!1})(e,r3,o3))return{event:null,respond:c2};if(a2&&void 0!==r3.config?.chainMocks?.[a2]){const t3=r3.config.chainMocks[a2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:a2}),i2=t3;continue}if(void 0!==r3.config?.mock){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),i2=r3.config.mock;continue}if(r3.config?.disabled)continue;const u2=r3.config?.cache,d2=u2?ee(u2):void 0,l2=d2?ce(d2,e):void 0,f2=r3.config?.state?ae(r3.config.state):void 0,p2=f2?.filter(e2=>"get"===e2.mode),g2=f2?.filter(e2=>"set"===e2.mode);let m2;if(d2&&l2){const e2=oe(s2,i2),t3=await te(d2,l2,e2);if("HIT"===t3?.status&&t3.value){if(i2=t3.value,d2.stop)return{event:i2,respond:c2,stopped:!0};continue}"MISS"===t3?.status&&(m2={key:t3.key,ttl:t3.rule.ttl})}const h2=r3.config.before;if(h2){const n3=Z(h2,oe(s2,i2));if(1===n3.length){const o4=fe(n3[0],de(t2));if(o4.length>0){const n4=await he(e,t2,o4,i2,s2,c2,a2);if(null===n4.event)return{event:null,respond:n4.respond??c2};if(n4.stopped)return{event:Array.isArray(n4.event)?n4.event[0]:n4.event,respond:n4.respond??c2,stopped:!0};n4.respond&&(c2=n4.respond),i2=Array.isArray(n4.event)?n4.event[0]:n4.event}}else n3.length>1&&await Promise.all(n3.map(n4=>Q(he,t3=>(e.logger.scope("transformer:many").error(`many branch ${n4} failed`,{error:t3}),{event:null,respond:void 0}))(e,t2,fe(n4,de(t2)),i2,me(s2,n4),void 0,a2)))}p2&&p2.length>0&&(i2=await ie(p2,t3=>ue(t3,e),i2,e));const y2=await Q(ge,t3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:t3}),!1))(e,r3,o3,i2,s2,c2);if(!1===y2)return{event:null,respond:c2};if(Array.isArray(y2)){const r4=n2.slice(n2.indexOf(o3)+1),u3=await Promise.all(y2.map(async n3=>{const o4=n3.event||i2,u4=me(s2,"unknown");if(n3.next){const s3=Z(n3.next,oe(u4,o4));if(0===s3.length)return{event:o4,respond:c2};if(1===s3.length){const n4=fe(s3[0],de(t2));return n4.length>0?he(e,t2,n4,o4,u4,c2,a2):{event:o4,respond:c2}}return(await Promise.all(s3.map(n4=>Q(he,t3=>(e.logger.scope("transformer:many").error(`many branch ${n4} failed`,{error:t3}),{event:null,respond:void 0}))(e,t2,fe(n4,de(t2)),o4,me(u4,n4),void 0,a2)))).map(e2=>({event:e2.event,respond:void 0}))}return r4.length>0?he(e,t2,r4,o4,u4,c2,a2):{event:o4,respond:c2}}));let d3=c2;const l3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const t3=e2;if(t3.respond&&(d3=t3.respond),null===t3.event)continue;Array.isArray(t3.event)?l3.push(...t3.event):l3.push(t3.event)}else l3.push(e2);return 0===l3.length?{event:null,respond:d3}:1===l3.length?{event:l3[0],respond:d3}:{event:l3,respond:d3}}if(y2&&"object"==typeof y2){const{event:n3,respond:o4,next:r4}=y2;if(o4&&(c2=o4),void 0!==r4){const o5=Z(r4,oe(s2,i2));if(0===o5.length){n3&&(i2=n3);continue}if(1===o5.length){const u3=fe(o5[0],de(t2));return u3.length>0?he(e,t2,u3,n3||i2,s2,c2,a2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}return await Promise.all(o5.map(o6=>Q(he,t3=>(e.logger.scope("transformer:many").error(`many branch ${o6} failed`,{error:t3}),{event:null,respond:void 0}))(e,t2,fe(o6,de(t2)),n3||i2,me(s2,o6),void 0,a2))),{event:null,respond:void 0}}n3&&(i2=n3)}g2&&g2.length>0&&(i2=await ie(g2,t3=>ue(t3,e),i2,e)),m2&&l2&&ne(l2,m2.key,i2,m2.ttl);const w2=r3.config.next,v2="string"==typeof w2||Array.isArray(w2)&&w2.every(e2=>"string"==typeof e2),b2=void 0!==w2&&!v2;if((!y2||"object"==typeof y2&&!y2.next)&&b2){const n3=Z(r3.config.next,oe(s2,i2));if(1===n3.length){const o4=fe(n3[0],de(t2));return o4.length>0?he(e,t2,o4,i2,s2,c2,a2):{event:i2,respond:c2}}return n3.length>1?(await Promise.all(n3.map(n4=>Q(he,t3=>(e.logger.scope("transformer:many").error(`many branch ${n4} failed`,{error:t3}),{event:null,respond:void 0}))(e,t2,fe(n4,de(t2)),i2,me(s2,n4),void 0,a2))),{event:null,respond:void 0}):{event:i2,respond:c2}}}return{event:i2,respond:c2}}function ye(e){return e&&Y(e)?e:{}}function we(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e2=>"string"==typeof e2))}async function ve(e,t2,n2){if(!t2.on||!t2.queueOn?.length)return;const o2=t2.queueOn;t2.queueOn=[];const s2=n2||t2.config?.id||"unknown";for(const{type:n3,data:r2}of o2)await z(t2.on,t3=>{if(t3 instanceof T)throw t3;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s2,type:n3,error:t3})})(n3,r2)}function be(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ke(e,t2,n2){const{code:o2,config:s2={},env:r2={},primary:a2,next:i2,before:c2,cache:u2}=n2,d2=s2.state??n2.state,l2=d2?W(d2):void 0,f2=u2,p2=f2?B({...f2,stop:f2.stop??!0}):void 0,g2=we(i2)?fe(i2,de(e.transformers)):void 0,m2=we(c2)?fe(c2,de(e.transformers)):void 0,h2=r2.push,y2=h2??e.push,w2=Boolean(h2),v2=async(n3,o3,r3)=>{let a3;const u3=m2??(void 0!==c2?(()=>{const t3=R(c2,G(r3.ingest));return 0===t3.length?[]:fe(1===t3.length?t3[0]:t3,de(e.transformers))})():[]);let d3=[n3];if(u3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o4=await he(e,e.transformers,u3,n3,r3.ingest,r3.respond,`source.${t2}.before`);if(null===o4.event)return{ok:!0};if(o4.stopped)return o4.respond&&(r3.respond=o4.respond),{ok:!0};o4.respond&&(r3.respond=o4.respond),d3=Array.isArray(o4.event)?o4.event:[o4.event]}if(p2){const t3=ce(p2,e);if(t3){const n4=G(r3.ingest),o4=await H(p2,t3,n4);if(o4){if("HIT"===o4.status&&void 0!==o4.value&&p2.stop){let t4=o4.value;return o4.rule.update&&(t4=await K(t4,o4.rule.update,{...n4,cache:{status:"HIT"}},e)),r3.respond?.(t4),{ok:!0}}if("MISS"===o4.status&&p2.stop&&r3.respond){const s3=r3.respond,i3=o4.rule.update,c3={...n4,cache:{status:"MISS"}},u4=o4.key,d4=o4.rule.ttl,l3=n5=>{F(t3,u4,n5,d4),i3?a3=(async()=>{const t4=await K(n5,i3,c3,e);s3(t4)})():s3(n5)};r3.respond=l3}"MISS"!==o4.status||p2.stop||F(t3,o4.key,!0,o4.rule.ttl)}}}const f3=g2?{kind:"single",preChain:g2}:void 0!==i2?(()=>{const t3=R(i2,G(r3.ingest));return 0===t3.length?{kind:"single",preChain:[]}:1===t3.length?{kind:"single",preChain:fe(t3[0],de(e.transformers))}:{kind:"many",branches:t3.map(t4=>fe(t4,de(e.transformers)))}})():{kind:"single",preChain:[]};l2&&l2.length>0&&(d3=await Promise.all(d3.map(t3=>N(l2,t4=>ue(t4,e),t3,e))));let h3={ok:!0};for(const n4 of d3)"many"===f3.kind?(await Promise.all(f3.branches.map((a4,i3)=>z(async()=>w2?y2(n4):y2(n4,{...o3,id:t2,ingest:me(r3.ingest,`${t2}.${i3}`),respond:void 0,mapping:s2,preChain:a4}),t3=>(e.logger.scope("source:many").error(`many branch ${i3} failed`,{error:t3}),{ok:!0}))())),h3={ok:!0}):h3=w2?await y2(n4):await y2(n4,{...o3,id:t2,ingest:r3.ingest,respond:r3.respond,mapping:s2,preChain:f3.preChain});return a3&&await a3,h3},b2=async n3=>{const o3=_(t2);if(!s2.ingest||void 0===n3)return o3;const r3=await P(n3,s2.ingest,{collector:e});return{...o3,...r3,_meta:o3._meta}},k2=e.logger.scope("source").scope(t2),C2={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:k2,...r2,push:async(e2,n3={})=>{const o3={ingest:_(t2),respond:void 0};return v2(e2,n3,o3)}},I2={collector:e,logger:k2,id:t2,config:s2,env:C2,withScope:async(e2,t3,n3)=>{const o3={ingest:await b2(e2),respond:t3};return n3({...C2,push:(e3,t4={})=>v2(e3,t4,o3),ingest:o3.ingest,respond:o3.respond})}},q2=await z(o2,n3=>{if(n3 instanceof T)throw n3;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t2,error:n3})})(I2);if(!q2)return;const x2=q2.type||"unknown",O2=e.logger.scope(x2).scope(t2);return C2.logger=O2,a2&&(q2.config={...q2.config,primary:a2}),q2}function Ie(e,t2,n2,o2){if(n2 instanceof $)throw n2;e.logger.scope("on").error("on callback failed",{kind:t2,...o2,error:n2})}function qe(e,t2){return{collector:e,logger:e.logger.scope("on").scope(String(t2))}}function Oe(e,t2,n2,o2,s2){if(!t2.on)return;const r2=t2.type||"unknown",a2=e.logger.scope(r2).scope("on").scope(o2),i2={collector:e,logger:a2,id:n2,config:t2.config,data:s2,env:Ue(t2.env,t2.config.env)};E(t2.on,t3=>Ie(e,"destination",t3,{destId:n2,type:o2}))(o2,i2)}function Se(e,t2,o2,s2){let r2;switch(t2){case n_Commands.Consent:r2=s2||e.consent;break;case n_Commands.Session:r2=e.session;break;case n_Commands.User:r2=s2||e.user;break;case n_Commands.Custom:r2=s2||e.custom;break;case n_Commands.Globals:r2=s2||e.globals;break;case n_Commands.Config:r2=s2||e.config;break;case n_Commands.Ready:case n_Commands.Run:default:r2=void 0}if(o2.length)switch(t2){case n_Commands.Consent:!function(e2,t3,o3){const s3=o3||e2.consent,r3=qe(e2,n_Commands.Consent);t3.forEach(t4=>{Object.keys(s3).filter(e3=>e3 in t4).forEach(n2=>{E(t4[n2],t5=>Ie(e2,"consent",t5,{key:n2}))(s3,r3)})})}(e,o2,s2);break;case n_Commands.Ready:!function(e2,t3){if(!e2.allowed)return;const o3=qe(e2,n_Commands.Ready);t3.forEach(t4=>{E(t4,t5=>Ie(e2,"ready",t5))(void 0,o3)})}(e,o2);break;case n_Commands.Run:!function(e2,t3){if(!e2.allowed)return;const o3=qe(e2,n_Commands.Run);t3.forEach(t4=>{E(t4,t5=>Ie(e2,"run",t5))(void 0,o3)})}(e,o2);break;case n_Commands.Session:!function(e2,t3){if(!e2.session)return;const o3=qe(e2,n_Commands.Session);t3.forEach(t4=>{E(t4,t5=>Ie(e2,"session",t5))(e2.session,o3)})}(e,o2);break;default:{const n2=qe(e,t2);o2.forEach(o3=>{"function"==typeof o3&&E(o3,n3=>Ie(e,"generic",n3,{type:t2}))(r2,n2)});break}}}function De(e,t2,n2,o2){if(!Number.isFinite(n2.max)||n2.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n2.max})`);if("dropNewest"===(n2.onOverflow??"dropOldest"))return e.length>=n2.max?(o2&&o2([t2]),{appended:!1,dropped:1}):(e.push(t2),{appended:!0,dropped:0});const s2=[];for(;e.length>=n2.max;)s2.push(e.shift());return e.push(t2),s2.length>0&&o2&&o2(s2),{appended:!0,dropped:s2.length}}var Ae=new WeakMap;function $e(e,t2,n2,o2){Ae.get(e)||(Ae.set(e,!0),t2.warn(n2,o2))}function Ee(e){Ae.delete(e)}var Me=Object.freeze({batched:!0});function _e(e){return e===Me}function Te(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function Pe(e,t2){return e.status.destinations[t2]||(e.status.destinations[t2]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t2]}function ze(e,t2,n2,o2){e.dropped[t2]||(e.dropped[t2]={});const s2=e.dropped[t2];return s2[n2]=(s2[n2]??0)+o2,s2[n2]}function Re(e,t2,n2){if(!e)return[];if(Array.isArray(e)&&e.every(e2=>"string"==typeof e2))return fe(e,t2);if("string"==typeof e)return fe(e,t2);const o2=w(e,c(n2));return 0===o2.length?[]:1===o2.length?fe(o2[0],t2):fe(o2,t2)}async function He(e,t2,n2={},o2){const{allowed:s2,consent:r2,globals:a2,user:g2}=e;if(!s2)return Ge({ok:!1});if(t2){const n3=e.config.queueMax;if(void 0===n3)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o3=De(e.queue,t2,{max:n3});if(o3.dropped>0){const t3=ze(e.status,I("collector"),"queue",o3.dropped);$e(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n3,droppedCount:t3})}else e.queue.length<n3&&Ee(e.queue);e.status.in++}o2||(o2=e.destinations);const h2=e.transformers?de(e.transformers):{},w2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let w3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],t2&&w3.push(u(t2));const v3=n2.ingest?{...n2.ingest,_meta:{...n2.ingest._meta,path:[...n2.ingest._meta.path]}}:p("unknown");if(!w3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!w3.length&&s3.queueOn?.length){let t3=!1;try{t3=await Fe(e,s3,o3)}catch(t4){e.status.failed++;const n3=s3.type||"unknown";e.logger.scope(n3).error("destination init failed",{error:t4 instanceof Error?t4.message:String(t4)})}return{id:o3,destination:s3,skipped:!t3}}const b3=[],k3=w3.filter(t3=>{const n3=y(s3.config.consent,r2,t3.consent);if(n3)return t3.consent=n3,b3.push(t3),!1;const a3=D(e,{stepId:I("destination",o3),stepType:"destination",phase:"skip",eventId:"string"==typeof t3.id?t3.id:"",now:Date.now()});return a3.skipReason="consent",r2&&(a3.consent={...r2}),s3.config.consent&&(a3.meta={required:{...s3.config.consent}}),m(e,a3),!0});if(k3.length>0){const t3=s3.queuePush,n3=s3.config.id||o3,r3={max:s3.config.queueMax??1e3};let a3=0;for(const e2 of k3)a3+=De(t3,e2,r3).dropped;if(a3>0){Pe(e,n3);const o4=ze(e.status,I("destination",n3),"queue",a3);$e(t3,e.logger.scope(s3.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n3,cap:r3.max,droppedCount:o4})}else t3.length<r3.max&&Ee(t3)}if(!b3.length)return{id:o3,destination:s3,queue:w3};let C2,x2,j2=!1;try{j2=await Fe(e,s3,o3)}catch(t3){e.status.failed++;const n3=s3.type||"unknown";e.logger.scope(n3).error("destination init failed",{error:t3 instanceof Error?t3.message:String(t3)})}if(!j2)return{id:o3,destination:s3,queue:w3};s3.dlq||(s3.dlq=[]);const A2=Re(s3.config.before,h2,v3),$2=s3.config.next,E2=s3.config?.cache,M2=E2?d(E2):void 0,_2=M2?ce(M2,e):void 0,T2=s3.config?.state?O(s3.config.state):void 0,P2=T2?.filter(e2=>"get"===e2.mode),z2=T2?.filter(e2=>"set"===e2.mode);let R2=0,B2=0;return await Promise.all(b3.map(async t3=>{let r3;if(t3.globals=i(a2,t3.globals),t3.user=i(g2,t3.user),M2?.stop&&_2){const e2=c(v3,t3),n3=await l(M2,_2,e2);if("HIT"===n3?.status)return t3;"MISS"===n3?.status&&(r3={key:n3.key,ttl:n3.rule.ttl})}let u2=t3,d2=n2.respond;if(A2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await he(e,e.transformers,A2,t3,v3,n2.respond,`destination.${o3}.before`);if(null===s4.event)return t3;s4.respond&&(d2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if(M2&&!M2.stop&&_2){const e2=c(v3,u2),n3=await l(M2,_2,e2);if("HIT"===n3?.status)return t3;"MISS"===n3?.status&&(r3={key:n3.key,ttl:n3.rule.ttl})}P2&&P2.length>0&&u2&&(u2=await S(P2,t4=>ue(t4,e),u2,e));const p2=Date.now();let m2=!1;const y2=await q(Ke,t4=>{const n3=s3.type||"unknown";e.logger.scope(n3).error("Push failed",{error:t4,event:u2.name}),C2=t4,m2=!0;const r4=s3.dlq,a3=s3.config.id||o3,i2={max:s3.config.dlqMax??100},c2=De(r4,[u2,t4],i2);if(c2.dropped>0){Pe(e,a3);const t5=ze(e.status,I("destination",a3),"dlq",c2.dropped);$e(r4,e.logger.scope(s3.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:a3,cap:i2.max,droppedCount:t5})}else r4.length<i2.max&&Ee(r4)})(e,s3,o3,u2,v3,d2);if(R2+=Date.now()-p2,r3&&_2&&void 0===s3.config.mock&&f(_2,r3.key,y2??!0,r3.ttl),!m2&&z2&&z2.length>0&&u2&&(u2=await S(z2,t4=>ue(t4,e),u2,e)),void 0===y2||_e(y2)||(x2=y2),_e(y2)&&B2++,!m2&&$2){void 0!==y2&&(v3._response=y2);const t4=Re($2,h2,v3);if(t4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n3=await he(e,e.transformers,t4,u2,v3,d2,`destination.${o3}.next`);n3.respond&&(d2=n3.respond)}}return t3})),{id:o3,destination:s3,error:C2,response:x2,totalDuration:R2,batchedCount:B2,allowedCount:b3.length}})),v2={},b2={},k2={};for(const t3 of w2){if(t3.skipped)continue;const n3=t3.destination,o3={type:n3.type||"unknown",data:t3.response};Pe(e,t3.id);const s3=e.status.destinations[t3.id],r3=Date.now();if(s3.queuePushSize=n3.queuePush?.length??0,s3.dlqSize=n3.dlq?.length??0,t3.error)o3.error=t3.error,k2[t3.id]=o3,s3.failed++,s3.lastAt=r3,s3.duration+=t3.totalDuration||0,e.status.failed++;else if(t3.queue&&t3.queue.length)b2[t3.id]=o3;else{const n4=t3.batchedCount??0,a3=t3.allowedCount??0;(Math.max(0,a3-n4)>0||0===a3)&&(v2[t3.id]=o3,s3.count++,s3.lastAt=r3,s3.duration+=t3.totalDuration||0,e.status.out++)}}return Ge({event:t2,...Object.keys(v2).length&&{done:v2},...Object.keys(b2).length&&{queued:b2},...Object.keys(k2).length&&{failed:k2}})}async function Fe(e,t2,n2){if(t2.init&&!t2.config.init){const o2=t2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:n2,config:t2.config,env:Ue(t2.env,t2.config.env)};s2.debug("init");const a2=Date.now();let i2;m(e,D(e,{stepId:I("destination",n2),stepType:"destination",phase:"init",eventId:"",now:a2}));try{i2=await x(t2.init,"DestinationInit",e.hooks,e.logger)(r2)}catch(t3){const o3=Date.now(),s3=D(e,{stepId:I("destination",n2),stepType:"destination",phase:"error",eventId:"",now:o3});throw s3.durationMs=o3-a2,s3.error=t3 instanceof Error?{name:t3.name,message:t3.message}:{message:String(t3)},m(e,s3),t3}if(!1===i2)return i2;if(t2.config={...i2||t2.config,init:!0},t2.queueOn?.length){const o3=t2.queueOn;t2.queueOn=[];for(const{type:s3,data:r3}of o3)Oe(e,t2,n2,s3,r3)}s2.debug("init done")}return!0}async function Ke(e,t2,n2,o2,s2,r2){const{config:a2}=t2,i2=await C(o2,a2,e);if(i2.ignore)return!1;const c2=t2.type||"unknown",u2=e.logger.scope(c2),d2={collector:e,logger:u2,id:n2,config:a2,data:i2.data,rule:i2.mapping,ingest:s2,env:{...Ue(t2.env,a2.env),...r2?{respond:r2}:{}}};if(void 0!==a2.mock)return u2.debug("mock",{event:i2.event.name}),a2.mock;const l2=i2.mapping,f2=i2.mappingKey||"* *";if(l2?.batch&&t2.pushBatch&&void 0===a2.mock){if(t2.batches=t2.batches||{},!t2.batches[f2]){const o4={key:f2,entries:[],events:[],data:[]},s3=Te(l2.batch),r3=Te(a2.batch),i3=s3.wait??r3.wait??3e4,c4=s3.size??r3.size??1e3,d4=s3.age??r3.age??3e4,p2=Ue(t2.env,a2.env),h2=g(async()=>{const o5=t2.batches[f2].batched;if(0===o5.entries.length)return;const s4={key:o5.key,entries:o5.entries,events:o5.events,data:o5.data};o5.entries=[],o5.events=[],o5.data=[];const r4=s4.entries[0],i4={collector:e,logger:u2,id:n2,config:a2,data:void 0,rule:r4.rule,ingest:r4.ingest,env:{...p2,...r4.respond?{respond:r4.respond}:{}}};u2.debug("push batch",{events:s4.entries.length});const c5=t2.config.id||n2,d5=Pe(e,c5),l3=Date.now(),g2=D(e,{stepId:I("destination",n2),stepType:"destination",phase:"flush",eventId:"",now:l3});g2.batch={size:s4.entries.length,index:0},m(e,g2);let h3=!0;await q(x(t2.pushBatch,"DestinationPushBatch",e.hooks,e.logger),o6=>{h3=!1;const r5=Date.now(),a3=D(e,{stepId:I("destination",n2),stepType:"destination",phase:"error",eventId:"",now:r5});a3.durationMs=r5-l3,a3.error=o6 instanceof Error?{name:o6.name,message:o6.message}:{message:String(o6)},a3.batch={size:s4.entries.length,index:0},m(e,a3);const i5=t2.dlq=t2.dlq||[],f3={max:t2.config.dlqMax??100};let p3=0;for(const e2 of s4.entries)p3+=De(i5,[e2.event,o6],f3).dropped;if(p3>0){const t3=ze(e.status,I("destination",c5),"dlq",p3);$e(i5,u2,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c5,cap:f3.max,droppedCount:t3})}else i5.length<f3.max&&Ee(i5);d5.failed+=s4.entries.length,d5.dlqSize=i5.length,e.status.failed+=s4.entries.length,u2.error("Push batch failed",{error:o6 instanceof Error?o6.message:String(o6),entries:s4.entries.length})})(s4,i4),u2.debug("push batch done"),d5.inFlightBatch=Math.max(0,(d5.inFlightBatch??0)-s4.entries.length),h3&&(d5.count+=s4.entries.length,d5.lastAt=Date.now(),e.status.out+=s4.entries.length)},{wait:i3,size:c4,age:d4});t2.batches[f2]={batched:o4,batchFn:()=>{h2()},flush:async()=>{await h2.flush()}}}const o3=t2.batches[f2];o3.batched.entries.push({event:i2.event,ingest:s2,respond:r2,rule:l2,data:i2.data}),o3.batched.events.push(i2.event),v(i2.data)&&o3.batched.data.push(i2.data);const c3=t2.config.id||n2,d3=Pe(e,c3);return d3.inFlightBatch=(d3.inFlightBatch??0)+1,o3.batchFn(),Me}{u2.debug("push",{event:i2.event.name});const o3="string"==typeof i2.event.id?i2.event.id:"",s3=Date.now(),r3=D(e,{stepId:I("destination",n2),stepType:"destination",phase:"in",eventId:o3,now:s3});i2.mappingKey&&(r3.mappingKey=i2.mappingKey),i2.event.consent&&(r3.consent={...i2.event.consent}),m(e,r3);try{const r4=await x(t2.push,"DestinationPush",e.hooks,e.logger)(i2.event,d2),a3=Date.now(),c3=D(e,{stepId:I("destination",n2),stepType:"destination",phase:"out",eventId:o3,now:a3});return c3.durationMs=a3-s3,c3.outEvent=r4,i2.mappingKey&&(c3.mappingKey=i2.mappingKey),m(e,c3),u2.debug("push done"),r4}catch(t3){const r4=Date.now(),a3=D(e,{stepId:I("destination",n2),stepType:"destination",phase:"error",eventId:o3,now:r4});throw a3.durationMs=r4-s3,a3.error=t3 instanceof Error?{name:t3.name,message:t3.message}:{message:String(t3)},i2.mappingKey&&(a3.mappingKey=i2.mappingKey),m(e,a3),t3}}}function Ge(e){return{ok:!e?.failed,...e}}function We(e){const{code:t2,config:n2={},env:o2={},cache:s2,state:r2}=e,{config:a2}=le(e,"before"),{config:i2}=le({...e,config:a2},"next"),c2={...t2.config,...n2,...i2};s2&&(c2.cache=s2),void 0!==r2&&void 0===c2.state&&(c2.state=r2);const u2=Ue(t2.env,o2);return{...t2,config:c2,env:u2}}function Ue(e,t2){return e||t2?t2?e&&k(e)&&k(t2)?{...e,...t2}:t2:e:{}}async function Xe(e,t2,n2){const o2=Object.entries(e).map(async([e2,o3])=>{const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",a2=n2.scope(r2),i2={id:e2,config:o3.config,env:o3.env??{},logger:a2};try{await Promise.race([s2(i2),new Promise((n3,o4)=>setTimeout(()=>o4(new Error(`${t2} '${e2}' destroy timed out`)),5e3))])}catch(n3){a2.error(`${t2} '${e2}' destroy failed: ${n3}`)}});await Promise.allSettled(o2)}async function Ze(e,t2,o2){let r2,a2,i2=!1;switch(t2){case n_Commands.Config:Qe(o2)&&(Le(e.config,o2,{shallow:!1}),a2=o2,i2=!0);break;case n_Commands.Consent:if(Qe(o2)){const{update:t3}=function(e,t2){const n2={};return Object.entries(t2).forEach(([e2,t3])=>{n2[e2]=!!t3}),e.consent=o(e.consent,n2),{update:n2}}(e,o2);a2=t3,i2=!0}break;case n_Commands.Custom:Qe(o2)&&(e.custom=Le(e.custom,o2),a2=o2,i2=!0);break;case n_Commands.Destination:Qe(o2)&&"code"in o2&&Qe(o2.code)&&(r2=await async function(e,t2){const{code:n2,config:o2={},env:s2={},before:r2,next:a2,cache:i2,state:c2}=t2;if(!b(n2.push))return Ge({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const u2=o2||{init:!1};let d2=r2?{...u2,before:r2}:{...u2};a2&&(d2={...d2,next:a2}),i2&&(d2={...d2,cache:i2}),void 0!==c2&&void 0===d2.state&&(d2={...d2,state:c2});const l2={...n2,config:d2,env:Ue(n2.env,s2)};let f2=l2.config.id;if(!f2)do{f2=h(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f2]);return e.destinations[f2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),He(e,void 0,{},{[f2]:l2})}(e,o2));break;case n_Commands.Globals:Qe(o2)&&(e.globals=Le(e.globals,o2),a2=o2,i2=!0);break;case n_Commands.Hook:if(Qe(o2)&&Je(o2.name)&&Ye(o2.fn)){const{name:t3,fn:n2}=o2;e.hooks[t3]=n2,a2=o2,i2=!0}break;case n_Commands.On:if(Qe(o2)&&Je(o2.type)){const{type:t3,rules:n2}=o2;await async function(e,t2,n2){const o2=e.on,s2=o2[t2]||[],r2=A(n2)?n2:[n2];r2.forEach(e2=>{s2.push(e2)}),o2[t2]=s2,Se(e,t2,r2)}(e,t3,n2)}break;case n_Commands.Ready:i2=!0;break;case n_Commands.Run:r2=await async function(e,t2){return e.allowed=!0,e.timing=Date.now(),t2&&(t2.consent&&(e.consent=Le(e.consent,t2.consent)),t2.user&&(e.user=Le(e.user,t2.user)),t2.globals&&(e.globals=Le(e.config.globalsStatic||{},t2.globals)),t2.custom&&(e.custom=Le(e.custom,t2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await He(e)}(e,o2),i2=!0;break;case n_Commands.Session:i2=!0;break;case n_Commands.Shutdown:await async function(e2){const t3=e2.logger;await Xe(e2.sources,"source",t3),await Xe(e2.destinations,"destination",t3),await Xe(e2.transformers,"transformer",t3),await Xe(e2.stores,"store",t3)}(e);break;case n_Commands.User:Qe(o2)&&(Le(e.user,o2,{shallow:!1}),a2=o2,i2=!0)}return i2&&(await async function(e,t2,o2,s2){let r2,a2=o2||[];switch(o2||(a2=e.on[t2]||[]),t2){case n_Commands.Consent:r2=s2||e.consent;break;case n_Commands.Session:r2=e.session;break;case n_Commands.User:r2=s2||e.user;break;case n_Commands.Custom:r2=s2||e.custom;break;case n_Commands.Globals:r2=s2||e.globals;break;case n_Commands.Config:r2=s2||e.config;break;case n_Commands.Ready:case n_Commands.Run:default:r2=void 0}let i2=!1;for(const[n2,o3]of Object.entries(e.sources)){if(o3.config.require?.length){const e2=o3.config.require.indexOf(t2);-1!==e2&&o3.config.require.splice(e2,1)}o3.on&&(be(o3)?!1===await M(o3.on,o4=>Ie(e,"source",o4,{sourceId:n2,type:t2}))(t2,r2)&&(i2=!0):(o3.queueOn=o3.queueOn||[],o3.queueOn.push({type:t2,data:r2})))}Object.entries(e.destinations).forEach(([n2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:t2,data:r2});Oe(e,o3,n2,t2,r2)}});for(const[t3,n2]of Object.entries(e.sources))be(n2)&&n2.queueOn?.length&&await ve(e,n2,t3);return Object.keys(e.pending.destinations).length>0&&await async function(e2,t3){for(const[n2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[n2]||e2.destinations[n2])continue;const s3=o3.config?.require;if(!s3)continue;const r3=s3.indexOf(t3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[n2];const a3=We(o3);!1!==a3.config.queue&&(a3.queuePush=[...e2.queue]),e2.destinations[n2]=a3}}(e,t2),Se(e,t2,a2,s2),!i2}(e,t2,void 0,a2),r2=await He(e)),r2||Ge({ok:!0})}function et(e,t2){if(!t2.name)throw new Error("Event name is required");const[n2,o2]=t2.name.split(" ");if(!n2||!o2)throw new Error("Event name is invalid");const{timestamp:s2=Date.now(),name:r2=`${n2} ${o2}`,data:a2={},context:i2={},globals:c2=e.globals,custom:u2={},user:d2=e.user,nested:l2=[],consent:f2=e.consent,id:p2=Ve(),trigger:g2="",entity:m2=n2,action:h2=o2,timing:y2=0,source:w2={type:"collector",schema:"4"}}=t2;return{name:r2,data:a2,context:i2,globals:c2,custom:u2,user:d2,nested:l2,consent:f2,id:p2,trigger:g2,entity:m2,action:h2,timestamp:s2,timing:y2,source:w2}}function mt(e={}){const t2=e.maxEntries??1e4,n2=e.lowWaterMark??.8,o2=e.sweepIntervalMs??6e4,s2=Math.floor(t2*n2),r2=new Map,a2={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let i2;return o2>0&&(i2=setInterval(function(){const e2=Date.now();let t3=0;for(const[n3,o3]of r2)void 0!==o3.expires&&o3.expires<=e2&&(r2.delete(n3),t3++);a2.evictions_ttl+=t3},o2),i2&&"function"==typeof i2.unref&&i2.unref()),{type:"memory",config:{},get(e2){const t3=r2.get(e2);if(t3)return void 0!==t3.expires&&t3.expires<=Date.now()?(r2.delete(e2),a2.evictions_ttl++,void a2.misses++):(r2.delete(e2),r2.set(e2,t3),a2.hits++,t3.value);a2.misses++},set(e2,n3,o3){const i3=!r2.has(e2);i3||r2.delete(e2),r2.set(e2,{value:n3,expires:void 0!==o3?Date.now()+o3:void 0}),a2.writes++,i3&&a2.populates++,r2.size>t2&&function(){if(r2.size<=t2)return;const e3=r2.size-s2;let n4=0;for(const t3 of r2.keys()){if(n4>=e3)break;r2.delete(t3),n4++}a2.evictions_entries+=n4}()},delete(e2){r2.delete(e2)&&a2.deletes++},get counters(){return{...a2}},destroy(){void 0!==i2&&(clearInterval(i2),i2=void 0),r2.clear()}}}function wt(e,t2){const{cacheConfig:n2,cacheStore:o2,namespace:s2,logger:r2,storeId:a2,collector:i2}=t2,c2=(e2,t3)=>{if(!i2)return;const n3=D(i2,{stepId:`store.${a2}`,stepType:"store",phase:"in",eventId:"",now:Date.now()});n3.meta={op:"cache",cached:"hit"===t3,status:t3,key:e2},yt(i2,n3)},u2={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},d2=n2.rules.map(e2=>({match:e2.match?ht(e2.match):()=>!0,ttl:e2.ttl})),l2=e2=>`${s2}:${e2}`;function f2(e2,t3){const n3=void 0===t3?{key:e2}:{key:e2,value:t3};return d2.find(e3=>e3.match(n3))}const p2=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...u2}},async get(t3){const n3=l2(t3),s3=await o2.get(n3);if(void 0!==s3)return u2.hits++,c2(t3,"hit"),s3;const r3=p2.get(n3);if(r3)return u2.inflight_dedups++,c2(t3,"hit"),r3;u2.misses++,c2(t3,"miss");const a3=(async()=>{try{const s4=await e.get(t3);if(void 0===s4)return;const r4=f2(t3,s4);if(r4)try{await o2.set(n3,s4,1e3*r4.ttl),u2.populates++}catch(e2){g2("set",t3,e2)}return s4}finally{p2.delete(n3)}})();return p2.set(n3,a3),a3},async set(t3,n3,s3){u2.writes++,await e.set(t3,n3,s3);const r3=f2(t3,n3);if(r3)try{await o2.set(l2(t3),n3,1e3*r3.ttl)}catch(e2){g2("set",t3,e2)}},async delete(t3){u2.deletes++,await e.delete(t3);try{await o2.delete(l2(t3))}catch(e2){g2("delete",t3,e2)}}};function g2(e2,t3,n3){const o3=`store-cache(${a2}): cache ${e2} failed for "${t3}"; backing succeeded, continuing`;r2?r2.warn(o3,{error:n3}):console.warn(o3,n3)}}function vt(e,t2,n2){const o2=`store.${n2}`,s2=gt(t2.get,"StoreGet",e.hooks,e.logger),r2=gt(t2.set,"StoreSet",e.hooks,e.logger),a2=gt(t2.delete,"StoreDelete",e.hooks,e.logger);t2.get=async t3=>{const n3=Date.now(),r3=D(e,{stepId:o2,stepType:"store",phase:"in",eventId:"",now:n3});r3.meta={op:"get",key:t3},pt(e,r3);try{const r4=await s2(t3),a3=Date.now(),i2=D(e,{stepId:o2,stepType:"store",phase:"out",eventId:"",now:a3});return i2.durationMs=a3-n3,i2.meta={op:"get",key:t3},pt(e,i2),r4}catch(s3){const r4=Date.now(),a3=D(e,{stepId:o2,stepType:"store",phase:"error",eventId:"",now:r4});throw a3.durationMs=r4-n3,a3.meta={op:"get",key:t3},a3.error=s3 instanceof Error?{name:s3.name,message:s3.message}:{message:String(s3)},pt(e,a3),s3}},t2.set=async(t3,n3,s3)=>{const a3=Date.now(),i2=D(e,{stepId:o2,stepType:"store",phase:"in",eventId:"",now:a3});i2.meta={op:"set",key:t3},pt(e,i2);try{await r2(t3,n3,s3);const i3=Date.now(),c2=D(e,{stepId:o2,stepType:"store",phase:"out",eventId:"",now:i3});c2.durationMs=i3-a3,c2.meta={op:"set",key:t3},pt(e,c2)}catch(n4){const s4=Date.now(),r3=D(e,{stepId:o2,stepType:"store",phase:"error",eventId:"",now:s4});throw r3.durationMs=s4-a3,r3.meta={op:"set",key:t3},r3.error=n4 instanceof Error?{name:n4.name,message:n4.message}:{message:String(n4)},pt(e,r3),n4}},t2.delete=async t3=>{const n3=Date.now(),s3=D(e,{stepId:o2,stepType:"store",phase:"in",eventId:"",now:n3});s3.meta={op:"delete",key:t3},pt(e,s3);try{await a2(t3);const s4=Date.now(),r3=D(e,{stepId:o2,stepType:"store",phase:"out",eventId:"",now:s4});r3.durationMs=s4-n3,r3.meta={op:"delete",key:t3},pt(e,r3)}catch(s4){const r3=Date.now(),a3=D(e,{stepId:o2,stepType:"store",phase:"error",eventId:"",now:r3});throw a3.durationMs=r3-n3,a3.meta={op:"delete",key:t3},a3.error=s4 instanceof Error?{name:s4.name,message:s4.message}:{message:String(s4)},pt(e,a3),s4}}}async function kt(e){const t2=r({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),n2={level:e.logger?.level,handler:e.logger?.handler},o2=a(n2),s2={...t2.globalsStatic,...e.globals},i2={allowed:!1,config:t2,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,hooks:e.hooks||{},observers:new Set,logger:o2,on:{},queue:[],round:0,session:void 0,status:{startedAt:Date.now(),in:0,out:0,failed:0,sources:{},destinations:{},dropped:{}},timing:Date.now(),user:e.user||{},sources:{},pending:{destinations:{}},push:void 0,command:void 0};var e2,t3;i2.push=function(e,t2){const n2=ct(async(n3,o2={})=>await it(async()=>{const s2=Date.now(),{id:r2,ingest:a2,respond:i2,mapping:c2,preChain:u2,include:d2,exclude:l2}=o2;let f2=i2,p2=n3;const g2=d2||l2?function(e2,t3,n4){let o3=e2;return t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>t3.includes(e3)))),n4&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!n4.includes(e3)))),o3}(e.destinations,d2,l2):void 0,m2=a2??nt(r2||"unknown");if(c2){const t3=await at(p2,c2,e);if(t3.ignore)return Ge({ok:!0});if(c2.consent&&!rt(c2.consent,e.consent,t3.event.consent))return Ge({ok:!0});p2=t3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n4=await he(e,e.transformers,u2,p2,m2,f2,r2?`source.${r2}.next`:void 0);if(null===n4.event)return Ge({ok:!0});if(n4.stopped)return n4.respond&&(f2=n4.respond),Ge({ok:!0});if(n4.respond&&(f2=n4.respond),Array.isArray(n4.event)){const o3=await Promise.all(n4.event.map(async n5=>{const o4=t2(n5),s3=et(e,o4);return He(e,s3,{id:r2,ingest:m2,respond:f2},g2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const t3=e.status.sources[r2];t3.count+=n4.event.length,t3.lastAt=Date.now(),t3.duration+=Date.now()-s2}return o3[0]??Ge({ok:!0})}p2=n4.event}const h2=t2(p2),y2=et(e,h2),w2=await He(e,y2,{id:r2,ingest:m2,respond:f2},g2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const t3=e.status.sources[r2];t3.count++,t3.lastAt=Date.now(),t3.duration+=Date.now()-s2}return w2},t3=>{if(t3 instanceof st)throw t3;return e.status.failed++,e.logger.error("push failed",{event:n3,ingest:o2.ingest,error:t3}),Ge({ok:!1})})(),"Push",e.hooks,e.logger);return async(t3,o2)=>{const s2="string"==typeof t3.id?t3.id:"",r2=Date.now();ot(e,D(e,{stepId:"collector.push",stepType:"collector",phase:"in",eventId:s2,now:r2}));try{const a2=await n2(t3,o2),i2=Date.now(),c2=D(e,{stepId:"collector.push",stepType:"collector",phase:"out",eventId:s2,now:i2});return c2.durationMs=i2-r2,c2.outEvent=a2,ot(e,c2),a2}catch(t4){const n3=Date.now(),o3=D(e,{stepId:"collector.push",stepType:"collector",phase:"error",eventId:s2,now:n3});throw o3.durationMs=n3-r2,o3.error=t4 instanceof Error?{name:t4.name,message:t4.message}:{message:String(t4)},ot(e,o3),t4}}}(i2,e2=>({timing:Math.round((Date.now()-i2.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.3-next-1780071196115"},...e2})),i2.command=(t3=Ze,lt(async(n3,o3,s3)=>await ft(async()=>await t3(e2,n3,o3,s3),t4=>{if(t4 instanceof dt)throw t4;return e2.status.failed++,e2.logger.error("command failed",{command:n3,data:o3,error:t4}),Ge({ok:!1})})(),"Command",(e2=i2).hooks,e2.logger));const c2=e.stores||{};return i2.stores=await async function(e,t2={}){const n2={};for(const[o3,s3]of Object.entries(t2)){const{code:t3,config:r2={},env:a2={}}=s3,i2=e.logger.scope("store").scope(o3),c2={collector:e,logger:i2,id:o3,config:r2,env:a2},u2=await t3(c2);n2[o3]=u2}const o2=t2,s2=function(e2){const t3={};for(const n4 of Object.keys(e2))t3[n4]="WHITE";const n3=[],o3=[];function s3(r2){const a2=t3[r2];if("BLACK"===a2)return;if("GRAY"===a2){const e3=o3.indexOf(r2),t4=o3.slice(-1===e3?0:e3).concat(r2).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t4}`)}t3[r2]="GRAY",o3.push(r2);const i2=e2[r2].cache?.store;if(void 0!==i2){if(!(i2 in e2))throw new Error(`Store "${r2}" cache.store references "${i2}", which is not declared in flow.stores`);s3(i2)}o3.pop(),t3[r2]="BLACK",n3.push(r2)}for(const n4 of Object.keys(e2))"WHITE"===t3[n4]&&s3(n4);return n3}(o2);for(const t3 of s2){const s3=o2[t3].cache;if(!s3)continue;let r2,a2;void 0!==s3.store?(r2=n2[s3.store],a2=s3.store):(n2.__cache||(n2.__cache=mt()),r2=n2.__cache,a2="__cache");const i2=s3.namespace??t3;e.logger.scope("store-cache").scope(t3).info(`store "${t3}" caches with namespace "${i2}:" via ${a2}`),n2[t3]=wt(n2[t3],{storeId:t3,cacheConfig:s3,cacheStore:r2,namespace:i2,logger:e.logger.scope("store-cache").scope(t3),collector:e})}for(const[t3,o3]of Object.entries(n2))"__cache"!==t3&&vt(e,o3,t3);return n2}(i2,c2),function(e2,t3,n3){const o3=new Map;for(const[n4,s4]of Object.entries(e2))t3[n4]&&o3.set(s4,t3[n4]);if(0!==o3.size)for(const e3 of[n3.transformers,n3.destinations,n3.sources])if(e3)for(const t4 of Object.values(e3))s3(t4.env);function s3(e3){if(e3)for(const[t4,n4]of Object.entries(e3))if("object"==typeof n4&&null!==n4){const s4=o3.get(n4);s4&&(e3[t4]=s4)}}}(c2,i2.stores,e),i2.stores.__cache||(i2.stores.__cache=mt()),i2.destinations=await async function(e,t2={}){const n2={};for(const[o2,s2]of Object.entries(t2))s2.config?.require?.length?e.pending.destinations[o2]=s2:n2[o2]=We(s2);return n2}(i2,e.destinations||{}),i2.transformers=await async function(e2,t3={}){const n3={};for(const[o3,s3]of Object.entries(t3)){const{code:t4,env:r2={}}=s3,a2=se(s3,"Transformer");if(!a2.ok){e2.logger.warn(`Transformer ${o3} invalid (${a2.code}): ${a2.reason}. Skipping.`);continue}const{config:i3}=le(s3,"before"),{config:c3}=le({...s3,config:i3},"next"),u2=Object.keys(r2).length>0?{...c3,env:r2}:c3,{cache:d2}=s3,l2=d2?{...u2,cache:d2}:u2,{state:f2}=s3,p2=void 0!==f2&&void 0===l2.state?{...l2,state:f2}:l2,g2=e2.logger.scope("transformer").scope(o3),m2={collector:e2,logger:g2,id:o3,ingest:U(o3),config:p2,env:r2},h2=t4??(e3=>{const t5=s3.mapping;if(t5){const n4=[];if(void 0!==t5.data&&n4.push("data"),t5.mapping)for(const[e4,o4]of Object.entries(t5.mapping))if("object"==typeof o4&&null!==o4)for(const[t6,s4]of Object.entries(o4)){if("object"!=typeof s4||null===s4)continue;const o5=s4;void 0!==o5.data&&n4.push(`mapping[${e4}][${t6}].data`),void 0!==o5.silent&&n4.push(`mapping[${e4}][${t6}].silent`)}return n4.length>0&&e3.collector.logger.warn(`Transformer ${o3}: \`${n4.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e3.config,push:async n5=>{const o4=await re(n5,t5,e3.collector);return!o4.ignore&&{event:o4.event}}}}return{type:"pass",config:e3.config,push:e4=>({event:e4})}}),y2=await h2(m2);void 0!==s3.before&&void 0===y2.config?.before&&(y2.config={...y2.config??{},before:s3.before}),void 0!==s3.next&&void 0===y2.config?.next&&(y2.config={...y2.config??{},next:s3.next}),n3[o3]=y2}return n3}(i2,e.transformers||{}),i2}async function Ct(e){e=e||{};const t2=await kt(e),n2=(o2=t2,{type:"elb",config:{},push:async(e2,t3,n3,s3,r3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const n4=e2.replace("walker ","");return o2.command(n4,t3)}let a3;if("string"==typeof e2)a3={name:e2},t3&&"object"==typeof t3&&!Array.isArray(t3)&&(a3.data=t3);else{if(!e2||"object"!=typeof e2)return Ge({ok:!1});a3=e2,t3&&"object"==typeof t3&&!Array.isArray(t3)&&(a3.data={...a3.data||{},...t3})}return n3&&"object"==typeof n3&&(a3.context=n3),s3&&Array.isArray(s3)&&(a3.nested=s3),r3&&"object"==typeof r3&&(a3.custom=r3),o2.push(a3)}});var o2;t2.sources.elb=n2,await async function(e,t2={}){const n2={};for(const[o2,s2]of Object.entries(t2)){const t3=await ke(e,o2,s2);if(!t3)continue;const r2=s2.config?.require;t3.config={...t3.config,init:!1,...r2?{require:[...r2]}:{}},n2[o2]=t3}Object.assign(e.sources,n2);for(const t3 of Object.keys(n2)){const n3=e.sources[t3];let o2=!1;n3.init&&await z(n3.init.bind(n3),n4=>{if(n4 instanceof T)throw n4;o2=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t3,error:n4})})(),o2||(n3.config.init=!0,be(n3)&&await ve(e,n3,t3))}return n2}(t2,e.sources||{});const{consent:s2,user:r2,globals:a2,custom:i2}=e;s2&&await t2.command("consent",s2),r2&&await t2.command("user",r2),a2&&Object.assign(t2.globals,a2),i2&&Object.assign(t2.custom,i2),t2.config.run&&await t2.command("run");let c2=n2.push;const u2=Object.values(t2.sources).filter(e2=>"elb"!==e2.type),d2=u2.find(e2=>e2.config.primary);return d2?c2=d2.push:u2.length>0&&(c2=u2[0].push),{collector:t2,elb:c2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await Ct(config);flow={collector:result.collector,elb:result.elb}}const source=function(collector){for(const source of Object.values(collector.sources||{}))if("lambda"===source.type)return source}(flow.collector);if(!source)throw new Error("Lambda source not found in collector");const lambdaContext={awsRequestId:`test-${Date.now()}`},pushFn=source.push,lambdaResult=await pushFn(content,lambdaContext);let body;try{body=JSON.parse(lambdaResult.body||"{}")}catch{body=lambdaResult.body}const headers={};if(lambdaResult.headers)for(const[k2,v2]of Object.entries(lambdaResult.headers))void 0!==v2&&(headers[k2]=String(v2));return{statusCode:lambdaResult.statusCode,body:body,headers:headers}}}};function trigger(source){return async content=>{const lambdaEvent={...content};if(lambdaEvent.body&&"string"==typeof lambdaEvent.body){const body=JSON.parse(lambdaEvent.body);body.name&&!body.event&&(lambdaEvent.body=JSON.stringify({...body,event:body.name,name:void 0}))}return source.push(lambdaEvent,{awsRequestId:"test-req"})}}var lambda_default=async context=>{const{config:config={},env:env}=context,userSettings=config.settings||{},settings={...userSettings,cors:userSettings.cors??!0,timeout:userSettings.timeout??3e4,enablePixelTracking:userSettings.enablePixelTracking??!0,healthPath:userSettings.healthPath??"/health"};return{type:"lambda",config:{...config,settings:settings},push:async(event,lambdaContext)=>{const requestId=lambdaContext.awsRequestId;let parsed;try{const corsHeaders=function(corsOptions){if(!corsOptions)return{};if(!0===corsOptions)return{"Access-Control-Allow-Origin":"*","Access-Control-Allow-Methods":"GET, POST, OPTIONS","Access-Control-Allow-Headers":"Content-Type, Authorization","Access-Control-Max-Age":"3600"};const headers={};if(corsOptions.origin){const origin=Array.isArray(corsOptions.origin)?corsOptions.origin.join(", "):corsOptions.origin;headers["Access-Control-Allow-Origin"]=origin}return corsOptions.methods&&(headers["Access-Control-Allow-Methods"]=corsOptions.methods.join(", ")),corsOptions.headers&&(headers["Access-Control-Allow-Headers"]=corsOptions.headers.join(", ")),corsOptions.credentials&&(headers["Access-Control-Allow-Credentials"]="true"),void 0!==corsOptions.maxAge&&(headers["Access-Control-Max-Age"]=corsOptions.maxAge.toString()),headers}(settings.cors||!1);parsed=function(event){if(isAPIGatewayV2(event)){const headers={};return event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)}),{method:event.requestContext.http.method,body:event.body,queryString:event.rawQueryString||null,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}{const headers={};event.headers&&Object.entries(event.headers).forEach(([key,value])=>{value&&(headers[key.toLowerCase()]=value)});let queryString=null;if(event.queryStringParameters){const params=new URLSearchParams;Object.entries(event.queryStringParameters).forEach(([key,value])=>{value&¶ms.append(key,value)}),queryString=params.toString()||null}return{method:event.httpMethod,body:event.body,queryString:queryString,headers:headers,isBase64Encoded:event.isBase64Encoded||!1}}}(event);const path=function(event){return isAPIGatewayV2(event)?event.rawPath:event.path}(event);return settings.healthPath&&path===settings.healthPath?createResponse(200,{status:"ok",timestamp:Date.now(),source:"lambda",requestId:requestId},corsHeaders,requestId):"OPTIONS"===parsed.method?createResponse(204,"",corsHeaders,requestId):await context.withScope(event,void 0,async scopeEnv=>{const envPush=scopeEnv.push;if("GET"===parsed.method){if(!settings.enablePixelTracking)return createResponse(405,{success:!1,error:"GET not allowed",requestId:requestId},corsHeaders,requestId);if(parsed.queryString){const parsedData=requestToData(parsed.queryString);parsedData&&"object"==typeof parsedData&&await envPush(parsedData)}return function(headers={},requestId){const responseHeaders={"Content-Type":"image/gif","Cache-Control":"no-cache, no-store, must-revalidate",...headers};return requestId&&(responseHeaders["X-Request-ID"]=requestId),{statusCode:200,headers:responseHeaders,body:"R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",isBase64Encoded:!0}}(corsHeaders,requestId)}if("POST"===parsed.method){if(!parsed.body)return createResponse(400,{success:!1,error:"Request body is required",requestId:requestId},corsHeaders,requestId);const body=function(body,isBase64Encoded){if(!body||"string"!=typeof body)return body;try{const decoded=isBase64Encoded?Buffer.from(body,"base64").toString("utf8"):body;return JSON.parse(decoded)}catch{return body}}(parsed.body,parsed.isBase64Encoded);if(!body||"object"!=typeof body)return await envPush({}),createResponse(200,{success:!0,requestId:requestId},corsHeaders,requestId);if(function(body){return"object"==typeof body&&null!==body&&"event"in body&&"string"==typeof body.event}(body)){const result=await async function(eventReq,push2,logger,requestId){try{const result=await push2({name:eventReq.event,data:eventReq.data||{},context:eventReq.context,user:eventReq.user,globals:eventReq.globals,consent:eventReq.consent});return{id:result?.event?.id}}catch(error){return logger?.error("Event processing failed",{error:error,eventName:eventReq.event,requestId:requestId}),{error:error instanceof Error?error.message:"Unknown error"}}}(body,envPush,env.logger,requestId);return result.error?createResponse(400,{success:!1,error:result.error,requestId:requestId},corsHeaders,requestId):createResponse(200,{success:!0,id:result.id,requestId:requestId},corsHeaders,requestId)}return createResponse(400,{success:!1,error:"Invalid request format",requestId:requestId},corsHeaders,requestId)}return createResponse(405,{success:!1,error:"Method not allowed",requestId:requestId},corsHeaders,requestId)})}catch(error){return env.logger?.error("Lambda handler error",{error:error,requestId:requestId,method:parsed?.method}),createResponse(500,{success:!1,error:error instanceof Error?error.message:"Internal server error",requestId:requestId},{},requestId)}}}};import{DeleteMessageCommand,GetQueueAttributesCommand as GetQueueAttributesCommand2,GetQueueUrlCommand,ReceiveMessageCommand}from"@aws-sdk/client-sqs";var DecoderError=class extends Error{constructor(message){super(message),this.name="DecoderError"}};import{SQSClient}from"@aws-sdk/client-sqs";import{CreateQueueCommand,GetQueueAttributesCommand,SQSClient as SQSClient2}from"@aws-sdk/client-sqs";import{SNSClient,SubscribeCommand}from"@aws-sdk/client-sns";import{resolveSetup}from"@walkeros/core";var DEFAULT_SETUP={region:"eu-central-1",fifoQueue:!1,visibilityTimeoutSeconds:30,messageRetentionSeconds:345600,maximumMessageSize:262144};function buildDlqAttributes(args){const attrs={};return attrs.MessageRetentionPeriod=String(1209600),args.kmsMasterKeyId&&(attrs.KmsMasterKeyId=args.kmsMasterKeyId),args.fifoQueue&&(attrs.FifoQueue="true",attrs.ContentBasedDeduplication="true"),attrs}async function ensureQueue(args){const{sqs:sqs,logger:logger,queueName:queueName,attributes:attributes,tags:tags}=args;let queueUrl,queueCreated=!1;try{queueUrl=(await sqs.send(new CreateQueueCommand({QueueName:queueName,Attributes:attributes,tags:tags}))).QueueUrl??"",queueCreated=!0,logger.info(`SQS queue "${queueName}" created.`)}catch(err){if(function(err){return!!function(err){return"object"==typeof err&&null!==err&&"string"==typeof err.name}(err)&&("QueueNameExists"===err.name||"QueueAlreadyExists"===err.name||"AWS.SimpleQueueService.QueueNameExists"===err.name)}(err)){const message=err instanceof Error?err.message:String(err);return logger.throw(`SQS queue "${queueName}" exists with different attributes (${message}). Setup will not mutate an existing queue's attributes. Delete or rename the queue, then re-run setup.`)}throw err}if(!queueUrl)return logger.throw(`SQS CreateQueueCommand returned no QueueUrl for "${queueName}".`);const attrsRes=await sqs.send(new GetQueueAttributesCommand({QueueUrl:queueUrl,AttributeNames:["QueueArn"]})),queueArn=attrsRes.Attributes?.QueueArn??"";return queueArn?{queueCreated:queueCreated,queueUrl:queueUrl,queueArn:queueArn}:logger.throw(`SQS GetQueueAttributesCommand returned no QueueArn for "${queueName}".`)}function dlqName(queueName,fifo){if(fifo){return`${queueName.endsWith(".fifo")?queueName.slice(0,-5):queueName}-dlq.fifo`}return`${queueName}-dlq`}var setup=async context=>{const{id:id,config:config,env:env,logger:logger}=context,merged=resolveSetup(config.setup,DEFAULT_SETUP);if(!merged)return void logger.debug("SQS source setup skipped (config.setup is falsy).");const options={...DEFAULT_SETUP,...merged},settings=config.settings;if(!settings)return logger.throw("setup: settings missing");const queueName=settings.queueName;if(!queueName)return logger.throw("setup: settings.queueName is missing");const region=options.region??"eu-central-1",sqs=new(env.AWS?.SQSClient??SQSClient2)({region:region});let dlqArn,dlqCreated=!1;if(options.deadLetterQueue?.arn)dlqArn=options.deadLetterQueue.arn;else if(options.deadLetterQueue?.create){const dlqResult=await ensureQueue({sqs:sqs,logger:logger,queueName:dlqName(queueName,options.fifoQueue??!1),attributes:buildDlqAttributes({fifoQueue:options.fifoQueue??!1,kmsMasterKeyId:options.kmsMasterKeyId}),tags:(parentTags=options.tags,{...parentTags??{},walkerOS:"dlq"})});dlqArn=dlqResult.queueArn,dlqCreated=dlqResult.queueCreated}var parentTags;const finalQueueName=options.fifoQueue?queueName.endsWith(".fifo")?queueName:`${queueName}.fifo`:queueName;var args;const mainAttrs=function(args){const{options:options,dlqArn:dlqArn,queuePolicy:queuePolicy}=args,attrs={};if(attrs.VisibilityTimeout=String(options.visibilityTimeoutSeconds??30),attrs.MessageRetentionPeriod=String(options.messageRetentionSeconds??345600),attrs.MaximumMessageSize=String(options.maximumMessageSize??262144),options.kmsMasterKeyId&&(attrs.KmsMasterKeyId=options.kmsMasterKeyId),options.fifoQueue&&(attrs.FifoQueue="true",attrs.ContentBasedDeduplication="true"),dlqArn){const maxReceiveCount=options.deadLetterQueue?.maxReceiveCount??5;attrs.RedrivePolicy=JSON.stringify({deadLetterTargetArn:dlqArn,maxReceiveCount:maxReceiveCount})}return queuePolicy&&(attrs.Policy=queuePolicy),attrs}({options:options,dlqArn:dlqArn,queuePolicy:options.subscribeToSnsTopic?(args={sourceId:id,topicArn:options.subscribeToSnsTopic.topicArn},JSON.stringify({Version:"2012-10-17",Statement:[{Sid:`walkerOSAllowSNSPublish-${args.sourceId}`,Effect:"Allow",Principal:{Service:"sns.amazonaws.com"},Action:"SQS:SendMessage",Resource:"*",Condition:{ArnEquals:{"aws:SourceArn":args.topicArn}}}]})):void 0}),mainResult=await ensureQueue({sqs:sqs,logger:logger,queueName:finalQueueName,attributes:mainAttrs,tags:options.tags});let subscriptionArn;if(options.subscribeToSnsTopic){const sns=new(env.AWS?.SNSClient??SNSClient)({region:region}),subAttrs={};options.subscribeToSnsTopic.rawMessageDelivery&&(subAttrs.RawMessageDelivery="true"),options.subscribeToSnsTopic.filterPolicy&&(subAttrs.FilterPolicy=JSON.stringify(options.subscribeToSnsTopic.filterPolicy));subscriptionArn=(await sns.send(new SubscribeCommand({TopicArn:options.subscribeToSnsTopic.topicArn,Protocol:"sqs",Endpoint:mainResult.queueArn,Attributes:Object.keys(subAttrs).length>0?subAttrs:void 0,ReturnSubscriptionArn:!0}))).SubscriptionArn??void 0,logger.info("SQS source setup: SNS subscription created",{topicArn:options.subscribeToSnsTopic.topicArn,subscriptionArn:subscriptionArn})}return{queueCreated:mainResult.queueCreated,queueUrl:mainResult.queueUrl,queueArn:mainResult.queueArn,dlqCreated:dlqArn?dlqCreated:void 0,dlqArn:dlqArn,subscriptionArn:subscriptionArn}};async function handleMessage(args){const{message:message,settings:settings,pushFn:pushFn,logger:logger}=args;try{const decoded=function(messageId,body,decoder){if("raw"===decoder)return Buffer.from(body,"utf8");if("text"===decoder)return body;try{return JSON.parse(body)}catch(err){throw new DecoderError(`SQS message ${messageId} JSON decode failed: ${err instanceof Error?err.message:String(err)}`)}}(message.id,message.body,settings.decoder??"json");if(null==decoded)return logger.debug("SQS message acked-and-dropped (decoder returned null)",{id:message.id}),void await message.ack();await pushFn((value=decoded,"object"==typeof value&&null!==value?value:"string"==typeof value?{data:{payload:value}}:Buffer.isBuffer(value)?{data:{payload:value.toString("base64")}}:{data:{payload:String(value)}})),await message.ack()}catch(err){const error=err instanceof Error?err.message:String(err);err instanceof DecoderError?logger.error("SQS message decode failed",{id:message.id,error:error}):logger.error("SQS message handler failed",{id:message.id,error:error}),"ack"===settings.onPushError?await message.ack():await message.nack()}var value}function isQueueDoesNotExist(err){if("object"!=typeof err||null===err)return!1;if(!("name"in err))return!1;const obj=err;return"QueueDoesNotExist"===obj.name||"AWS.SimpleQueueService.NonExistentQueue"===obj.name}function isFetchedMessage(value){if("object"!=typeof value||null===value)return!1;const obj=value;return"string"==typeof obj.MessageId&&"string"==typeof obj.ReceiptHandle&&"string"==typeof obj.Body}var sqs_default=async context=>{const{config:partialConfig={},env:env,logger:logger,id:id}=context,config=function(partial={},env,logger){const partialSettings=partial.settings??{},queueName="string"==typeof partialSettings.queueName?partialSettings.queueName:"";queueName||logger.throw("Config settings queueName missing");const region=partialSettings.region??"eu-central-1";let client=partialSettings.client;client||(client=new(env?.AWS?.SQSClient??SQSClient)({region:region,...partialSettings.config}));const settings={...partialSettings,client:client,queueName:queueName,region:region,queueUrl:partialSettings.queueUrl,config:partialSettings.config,decoder:partialSettings.decoder??"json",maxMessages:partialSettings.maxMessages??10,waitTimeSeconds:partialSettings.waitTimeSeconds??20,visibilityTimeout:partialSettings.visibilityTimeout,shutdownTimeoutMs:partialSettings.shutdownTimeoutMs??3e4,onPushError:partialSettings.onPushError??"nack"};return{...partial,settings:settings}}(partialConfig,env,logger),settings=config.settings;if(!settings.queueUrl)try{const res=await settings.client.send(new GetQueueUrlCommand({QueueName:settings.queueName}));if(!res.QueueUrl)return logger.throw(`SQS queue not found: ${settings.queueName}. Run "walkeros setup source.${id}" to create it.`);settings.queueUrl=res.QueueUrl}catch(err){if(isQueueDoesNotExist(err))return logger.throw(`SQS queue not found: ${settings.queueName}. Run "walkeros setup source.${id}" to create it.`);throw err}if(!settings.queueArn)try{const res=await settings.client.send(new GetQueueAttributesCommand2({QueueUrl:settings.queueUrl,AttributeNames:["QueueArn"]}));settings.queueArn=res.Attributes?.QueueArn}catch(err){logger.debug("SQS GetQueueAttributesCommand failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}let stopped=!1;const inFlight=new Set,loopPromise=(async()=>{for(;!stopped;)try{const messages=(await settings.client.send(new ReceiveMessageCommand({QueueUrl:settings.queueUrl,MaxNumberOfMessages:settings.maxMessages??10,WaitTimeSeconds:settings.waitTimeSeconds??20,VisibilityTimeout:settings.visibilityTimeout,MessageAttributeNames:["All"],AttributeNames:["All"]}))).Messages??[];for(const msg of messages){if(!isFetchedMessage(msg)){logger.warn("SQS received malformed message; skipping",{messageId:"string"==typeof msg.MessageId?msg.MessageId:void 0});continue}const fetched=msg,handler=handleMessage({message:{id:fetched.MessageId,body:fetched.Body,receiptHandle:fetched.ReceiptHandle,ack:async()=>{await settings.client.send(new DeleteMessageCommand({QueueUrl:settings.queueUrl??"",ReceiptHandle:fetched.ReceiptHandle}))},nack:async()=>{}},settings:settings,pushFn:env.push,logger:logger});inFlight.add(handler),handler.finally(()=>{inFlight.delete(handler)})}}catch(err){if(stopped)break;const error=err instanceof Error?err.message:String(err);if(isQueueDoesNotExist(err)){logger.error(`SQS queue "${settings.queueName}" not found at runtime. Run "walkeros setup source.${id}" to create it. Original: ${error}`),stopped=!0;break}logger.error("SQS receive error (will retry)",{error:error}),await new Promise(r2=>setTimeout(r2,1e3))}})();return{type:"sqs",config:config,setup:setup,push:async content=>{if(!content)return;const result={acked:!1,nacked:!1};return await handleMessage({message:{id:content.MessageId,body:content.Body,receiptHandle:content.ReceiptHandle,ack:async()=>{result.acked=!0},nack:async()=>{result.nacked=!0}},settings:settings,pushFn:env.push,logger:logger}),result},destroy:async()=>{stopped=!0;const timeoutMs=settings.shutdownTimeoutMs??3e4;let timer;try{await Promise.race([(async()=>{await loopPromise,await Promise.all(Array.from(inFlight))})(),new Promise(resolve=>{timer=setTimeout(()=>{logger.warn(`SQS source close timed out after ${timeoutMs}ms; forcing close.`),resolve()},timeoutMs)})])}finally{timer&&clearTimeout(timer),function(client,logger){const candidate=client;if("function"==typeof candidate.destroy)try{candidate.destroy()}catch(err){logger.debug("SQS client destroy failed (non-fatal)",{error:err instanceof Error?err.message:String(err)})}}(settings.client,logger)}}}},types_exports2={};export{types_exports as SourceLambda,types_exports2 as SourceSqs,examples_exports as examples,lambda_default as sourceLambda,sqs_default as sourceSqs};//# sourceMappingURL=index.mjs.map
|