@walkeros/server-source-aws 4.1.0-next-1779362268386 → 4.1.0

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  # @walkeros/server-source-aws
2
2
 
3
- ## 4.1.0-next-1779362268386
3
+ ## 4.1.0
4
4
 
5
5
  ### Minor Changes
6
6
 
@@ -28,7 +28,7 @@
28
28
  - Updated dependencies [058f7ed]
29
29
  - Updated dependencies [28a8ac2]
30
30
  - Updated dependencies [fd6076e]
31
- - @walkeros/core@4.1.0-next-1779362268386
31
+ - @walkeros/core@4.1.0
32
32
 
33
33
  ## 4.0.2
34
34
 
package/dist/dev.js CHANGED
@@ -1 +1 @@
1
- "use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,r=(e,n)=>{for(var o in n)t(e,o,{get:n[o],enumerable:!0})},i={};r(i,{examples:()=>O,schemas:()=>a,sqsExamples:()=>_e}),module.exports=(e=i,((e,r,i,a)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let c of o(r))s.call(e,c)||c===i||t(e,c,{get:()=>r[c],enumerable:!(a=n(r,c))||a.enumerable});return e})(t({},"__esModule",{value:!0}),e));var a={};r(a,{CorsOptionsSchema:()=>g,CorsOrigin:()=>f,HttpMethod:()=>d,SettingsSchema:()=>p,settings:()=>h,sqsSettings:()=>q,sqsSetup:()=>S});var c=require("@walkeros/core/dev"),u=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),d=l.z.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),f=l.z.union([l.z.string(),l.z.array(l.z.string()),l.z.literal("*")]),g=l.z.object({origin:f.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:l.z.array(d).describe("Allowed HTTP methods").optional(),headers:l.z.array(l.z.string()).describe("Allowed request headers").optional(),credentials:l.z.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:l.z.number().int().positive().describe("Preflight cache duration in seconds").optional()}),p=u.z.object({cors:u.z.union([u.z.boolean(),g]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:u.z.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:u.z.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),healthPath:u.z.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),h=(0,c.zodToSchema)(p),m=require("@walkeros/core/dev"),y=require("@walkeros/core/dev"),b=y.z.object({queueName:y.z.string().min(1).describe("SQS queue short name (like walkeros-events). Required for both setup and runtime poll."),region:y.z.string().describe("AWS region (like eu-central-1). Default: eu-central-1.").optional(),queueUrl:y.z.string().url().describe("Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.").optional(),client:y.z.any().describe("Pre-configured AWS SQSClient instance. Bypasses construction when supplied.").optional(),config:y.z.any().describe("AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).").optional(),decoder:y.z.enum(["json","text","raw"]).describe("Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer.").optional(),maxMessages:y.z.number().int().min(1).max(10).describe("SQS receive batch size. Cap 10. Default: 10.").optional(),waitTimeSeconds:y.z.number().int().min(0).max(20).describe("Long-poll duration in seconds. Cap 20. Default: 20.").optional(),visibilityTimeout:y.z.number().int().nonnegative().describe("Per-receive visibility timeout override. Default: queue-configured value.").optional(),shutdownTimeoutMs:y.z.number().int().positive().describe("Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.").optional(),onPushError:y.z.enum(["nack","ack"]).describe("Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it.").optional()}),v=require("@walkeros/core/dev"),w=v.z.record(v.z.string(),v.z.string()),k=v.z.object({region:v.z.string().min(1).describe("AWS region.").optional(),fifoQueue:v.z.boolean().describe("FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.").optional(),visibilityTimeoutSeconds:v.z.number().int().nonnegative().describe("Visibility timeout in seconds. Default: 30.").optional(),messageRetentionSeconds:v.z.number().int().positive().describe("Message retention period in seconds. Default: 345600 (4 days).").optional(),maximumMessageSize:v.z.number().int().min(1024).max(262144).describe("Max message size in bytes. Default: 262144 (256 KB).").optional(),kmsMasterKeyId:v.z.string().describe("KMS key alias or ID for at-rest encryption.").optional(),deadLetterQueue:v.z.object({arn:v.z.string().describe("ARN of an existing DLQ. Mutually exclusive with create: true.").optional(),create:v.z.boolean().describe("Create a sibling DLQ named <queueName>-dlq. Default: false.").optional(),maxReceiveCount:v.z.number().int().min(1).max(1e3).describe("Max receive count before message goes to DLQ. Default: 5.").optional()}).describe("Optional dead-letter queue.").optional(),tags:w.describe("Tags applied to the queue (and inherited by an auto-created DLQ).").optional(),subscribeToSnsTopic:v.z.object({topicArn:v.z.string().min(1).describe("Topic ARN to subscribe to."),rawMessageDelivery:v.z.boolean().describe("Deliver SNS messages without the SNS envelope.").optional(),filterPolicy:v.z.record(v.z.string(),v.z.unknown()).describe("SNS filter policy applied at subscription level.").optional()}).describe("Optional SNS topic subscription. Creates the subscription and the matching queue policy.").optional()}),q=(0,m.zodToSchema)(b),S=(0,m.zodToSchema)(k),O={};r(O,{createTrigger:()=>Te,env:()=>x,step:()=>P,trigger:()=>$e});var x={};r(x,{push:()=>z});var C=()=>()=>Promise.resolve({ok:!0}),A=()=>{},j={error:A,warn:A,info:A,debug:A,throw:e=>{throw"string"==typeof e?new Error(e):e},json:A,scope:()=>j},z={get push(){return C()},get command(){return C()},get elb(){return C()},logger:j},P={};r(P,{apiGatewayV1Post:()=>E,lambdaGet:()=>D,lambdaPost:()=>I});var I={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"}}]]},E={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"}}]]},D={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"}'}]]},M=require("@walkeros/core"),T=require("@walkeros/core"),$=require("@walkeros/core"),_=require("@walkeros/core"),H=require("@walkeros/core"),N=require("@walkeros/core"),R=require("@walkeros/core"),B=require("@walkeros/core"),G=require("@walkeros/core"),F=require("@walkeros/core"),L=require("@walkeros/core"),Q=require("@walkeros/core"),J=require("@walkeros/core"),U={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 W(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function K(e){const t={};for(const[n,o]of Object.entries(e)){const e=o.config?.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?t[n]={next:e}:t[n]={}}return t}function V(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}function Y(e,t={}){if(!e)return[];if(Array.isArray(e))return e;const n=[],o=new Set;let s=e;for(;s&&t[s]&&!o.has(s);){o.add(s),n.push(s);const e=t[s].next;if(Array.isArray(e)){n.push(...e);break}s=e}return n}async function X(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:n,ingest:(0,R.createIngest)(n),config:t.config,env:ne(t.config.env)};s.debug("init");const i=await(0,R.useHooks)(t.init,"TransformerInit",e.hooks,e.logger)(r);if(!1===i)return!1;t.config={...i||t.config,env:i?.env||t.config.env,init:!0},s.debug("init done")}return!0}async function Z(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...ne(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await(0,R.useHooks)(t.push,"TransformerPush",e.hooks,e.logger)(o,c);return a.debug("push done"),u}function ee(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:(0,R.createIngest)(t)}async function te(e,t,n,o,s,r,i){s||(s=(0,R.createIngest)(n[0]??"chain")),i&&s._meta&&(s._meta.chainPath=i);let a=o,c=r;for(const o of n){const r=t[o];if(!r){e.logger.warn(`Transformer not found: ${o}`);continue}if(s&&s._meta&&s._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o}`),{event:null,respond:c};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await(0,R.tryCatchAsync)(X,t=>{if(t instanceof R.FatalError)throw t;return e.status.failed++,e.logger.scope(`transformer:${r.type||"unknown"}`).error("transformer init failed",{transformer:o,error:t}),!1})(e,r,o))return{event:null,respond:c};if(i&&void 0!==r.config?.chainMocks?.[i]){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),a=t;continue}if(void 0!==r.config?.mock){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),a=r.config.mock;continue}if(r.config?.disabled)continue;const u=r.config?.cache,l=u?(0,R.compileCache)(u):void 0,d=l?W(l,e):void 0;let f;if(l&&d){const e=(0,R.buildCacheContext)(s,a),t=await(0,R.checkCache)(l,d,e);if("HIT"===t?.status&&t.value){if(a=t.value,l.stop)return{event:a,respond:c,stopped:!0};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=(0,R.getNextSteps)(g,(0,R.buildCacheContext)(s,a));if(1===n.length){const o=Y(n[0],K(t));if(o.length>0){const n=await te(e,t,o,a,s,c,i);if(null===n.event)return{event:null,respond:n.respond??c};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:n.respond??c,stopped:!0};n.respond&&(c=n.respond),a=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(n,K(t)),a,ee(s,n),void 0,i)))}const p=await(0,R.tryCatchAsync)(Z,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,a,s,c);if(!1===p)return{event:null,respond:c};if(Array.isArray(p)){const r=n.slice(n.indexOf(o)+1),u=await Promise.all(p.map(async n=>{const o=n.event||a,u=ee(s,"unknown");if(n.next){const s=(0,R.getNextSteps)(n.next,(0,R.buildCacheContext)(u,o));if(0===s.length)return{event:o,respond:c};if(1===s.length){const n=Y(s[0],K(t));return n.length>0?te(e,t,n,o,u,c,i):{event:o,respond:c}}return(await Promise.all(s.map(n=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(n,K(t)),o,ee(u,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?te(e,t,r,o,u,c,i):{event:o,respond:c}}));let l=c;const d=[];for(const e of u.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const t=e;if(t.respond&&(l=t.respond),null===t.event)continue;Array.isArray(t.event)?d.push(...t.event):d.push(t.event)}else d.push(e);return 0===d.length?{event:null,respond:l}:1===d.length?{event:d[0],respond:l}:{event:d,respond:l}}if(p&&"object"==typeof p){const{event:n,respond:o,next:r}=p;if(o&&(c=o),void 0!==r){const o=(0,R.getNextSteps)(r,(0,R.buildCacheContext)(s,a));if(0===o.length){n&&(a=n);continue}if(1===o.length){const u=Y(o[0],K(t));return u.length>0?te(e,t,u,n||a,s,c,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:c})}return await Promise.all(o.map(o=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${o} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(o,K(t)),n||a,ee(s,o),void 0,i))),{event:null,respond:void 0}}n&&(a=n)}f&&d&&(0,R.storeCache)(d,f.key,a,f.ttl);const h=r.config.next,m="string"==typeof h||Array.isArray(h)&&h.every(e=>"string"==typeof e),y=void 0!==h&&!m;if((!p||"object"==typeof p&&!p.next)&&y){const n=(0,R.getNextSteps)(r.config.next,(0,R.buildCacheContext)(s,a));if(1===n.length){const o=Y(n[0],K(t));return o.length>0?te(e,t,o,a,s,c,i):{event:a,respond:c}}return n.length>1?(await Promise.all(n.map(n=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(n,K(t)),a,ee(s,n),void 0,i))),{event:null,respond:void 0}):{event:a,respond:c}}}return{event:a,respond:c}}function ne(e){return e&&(0,R.isObject)(e)?e:{}}function oe(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function se(e,t,n){if(!t.on||!t.queueOn?.length)return;const o=t.queueOn;t.queueOn=[];const s=n||t.config?.id||"unknown";for(const{type:n,data:r}of o)await(0,N.tryCatchAsync)(t.on,t=>{if(t instanceof N.FatalError)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s,type:n,error:t})})(n,r)}function re(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ie(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:u}=n,l=u,d=l?(0,N.compileCache)({...l,stop:l.stop??!0}):void 0,f=oe(a)?Y(a,K(e.transformers)):void 0,g=oe(c)?Y(c,K(e.transformers)):void 0,p=r.push,h=p??e.push,m=Boolean(p),y=async(n,o,r)=>{let i;const u=g??(void 0!==c?(()=>{const t=(0,N.getNextSteps)(c,(0,N.buildCacheContext)(r.ingest));return 0===t.length?[]:Y(1===t.length?t[0]:t,K(e.transformers))})():[]);let l=[n];if(u.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await te(e,e.transformers,u,n,r.ingest,r.respond,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(r.respond=o.respond),{ok:!0};o.respond&&(r.respond=o.respond),l=Array.isArray(o.event)?o.event:[o.event]}if(d){const t=W(d,e);if(t){const n=(0,N.buildCacheContext)(r.ingest),o=await(0,N.checkCache)(d,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&d.stop){let t=o.value;return o.rule.update&&(t=await(0,N.applyUpdate)(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),r.respond?.(t),{ok:!0}}if("MISS"===o.status&&d.stop&&r.respond){const s=r.respond,a=o.rule.update,c={...n,cache:{status:"MISS"}},u=o.key,l=o.rule.ttl,d=n=>{(0,N.storeCache)(t,u,n,l),a?i=(async()=>{const t=await(0,N.applyUpdate)(n,a,c,e);s(t)})():s(n)};r.respond=d}"MISS"!==o.status||d.stop||(0,N.storeCache)(t,o.key,!0,o.rule.ttl)}}}const p=f?{kind:"single",preChain:f}:void 0!==a?(()=>{const t=(0,N.getNextSteps)(a,(0,N.buildCacheContext)(r.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:Y(t[0],K(e.transformers))}:{kind:"many",branches:t.map(t=>Y(t,K(e.transformers)))}})():{kind:"single",preChain:[]};let y={ok:!0};for(const n of l)"many"===p.kind?(await Promise.all(p.branches.map((i,a)=>(0,N.tryCatchAsync)(async()=>m?h(n):h(n,{...o,id:t,ingest:ee(r.ingest,`${t}.${a}`),respond:void 0,mapping:s,preChain:i}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),y={ok:!0}):y=m?await h(n):await h(n,{...o,id:t,ingest:r.ingest,respond:r.respond,mapping:s,preChain:p.preChain});return i&&await i,y},b=async n=>{const o=(0,N.createIngest)(t);if(!s.ingest||void 0===n)return o;const r=await(0,N.getMappingValue)(n,s.ingest,{collector:e});return{...o,...r,_meta:o._meta}},v=e.logger.scope("source").scope(t),w={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:v,...r,push:async(e,n={})=>{const o={ingest:(0,N.createIngest)(t),respond:void 0};return y(e,n,o)}},k={collector:e,logger:v,id:t,config:s,env:w,withScope:async(e,t,n)=>{const o={ingest:await b(e),respond:t};return n({...w,push:(e,t={})=>y(e,t,o),ingest:o.ingest,respond:o.respond})}},q=await(0,N.tryCatchAsync)(o,n=>{if(n instanceof N.FatalError)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(k);if(!q)return;const S=q.type||"unknown",O=e.logger.scope(S).scope(t);return w.logger=O,i&&(q.config={...q.config,primary:i}),q}function ae(e,t,n,o){if(n instanceof _.FatalError)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}function ce(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function ue(e,t,n,o,s){if(!t.on)return;const r=t.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:s,env:Ce(t.env,t.config.env)};(0,H.tryCatch)(t.on,t=>ae(e,"destination",t,{destId:n,type:o}))(o,a)}function le(e,t,n,o){let s;switch(t){case U.Consent:s=o||e.consent;break;case U.Session:s=e.session;break;case U.User:s=o||e.user;break;case U.Custom:s=o||e.custom;break;case U.Globals:s=o||e.globals;break;case U.Config:s=o||e.config;break;case U.Ready:case U.Run:default:s=void 0}if(n.length)switch(t){case U.Consent:!function(e,t,n){const o=n||e.consent,s=ce(e,U.Consent);t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{(0,H.tryCatch)(t[n],t=>ae(e,"consent",t,{key:n}))(o,s)})})}(e,n,o);break;case U.Ready:!function(e,t){if(!e.allowed)return;const n=ce(e,U.Ready);t.forEach(t=>{(0,H.tryCatch)(t,t=>ae(e,"ready",t))(void 0,n)})}(e,n);break;case U.Run:!function(e,t){if(!e.allowed)return;const n=ce(e,U.Run);t.forEach(t=>{(0,H.tryCatch)(t,t=>ae(e,"run",t))(void 0,n)})}(e,n);break;case U.Session:!function(e,t){if(!e.session)return;const n=ce(e,U.Session);t.forEach(t=>{(0,H.tryCatch)(t,t=>ae(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=ce(e,t);n.forEach(n=>{"function"==typeof n&&(0,H.tryCatch)(n,n=>ae(e,"generic",n,{type:t}))(s,o)});break}}}function de(e,t,n,o){if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(n.onOverflow??"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const s=[];for(;e.length>=n.max;)s.push(e.shift());return e.push(t),s.length>0&&o&&o(s),{appended:!0,dropped:s.length}}var fe=new WeakMap;function ge(e,t,n,o){fe.get(e)||(fe.set(e,!0),t.warn(n,o))}function pe(e){fe.delete(e)}var he=Object.freeze({batched:!0});function me(e){return e===he}function ye(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function be(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function ve(e,t,n,o){e.dropped[t]||(e.dropped[t]={});const s=e.dropped[t];return s[n]=(s[n]??0)+o,s[n]}function we(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Y(e,t);if("string"==typeof e)return Y(e,t);const o=(0,$.getNextSteps)(e,(0,$.buildCacheContext)(n));return 0===o.length?[]:1===o.length?Y(o[0],t):Y(o,t)}async function ke(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return Oe({ok:!1});if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=de(e.queue,t,{max:n});if(o.dropped>0){const t=ve(e.status,(0,$.stepId)("collector"),"queue",o.dropped);ge(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&pe(e.queue);e.status.in++}o||(o=e.destinations);const c=e.transformers?K(e.transformers):{},u=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let u=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&u.push((0,$.clone)(t));const l=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,$.createIngest)("unknown");if(!u.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!u.length&&s.queueOn?.length){let t=!1;try{t=await qe(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const d=[],f=u.filter(e=>{const t=(0,$.getGrantedConsent)(s.config.consent,r,e.consent);return!t||(e.consent=t,d.push(e),!1)});if(f.length>0){const t=s.queuePush,n=s.config.id||o,r={max:s.config.queueMax??1e3};let i=0;for(const e of f)i+=de(t,e,r).dropped;if(i>0){be(e,n);const o=ve(e.status,(0,$.stepId)("destination",n),"queue",i);ge(t,e.logger.scope(s.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n,cap:r.max,droppedCount:o})}else t.length<r.max&&pe(t)}if(!d.length)return{id:o,destination:s,queue:u};let g,p,h=!1;try{h=await qe(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!h)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const m=we(s.config.before,c,l),y=s.config.next,b=s.config?.cache,v=b?(0,$.compileCache)(b):void 0,w=v?W(v,e):void 0;let k=0,q=0;return await Promise.all(d.map(async t=>{let r;if(t.globals=(0,$.assign)(i,t.globals),t.user=(0,$.assign)(a,t.user),v?.stop&&w){const e=(0,$.buildCacheContext)(l,t),n=await(0,$.checkCache)(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let u=t,d=n.respond;if(m.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await te(e,e.transformers,m,t,l,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(d=s.respond),u=Array.isArray(s.event)?s.event[0]:s.event}if(v&&!v.stop&&w){const e=(0,$.buildCacheContext)(l,u),n=await(0,$.checkCache)(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const f=Date.now();let h=!1;const b=await(0,$.tryCatchAsync)(Se,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:u.name}),g=t,h=!0;const r=s.dlq,i=s.config.id||o,a={max:s.config.dlqMax??100},c=de(r,[u,t],a);if(c.dropped>0){be(e,i);const t=ve(e.status,(0,$.stepId)("destination",i),"dlq",c.dropped);ge(r,e.logger.scope(s.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:i,cap:a.max,droppedCount:t})}else r.length<a.max&&pe(r)})(e,s,o,u,l,d);if(k+=Date.now()-f,r&&w&&void 0===s.config.mock&&(0,$.storeCache)(w,r.key,b??!0,r.ttl),void 0===b||me(b)||(p=b),me(b)&&q++,!h&&y){void 0!==b&&(l._response=b);const t=we(y,c,l);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await te(e,e.transformers,t,u,l,d,`destination.${o}.next`);n.respond&&(d=n.respond)}}return t})),{id:o,destination:s,error:g,response:p,totalDuration:k,batchedCount:q,allowedCount:d.length}})),l={},d={},f={};for(const t of u){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};be(e,t.id);const s=e.status.destinations[t.id],r=Date.now();if(s.queuePushSize=n.queuePush?.length??0,s.dlqSize=n.dlq?.length??0,t.error)o.error=t.error,f[t.id]=o,s.failed++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)d[t.id]=o;else{const n=t.batchedCount??0,i=t.allowedCount??0;(Math.max(0,i-n)>0||0===i)&&(l[t.id]=o,s.count++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.out++)}}return Oe({event:t,...Object.keys(l).length&&{done:l},...Object.keys(d).length&&{queued:d},...Object.keys(f).length&&{failed:f}})}async function qe(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(o),r={collector:e,logger:s,id:n,config:t.config,env:Ce(t.env,t.config.env)};s.debug("init");const i=await(0,$.useHooks)(t.init,"DestinationInit",e.hooks,e.logger)(r);if(!1===i)return i;if(t.config={...i||t.config,init:!0},t.queueOn?.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)ue(e,t,n,s,r)}s.debug("init done")}return!0}async function Se(e,t,n,o,s,r){const{config:i}=t,a=await(0,$.processEventMapping)(o,i,e);if(a.ignore)return!1;const c=t.type||"unknown",u=e.logger.scope(c),l={collector:e,logger:u,id:n,config:i,data:a.data,rule:a.mapping,ingest:s,env:{...Ce(t.env,i.env),...r?{respond:r}:{}}};if(void 0!==i.mock)return u.debug("mock",{event:a.event.name}),i.mock;const d=a.mapping,f=a.mappingKey||"* *";if(d?.batch&&t.pushBatch&&void 0===i.mock){if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,entries:[],events:[],data:[]},s=ye(d.batch),r=ye(i.batch),a=s.wait??r.wait??3e4,c=s.size??r.size??1e3,l=s.age??r.age??3e4,g=Ce(t.env,i.env),p=(0,$.debounce)(async()=>{const o=t.batches[f].batched;if(0===o.entries.length)return;const s={key:o.key,entries:o.entries,events:o.events,data:o.data};o.entries=[],o.events=[],o.data=[];const r=s.entries[0],a={collector:e,logger:u,id:n,config:i,data:void 0,rule:r.rule,ingest:r.ingest,env:{...g,...r.respond?{respond:r.respond}:{}}};u.debug("push batch",{events:s.entries.length});const c=t.config.id||n,l=be(e,c);let d=!0;await(0,$.tryCatchAsync)((0,$.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),n=>{d=!1;const o=t.dlq=t.dlq||[],r={max:t.config.dlqMax??100};let i=0;for(const e of s.entries)i+=de(o,[e.event,n],r).dropped;if(i>0){const t=ve(e.status,(0,$.stepId)("destination",c),"dlq",i);ge(o,u,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:r.max,droppedCount:t})}else o.length<r.max&&pe(o);l.failed+=s.entries.length,l.dlqSize=o.length,e.status.failed+=s.entries.length,u.error("Push batch failed",{error:n instanceof Error?n.message:String(n),entries:s.entries.length})})(s,a),u.debug("push batch done"),l.inFlightBatch=Math.max(0,(l.inFlightBatch??0)-s.entries.length),d&&(l.count+=s.entries.length,l.lastAt=Date.now(),e.status.out+=s.entries.length)},{wait:a,size:c,age:l});t.batches[f]={batched:o,batchFn:()=>{p()},flush:async()=>{await p.flush()}}}const o=t.batches[f];o.batched.entries.push({event:a.event,ingest:s,respond:r,rule:d,data:a.data}),o.batched.events.push(a.event),(0,$.isDefined)(a.data)&&o.batched.data.push(a.data);const c=t.config.id||n,l=be(e,c);return l.inFlightBatch=(l.inFlightBatch??0)+1,o.batchFn(),he}{u.debug("push",{event:a.event.name});const n=await(0,$.useHooks)(t.push,"DestinationPush",e.hooks,e.logger)(a.event,l);return u.debug("push done"),n}}function Oe(e){return{ok:!e?.failed,...e}}function xe(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=V(e,"before"),{config:i}=V({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=Ce(t.env,o);return{...t,config:a,env:c}}function Ce(e,t){return e||t?t?e&&(0,$.isObject)(e)&&(0,$.isObject)(t)?{...e,...t}:t:e:{}}async function Ae(e,t,n){const o=Object.entries(e).map(async([e,o])=>{const s=o.destroy;if(!s)return;const r=o.type||"unknown",i=n.scope(r),a={id:e,config:o.config,env:o.env??{},logger:i};try{await Promise.race([s(a),new Promise((n,o)=>setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3))])}catch(n){i.error(`${t} '${e}' destroy failed: ${n}`)}});await Promise.allSettled(o)}async function je(e,t,n){let o,s,r=!1;switch(t){case U.Config:(0,G.isObject)(n)&&((0,B.assign)(e.config,n,{shallow:!1}),s=n,r=!0);break;case U.Consent:if((0,G.isObject)(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=(0,M.assign)(e.consent,n),{update:n}}(e,n);s=t,r=!0}break;case U.Custom:(0,G.isObject)(n)&&(e.custom=(0,B.assign)(e.custom,n),s=n,r=!0);break;case U.Destination:(0,G.isObject)(n)&&"code"in n&&(0,G.isObject)(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:s={},before:r,next:i,cache:a}=t;if(!(0,$.isFunction)(n.push))return Oe({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c=o||{init:!1};let u=r?{...c,before:r}:{...c};i&&(u={...u,next:i}),a&&(u={...u,cache:a});const l={...n,config:u,env:Ce(n.env,s)};let d=l.config.id;if(!d)do{d=(0,$.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d]);return e.destinations[d]=l,!1!==l.config.queue&&(l.queuePush=[...e.queue]),ke(e,void 0,{},{[d]:l})}(e,n));break;case U.Globals:(0,G.isObject)(n)&&(e.globals=(0,B.assign)(e.globals,n),s=n,r=!0);break;case U.Hook:if((0,G.isObject)(n)&&(0,B.isString)(n.name)&&(0,B.isFunction)(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case U.On:if((0,G.isObject)(n)&&(0,B.isString)(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=(0,_.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,le(e,t,r)}(e,t,o)}break;case U.Ready:r=!0;break;case U.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=(0,B.assign)(e.consent,t.consent)),t.user&&(e.user=(0,B.assign)(e.user,t.user)),t.globals&&(e.globals=(0,B.assign)(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=(0,B.assign)(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ke(e)}(e,n),r=!0;break;case U.Session:r=!0;break;case U.Shutdown:await async function(e){const t=e.logger;await Ae(e.sources,"source",t),await Ae(e.destinations,"destination",t),await Ae(e.transformers,"transformer",t),await Ae(e.stores,"store",t)}(e);break;case U.User:(0,G.isObject)(n)&&((0,B.assign)(e.user,n,{shallow:!1}),s=n,r=!0)}return r&&(await async function(e,t,n,o){let s,r=n||[];switch(n||(r=e.on[t]||[]),t){case U.Consent:s=o||e.consent;break;case U.Session:s=e.session;break;case U.User:s=o||e.user;break;case U.Custom:s=o||e.custom;break;case U.Globals:s=o||e.globals;break;case U.Config:s=o||e.config;break;case U.Ready:case U.Run:default:s=void 0}let i=!1;for(const[n,o]of Object.entries(e.sources)){if(o.config.require?.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(re(o)?!1===await(0,H.tryCatchAsync)(o.on,o=>ae(e,"source",o,{sourceId:n,type:t}))(t,s)&&(i=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:s})))}Object.entries(e.destinations).forEach(([n,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:t,data:s});ue(e,o,n,t,s)}});for(const[t,n]of Object.entries(e.sources))re(n)&&n.queueOn?.length&&await se(e,n,t);return Object.keys(e.pending.destinations).length>0&&await async function(e,t){for(const[n,o]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const s=o.config?.require;if(!s)continue;const r=s.indexOf(t);if(-1===r)continue;if(s.splice(r,1),s.length>0)continue;delete e.pending.destinations[n];const i=xe(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}(e,t),le(e,t,r,o),!i}(e,t,void 0,s),o=await ke(e)),o||Oe({ok:!0})}function ze(e,t){if(!t.name)throw new Error("Event name is required");const[n,o]=t.name.split(" ");if(!n||!o)throw new Error("Event name is invalid");const{timestamp:s=Date.now(),name:r=`${n} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:u={},user:l=e.user,nested:d=[],consent:f=e.consent,id:g=(0,B.getSpanId)(),trigger:p="",entity:h=n,action:m=o,timing:y=0,source:b={type:"collector",schema:"4"}}=t;return{name:r,data:i,context:a,globals:c,custom:u,user:l,nested:d,consent:f,id:g,trigger:p,entity:h,action:m,timestamp:s,timing:y,source:b}}function Pe(e={}){const t=e.maxEntries??1e4,n=e.lowWaterMark??.8,o=e.sweepIntervalMs??6e4,s=Math.floor(t*n),r=new Map,i={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a;return o>0&&(a=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of r)void 0!==o.expires&&o.expires<=e&&(r.delete(n),t++);i.evictions_ttl+=t},o),a&&"function"==typeof a.unref&&a.unref()),{type:"memory",config:{},get(e){const t=r.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(r.delete(e),i.evictions_ttl++,void i.misses++):(r.delete(e),r.set(e,t),i.hits++,t.value);i.misses++},set(e,n,o){const a=!r.has(e);a||r.delete(e),r.set(e,{value:n,expires:void 0!==o?Date.now()+o:void 0}),i.writes++,a&&i.populates++,r.size>t&&function(){if(r.size<=t)return;const e=r.size-s;let n=0;for(const t of r.keys()){if(n>=e)break;r.delete(t),n++}i.evictions_entries+=n}()},delete(e){r.delete(e)&&i.deletes++},get counters(){return{...i}},destroy(){void 0!==a&&(clearInterval(a),a=void 0),r.clear()}}}function Ie(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i}=t,a={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c=n.rules.map(e=>({match:e.match?(0,J.compileMatcher)(e.match):()=>!0,ttl:e.ttl})),u=e=>`${s}:${e}`;function l(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return c.find(e=>e.match(n))}const d=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a}},async get(t){const n=u(t),s=await o.get(n);if(void 0!==s)return a.hits++,s;const r=d.get(n);if(r)return a.inflight_dedups++,r;a.misses++;const i=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=l(t,s);if(r)try{await o.set(n,s,1e3*r.ttl),a.populates++}catch(e){f("set",t,e)}return s}finally{d.delete(n)}})();return d.set(n,i),i},async set(t,n,s){a.writes++,await e.set(t,n,s);const r=l(t,n);if(r)try{await o.set(u(t),n,1e3*r.ttl)}catch(e){f("set",t,e)}},async delete(t){a.deletes++,await e.delete(t);try{await o.delete(u(t))}catch(e){f("delete",t,e)}}};function f(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,{error:n}):console.warn(o,n)}}function Ee(e,t){const n=t.get,o=t.set,s=t.delete;t.get=(0,Q.useHooks)(n,"StoreGet",e.hooks,e.logger),t.set=(0,Q.useHooks)(o,"StoreSet",e.hooks,e.logger),t.delete=(0,Q.useHooks)(s,"StoreDelete",e.hooks,e.logger)}async function De(e){const t=(0,T.assign)({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=(0,T.createLogger)(n),s={...t.globalsStatic,...e.globals},r={allowed:!1,config:t,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s,hooks:e.hooks||{},logger:o,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 i,a;r.push=function(e,t){return(0,F.useHooks)(async(n,o={})=>await(0,F.tryCatchAsync)(async()=>{const s=Date.now(),{id:r,ingest:i,respond:a,mapping:c,preChain:u,include:l,exclude:d}=o;let f=a,g=n;const p=l||d?function(e,t,n){let o=e;return t&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>t.includes(e)))),n&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>!n.includes(e)))),o}(e.destinations,l,d):void 0,h=i??(0,F.createIngest)(r||"unknown");if(c){const t=await(0,F.processEventMapping)(g,c,e);if(t.ignore)return Oe({ok:!0});if(c.consent&&!(0,F.getGrantedConsent)(c.consent,e.consent,t.event.consent))return Oe({ok:!0});g=t.event}if(u?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await te(e,e.transformers,u,g,h,f,r?`source.${r}.next`:void 0);if(null===n.event)return Oe({ok:!0});if(n.stopped)return n.respond&&(f=n.respond),Oe({ok:!0});if(n.respond&&(f=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=ze(e,o);return ke(e,s,{id:r,ingest:h,respond:f},p)}));if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count+=n.event.length,t.lastAt=Date.now(),t.duration+=Date.now()-s}return o[0]??Oe({ok:!0})}g=n.event}const m=t(g),y=ze(e,m),b=await ke(e,y,{id:r,ingest:h,respond:f},p);if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-s}return b},t=>{if(t instanceof F.FatalError)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),Oe({ok:!1})})(),"Push",e.hooks,e.logger)}(r,e=>({timing:Math.round((Date.now()-r.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.0-next-1779362268386"},...e})),r.command=(i=r,a=je,(0,L.useHooks)(async(e,t,n)=>await(0,L.tryCatchAsync)(async()=>await a(i,e,t,n),n=>{if(n instanceof L.FatalError)throw n;return i.status.failed++,i.logger.error("command failed",{command:e,data:t,error:n}),Oe({ok:!1})})(),"Command",i.hooks,i.logger));const c=e.stores||{};return r.stores=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(o),c={collector:e,logger:a,id:o,config:r,env:i},u=await t(c);n[o]=u}const o=t,s=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){const i=t[r];if("BLACK"===i)return;if("GRAY"===i){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const a=e[r].cache?.store;if(void 0!==a){if(!(a in e))throw new Error(`Store "${r}" cache.store references "${a}", which is not declared in flow.stores`);s(a)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(o);for(const t of s){const s=o[t].cache;if(!s)continue;let r,i;void 0!==s.store?(r=n[s.store],i=s.store):(n.__cache||(n.__cache=Pe()),r=n.__cache,i="__cache");const a=s.namespace??t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${a}:" via ${i}`),n[t]=Ie(n[t],{storeId:t,cacheConfig:s,cacheStore:r,namespace:a,logger:e.logger.scope("store-cache").scope(t)})}for(const[t,o]of Object.entries(n))"__cache"!==t&&Ee(e,o);return n}(r,c),function(e,t,n){const o=new Map;for(const[n,s]of Object.entries(e))t[n]&&o.set(s,t[n]);if(0!==o.size)for(const e of[n.transformers,n.destinations,n.sources])if(e)for(const t of Object.values(e))s(t.env);function s(e){if(e)for(const[t,n]of Object.entries(e))if("object"==typeof n&&null!==n){const s=o.get(n);s&&(e[t]=s)}}}(c,r.stores,e),r.stores.__cache||(r.stores.__cache=Pe()),r.destinations=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t))s.config?.require?.length?e.pending.destinations[o]=s:n[o]=xe(s);return n}(r,e.destinations||{}),r.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,i=(0,R.validateStepEntry)(s,"Transformer");if(!i.ok){e.logger.warn(`Transformer ${o} invalid (${i.code}): ${i.reason}. Skipping.`);continue}const{config:a}=V(s,"before"),{config:c}=V({...s,config:a},"next"),u=Object.keys(r).length>0?{...c,env:r}:c,{cache:l}=s,d=l?{...u,cache:l}:u,f=e.logger.scope("transformer").scope(o),g={collector:e,logger:f,id:o,ingest:(0,R.createIngest)(o),config:d,env:r},p=t??(e=>{const t=s.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${o}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await(0,R.processEventMapping)(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}}),h=await p(g);void 0!==s.before&&void 0===h.config?.before&&(h.config={...h.config??{},before:s.before}),void 0!==s.next&&void 0===h.config?.next&&(h.config={...h.config??{},next:s.next}),n[o]=h}return n}(r,e.transformers||{}),r}async function Me(e){e=e||{};const t=await De(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r)=>{if("string"==typeof e&&e.startsWith("walker ")){const n=e.replace("walker ","");return o.command(n,t)}let i;if("string"==typeof e)i={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(i.data=t);else{if(!e||"object"!=typeof e)return Oe({ok:!1});i=e,t&&"object"==typeof t&&!Array.isArray(t)&&(i.data={...i.data||{},...t})}return n&&"object"==typeof n&&(i.context=n),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),o.push(i)}});var o;t.sources.elb=n,await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await ie(e,o,s);if(!t)continue;const r=s.config?.require;t.config={...t.config,init:!1,...r?{require:[...r]}:{}},n[o]=t}Object.assign(e.sources,n);for(const t of Object.keys(n)){const n=e.sources[t];let o=!1;n.init&&await(0,N.tryCatchAsync)(n.init.bind(n),n=>{if(n instanceof N.FatalError)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,re(n)&&await se(e,n,t))}return n}(t,e.sources||{});const{consent:s,user:r,globals:i,custom:a}=e;s&&await t.command("consent",s),r&&await t.command("user",r),i&&Object.assign(t.globals,i),a&&Object.assign(t.custom,a),t.config.run&&await t.command("run");let c=n.push;const u=Object.values(t.sources).filter(e=>"elb"!==e.type),l=u.find(e=>e.config.primary);return l?c=l.push:u.length>0&&(c=u[0].push),{collector:t,elb:c}}var Te=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await Me(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources||{}))if("lambda"===t.type)return t}(t.collector);if(!o)throw new Error("Lambda source not found in collector");const s={awsRequestId:`test-${Date.now()}`},r=o.push,i=await r(n,s);let a;try{a=JSON.parse(i.body||"{}")}catch{a=i.body}const c={};if(i.headers)for(const[e,t]of Object.entries(i.headers))void 0!==t&&(c[e]=String(t));return{statusCode:i.statusCode,body:a,headers:c}}}};function $e(e){return async t=>{const n={...t};if(n.body&&"string"==typeof n.body){const e=JSON.parse(n.body);e.name&&!e.event&&(n.body=JSON.stringify({...e,event:e.name,name:void 0}))}return e.push(n,{awsRequestId:"test-req"})}}var _e={};r(_e,{createTrigger:()=>Ve,env:()=>He,step:()=>Le});var He={};r(He,{push:()=>Ge,simulation:()=>Fe});var Ne=()=>{},Re={error:Ne,warn:Ne,info:Ne,debug:Ne,throw:e=>{throw"string"==typeof e?new Error(e):e},json:Ne,scope:()=>Re},Be=()=>()=>Promise.resolve({ok:!0}),Ge={get push(){return Be()},get command(){return Be()},get elb(){return Be()},logger:Re},Fe=["AWS.SQSClient"],Le={};r(Le,{decoderText:()=>Ue,malformedJson:()=>We,orderComplete:()=>Je,pageView:()=>Qe});var Qe={title:"Page view from SQS",description:"A standard SQS message body containing a walker elb event payload as JSON.",in:{MessageId:"m-1",Body:JSON.stringify({event:"page view",data:{title:"Documentation",url:"https://example.com/docs"}})},out:[["message.ack","m-1"]]},Je={title:"Order complete from SQS",description:"Order complete event flowing through the long-poll loop.",in:{MessageId:"m-2",Body:JSON.stringify({event:"order complete",data:{id:"ORD-500",total:199.99,currency:"EUR"}})},out:[["message.ack","m-2"]]},Ue={title:"Text decoder",description:'When decoder is "text", the body string flows under data.payload.',in:{MessageId:"m-3",Body:"raw text payload"},out:[["message.ack","m-3"]]},We={title:"Malformed JSON nacks",description:"Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.",in:{MessageId:"m-4",Body:"{not json"},out:[["message.nack","m-4"]]};function Ke(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var Ve=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await Me(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Ke(t))return t}(t.collector);if(!o)throw new Error("sqs source not registered in collector, ensure it is configured in sources");const s={MessageId:n.MessageId,Body:n.Body,ReceiptHandle:n.ReceiptHandle,Attributes:n.Attributes,MessageAttributes:n.MessageAttributes},r=await o.push(s),i=[];return r&&"object"==typeof r&&(r.acked&&i.push(["message.ack",n.MessageId]),r.nacked&&i.push(["message.nack",n.MessageId])),i}}};//# sourceMappingURL=dev.js.map
1
+ "use strict";var e,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,o=Object.getOwnPropertyNames,s=Object.prototype.hasOwnProperty,r=(e,n)=>{for(var o in n)t(e,o,{get:n[o],enumerable:!0})},i={};r(i,{examples:()=>O,schemas:()=>a,sqsExamples:()=>_e}),module.exports=(e=i,((e,r,i,a)=>{if(r&&"object"==typeof r||"function"==typeof r)for(let c of o(r))s.call(e,c)||c===i||t(e,c,{get:()=>r[c],enumerable:!(a=n(r,c))||a.enumerable});return e})(t({},"__esModule",{value:!0}),e));var a={};r(a,{CorsOptionsSchema:()=>g,CorsOrigin:()=>f,HttpMethod:()=>d,SettingsSchema:()=>p,settings:()=>h,sqsSettings:()=>q,sqsSetup:()=>S});var c=require("@walkeros/core/dev"),u=require("@walkeros/core/dev"),l=require("@walkeros/core/dev"),d=l.z.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),f=l.z.union([l.z.string(),l.z.array(l.z.string()),l.z.literal("*")]),g=l.z.object({origin:f.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:l.z.array(d).describe("Allowed HTTP methods").optional(),headers:l.z.array(l.z.string()).describe("Allowed request headers").optional(),credentials:l.z.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:l.z.number().int().positive().describe("Preflight cache duration in seconds").optional()}),p=u.z.object({cors:u.z.union([u.z.boolean(),g]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:u.z.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:u.z.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),healthPath:u.z.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),h=(0,c.zodToSchema)(p),m=require("@walkeros/core/dev"),y=require("@walkeros/core/dev"),b=y.z.object({queueName:y.z.string().min(1).describe("SQS queue short name (like walkeros-events). Required for both setup and runtime poll."),region:y.z.string().describe("AWS region (like eu-central-1). Default: eu-central-1.").optional(),queueUrl:y.z.string().url().describe("Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.").optional(),client:y.z.any().describe("Pre-configured AWS SQSClient instance. Bypasses construction when supplied.").optional(),config:y.z.any().describe("AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).").optional(),decoder:y.z.enum(["json","text","raw"]).describe("Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer.").optional(),maxMessages:y.z.number().int().min(1).max(10).describe("SQS receive batch size. Cap 10. Default: 10.").optional(),waitTimeSeconds:y.z.number().int().min(0).max(20).describe("Long-poll duration in seconds. Cap 20. Default: 20.").optional(),visibilityTimeout:y.z.number().int().nonnegative().describe("Per-receive visibility timeout override. Default: queue-configured value.").optional(),shutdownTimeoutMs:y.z.number().int().positive().describe("Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.").optional(),onPushError:y.z.enum(["nack","ack"]).describe("Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it.").optional()}),v=require("@walkeros/core/dev"),w=v.z.record(v.z.string(),v.z.string()),k=v.z.object({region:v.z.string().min(1).describe("AWS region.").optional(),fifoQueue:v.z.boolean().describe("FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.").optional(),visibilityTimeoutSeconds:v.z.number().int().nonnegative().describe("Visibility timeout in seconds. Default: 30.").optional(),messageRetentionSeconds:v.z.number().int().positive().describe("Message retention period in seconds. Default: 345600 (4 days).").optional(),maximumMessageSize:v.z.number().int().min(1024).max(262144).describe("Max message size in bytes. Default: 262144 (256 KB).").optional(),kmsMasterKeyId:v.z.string().describe("KMS key alias or ID for at-rest encryption.").optional(),deadLetterQueue:v.z.object({arn:v.z.string().describe("ARN of an existing DLQ. Mutually exclusive with create: true.").optional(),create:v.z.boolean().describe("Create a sibling DLQ named <queueName>-dlq. Default: false.").optional(),maxReceiveCount:v.z.number().int().min(1).max(1e3).describe("Max receive count before message goes to DLQ. Default: 5.").optional()}).describe("Optional dead-letter queue.").optional(),tags:w.describe("Tags applied to the queue (and inherited by an auto-created DLQ).").optional(),subscribeToSnsTopic:v.z.object({topicArn:v.z.string().min(1).describe("Topic ARN to subscribe to."),rawMessageDelivery:v.z.boolean().describe("Deliver SNS messages without the SNS envelope.").optional(),filterPolicy:v.z.record(v.z.string(),v.z.unknown()).describe("SNS filter policy applied at subscription level.").optional()}).describe("Optional SNS topic subscription. Creates the subscription and the matching queue policy.").optional()}),q=(0,m.zodToSchema)(b),S=(0,m.zodToSchema)(k),O={};r(O,{createTrigger:()=>Te,env:()=>x,step:()=>P,trigger:()=>$e});var x={};r(x,{push:()=>z});var C=()=>()=>Promise.resolve({ok:!0}),A=()=>{},j={error:A,warn:A,info:A,debug:A,throw:e=>{throw"string"==typeof e?new Error(e):e},json:A,scope:()=>j},z={get push(){return C()},get command(){return C()},get elb(){return C()},logger:j},P={};r(P,{apiGatewayV1Post:()=>E,lambdaGet:()=>D,lambdaPost:()=>I});var I={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"}}]]},E={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"}}]]},D={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"}'}]]},M=require("@walkeros/core"),T=require("@walkeros/core"),$=require("@walkeros/core"),_=require("@walkeros/core"),H=require("@walkeros/core"),N=require("@walkeros/core"),R=require("@walkeros/core"),B=require("@walkeros/core"),G=require("@walkeros/core"),F=require("@walkeros/core"),L=require("@walkeros/core"),Q=require("@walkeros/core"),J=require("@walkeros/core"),U={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 W(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function K(e){const t={};for(const[n,o]of Object.entries(e)){const e=o.config?.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?t[n]={next:e}:t[n]={}}return t}function V(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}function Y(e,t={}){if(!e)return[];if(Array.isArray(e))return e;const n=[],o=new Set;let s=e;for(;s&&t[s]&&!o.has(s);){o.add(s),n.push(s);const e=t[s].next;if(Array.isArray(e)){n.push(...e);break}s=e}return n}async function X(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:n,ingest:(0,R.createIngest)(n),config:t.config,env:ne(t.config.env)};s.debug("init");const i=await(0,R.useHooks)(t.init,"TransformerInit",e.hooks,e.logger)(r);if(!1===i)return!1;t.config={...i||t.config,env:i?.env||t.config.env,init:!0},s.debug("init done")}return!0}async function Z(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...ne(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await(0,R.useHooks)(t.push,"TransformerPush",e.hooks,e.logger)(o,c);return a.debug("push done"),u}function ee(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:(0,R.createIngest)(t)}async function te(e,t,n,o,s,r,i){s||(s=(0,R.createIngest)(n[0]??"chain")),i&&s._meta&&(s._meta.chainPath=i);let a=o,c=r;for(const o of n){const r=t[o];if(!r){e.logger.warn(`Transformer not found: ${o}`);continue}if(s&&s._meta&&s._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o}`),{event:null,respond:c};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await(0,R.tryCatchAsync)(X,t=>{if(t instanceof R.FatalError)throw t;return e.status.failed++,e.logger.scope(`transformer:${r.type||"unknown"}`).error("transformer init failed",{transformer:o,error:t}),!1})(e,r,o))return{event:null,respond:c};if(i&&void 0!==r.config?.chainMocks?.[i]){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),a=t;continue}if(void 0!==r.config?.mock){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),a=r.config.mock;continue}if(r.config?.disabled)continue;const u=r.config?.cache,l=u?(0,R.compileCache)(u):void 0,d=l?W(l,e):void 0;let f;if(l&&d){const e=(0,R.buildCacheContext)(s,a),t=await(0,R.checkCache)(l,d,e);if("HIT"===t?.status&&t.value){if(a=t.value,l.stop)return{event:a,respond:c,stopped:!0};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=(0,R.getNextSteps)(g,(0,R.buildCacheContext)(s,a));if(1===n.length){const o=Y(n[0],K(t));if(o.length>0){const n=await te(e,t,o,a,s,c,i);if(null===n.event)return{event:null,respond:n.respond??c};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:n.respond??c,stopped:!0};n.respond&&(c=n.respond),a=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(n,K(t)),a,ee(s,n),void 0,i)))}const p=await(0,R.tryCatchAsync)(Z,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,a,s,c);if(!1===p)return{event:null,respond:c};if(Array.isArray(p)){const r=n.slice(n.indexOf(o)+1),u=await Promise.all(p.map(async n=>{const o=n.event||a,u=ee(s,"unknown");if(n.next){const s=(0,R.getNextSteps)(n.next,(0,R.buildCacheContext)(u,o));if(0===s.length)return{event:o,respond:c};if(1===s.length){const n=Y(s[0],K(t));return n.length>0?te(e,t,n,o,u,c,i):{event:o,respond:c}}return(await Promise.all(s.map(n=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(n,K(t)),o,ee(u,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?te(e,t,r,o,u,c,i):{event:o,respond:c}}));let l=c;const d=[];for(const e of u.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const t=e;if(t.respond&&(l=t.respond),null===t.event)continue;Array.isArray(t.event)?d.push(...t.event):d.push(t.event)}else d.push(e);return 0===d.length?{event:null,respond:l}:1===d.length?{event:d[0],respond:l}:{event:d,respond:l}}if(p&&"object"==typeof p){const{event:n,respond:o,next:r}=p;if(o&&(c=o),void 0!==r){const o=(0,R.getNextSteps)(r,(0,R.buildCacheContext)(s,a));if(0===o.length){n&&(a=n);continue}if(1===o.length){const u=Y(o[0],K(t));return u.length>0?te(e,t,u,n||a,s,c,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:c})}return await Promise.all(o.map(o=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${o} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(o,K(t)),n||a,ee(s,o),void 0,i))),{event:null,respond:void 0}}n&&(a=n)}f&&d&&(0,R.storeCache)(d,f.key,a,f.ttl);const h=r.config.next,m="string"==typeof h||Array.isArray(h)&&h.every(e=>"string"==typeof e),y=void 0!==h&&!m;if((!p||"object"==typeof p&&!p.next)&&y){const n=(0,R.getNextSteps)(r.config.next,(0,R.buildCacheContext)(s,a));if(1===n.length){const o=Y(n[0],K(t));return o.length>0?te(e,t,o,a,s,c,i):{event:a,respond:c}}return n.length>1?(await Promise.all(n.map(n=>(0,R.tryCatchAsync)(te,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Y(n,K(t)),a,ee(s,n),void 0,i))),{event:null,respond:void 0}):{event:a,respond:c}}}return{event:a,respond:c}}function ne(e){return e&&(0,R.isObject)(e)?e:{}}function oe(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function se(e,t,n){if(!t.on||!t.queueOn?.length)return;const o=t.queueOn;t.queueOn=[];const s=n||t.config?.id||"unknown";for(const{type:n,data:r}of o)await(0,N.tryCatchAsync)(t.on,t=>{if(t instanceof N.FatalError)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s,type:n,error:t})})(n,r)}function re(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ie(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:u}=n,l=u,d=l?(0,N.compileCache)({...l,stop:l.stop??!0}):void 0,f=oe(a)?Y(a,K(e.transformers)):void 0,g=oe(c)?Y(c,K(e.transformers)):void 0,p=r.push,h=p??e.push,m=Boolean(p),y=async(n,o,r)=>{let i;const u=g??(void 0!==c?(()=>{const t=(0,N.getNextSteps)(c,(0,N.buildCacheContext)(r.ingest));return 0===t.length?[]:Y(1===t.length?t[0]:t,K(e.transformers))})():[]);let l=[n];if(u.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await te(e,e.transformers,u,n,r.ingest,r.respond,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(r.respond=o.respond),{ok:!0};o.respond&&(r.respond=o.respond),l=Array.isArray(o.event)?o.event:[o.event]}if(d){const t=W(d,e);if(t){const n=(0,N.buildCacheContext)(r.ingest),o=await(0,N.checkCache)(d,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&d.stop){let t=o.value;return o.rule.update&&(t=await(0,N.applyUpdate)(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),r.respond?.(t),{ok:!0}}if("MISS"===o.status&&d.stop&&r.respond){const s=r.respond,a=o.rule.update,c={...n,cache:{status:"MISS"}},u=o.key,l=o.rule.ttl,d=n=>{(0,N.storeCache)(t,u,n,l),a?i=(async()=>{const t=await(0,N.applyUpdate)(n,a,c,e);s(t)})():s(n)};r.respond=d}"MISS"!==o.status||d.stop||(0,N.storeCache)(t,o.key,!0,o.rule.ttl)}}}const p=f?{kind:"single",preChain:f}:void 0!==a?(()=>{const t=(0,N.getNextSteps)(a,(0,N.buildCacheContext)(r.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:Y(t[0],K(e.transformers))}:{kind:"many",branches:t.map(t=>Y(t,K(e.transformers)))}})():{kind:"single",preChain:[]};let y={ok:!0};for(const n of l)"many"===p.kind?(await Promise.all(p.branches.map((i,a)=>(0,N.tryCatchAsync)(async()=>m?h(n):h(n,{...o,id:t,ingest:ee(r.ingest,`${t}.${a}`),respond:void 0,mapping:s,preChain:i}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),y={ok:!0}):y=m?await h(n):await h(n,{...o,id:t,ingest:r.ingest,respond:r.respond,mapping:s,preChain:p.preChain});return i&&await i,y},b=async n=>{const o=(0,N.createIngest)(t);if(!s.ingest||void 0===n)return o;const r=await(0,N.getMappingValue)(n,s.ingest,{collector:e});return{...o,...r,_meta:o._meta}},v=e.logger.scope("source").scope(t),w={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:v,...r,push:async(e,n={})=>{const o={ingest:(0,N.createIngest)(t),respond:void 0};return y(e,n,o)}},k={collector:e,logger:v,id:t,config:s,env:w,withScope:async(e,t,n)=>{const o={ingest:await b(e),respond:t};return n({...w,push:(e,t={})=>y(e,t,o),ingest:o.ingest,respond:o.respond})}},q=await(0,N.tryCatchAsync)(o,n=>{if(n instanceof N.FatalError)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(k);if(!q)return;const S=q.type||"unknown",O=e.logger.scope(S).scope(t);return w.logger=O,i&&(q.config={...q.config,primary:i}),q}function ae(e,t,n,o){if(n instanceof _.FatalError)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}function ce(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function ue(e,t,n,o,s){if(!t.on)return;const r=t.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:s,env:Ce(t.env,t.config.env)};(0,H.tryCatch)(t.on,t=>ae(e,"destination",t,{destId:n,type:o}))(o,a)}function le(e,t,n,o){let s;switch(t){case U.Consent:s=o||e.consent;break;case U.Session:s=e.session;break;case U.User:s=o||e.user;break;case U.Custom:s=o||e.custom;break;case U.Globals:s=o||e.globals;break;case U.Config:s=o||e.config;break;case U.Ready:case U.Run:default:s=void 0}if(n.length)switch(t){case U.Consent:!function(e,t,n){const o=n||e.consent,s=ce(e,U.Consent);t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{(0,H.tryCatch)(t[n],t=>ae(e,"consent",t,{key:n}))(o,s)})})}(e,n,o);break;case U.Ready:!function(e,t){if(!e.allowed)return;const n=ce(e,U.Ready);t.forEach(t=>{(0,H.tryCatch)(t,t=>ae(e,"ready",t))(void 0,n)})}(e,n);break;case U.Run:!function(e,t){if(!e.allowed)return;const n=ce(e,U.Run);t.forEach(t=>{(0,H.tryCatch)(t,t=>ae(e,"run",t))(void 0,n)})}(e,n);break;case U.Session:!function(e,t){if(!e.session)return;const n=ce(e,U.Session);t.forEach(t=>{(0,H.tryCatch)(t,t=>ae(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=ce(e,t);n.forEach(n=>{"function"==typeof n&&(0,H.tryCatch)(n,n=>ae(e,"generic",n,{type:t}))(s,o)});break}}}function de(e,t,n,o){if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(n.onOverflow??"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const s=[];for(;e.length>=n.max;)s.push(e.shift());return e.push(t),s.length>0&&o&&o(s),{appended:!0,dropped:s.length}}var fe=new WeakMap;function ge(e,t,n,o){fe.get(e)||(fe.set(e,!0),t.warn(n,o))}function pe(e){fe.delete(e)}var he=Object.freeze({batched:!0});function me(e){return e===he}function ye(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function be(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function ve(e,t,n,o){e.dropped[t]||(e.dropped[t]={});const s=e.dropped[t];return s[n]=(s[n]??0)+o,s[n]}function we(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Y(e,t);if("string"==typeof e)return Y(e,t);const o=(0,$.getNextSteps)(e,(0,$.buildCacheContext)(n));return 0===o.length?[]:1===o.length?Y(o[0],t):Y(o,t)}async function ke(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return Oe({ok:!1});if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=de(e.queue,t,{max:n});if(o.dropped>0){const t=ve(e.status,(0,$.stepId)("collector"),"queue",o.dropped);ge(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&pe(e.queue);e.status.in++}o||(o=e.destinations);const c=e.transformers?K(e.transformers):{},u=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let u=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&u.push((0,$.clone)(t));const l=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:(0,$.createIngest)("unknown");if(!u.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!u.length&&s.queueOn?.length){let t=!1;try{t=await qe(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const d=[],f=u.filter(e=>{const t=(0,$.getGrantedConsent)(s.config.consent,r,e.consent);return!t||(e.consent=t,d.push(e),!1)});if(f.length>0){const t=s.queuePush,n=s.config.id||o,r={max:s.config.queueMax??1e3};let i=0;for(const e of f)i+=de(t,e,r).dropped;if(i>0){be(e,n);const o=ve(e.status,(0,$.stepId)("destination",n),"queue",i);ge(t,e.logger.scope(s.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n,cap:r.max,droppedCount:o})}else t.length<r.max&&pe(t)}if(!d.length)return{id:o,destination:s,queue:u};let g,p,h=!1;try{h=await qe(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!h)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const m=we(s.config.before,c,l),y=s.config.next,b=s.config?.cache,v=b?(0,$.compileCache)(b):void 0,w=v?W(v,e):void 0;let k=0,q=0;return await Promise.all(d.map(async t=>{let r;if(t.globals=(0,$.assign)(i,t.globals),t.user=(0,$.assign)(a,t.user),v?.stop&&w){const e=(0,$.buildCacheContext)(l,t),n=await(0,$.checkCache)(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let u=t,d=n.respond;if(m.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await te(e,e.transformers,m,t,l,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(d=s.respond),u=Array.isArray(s.event)?s.event[0]:s.event}if(v&&!v.stop&&w){const e=(0,$.buildCacheContext)(l,u),n=await(0,$.checkCache)(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const f=Date.now();let h=!1;const b=await(0,$.tryCatchAsync)(Se,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:u.name}),g=t,h=!0;const r=s.dlq,i=s.config.id||o,a={max:s.config.dlqMax??100},c=de(r,[u,t],a);if(c.dropped>0){be(e,i);const t=ve(e.status,(0,$.stepId)("destination",i),"dlq",c.dropped);ge(r,e.logger.scope(s.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:i,cap:a.max,droppedCount:t})}else r.length<a.max&&pe(r)})(e,s,o,u,l,d);if(k+=Date.now()-f,r&&w&&void 0===s.config.mock&&(0,$.storeCache)(w,r.key,b??!0,r.ttl),void 0===b||me(b)||(p=b),me(b)&&q++,!h&&y){void 0!==b&&(l._response=b);const t=we(y,c,l);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await te(e,e.transformers,t,u,l,d,`destination.${o}.next`);n.respond&&(d=n.respond)}}return t})),{id:o,destination:s,error:g,response:p,totalDuration:k,batchedCount:q,allowedCount:d.length}})),l={},d={},f={};for(const t of u){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};be(e,t.id);const s=e.status.destinations[t.id],r=Date.now();if(s.queuePushSize=n.queuePush?.length??0,s.dlqSize=n.dlq?.length??0,t.error)o.error=t.error,f[t.id]=o,s.failed++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)d[t.id]=o;else{const n=t.batchedCount??0,i=t.allowedCount??0;(Math.max(0,i-n)>0||0===i)&&(l[t.id]=o,s.count++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.out++)}}return Oe({event:t,...Object.keys(l).length&&{done:l},...Object.keys(d).length&&{queued:d},...Object.keys(f).length&&{failed:f}})}async function qe(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(o),r={collector:e,logger:s,id:n,config:t.config,env:Ce(t.env,t.config.env)};s.debug("init");const i=await(0,$.useHooks)(t.init,"DestinationInit",e.hooks,e.logger)(r);if(!1===i)return i;if(t.config={...i||t.config,init:!0},t.queueOn?.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)ue(e,t,n,s,r)}s.debug("init done")}return!0}async function Se(e,t,n,o,s,r){const{config:i}=t,a=await(0,$.processEventMapping)(o,i,e);if(a.ignore)return!1;const c=t.type||"unknown",u=e.logger.scope(c),l={collector:e,logger:u,id:n,config:i,data:a.data,rule:a.mapping,ingest:s,env:{...Ce(t.env,i.env),...r?{respond:r}:{}}};if(void 0!==i.mock)return u.debug("mock",{event:a.event.name}),i.mock;const d=a.mapping,f=a.mappingKey||"* *";if(d?.batch&&t.pushBatch&&void 0===i.mock){if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,entries:[],events:[],data:[]},s=ye(d.batch),r=ye(i.batch),a=s.wait??r.wait??3e4,c=s.size??r.size??1e3,l=s.age??r.age??3e4,g=Ce(t.env,i.env),p=(0,$.debounce)(async()=>{const o=t.batches[f].batched;if(0===o.entries.length)return;const s={key:o.key,entries:o.entries,events:o.events,data:o.data};o.entries=[],o.events=[],o.data=[];const r=s.entries[0],a={collector:e,logger:u,id:n,config:i,data:void 0,rule:r.rule,ingest:r.ingest,env:{...g,...r.respond?{respond:r.respond}:{}}};u.debug("push batch",{events:s.entries.length});const c=t.config.id||n,l=be(e,c);let d=!0;await(0,$.tryCatchAsync)((0,$.useHooks)(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),n=>{d=!1;const o=t.dlq=t.dlq||[],r={max:t.config.dlqMax??100};let i=0;for(const e of s.entries)i+=de(o,[e.event,n],r).dropped;if(i>0){const t=ve(e.status,(0,$.stepId)("destination",c),"dlq",i);ge(o,u,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:r.max,droppedCount:t})}else o.length<r.max&&pe(o);l.failed+=s.entries.length,l.dlqSize=o.length,e.status.failed+=s.entries.length,u.error("Push batch failed",{error:n instanceof Error?n.message:String(n),entries:s.entries.length})})(s,a),u.debug("push batch done"),l.inFlightBatch=Math.max(0,(l.inFlightBatch??0)-s.entries.length),d&&(l.count+=s.entries.length,l.lastAt=Date.now(),e.status.out+=s.entries.length)},{wait:a,size:c,age:l});t.batches[f]={batched:o,batchFn:()=>{p()},flush:async()=>{await p.flush()}}}const o=t.batches[f];o.batched.entries.push({event:a.event,ingest:s,respond:r,rule:d,data:a.data}),o.batched.events.push(a.event),(0,$.isDefined)(a.data)&&o.batched.data.push(a.data);const c=t.config.id||n,l=be(e,c);return l.inFlightBatch=(l.inFlightBatch??0)+1,o.batchFn(),he}{u.debug("push",{event:a.event.name});const n=await(0,$.useHooks)(t.push,"DestinationPush",e.hooks,e.logger)(a.event,l);return u.debug("push done"),n}}function Oe(e){return{ok:!e?.failed,...e}}function xe(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=V(e,"before"),{config:i}=V({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=Ce(t.env,o);return{...t,config:a,env:c}}function Ce(e,t){return e||t?t?e&&(0,$.isObject)(e)&&(0,$.isObject)(t)?{...e,...t}:t:e:{}}async function Ae(e,t,n){const o=Object.entries(e).map(async([e,o])=>{const s=o.destroy;if(!s)return;const r=o.type||"unknown",i=n.scope(r),a={id:e,config:o.config,env:o.env??{},logger:i};try{await Promise.race([s(a),new Promise((n,o)=>setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3))])}catch(n){i.error(`${t} '${e}' destroy failed: ${n}`)}});await Promise.allSettled(o)}async function je(e,t,n){let o,s,r=!1;switch(t){case U.Config:(0,G.isObject)(n)&&((0,B.assign)(e.config,n,{shallow:!1}),s=n,r=!0);break;case U.Consent:if((0,G.isObject)(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=(0,M.assign)(e.consent,n),{update:n}}(e,n);s=t,r=!0}break;case U.Custom:(0,G.isObject)(n)&&(e.custom=(0,B.assign)(e.custom,n),s=n,r=!0);break;case U.Destination:(0,G.isObject)(n)&&"code"in n&&(0,G.isObject)(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:s={},before:r,next:i,cache:a}=t;if(!(0,$.isFunction)(n.push))return Oe({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c=o||{init:!1};let u=r?{...c,before:r}:{...c};i&&(u={...u,next:i}),a&&(u={...u,cache:a});const l={...n,config:u,env:Ce(n.env,s)};let d=l.config.id;if(!d)do{d=(0,$.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d]);return e.destinations[d]=l,!1!==l.config.queue&&(l.queuePush=[...e.queue]),ke(e,void 0,{},{[d]:l})}(e,n));break;case U.Globals:(0,G.isObject)(n)&&(e.globals=(0,B.assign)(e.globals,n),s=n,r=!0);break;case U.Hook:if((0,G.isObject)(n)&&(0,B.isString)(n.name)&&(0,B.isFunction)(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case U.On:if((0,G.isObject)(n)&&(0,B.isString)(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=(0,_.isArray)(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,le(e,t,r)}(e,t,o)}break;case U.Ready:r=!0;break;case U.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=(0,B.assign)(e.consent,t.consent)),t.user&&(e.user=(0,B.assign)(e.user,t.user)),t.globals&&(e.globals=(0,B.assign)(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=(0,B.assign)(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ke(e)}(e,n),r=!0;break;case U.Session:r=!0;break;case U.Shutdown:await async function(e){const t=e.logger;await Ae(e.sources,"source",t),await Ae(e.destinations,"destination",t),await Ae(e.transformers,"transformer",t),await Ae(e.stores,"store",t)}(e);break;case U.User:(0,G.isObject)(n)&&((0,B.assign)(e.user,n,{shallow:!1}),s=n,r=!0)}return r&&(await async function(e,t,n,o){let s,r=n||[];switch(n||(r=e.on[t]||[]),t){case U.Consent:s=o||e.consent;break;case U.Session:s=e.session;break;case U.User:s=o||e.user;break;case U.Custom:s=o||e.custom;break;case U.Globals:s=o||e.globals;break;case U.Config:s=o||e.config;break;case U.Ready:case U.Run:default:s=void 0}let i=!1;for(const[n,o]of Object.entries(e.sources)){if(o.config.require?.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(re(o)?!1===await(0,H.tryCatchAsync)(o.on,o=>ae(e,"source",o,{sourceId:n,type:t}))(t,s)&&(i=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:s})))}Object.entries(e.destinations).forEach(([n,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:t,data:s});ue(e,o,n,t,s)}});for(const[t,n]of Object.entries(e.sources))re(n)&&n.queueOn?.length&&await se(e,n,t);return Object.keys(e.pending.destinations).length>0&&await async function(e,t){for(const[n,o]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const s=o.config?.require;if(!s)continue;const r=s.indexOf(t);if(-1===r)continue;if(s.splice(r,1),s.length>0)continue;delete e.pending.destinations[n];const i=xe(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}(e,t),le(e,t,r,o),!i}(e,t,void 0,s),o=await ke(e)),o||Oe({ok:!0})}function ze(e,t){if(!t.name)throw new Error("Event name is required");const[n,o]=t.name.split(" ");if(!n||!o)throw new Error("Event name is invalid");const{timestamp:s=Date.now(),name:r=`${n} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:u={},user:l=e.user,nested:d=[],consent:f=e.consent,id:g=(0,B.getSpanId)(),trigger:p="",entity:h=n,action:m=o,timing:y=0,source:b={type:"collector",schema:"4"}}=t;return{name:r,data:i,context:a,globals:c,custom:u,user:l,nested:d,consent:f,id:g,trigger:p,entity:h,action:m,timestamp:s,timing:y,source:b}}function Pe(e={}){const t=e.maxEntries??1e4,n=e.lowWaterMark??.8,o=e.sweepIntervalMs??6e4,s=Math.floor(t*n),r=new Map,i={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a;return o>0&&(a=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of r)void 0!==o.expires&&o.expires<=e&&(r.delete(n),t++);i.evictions_ttl+=t},o),a&&"function"==typeof a.unref&&a.unref()),{type:"memory",config:{},get(e){const t=r.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(r.delete(e),i.evictions_ttl++,void i.misses++):(r.delete(e),r.set(e,t),i.hits++,t.value);i.misses++},set(e,n,o){const a=!r.has(e);a||r.delete(e),r.set(e,{value:n,expires:void 0!==o?Date.now()+o:void 0}),i.writes++,a&&i.populates++,r.size>t&&function(){if(r.size<=t)return;const e=r.size-s;let n=0;for(const t of r.keys()){if(n>=e)break;r.delete(t),n++}i.evictions_entries+=n}()},delete(e){r.delete(e)&&i.deletes++},get counters(){return{...i}},destroy(){void 0!==a&&(clearInterval(a),a=void 0),r.clear()}}}function Ie(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i}=t,a={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c=n.rules.map(e=>({match:e.match?(0,J.compileMatcher)(e.match):()=>!0,ttl:e.ttl})),u=e=>`${s}:${e}`;function l(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return c.find(e=>e.match(n))}const d=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a}},async get(t){const n=u(t),s=await o.get(n);if(void 0!==s)return a.hits++,s;const r=d.get(n);if(r)return a.inflight_dedups++,r;a.misses++;const i=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=l(t,s);if(r)try{await o.set(n,s,1e3*r.ttl),a.populates++}catch(e){f("set",t,e)}return s}finally{d.delete(n)}})();return d.set(n,i),i},async set(t,n,s){a.writes++,await e.set(t,n,s);const r=l(t,n);if(r)try{await o.set(u(t),n,1e3*r.ttl)}catch(e){f("set",t,e)}},async delete(t){a.deletes++,await e.delete(t);try{await o.delete(u(t))}catch(e){f("delete",t,e)}}};function f(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,{error:n}):console.warn(o,n)}}function Ee(e,t){const n=t.get,o=t.set,s=t.delete;t.get=(0,Q.useHooks)(n,"StoreGet",e.hooks,e.logger),t.set=(0,Q.useHooks)(o,"StoreSet",e.hooks,e.logger),t.delete=(0,Q.useHooks)(s,"StoreDelete",e.hooks,e.logger)}async function De(e){const t=(0,T.assign)({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=(0,T.createLogger)(n),s={...t.globalsStatic,...e.globals},r={allowed:!1,config:t,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s,hooks:e.hooks||{},logger:o,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 i,a;r.push=function(e,t){return(0,F.useHooks)(async(n,o={})=>await(0,F.tryCatchAsync)(async()=>{const s=Date.now(),{id:r,ingest:i,respond:a,mapping:c,preChain:u,include:l,exclude:d}=o;let f=a,g=n;const p=l||d?function(e,t,n){let o=e;return t&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>t.includes(e)))),n&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>!n.includes(e)))),o}(e.destinations,l,d):void 0,h=i??(0,F.createIngest)(r||"unknown");if(c){const t=await(0,F.processEventMapping)(g,c,e);if(t.ignore)return Oe({ok:!0});if(c.consent&&!(0,F.getGrantedConsent)(c.consent,e.consent,t.event.consent))return Oe({ok:!0});g=t.event}if(u?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await te(e,e.transformers,u,g,h,f,r?`source.${r}.next`:void 0);if(null===n.event)return Oe({ok:!0});if(n.stopped)return n.respond&&(f=n.respond),Oe({ok:!0});if(n.respond&&(f=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=ze(e,o);return ke(e,s,{id:r,ingest:h,respond:f},p)}));if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count+=n.event.length,t.lastAt=Date.now(),t.duration+=Date.now()-s}return o[0]??Oe({ok:!0})}g=n.event}const m=t(g),y=ze(e,m),b=await ke(e,y,{id:r,ingest:h,respond:f},p);if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-s}return b},t=>{if(t instanceof F.FatalError)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),Oe({ok:!1})})(),"Push",e.hooks,e.logger)}(r,e=>({timing:Math.round((Date.now()-r.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.0"},...e})),r.command=(i=r,a=je,(0,L.useHooks)(async(e,t,n)=>await(0,L.tryCatchAsync)(async()=>await a(i,e,t,n),n=>{if(n instanceof L.FatalError)throw n;return i.status.failed++,i.logger.error("command failed",{command:e,data:t,error:n}),Oe({ok:!1})})(),"Command",i.hooks,i.logger));const c=e.stores||{};return r.stores=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(o),c={collector:e,logger:a,id:o,config:r,env:i},u=await t(c);n[o]=u}const o=t,s=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){const i=t[r];if("BLACK"===i)return;if("GRAY"===i){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const a=e[r].cache?.store;if(void 0!==a){if(!(a in e))throw new Error(`Store "${r}" cache.store references "${a}", which is not declared in flow.stores`);s(a)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(o);for(const t of s){const s=o[t].cache;if(!s)continue;let r,i;void 0!==s.store?(r=n[s.store],i=s.store):(n.__cache||(n.__cache=Pe()),r=n.__cache,i="__cache");const a=s.namespace??t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${a}:" via ${i}`),n[t]=Ie(n[t],{storeId:t,cacheConfig:s,cacheStore:r,namespace:a,logger:e.logger.scope("store-cache").scope(t)})}for(const[t,o]of Object.entries(n))"__cache"!==t&&Ee(e,o);return n}(r,c),function(e,t,n){const o=new Map;for(const[n,s]of Object.entries(e))t[n]&&o.set(s,t[n]);if(0!==o.size)for(const e of[n.transformers,n.destinations,n.sources])if(e)for(const t of Object.values(e))s(t.env);function s(e){if(e)for(const[t,n]of Object.entries(e))if("object"==typeof n&&null!==n){const s=o.get(n);s&&(e[t]=s)}}}(c,r.stores,e),r.stores.__cache||(r.stores.__cache=Pe()),r.destinations=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t))s.config?.require?.length?e.pending.destinations[o]=s:n[o]=xe(s);return n}(r,e.destinations||{}),r.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,i=(0,R.validateStepEntry)(s,"Transformer");if(!i.ok){e.logger.warn(`Transformer ${o} invalid (${i.code}): ${i.reason}. Skipping.`);continue}const{config:a}=V(s,"before"),{config:c}=V({...s,config:a},"next"),u=Object.keys(r).length>0?{...c,env:r}:c,{cache:l}=s,d=l?{...u,cache:l}:u,f=e.logger.scope("transformer").scope(o),g={collector:e,logger:f,id:o,ingest:(0,R.createIngest)(o),config:d,env:r},p=t??(e=>{const t=s.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${o}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await(0,R.processEventMapping)(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}}),h=await p(g);void 0!==s.before&&void 0===h.config?.before&&(h.config={...h.config??{},before:s.before}),void 0!==s.next&&void 0===h.config?.next&&(h.config={...h.config??{},next:s.next}),n[o]=h}return n}(r,e.transformers||{}),r}async function Me(e){e=e||{};const t=await De(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r)=>{if("string"==typeof e&&e.startsWith("walker ")){const n=e.replace("walker ","");return o.command(n,t)}let i;if("string"==typeof e)i={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(i.data=t);else{if(!e||"object"!=typeof e)return Oe({ok:!1});i=e,t&&"object"==typeof t&&!Array.isArray(t)&&(i.data={...i.data||{},...t})}return n&&"object"==typeof n&&(i.context=n),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),o.push(i)}});var o;t.sources.elb=n,await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await ie(e,o,s);if(!t)continue;const r=s.config?.require;t.config={...t.config,init:!1,...r?{require:[...r]}:{}},n[o]=t}Object.assign(e.sources,n);for(const t of Object.keys(n)){const n=e.sources[t];let o=!1;n.init&&await(0,N.tryCatchAsync)(n.init.bind(n),n=>{if(n instanceof N.FatalError)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,re(n)&&await se(e,n,t))}return n}(t,e.sources||{});const{consent:s,user:r,globals:i,custom:a}=e;s&&await t.command("consent",s),r&&await t.command("user",r),i&&Object.assign(t.globals,i),a&&Object.assign(t.custom,a),t.config.run&&await t.command("run");let c=n.push;const u=Object.values(t.sources).filter(e=>"elb"!==e.type),l=u.find(e=>e.config.primary);return l?c=l.push:u.length>0&&(c=u[0].push),{collector:t,elb:c}}var Te=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await Me(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources||{}))if("lambda"===t.type)return t}(t.collector);if(!o)throw new Error("Lambda source not found in collector");const s={awsRequestId:`test-${Date.now()}`},r=o.push,i=await r(n,s);let a;try{a=JSON.parse(i.body||"{}")}catch{a=i.body}const c={};if(i.headers)for(const[e,t]of Object.entries(i.headers))void 0!==t&&(c[e]=String(t));return{statusCode:i.statusCode,body:a,headers:c}}}};function $e(e){return async t=>{const n={...t};if(n.body&&"string"==typeof n.body){const e=JSON.parse(n.body);e.name&&!e.event&&(n.body=JSON.stringify({...e,event:e.name,name:void 0}))}return e.push(n,{awsRequestId:"test-req"})}}var _e={};r(_e,{createTrigger:()=>Ve,env:()=>He,step:()=>Le});var He={};r(He,{push:()=>Ge,simulation:()=>Fe});var Ne=()=>{},Re={error:Ne,warn:Ne,info:Ne,debug:Ne,throw:e=>{throw"string"==typeof e?new Error(e):e},json:Ne,scope:()=>Re},Be=()=>()=>Promise.resolve({ok:!0}),Ge={get push(){return Be()},get command(){return Be()},get elb(){return Be()},logger:Re},Fe=["AWS.SQSClient"],Le={};r(Le,{decoderText:()=>Ue,malformedJson:()=>We,orderComplete:()=>Je,pageView:()=>Qe});var Qe={title:"Page view from SQS",description:"A standard SQS message body containing a walker elb event payload as JSON.",in:{MessageId:"m-1",Body:JSON.stringify({event:"page view",data:{title:"Documentation",url:"https://example.com/docs"}})},out:[["message.ack","m-1"]]},Je={title:"Order complete from SQS",description:"Order complete event flowing through the long-poll loop.",in:{MessageId:"m-2",Body:JSON.stringify({event:"order complete",data:{id:"ORD-500",total:199.99,currency:"EUR"}})},out:[["message.ack","m-2"]]},Ue={title:"Text decoder",description:'When decoder is "text", the body string flows under data.payload.',in:{MessageId:"m-3",Body:"raw text payload"},out:[["message.ack","m-3"]]},We={title:"Malformed JSON nacks",description:"Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.",in:{MessageId:"m-4",Body:"{not json"},out:[["message.nack","m-4"]]};function Ke(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var Ve=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await Me(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Ke(t))return t}(t.collector);if(!o)throw new Error("sqs source not registered in collector, ensure it is configured in sources");const s={MessageId:n.MessageId,Body:n.Body,ReceiptHandle:n.ReceiptHandle,Attributes:n.Attributes,MessageAttributes:n.MessageAttributes},r=await o.push(s),i=[];return r&&"object"==typeof r&&(r.acked&&i.push(["message.ack",n.MessageId]),r.nacked&&i.push(["message.nack",n.MessageId])),i}}};//# sourceMappingURL=dev.js.map
package/dist/dev.mjs CHANGED
@@ -1 +1 @@
1
- var e=Object.defineProperty,t=(t,n)=>{for(var o in n)e(t,o,{get:n[o],enumerable:!0})},n={};t(n,{CorsOptionsSchema:()=>c,CorsOrigin:()=>a,HttpMethod:()=>i,SettingsSchema:()=>u,settings:()=>l,sqsSettings:()=>b,sqsSetup:()=>y});import{zodToSchema as o}from"@walkeros/core/dev";import{z as s}from"@walkeros/core/dev";import{z as r}from"@walkeros/core/dev";var i=r.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),a=r.union([r.string(),r.array(r.string()),r.literal("*")]),c=r.object({origin:a.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:r.array(i).describe("Allowed HTTP methods").optional(),headers:r.array(r.string()).describe("Allowed request headers").optional(),credentials:r.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:r.number().int().positive().describe("Preflight cache duration in seconds").optional()}),u=s.object({cors:s.union([s.boolean(),c]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:s.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:s.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),healthPath:s.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),l=o(u);import{zodToSchema as d}from"@walkeros/core/dev";import{z as f}from"@walkeros/core/dev";var g=f.object({queueName:f.string().min(1).describe("SQS queue short name (like walkeros-events). Required for both setup and runtime poll."),region:f.string().describe("AWS region (like eu-central-1). Default: eu-central-1.").optional(),queueUrl:f.string().url().describe("Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.").optional(),client:f.any().describe("Pre-configured AWS SQSClient instance. Bypasses construction when supplied.").optional(),config:f.any().describe("AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).").optional(),decoder:f.enum(["json","text","raw"]).describe("Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer.").optional(),maxMessages:f.number().int().min(1).max(10).describe("SQS receive batch size. Cap 10. Default: 10.").optional(),waitTimeSeconds:f.number().int().min(0).max(20).describe("Long-poll duration in seconds. Cap 20. Default: 20.").optional(),visibilityTimeout:f.number().int().nonnegative().describe("Per-receive visibility timeout override. Default: queue-configured value.").optional(),shutdownTimeoutMs:f.number().int().positive().describe("Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.").optional(),onPushError:f.enum(["nack","ack"]).describe("Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it.").optional()});import{z as p}from"@walkeros/core/dev";var h=p.record(p.string(),p.string()),m=p.object({region:p.string().min(1).describe("AWS region.").optional(),fifoQueue:p.boolean().describe("FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.").optional(),visibilityTimeoutSeconds:p.number().int().nonnegative().describe("Visibility timeout in seconds. Default: 30.").optional(),messageRetentionSeconds:p.number().int().positive().describe("Message retention period in seconds. Default: 345600 (4 days).").optional(),maximumMessageSize:p.number().int().min(1024).max(262144).describe("Max message size in bytes. Default: 262144 (256 KB).").optional(),kmsMasterKeyId:p.string().describe("KMS key alias or ID for at-rest encryption.").optional(),deadLetterQueue:p.object({arn:p.string().describe("ARN of an existing DLQ. Mutually exclusive with create: true.").optional(),create:p.boolean().describe("Create a sibling DLQ named <queueName>-dlq. Default: false.").optional(),maxReceiveCount:p.number().int().min(1).max(1e3).describe("Max receive count before message goes to DLQ. Default: 5.").optional()}).describe("Optional dead-letter queue.").optional(),tags:h.describe("Tags applied to the queue (and inherited by an auto-created DLQ).").optional(),subscribeToSnsTopic:p.object({topicArn:p.string().min(1).describe("Topic ARN to subscribe to."),rawMessageDelivery:p.boolean().describe("Deliver SNS messages without the SNS envelope.").optional(),filterPolicy:p.record(p.string(),p.unknown()).describe("SNS filter policy applied at subscription level.").optional()}).describe("Optional SNS topic subscription. Creates the subscription and the matching queue policy.").optional()}),b=d(g),y=d(m),v={};t(v,{createTrigger:()=>At,env:()=>w,step:()=>x,trigger:()=>Ct});var w={};t(w,{push:()=>O});var k=()=>()=>Promise.resolve({ok:!0}),S=()=>{},q={error:S,warn:S,info:S,debug:S,throw:e=>{throw"string"==typeof e?new Error(e):e},json:S,scope:()=>q},O={get push(){return k()},get command(){return k()},get elb(){return k()},logger:q},x={};t(x,{apiGatewayV1Post:()=>C,lambdaGet:()=>j,lambdaPost:()=>A});var A={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"}}]]},C={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"}}]]},j={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 P}from"@walkeros/core";import{assign as E,createLogger as I}from"@walkeros/core";import{assign as D,buildCacheContext as M,clone as T,compileCache as $,checkCache as _,storeCache as R,createIngest as H,debounce as N,getId as B,getGrantedConsent as z,getNextSteps as G,isDefined as F,isFunction as L,isObject as Q,processEventMapping as J,stepId as U,tryCatchAsync as W,useHooks as K}from"@walkeros/core";import{isArray as V,FatalError as Y}from"@walkeros/core";import{tryCatch as X,tryCatchAsync as Z}from"@walkeros/core";import{createIngest as ee,FatalError as te,getMappingValue as ne,tryCatchAsync as oe,getNextSteps as se,compileCache as re,checkCache as ie,storeCache as ae,applyUpdate as ce,buildCacheContext as ue}from"@walkeros/core";import{createIngest as le,FatalError as de,isObject as fe,tryCatchAsync as ge,useHooks as pe,getNextSteps as he,compileCache as me,checkCache as be,storeCache as ye,buildCacheContext as ve,validateStepEntry as we,processEventMapping as ke}from"@walkeros/core";import{assign as Se,getSpanId as qe,isFunction as Oe,isString as xe}from"@walkeros/core";import{isObject as Ae}from"@walkeros/core";import{createIngest as Ce,FatalError as je,getGrantedConsent as Pe,processEventMapping as Ee,tryCatchAsync as Ie,useHooks as De}from"@walkeros/core";import{FatalError as Me,useHooks as Te,tryCatchAsync as $e}from"@walkeros/core";import{useHooks as _e}from"@walkeros/core";import{compileMatcher as Re}from"@walkeros/core";var He={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 Ne(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Be(e){const t={};for(const[n,o]of Object.entries(e)){const e=o.config?.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?t[n]={next:e}:t[n]={}}return t}function ze(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}function Ge(e,t={}){if(!e)return[];if(Array.isArray(e))return e;const n=[],o=new Set;let s=e;for(;s&&t[s]&&!o.has(s);){o.add(s),n.push(s);const e=t[s].next;if(Array.isArray(e)){n.push(...e);break}s=e}return n}async function Fe(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:n,ingest:le(n),config:t.config,env:Ue(t.config.env)};s.debug("init");const i=await pe(t.init,"TransformerInit",e.hooks,e.logger)(r);if(!1===i)return!1;t.config={...i||t.config,env:i?.env||t.config.env,init:!0},s.debug("init done")}return!0}async function Le(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...Ue(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await pe(t.push,"TransformerPush",e.hooks,e.logger)(o,c);return a.debug("push done"),u}function Qe(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:le(t)}async function Je(e,t,n,o,s,r,i){s||(s=le(n[0]??"chain")),i&&s._meta&&(s._meta.chainPath=i);let a=o,c=r;for(const o of n){const r=t[o];if(!r){e.logger.warn(`Transformer not found: ${o}`);continue}if(s&&s._meta&&s._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o}`),{event:null,respond:c};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await ge(Fe,t=>{if(t instanceof de)throw t;return e.status.failed++,e.logger.scope(`transformer:${r.type||"unknown"}`).error("transformer init failed",{transformer:o,error:t}),!1})(e,r,o))return{event:null,respond:c};if(i&&void 0!==r.config?.chainMocks?.[i]){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),a=t;continue}if(void 0!==r.config?.mock){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),a=r.config.mock;continue}if(r.config?.disabled)continue;const u=r.config?.cache,l=u?me(u):void 0,d=l?Ne(l,e):void 0;let f;if(l&&d){const e=ve(s,a),t=await be(l,d,e);if("HIT"===t?.status&&t.value){if(a=t.value,l.stop)return{event:a,respond:c,stopped:!0};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=he(g,ve(s,a));if(1===n.length){const o=Ge(n[0],Be(t));if(o.length>0){const n=await Je(e,t,o,a,s,c,i);if(null===n.event)return{event:null,respond:n.respond??c};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:n.respond??c,stopped:!0};n.respond&&(c=n.respond),a=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(n,Be(t)),a,Qe(s,n),void 0,i)))}const p=await ge(Le,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,a,s,c);if(!1===p)return{event:null,respond:c};if(Array.isArray(p)){const r=n.slice(n.indexOf(o)+1),u=await Promise.all(p.map(async n=>{const o=n.event||a,u=Qe(s,"unknown");if(n.next){const s=he(n.next,ve(u,o));if(0===s.length)return{event:o,respond:c};if(1===s.length){const n=Ge(s[0],Be(t));return n.length>0?Je(e,t,n,o,u,c,i):{event:o,respond:c}}return(await Promise.all(s.map(n=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(n,Be(t)),o,Qe(u,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?Je(e,t,r,o,u,c,i):{event:o,respond:c}}));let l=c;const d=[];for(const e of u.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const t=e;if(t.respond&&(l=t.respond),null===t.event)continue;Array.isArray(t.event)?d.push(...t.event):d.push(t.event)}else d.push(e);return 0===d.length?{event:null,respond:l}:1===d.length?{event:d[0],respond:l}:{event:d,respond:l}}if(p&&"object"==typeof p){const{event:n,respond:o,next:r}=p;if(o&&(c=o),void 0!==r){const o=he(r,ve(s,a));if(0===o.length){n&&(a=n);continue}if(1===o.length){const u=Ge(o[0],Be(t));return u.length>0?Je(e,t,u,n||a,s,c,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:c})}return await Promise.all(o.map(o=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${o} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(o,Be(t)),n||a,Qe(s,o),void 0,i))),{event:null,respond:void 0}}n&&(a=n)}f&&d&&ye(d,f.key,a,f.ttl);const h=r.config.next,m="string"==typeof h||Array.isArray(h)&&h.every(e=>"string"==typeof e),b=void 0!==h&&!m;if((!p||"object"==typeof p&&!p.next)&&b){const n=he(r.config.next,ve(s,a));if(1===n.length){const o=Ge(n[0],Be(t));return o.length>0?Je(e,t,o,a,s,c,i):{event:a,respond:c}}return n.length>1?(await Promise.all(n.map(n=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(n,Be(t)),a,Qe(s,n),void 0,i))),{event:null,respond:void 0}):{event:a,respond:c}}}return{event:a,respond:c}}function Ue(e){return e&&fe(e)?e:{}}function We(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function Ke(e,t,n){if(!t.on||!t.queueOn?.length)return;const o=t.queueOn;t.queueOn=[];const s=n||t.config?.id||"unknown";for(const{type:n,data:r}of o)await oe(t.on,t=>{if(t instanceof te)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s,type:n,error:t})})(n,r)}function Ve(e){return Boolean(e.config.init)&&!e.config.require?.length}async function Ye(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:u}=n,l=u,d=l?re({...l,stop:l.stop??!0}):void 0,f=We(a)?Ge(a,Be(e.transformers)):void 0,g=We(c)?Ge(c,Be(e.transformers)):void 0,p=r.push,h=p??e.push,m=Boolean(p),b=async(n,o,r)=>{let i;const u=g??(void 0!==c?(()=>{const t=se(c,ue(r.ingest));return 0===t.length?[]:Ge(1===t.length?t[0]:t,Be(e.transformers))})():[]);let l=[n];if(u.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await Je(e,e.transformers,u,n,r.ingest,r.respond,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(r.respond=o.respond),{ok:!0};o.respond&&(r.respond=o.respond),l=Array.isArray(o.event)?o.event:[o.event]}if(d){const t=Ne(d,e);if(t){const n=ue(r.ingest),o=await ie(d,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&d.stop){let t=o.value;return o.rule.update&&(t=await ce(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),r.respond?.(t),{ok:!0}}if("MISS"===o.status&&d.stop&&r.respond){const s=r.respond,a=o.rule.update,c={...n,cache:{status:"MISS"}},u=o.key,l=o.rule.ttl,d=n=>{ae(t,u,n,l),a?i=(async()=>{const t=await ce(n,a,c,e);s(t)})():s(n)};r.respond=d}"MISS"!==o.status||d.stop||ae(t,o.key,!0,o.rule.ttl)}}}const p=f?{kind:"single",preChain:f}:void 0!==a?(()=>{const t=se(a,ue(r.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:Ge(t[0],Be(e.transformers))}:{kind:"many",branches:t.map(t=>Ge(t,Be(e.transformers)))}})():{kind:"single",preChain:[]};let b={ok:!0};for(const n of l)"many"===p.kind?(await Promise.all(p.branches.map((i,a)=>oe(async()=>m?h(n):h(n,{...o,id:t,ingest:Qe(r.ingest,`${t}.${a}`),respond:void 0,mapping:s,preChain:i}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),b={ok:!0}):b=m?await h(n):await h(n,{...o,id:t,ingest:r.ingest,respond:r.respond,mapping:s,preChain:p.preChain});return i&&await i,b},y=async n=>{const o=ee(t);if(!s.ingest||void 0===n)return o;const r=await ne(n,s.ingest,{collector:e});return{...o,...r,_meta:o._meta}},v=e.logger.scope("source").scope(t),w={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:v,...r,push:async(e,n={})=>{const o={ingest:ee(t),respond:void 0};return b(e,n,o)}},k={collector:e,logger:v,id:t,config:s,env:w,withScope:async(e,t,n)=>{const o={ingest:await y(e),respond:t};return n({...w,push:(e,t={})=>b(e,t,o),ingest:o.ingest,respond:o.respond})}},S=await oe(o,n=>{if(n instanceof te)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(k);if(!S)return;const q=S.type||"unknown",O=e.logger.scope(q).scope(t);return w.logger=O,i&&(S.config={...S.config,primary:i}),S}function Xe(e,t,n,o){if(n instanceof Y)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}function Ze(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function et(e,t,n,o,s){if(!t.on)return;const r=t.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:s,env:bt(t.env,t.config.env)};X(t.on,t=>Xe(e,"destination",t,{destId:n,type:o}))(o,a)}function tt(e,t,n,o){let s;switch(t){case He.Consent:s=o||e.consent;break;case He.Session:s=e.session;break;case He.User:s=o||e.user;break;case He.Custom:s=o||e.custom;break;case He.Globals:s=o||e.globals;break;case He.Config:s=o||e.config;break;case He.Ready:case He.Run:default:s=void 0}if(n.length)switch(t){case He.Consent:!function(e,t,n){const o=n||e.consent,s=Ze(e,He.Consent);t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{X(t[n],t=>Xe(e,"consent",t,{key:n}))(o,s)})})}(e,n,o);break;case He.Ready:!function(e,t){if(!e.allowed)return;const n=Ze(e,He.Ready);t.forEach(t=>{X(t,t=>Xe(e,"ready",t))(void 0,n)})}(e,n);break;case He.Run:!function(e,t){if(!e.allowed)return;const n=Ze(e,He.Run);t.forEach(t=>{X(t,t=>Xe(e,"run",t))(void 0,n)})}(e,n);break;case He.Session:!function(e,t){if(!e.session)return;const n=Ze(e,He.Session);t.forEach(t=>{X(t,t=>Xe(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=Ze(e,t);n.forEach(n=>{"function"==typeof n&&X(n,n=>Xe(e,"generic",n,{type:t}))(s,o)});break}}}function nt(e,t,n,o){if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(n.onOverflow??"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const s=[];for(;e.length>=n.max;)s.push(e.shift());return e.push(t),s.length>0&&o&&o(s),{appended:!0,dropped:s.length}}var ot=new WeakMap;function st(e,t,n,o){ot.get(e)||(ot.set(e,!0),t.warn(n,o))}function rt(e){ot.delete(e)}var it=Object.freeze({batched:!0});function at(e){return e===it}function ct(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function ut(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function lt(e,t,n,o){e.dropped[t]||(e.dropped[t]={});const s=e.dropped[t];return s[n]=(s[n]??0)+o,s[n]}function dt(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Ge(e,t);if("string"==typeof e)return Ge(e,t);const o=G(e,M(n));return 0===o.length?[]:1===o.length?Ge(o[0],t):Ge(o,t)}async function ft(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return ht({ok:!1});if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=nt(e.queue,t,{max:n});if(o.dropped>0){const t=lt(e.status,U("collector"),"queue",o.dropped);st(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&rt(e.queue);e.status.in++}o||(o=e.destinations);const c=e.transformers?Be(e.transformers):{},u=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let u=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&u.push(T(t));const l=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:H("unknown");if(!u.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!u.length&&s.queueOn?.length){let t=!1;try{t=await gt(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const d=[],f=u.filter(e=>{const t=z(s.config.consent,r,e.consent);return!t||(e.consent=t,d.push(e),!1)});if(f.length>0){const t=s.queuePush,n=s.config.id||o,r={max:s.config.queueMax??1e3};let i=0;for(const e of f)i+=nt(t,e,r).dropped;if(i>0){ut(e,n);const o=lt(e.status,U("destination",n),"queue",i);st(t,e.logger.scope(s.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n,cap:r.max,droppedCount:o})}else t.length<r.max&&rt(t)}if(!d.length)return{id:o,destination:s,queue:u};let g,p,h=!1;try{h=await gt(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!h)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const m=dt(s.config.before,c,l),b=s.config.next,y=s.config?.cache,v=y?$(y):void 0,w=v?Ne(v,e):void 0;let k=0,S=0;return await Promise.all(d.map(async t=>{let r;if(t.globals=D(i,t.globals),t.user=D(a,t.user),v?.stop&&w){const e=M(l,t),n=await _(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let u=t,d=n.respond;if(m.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Je(e,e.transformers,m,t,l,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(d=s.respond),u=Array.isArray(s.event)?s.event[0]:s.event}if(v&&!v.stop&&w){const e=M(l,u),n=await _(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const f=Date.now();let h=!1;const y=await W(pt,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:u.name}),g=t,h=!0;const r=s.dlq,i=s.config.id||o,a={max:s.config.dlqMax??100},c=nt(r,[u,t],a);if(c.dropped>0){ut(e,i);const t=lt(e.status,U("destination",i),"dlq",c.dropped);st(r,e.logger.scope(s.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:i,cap:a.max,droppedCount:t})}else r.length<a.max&&rt(r)})(e,s,o,u,l,d);if(k+=Date.now()-f,r&&w&&void 0===s.config.mock&&R(w,r.key,y??!0,r.ttl),void 0===y||at(y)||(p=y),at(y)&&S++,!h&&b){void 0!==y&&(l._response=y);const t=dt(b,c,l);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Je(e,e.transformers,t,u,l,d,`destination.${o}.next`);n.respond&&(d=n.respond)}}return t})),{id:o,destination:s,error:g,response:p,totalDuration:k,batchedCount:S,allowedCount:d.length}})),l={},d={},f={};for(const t of u){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};ut(e,t.id);const s=e.status.destinations[t.id],r=Date.now();if(s.queuePushSize=n.queuePush?.length??0,s.dlqSize=n.dlq?.length??0,t.error)o.error=t.error,f[t.id]=o,s.failed++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)d[t.id]=o;else{const n=t.batchedCount??0,i=t.allowedCount??0;(Math.max(0,i-n)>0||0===i)&&(l[t.id]=o,s.count++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.out++)}}return ht({event:t,...Object.keys(l).length&&{done:l},...Object.keys(d).length&&{queued:d},...Object.keys(f).length&&{failed:f}})}async function gt(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(o),r={collector:e,logger:s,id:n,config:t.config,env:bt(t.env,t.config.env)};s.debug("init");const i=await K(t.init,"DestinationInit",e.hooks,e.logger)(r);if(!1===i)return i;if(t.config={...i||t.config,init:!0},t.queueOn?.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)et(e,t,n,s,r)}s.debug("init done")}return!0}async function pt(e,t,n,o,s,r){const{config:i}=t,a=await J(o,i,e);if(a.ignore)return!1;const c=t.type||"unknown",u=e.logger.scope(c),l={collector:e,logger:u,id:n,config:i,data:a.data,rule:a.mapping,ingest:s,env:{...bt(t.env,i.env),...r?{respond:r}:{}}};if(void 0!==i.mock)return u.debug("mock",{event:a.event.name}),i.mock;const d=a.mapping,f=a.mappingKey||"* *";if(d?.batch&&t.pushBatch&&void 0===i.mock){if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,entries:[],events:[],data:[]},s=ct(d.batch),r=ct(i.batch),a=s.wait??r.wait??3e4,c=s.size??r.size??1e3,l=s.age??r.age??3e4,g=bt(t.env,i.env),p=N(async()=>{const o=t.batches[f].batched;if(0===o.entries.length)return;const s={key:o.key,entries:o.entries,events:o.events,data:o.data};o.entries=[],o.events=[],o.data=[];const r=s.entries[0],a={collector:e,logger:u,id:n,config:i,data:void 0,rule:r.rule,ingest:r.ingest,env:{...g,...r.respond?{respond:r.respond}:{}}};u.debug("push batch",{events:s.entries.length});const c=t.config.id||n,l=ut(e,c);let d=!0;await W(K(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),n=>{d=!1;const o=t.dlq=t.dlq||[],r={max:t.config.dlqMax??100};let i=0;for(const e of s.entries)i+=nt(o,[e.event,n],r).dropped;if(i>0){const t=lt(e.status,U("destination",c),"dlq",i);st(o,u,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:r.max,droppedCount:t})}else o.length<r.max&&rt(o);l.failed+=s.entries.length,l.dlqSize=o.length,e.status.failed+=s.entries.length,u.error("Push batch failed",{error:n instanceof Error?n.message:String(n),entries:s.entries.length})})(s,a),u.debug("push batch done"),l.inFlightBatch=Math.max(0,(l.inFlightBatch??0)-s.entries.length),d&&(l.count+=s.entries.length,l.lastAt=Date.now(),e.status.out+=s.entries.length)},{wait:a,size:c,age:l});t.batches[f]={batched:o,batchFn:()=>{p()},flush:async()=>{await p.flush()}}}const o=t.batches[f];o.batched.entries.push({event:a.event,ingest:s,respond:r,rule:d,data:a.data}),o.batched.events.push(a.event),F(a.data)&&o.batched.data.push(a.data);const c=t.config.id||n,l=ut(e,c);return l.inFlightBatch=(l.inFlightBatch??0)+1,o.batchFn(),it}{u.debug("push",{event:a.event.name});const n=await K(t.push,"DestinationPush",e.hooks,e.logger)(a.event,l);return u.debug("push done"),n}}function ht(e){return{ok:!e?.failed,...e}}function mt(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=ze(e,"before"),{config:i}=ze({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=bt(t.env,o);return{...t,config:a,env:c}}function bt(e,t){return e||t?t?e&&Q(e)&&Q(t)?{...e,...t}:t:e:{}}async function yt(e,t,n){const o=Object.entries(e).map(async([e,o])=>{const s=o.destroy;if(!s)return;const r=o.type||"unknown",i=n.scope(r),a={id:e,config:o.config,env:o.env??{},logger:i};try{await Promise.race([s(a),new Promise((n,o)=>setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3))])}catch(n){i.error(`${t} '${e}' destroy failed: ${n}`)}});await Promise.allSettled(o)}async function vt(e,t,n){let o,s,r=!1;switch(t){case He.Config:Ae(n)&&(Se(e.config,n,{shallow:!1}),s=n,r=!0);break;case He.Consent:if(Ae(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=P(e.consent,n),{update:n}}(e,n);s=t,r=!0}break;case He.Custom:Ae(n)&&(e.custom=Se(e.custom,n),s=n,r=!0);break;case He.Destination:Ae(n)&&"code"in n&&Ae(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:s={},before:r,next:i,cache:a}=t;if(!L(n.push))return ht({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c=o||{init:!1};let u=r?{...c,before:r}:{...c};i&&(u={...u,next:i}),a&&(u={...u,cache:a});const l={...n,config:u,env:bt(n.env,s)};let d=l.config.id;if(!d)do{d=B(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d]);return e.destinations[d]=l,!1!==l.config.queue&&(l.queuePush=[...e.queue]),ft(e,void 0,{},{[d]:l})}(e,n));break;case He.Globals:Ae(n)&&(e.globals=Se(e.globals,n),s=n,r=!0);break;case He.Hook:if(Ae(n)&&xe(n.name)&&Oe(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case He.On:if(Ae(n)&&xe(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=V(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,tt(e,t,r)}(e,t,o)}break;case He.Ready:r=!0;break;case He.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=Se(e.consent,t.consent)),t.user&&(e.user=Se(e.user,t.user)),t.globals&&(e.globals=Se(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=Se(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ft(e)}(e,n),r=!0;break;case He.Session:r=!0;break;case He.Shutdown:await async function(e){const t=e.logger;await yt(e.sources,"source",t),await yt(e.destinations,"destination",t),await yt(e.transformers,"transformer",t),await yt(e.stores,"store",t)}(e);break;case He.User:Ae(n)&&(Se(e.user,n,{shallow:!1}),s=n,r=!0)}return r&&(await async function(e,t,n,o){let s,r=n||[];switch(n||(r=e.on[t]||[]),t){case He.Consent:s=o||e.consent;break;case He.Session:s=e.session;break;case He.User:s=o||e.user;break;case He.Custom:s=o||e.custom;break;case He.Globals:s=o||e.globals;break;case He.Config:s=o||e.config;break;case He.Ready:case He.Run:default:s=void 0}let i=!1;for(const[n,o]of Object.entries(e.sources)){if(o.config.require?.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(Ve(o)?!1===await Z(o.on,o=>Xe(e,"source",o,{sourceId:n,type:t}))(t,s)&&(i=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:s})))}Object.entries(e.destinations).forEach(([n,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:t,data:s});et(e,o,n,t,s)}});for(const[t,n]of Object.entries(e.sources))Ve(n)&&n.queueOn?.length&&await Ke(e,n,t);return Object.keys(e.pending.destinations).length>0&&await async function(e,t){for(const[n,o]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const s=o.config?.require;if(!s)continue;const r=s.indexOf(t);if(-1===r)continue;if(s.splice(r,1),s.length>0)continue;delete e.pending.destinations[n];const i=mt(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}(e,t),tt(e,t,r,o),!i}(e,t,void 0,s),o=await ft(e)),o||ht({ok:!0})}function wt(e,t){if(!t.name)throw new Error("Event name is required");const[n,o]=t.name.split(" ");if(!n||!o)throw new Error("Event name is invalid");const{timestamp:s=Date.now(),name:r=`${n} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:u={},user:l=e.user,nested:d=[],consent:f=e.consent,id:g=qe(),trigger:p="",entity:h=n,action:m=o,timing:b=0,source:y={type:"collector",schema:"4"}}=t;return{name:r,data:i,context:a,globals:c,custom:u,user:l,nested:d,consent:f,id:g,trigger:p,entity:h,action:m,timestamp:s,timing:b,source:y}}function kt(e={}){const t=e.maxEntries??1e4,n=e.lowWaterMark??.8,o=e.sweepIntervalMs??6e4,s=Math.floor(t*n),r=new Map,i={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a;return o>0&&(a=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of r)void 0!==o.expires&&o.expires<=e&&(r.delete(n),t++);i.evictions_ttl+=t},o),a&&"function"==typeof a.unref&&a.unref()),{type:"memory",config:{},get(e){const t=r.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(r.delete(e),i.evictions_ttl++,void i.misses++):(r.delete(e),r.set(e,t),i.hits++,t.value);i.misses++},set(e,n,o){const a=!r.has(e);a||r.delete(e),r.set(e,{value:n,expires:void 0!==o?Date.now()+o:void 0}),i.writes++,a&&i.populates++,r.size>t&&function(){if(r.size<=t)return;const e=r.size-s;let n=0;for(const t of r.keys()){if(n>=e)break;r.delete(t),n++}i.evictions_entries+=n}()},delete(e){r.delete(e)&&i.deletes++},get counters(){return{...i}},destroy(){void 0!==a&&(clearInterval(a),a=void 0),r.clear()}}}function St(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i}=t,a={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c=n.rules.map(e=>({match:e.match?Re(e.match):()=>!0,ttl:e.ttl})),u=e=>`${s}:${e}`;function l(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return c.find(e=>e.match(n))}const d=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a}},async get(t){const n=u(t),s=await o.get(n);if(void 0!==s)return a.hits++,s;const r=d.get(n);if(r)return a.inflight_dedups++,r;a.misses++;const i=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=l(t,s);if(r)try{await o.set(n,s,1e3*r.ttl),a.populates++}catch(e){f("set",t,e)}return s}finally{d.delete(n)}})();return d.set(n,i),i},async set(t,n,s){a.writes++,await e.set(t,n,s);const r=l(t,n);if(r)try{await o.set(u(t),n,1e3*r.ttl)}catch(e){f("set",t,e)}},async delete(t){a.deletes++,await e.delete(t);try{await o.delete(u(t))}catch(e){f("delete",t,e)}}};function f(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,{error:n}):console.warn(o,n)}}function qt(e,t){const n=t.get,o=t.set,s=t.delete;t.get=_e(n,"StoreGet",e.hooks,e.logger),t.set=_e(o,"StoreSet",e.hooks,e.logger),t.delete=_e(s,"StoreDelete",e.hooks,e.logger)}async function Ot(e){const t=E({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=I(n),s={...t.globalsStatic,...e.globals},r={allowed:!1,config:t,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s,hooks:e.hooks||{},logger:o,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 i,a;r.push=function(e,t){return De(async(n,o={})=>await Ie(async()=>{const s=Date.now(),{id:r,ingest:i,respond:a,mapping:c,preChain:u,include:l,exclude:d}=o;let f=a,g=n;const p=l||d?function(e,t,n){let o=e;return t&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>t.includes(e)))),n&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>!n.includes(e)))),o}(e.destinations,l,d):void 0,h=i??Ce(r||"unknown");if(c){const t=await Ee(g,c,e);if(t.ignore)return ht({ok:!0});if(c.consent&&!Pe(c.consent,e.consent,t.event.consent))return ht({ok:!0});g=t.event}if(u?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Je(e,e.transformers,u,g,h,f,r?`source.${r}.next`:void 0);if(null===n.event)return ht({ok:!0});if(n.stopped)return n.respond&&(f=n.respond),ht({ok:!0});if(n.respond&&(f=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=wt(e,o);return ft(e,s,{id:r,ingest:h,respond:f},p)}));if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count+=n.event.length,t.lastAt=Date.now(),t.duration+=Date.now()-s}return o[0]??ht({ok:!0})}g=n.event}const m=t(g),b=wt(e,m),y=await ft(e,b,{id:r,ingest:h,respond:f},p);if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-s}return y},t=>{if(t instanceof je)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),ht({ok:!1})})(),"Push",e.hooks,e.logger)}(r,e=>({timing:Math.round((Date.now()-r.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.0-next-1779362268386"},...e})),r.command=(a=vt,Te(async(e,t,n)=>await $e(async()=>await a(i,e,t,n),n=>{if(n instanceof Me)throw n;return i.status.failed++,i.logger.error("command failed",{command:e,data:t,error:n}),ht({ok:!1})})(),"Command",(i=r).hooks,i.logger));const c=e.stores||{};return r.stores=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(o),c={collector:e,logger:a,id:o,config:r,env:i},u=await t(c);n[o]=u}const o=t,s=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){const i=t[r];if("BLACK"===i)return;if("GRAY"===i){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const a=e[r].cache?.store;if(void 0!==a){if(!(a in e))throw new Error(`Store "${r}" cache.store references "${a}", which is not declared in flow.stores`);s(a)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(o);for(const t of s){const s=o[t].cache;if(!s)continue;let r,i;void 0!==s.store?(r=n[s.store],i=s.store):(n.__cache||(n.__cache=kt()),r=n.__cache,i="__cache");const a=s.namespace??t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${a}:" via ${i}`),n[t]=St(n[t],{storeId:t,cacheConfig:s,cacheStore:r,namespace:a,logger:e.logger.scope("store-cache").scope(t)})}for(const[t,o]of Object.entries(n))"__cache"!==t&&qt(e,o);return n}(r,c),function(e,t,n){const o=new Map;for(const[n,s]of Object.entries(e))t[n]&&o.set(s,t[n]);if(0!==o.size)for(const e of[n.transformers,n.destinations,n.sources])if(e)for(const t of Object.values(e))s(t.env);function s(e){if(e)for(const[t,n]of Object.entries(e))if("object"==typeof n&&null!==n){const s=o.get(n);s&&(e[t]=s)}}}(c,r.stores,e),r.stores.__cache||(r.stores.__cache=kt()),r.destinations=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t))s.config?.require?.length?e.pending.destinations[o]=s:n[o]=mt(s);return n}(r,e.destinations||{}),r.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,i=we(s,"Transformer");if(!i.ok){e.logger.warn(`Transformer ${o} invalid (${i.code}): ${i.reason}. Skipping.`);continue}const{config:a}=ze(s,"before"),{config:c}=ze({...s,config:a},"next"),u=Object.keys(r).length>0?{...c,env:r}:c,{cache:l}=s,d=l?{...u,cache:l}:u,f=e.logger.scope("transformer").scope(o),g={collector:e,logger:f,id:o,ingest:le(o),config:d,env:r},p=t??(e=>{const t=s.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${o}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await ke(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}}),h=await p(g);void 0!==s.before&&void 0===h.config?.before&&(h.config={...h.config??{},before:s.before}),void 0!==s.next&&void 0===h.config?.next&&(h.config={...h.config??{},next:s.next}),n[o]=h}return n}(r,e.transformers||{}),r}async function xt(e){e=e||{};const t=await Ot(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r)=>{if("string"==typeof e&&e.startsWith("walker ")){const n=e.replace("walker ","");return o.command(n,t)}let i;if("string"==typeof e)i={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(i.data=t);else{if(!e||"object"!=typeof e)return ht({ok:!1});i=e,t&&"object"==typeof t&&!Array.isArray(t)&&(i.data={...i.data||{},...t})}return n&&"object"==typeof n&&(i.context=n),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),o.push(i)}});var o;t.sources.elb=n,await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await Ye(e,o,s);if(!t)continue;const r=s.config?.require;t.config={...t.config,init:!1,...r?{require:[...r]}:{}},n[o]=t}Object.assign(e.sources,n);for(const t of Object.keys(n)){const n=e.sources[t];let o=!1;n.init&&await oe(n.init.bind(n),n=>{if(n instanceof te)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,Ve(n)&&await Ke(e,n,t))}return n}(t,e.sources||{});const{consent:s,user:r,globals:i,custom:a}=e;s&&await t.command("consent",s),r&&await t.command("user",r),i&&Object.assign(t.globals,i),a&&Object.assign(t.custom,a),t.config.run&&await t.command("run");let c=n.push;const u=Object.values(t.sources).filter(e=>"elb"!==e.type),l=u.find(e=>e.config.primary);return l?c=l.push:u.length>0&&(c=u[0].push),{collector:t,elb:c}}var At=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await xt(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources||{}))if("lambda"===t.type)return t}(t.collector);if(!o)throw new Error("Lambda source not found in collector");const s={awsRequestId:`test-${Date.now()}`},r=o.push,i=await r(n,s);let a;try{a=JSON.parse(i.body||"{}")}catch{a=i.body}const c={};if(i.headers)for(const[e,t]of Object.entries(i.headers))void 0!==t&&(c[e]=String(t));return{statusCode:i.statusCode,body:a,headers:c}}}};function Ct(e){return async t=>{const n={...t};if(n.body&&"string"==typeof n.body){const e=JSON.parse(n.body);e.name&&!e.event&&(n.body=JSON.stringify({...e,event:e.name,name:void 0}))}return e.push(n,{awsRequestId:"test-req"})}}var jt={};t(jt,{createTrigger:()=>zt,env:()=>Pt,step:()=>$t});var Pt={};t(Pt,{push:()=>Mt,simulation:()=>Tt});var Et=()=>{},It={error:Et,warn:Et,info:Et,debug:Et,throw:e=>{throw"string"==typeof e?new Error(e):e},json:Et,scope:()=>It},Dt=()=>()=>Promise.resolve({ok:!0}),Mt={get push(){return Dt()},get command(){return Dt()},get elb(){return Dt()},logger:It},Tt=["AWS.SQSClient"],$t={};t($t,{decoderText:()=>Ht,malformedJson:()=>Nt,orderComplete:()=>Rt,pageView:()=>_t});var _t={title:"Page view from SQS",description:"A standard SQS message body containing a walker elb event payload as JSON.",in:{MessageId:"m-1",Body:JSON.stringify({event:"page view",data:{title:"Documentation",url:"https://example.com/docs"}})},out:[["message.ack","m-1"]]},Rt={title:"Order complete from SQS",description:"Order complete event flowing through the long-poll loop.",in:{MessageId:"m-2",Body:JSON.stringify({event:"order complete",data:{id:"ORD-500",total:199.99,currency:"EUR"}})},out:[["message.ack","m-2"]]},Ht={title:"Text decoder",description:'When decoder is "text", the body string flows under data.payload.',in:{MessageId:"m-3",Body:"raw text payload"},out:[["message.ack","m-3"]]},Nt={title:"Malformed JSON nacks",description:"Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.",in:{MessageId:"m-4",Body:"{not json"},out:[["message.nack","m-4"]]};function Bt(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var zt=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await xt(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Bt(t))return t}(t.collector);if(!o)throw new Error("sqs source not registered in collector, ensure it is configured in sources");const s={MessageId:n.MessageId,Body:n.Body,ReceiptHandle:n.ReceiptHandle,Attributes:n.Attributes,MessageAttributes:n.MessageAttributes},r=await o.push(s),i=[];return r&&"object"==typeof r&&(r.acked&&i.push(["message.ack",n.MessageId]),r.nacked&&i.push(["message.nack",n.MessageId])),i}}};export{v as examples,n as schemas,jt as sqsExamples};//# sourceMappingURL=dev.mjs.map
1
+ var e=Object.defineProperty,t=(t,n)=>{for(var o in n)e(t,o,{get:n[o],enumerable:!0})},n={};t(n,{CorsOptionsSchema:()=>c,CorsOrigin:()=>a,HttpMethod:()=>i,SettingsSchema:()=>u,settings:()=>l,sqsSettings:()=>b,sqsSetup:()=>y});import{zodToSchema as o}from"@walkeros/core/dev";import{z as s}from"@walkeros/core/dev";import{z as r}from"@walkeros/core/dev";var i=r.enum(["GET","POST","PUT","PATCH","DELETE","OPTIONS","HEAD"]),a=r.union([r.string(),r.array(r.string()),r.literal("*")]),c=r.object({origin:a.describe("Allowed origins (* for all, URL string, or array of URLs)").optional(),methods:r.array(i).describe("Allowed HTTP methods").optional(),headers:r.array(r.string()).describe("Allowed request headers").optional(),credentials:r.boolean().describe("Allow credentials (cookies, authorization headers)").optional(),maxAge:r.number().int().positive().describe("Preflight cache duration in seconds").optional()}),u=s.object({cors:s.union([s.boolean(),c]).describe("CORS configuration: false = disabled, true = allow all origins, object = custom configuration").default(!0),timeout:s.number().int().positive().max(9e5).describe("Request timeout in milliseconds (max: 900000 for Lambda)").default(3e4),enablePixelTracking:s.boolean().describe("Enable GET requests with 1x1 transparent GIF response for pixel tracking").default(!0),healthPath:s.string().describe("Health check endpoint path (e.g., /health)").default("/health")}),l=o(u);import{zodToSchema as d}from"@walkeros/core/dev";import{z as f}from"@walkeros/core/dev";var g=f.object({queueName:f.string().min(1).describe("SQS queue short name (like walkeros-events). Required for both setup and runtime poll."),region:f.string().describe("AWS region (like eu-central-1). Default: eu-central-1.").optional(),queueUrl:f.string().url().describe("Optional pre-resolved queue URL. When set, init skips the GetQueueUrl lookup.").optional(),client:f.any().describe("Pre-configured AWS SQSClient instance. Bypasses construction when supplied.").optional(),config:f.any().describe("AWS SDK SQSClientConfig (credentials, endpoint overrides, retries).").optional(),decoder:f.enum(["json","text","raw"]).describe("Decoder for the message body. json (default) parses JSON, text forwards UTF-8, raw forwards a Buffer.").optional(),maxMessages:f.number().int().min(1).max(10).describe("SQS receive batch size. Cap 10. Default: 10.").optional(),waitTimeSeconds:f.number().int().min(0).max(20).describe("Long-poll duration in seconds. Cap 20. Default: 20.").optional(),visibilityTimeout:f.number().int().nonnegative().describe("Per-receive visibility timeout override. Default: queue-configured value.").optional(),shutdownTimeoutMs:f.number().int().positive().describe("Graceful shutdown timeout in milliseconds. Default: 30000. After this window, destroy() force-closes.").optional(),onPushError:f.enum(["nack","ack"]).describe("Behavior when forwarding to the collector throws. nack (default) skips DeleteMessage so the message redelivers; ack drops it.").optional()});import{z as p}from"@walkeros/core/dev";var h=p.record(p.string(),p.string()),m=p.object({region:p.string().min(1).describe("AWS region.").optional(),fifoQueue:p.boolean().describe("FIFO queue with content-based deduplication. Auto-appends .fifo suffix to the queue name.").optional(),visibilityTimeoutSeconds:p.number().int().nonnegative().describe("Visibility timeout in seconds. Default: 30.").optional(),messageRetentionSeconds:p.number().int().positive().describe("Message retention period in seconds. Default: 345600 (4 days).").optional(),maximumMessageSize:p.number().int().min(1024).max(262144).describe("Max message size in bytes. Default: 262144 (256 KB).").optional(),kmsMasterKeyId:p.string().describe("KMS key alias or ID for at-rest encryption.").optional(),deadLetterQueue:p.object({arn:p.string().describe("ARN of an existing DLQ. Mutually exclusive with create: true.").optional(),create:p.boolean().describe("Create a sibling DLQ named <queueName>-dlq. Default: false.").optional(),maxReceiveCount:p.number().int().min(1).max(1e3).describe("Max receive count before message goes to DLQ. Default: 5.").optional()}).describe("Optional dead-letter queue.").optional(),tags:h.describe("Tags applied to the queue (and inherited by an auto-created DLQ).").optional(),subscribeToSnsTopic:p.object({topicArn:p.string().min(1).describe("Topic ARN to subscribe to."),rawMessageDelivery:p.boolean().describe("Deliver SNS messages without the SNS envelope.").optional(),filterPolicy:p.record(p.string(),p.unknown()).describe("SNS filter policy applied at subscription level.").optional()}).describe("Optional SNS topic subscription. Creates the subscription and the matching queue policy.").optional()}),b=d(g),y=d(m),v={};t(v,{createTrigger:()=>At,env:()=>w,step:()=>x,trigger:()=>Ct});var w={};t(w,{push:()=>O});var k=()=>()=>Promise.resolve({ok:!0}),S=()=>{},q={error:S,warn:S,info:S,debug:S,throw:e=>{throw"string"==typeof e?new Error(e):e},json:S,scope:()=>q},O={get push(){return k()},get command(){return k()},get elb(){return k()},logger:q},x={};t(x,{apiGatewayV1Post:()=>C,lambdaGet:()=>j,lambdaPost:()=>A});var A={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"}}]]},C={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"}}]]},j={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 P}from"@walkeros/core";import{assign as E,createLogger as I}from"@walkeros/core";import{assign as D,buildCacheContext as M,clone as T,compileCache as $,checkCache as _,storeCache as R,createIngest as H,debounce as N,getId as B,getGrantedConsent as z,getNextSteps as G,isDefined as F,isFunction as L,isObject as Q,processEventMapping as J,stepId as U,tryCatchAsync as W,useHooks as K}from"@walkeros/core";import{isArray as V,FatalError as Y}from"@walkeros/core";import{tryCatch as X,tryCatchAsync as Z}from"@walkeros/core";import{createIngest as ee,FatalError as te,getMappingValue as ne,tryCatchAsync as oe,getNextSteps as se,compileCache as re,checkCache as ie,storeCache as ae,applyUpdate as ce,buildCacheContext as ue}from"@walkeros/core";import{createIngest as le,FatalError as de,isObject as fe,tryCatchAsync as ge,useHooks as pe,getNextSteps as he,compileCache as me,checkCache as be,storeCache as ye,buildCacheContext as ve,validateStepEntry as we,processEventMapping as ke}from"@walkeros/core";import{assign as Se,getSpanId as qe,isFunction as Oe,isString as xe}from"@walkeros/core";import{isObject as Ae}from"@walkeros/core";import{createIngest as Ce,FatalError as je,getGrantedConsent as Pe,processEventMapping as Ee,tryCatchAsync as Ie,useHooks as De}from"@walkeros/core";import{FatalError as Me,useHooks as Te,tryCatchAsync as $e}from"@walkeros/core";import{useHooks as _e}from"@walkeros/core";import{compileMatcher as Re}from"@walkeros/core";var He={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 Ne(e,t){return e.storeId&&t.stores[e.storeId]?t.stores[e.storeId]:t.stores.__cache}function Be(e){const t={};for(const[n,o]of Object.entries(e)){const e=o.config?.next;"string"==typeof e||Array.isArray(e)&&e.every(e=>"string"==typeof e)?t[n]={next:e}:t[n]={}}return t}function ze(e,t){const n=e.config||{},o=e[t];return void 0!==o?{config:{...n,[t]:o},chainValue:o}:{config:n,chainValue:void 0}}function Ge(e,t={}){if(!e)return[];if(Array.isArray(e))return e;const n=[],o=new Set;let s=e;for(;s&&t[s]&&!o.has(s);){o.add(s),n.push(s);const e=t[s].next;if(Array.isArray(e)){n.push(...e);break}s=e}return n}async function Fe(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(`transformer:${o}`),r={collector:e,logger:s,id:n,ingest:le(n),config:t.config,env:Ue(t.config.env)};s.debug("init");const i=await pe(t.init,"TransformerInit",e.hooks,e.logger)(r);if(!1===i)return!1;t.config={...i||t.config,env:i?.env||t.config.env,init:!0},s.debug("init done")}return!0}async function Le(e,t,n,o,s,r){const i=t.type||"unknown",a=e.logger.scope(`transformer:${i}`),c={collector:e,logger:a,id:n,ingest:s,config:t.config,env:{...Ue(t.config.env),...r?{respond:r}:{}}};a.debug("push",{event:o.name});const u=await pe(t.push,"TransformerPush",e.hooks,e.logger)(o,c);return a.debug("push done"),u}function Qe(e,t){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:le(t)}async function Je(e,t,n,o,s,r,i){s||(s=le(n[0]??"chain")),i&&s._meta&&(s._meta.chainPath=i);let a=o,c=r;for(const o of n){const r=t[o];if(!r){e.logger.warn(`Transformer not found: ${o}`);continue}if(s&&s._meta&&s._meta.path.length>256)return e.logger.error(`Max path length exceeded at ${o}`),{event:null,respond:c};if(s&&s._meta&&(s._meta.hops++,s._meta.path.push(o)),!await ge(Fe,t=>{if(t instanceof de)throw t;return e.status.failed++,e.logger.scope(`transformer:${r.type||"unknown"}`).error("transformer init failed",{transformer:o,error:t}),!1})(e,r,o))return{event:null,respond:c};if(i&&void 0!==r.config?.chainMocks?.[i]){const t=r.config.chainMocks[i];e.logger.scope(`transformer:${r.type||"unknown"}`).debug("chainMock",{chain:i}),a=t;continue}if(void 0!==r.config?.mock){e.logger.scope(`transformer:${r.type||"unknown"}`).debug("mock"),a=r.config.mock;continue}if(r.config?.disabled)continue;const u=r.config?.cache,l=u?me(u):void 0,d=l?Ne(l,e):void 0;let f;if(l&&d){const e=ve(s,a),t=await be(l,d,e);if("HIT"===t?.status&&t.value){if(a=t.value,l.stop)return{event:a,respond:c,stopped:!0};continue}"MISS"===t?.status&&(f={key:t.key,ttl:t.rule.ttl})}const g=r.config.before;if(g){const n=he(g,ve(s,a));if(1===n.length){const o=Ge(n[0],Be(t));if(o.length>0){const n=await Je(e,t,o,a,s,c,i);if(null===n.event)return{event:null,respond:n.respond??c};if(n.stopped)return{event:Array.isArray(n.event)?n.event[0]:n.event,respond:n.respond??c,stopped:!0};n.respond&&(c=n.respond),a=Array.isArray(n.event)?n.event[0]:n.event}}else n.length>1&&await Promise.all(n.map(n=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(n,Be(t)),a,Qe(s,n),void 0,i)))}const p=await ge(Le,t=>(e.logger.scope(`transformer:${r.type||"unknown"}`).error("Push failed",{error:t}),!1))(e,r,o,a,s,c);if(!1===p)return{event:null,respond:c};if(Array.isArray(p)){const r=n.slice(n.indexOf(o)+1),u=await Promise.all(p.map(async n=>{const o=n.event||a,u=Qe(s,"unknown");if(n.next){const s=he(n.next,ve(u,o));if(0===s.length)return{event:o,respond:c};if(1===s.length){const n=Ge(s[0],Be(t));return n.length>0?Je(e,t,n,o,u,c,i):{event:o,respond:c}}return(await Promise.all(s.map(n=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(n,Be(t)),o,Qe(u,n),void 0,i)))).map(e=>({event:e.event,respond:void 0}))}return r.length>0?Je(e,t,r,o,u,c,i):{event:o,respond:c}}));let l=c;const d=[];for(const e of u.flat())if(null!==e)if(e&&"object"==typeof e&&"event"in e){const t=e;if(t.respond&&(l=t.respond),null===t.event)continue;Array.isArray(t.event)?d.push(...t.event):d.push(t.event)}else d.push(e);return 0===d.length?{event:null,respond:l}:1===d.length?{event:d[0],respond:l}:{event:d,respond:l}}if(p&&"object"==typeof p){const{event:n,respond:o,next:r}=p;if(o&&(c=o),void 0!==r){const o=he(r,ve(s,a));if(0===o.length){n&&(a=n);continue}if(1===o.length){const u=Ge(o[0],Be(t));return u.length>0?Je(e,t,u,n||a,s,c,i):(e.logger.warn(`Branch target not found: ${JSON.stringify(r)}`),{event:null,respond:c})}return await Promise.all(o.map(o=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${o} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(o,Be(t)),n||a,Qe(s,o),void 0,i))),{event:null,respond:void 0}}n&&(a=n)}f&&d&&ye(d,f.key,a,f.ttl);const h=r.config.next,m="string"==typeof h||Array.isArray(h)&&h.every(e=>"string"==typeof e),b=void 0!==h&&!m;if((!p||"object"==typeof p&&!p.next)&&b){const n=he(r.config.next,ve(s,a));if(1===n.length){const o=Ge(n[0],Be(t));return o.length>0?Je(e,t,o,a,s,c,i):{event:a,respond:c}}return n.length>1?(await Promise.all(n.map(n=>ge(Je,t=>(e.logger.scope("transformer:many").error(`many branch ${n} failed`,{error:t}),{event:null,respond:void 0}))(e,t,Ge(n,Be(t)),a,Qe(s,n),void 0,i))),{event:null,respond:void 0}):{event:a,respond:c}}}return{event:a,respond:c}}function Ue(e){return e&&fe(e)?e:{}}function We(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e=>"string"==typeof e))}async function Ke(e,t,n){if(!t.on||!t.queueOn?.length)return;const o=t.queueOn;t.queueOn=[];const s=n||t.config?.id||"unknown";for(const{type:n,data:r}of o)await oe(t.on,t=>{if(t instanceof te)throw t;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s,type:n,error:t})})(n,r)}function Ve(e){return Boolean(e.config.init)&&!e.config.require?.length}async function Ye(e,t,n){const{code:o,config:s={},env:r={},primary:i,next:a,before:c,cache:u}=n,l=u,d=l?re({...l,stop:l.stop??!0}):void 0,f=We(a)?Ge(a,Be(e.transformers)):void 0,g=We(c)?Ge(c,Be(e.transformers)):void 0,p=r.push,h=p??e.push,m=Boolean(p),b=async(n,o,r)=>{let i;const u=g??(void 0!==c?(()=>{const t=se(c,ue(r.ingest));return 0===t.length?[]:Ge(1===t.length?t[0]:t,Be(e.transformers))})():[]);let l=[n];if(u.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o=await Je(e,e.transformers,u,n,r.ingest,r.respond,`source.${t}.before`);if(null===o.event)return{ok:!0};if(o.stopped)return o.respond&&(r.respond=o.respond),{ok:!0};o.respond&&(r.respond=o.respond),l=Array.isArray(o.event)?o.event:[o.event]}if(d){const t=Ne(d,e);if(t){const n=ue(r.ingest),o=await ie(d,t,n);if(o){if("HIT"===o.status&&void 0!==o.value&&d.stop){let t=o.value;return o.rule.update&&(t=await ce(t,o.rule.update,{...n,cache:{status:"HIT"}},e)),r.respond?.(t),{ok:!0}}if("MISS"===o.status&&d.stop&&r.respond){const s=r.respond,a=o.rule.update,c={...n,cache:{status:"MISS"}},u=o.key,l=o.rule.ttl,d=n=>{ae(t,u,n,l),a?i=(async()=>{const t=await ce(n,a,c,e);s(t)})():s(n)};r.respond=d}"MISS"!==o.status||d.stop||ae(t,o.key,!0,o.rule.ttl)}}}const p=f?{kind:"single",preChain:f}:void 0!==a?(()=>{const t=se(a,ue(r.ingest));return 0===t.length?{kind:"single",preChain:[]}:1===t.length?{kind:"single",preChain:Ge(t[0],Be(e.transformers))}:{kind:"many",branches:t.map(t=>Ge(t,Be(e.transformers)))}})():{kind:"single",preChain:[]};let b={ok:!0};for(const n of l)"many"===p.kind?(await Promise.all(p.branches.map((i,a)=>oe(async()=>m?h(n):h(n,{...o,id:t,ingest:Qe(r.ingest,`${t}.${a}`),respond:void 0,mapping:s,preChain:i}),t=>(e.logger.scope("source:many").error(`many branch ${a} failed`,{error:t}),{ok:!0}))())),b={ok:!0}):b=m?await h(n):await h(n,{...o,id:t,ingest:r.ingest,respond:r.respond,mapping:s,preChain:p.preChain});return i&&await i,b},y=async n=>{const o=ee(t);if(!s.ingest||void 0===n)return o;const r=await ne(n,s.ingest,{collector:e});return{...o,...r,_meta:o._meta}},v=e.logger.scope("source").scope(t),w={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:v,...r,push:async(e,n={})=>{const o={ingest:ee(t),respond:void 0};return b(e,n,o)}},k={collector:e,logger:v,id:t,config:s,env:w,withScope:async(e,t,n)=>{const o={ingest:await y(e),respond:t};return n({...w,push:(e,t={})=>b(e,t,o),ingest:o.ingest,respond:o.respond})}},S=await oe(o,n=>{if(n instanceof te)throw n;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:t,error:n})})(k);if(!S)return;const q=S.type||"unknown",O=e.logger.scope(q).scope(t);return w.logger=O,i&&(S.config={...S.config,primary:i}),S}function Xe(e,t,n,o){if(n instanceof Y)throw n;e.logger.scope("on").error("on callback failed",{kind:t,...o,error:n})}function Ze(e,t){return{collector:e,logger:e.logger.scope("on").scope(String(t))}}function et(e,t,n,o,s){if(!t.on)return;const r=t.type||"unknown",i=e.logger.scope(r).scope("on").scope(o),a={collector:e,logger:i,id:n,config:t.config,data:s,env:bt(t.env,t.config.env)};X(t.on,t=>Xe(e,"destination",t,{destId:n,type:o}))(o,a)}function tt(e,t,n,o){let s;switch(t){case He.Consent:s=o||e.consent;break;case He.Session:s=e.session;break;case He.User:s=o||e.user;break;case He.Custom:s=o||e.custom;break;case He.Globals:s=o||e.globals;break;case He.Config:s=o||e.config;break;case He.Ready:case He.Run:default:s=void 0}if(n.length)switch(t){case He.Consent:!function(e,t,n){const o=n||e.consent,s=Ze(e,He.Consent);t.forEach(t=>{Object.keys(o).filter(e=>e in t).forEach(n=>{X(t[n],t=>Xe(e,"consent",t,{key:n}))(o,s)})})}(e,n,o);break;case He.Ready:!function(e,t){if(!e.allowed)return;const n=Ze(e,He.Ready);t.forEach(t=>{X(t,t=>Xe(e,"ready",t))(void 0,n)})}(e,n);break;case He.Run:!function(e,t){if(!e.allowed)return;const n=Ze(e,He.Run);t.forEach(t=>{X(t,t=>Xe(e,"run",t))(void 0,n)})}(e,n);break;case He.Session:!function(e,t){if(!e.session)return;const n=Ze(e,He.Session);t.forEach(t=>{X(t,t=>Xe(e,"session",t))(e.session,n)})}(e,n);break;default:{const o=Ze(e,t);n.forEach(n=>{"function"==typeof n&&X(n,n=>Xe(e,"generic",n,{type:t}))(s,o)});break}}}function nt(e,t,n,o){if(!Number.isFinite(n.max)||n.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${n.max})`);if("dropNewest"===(n.onOverflow??"dropOldest"))return e.length>=n.max?(o&&o([t]),{appended:!1,dropped:1}):(e.push(t),{appended:!0,dropped:0});const s=[];for(;e.length>=n.max;)s.push(e.shift());return e.push(t),s.length>0&&o&&o(s),{appended:!0,dropped:s.length}}var ot=new WeakMap;function st(e,t,n,o){ot.get(e)||(ot.set(e,!0),t.warn(n,o))}function rt(e){ot.delete(e)}var it=Object.freeze({batched:!0});function at(e){return e===it}function ct(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function ut(e,t){return e.status.destinations[t]||(e.status.destinations[t]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[t]}function lt(e,t,n,o){e.dropped[t]||(e.dropped[t]={});const s=e.dropped[t];return s[n]=(s[n]??0)+o,s[n]}function dt(e,t,n){if(!e)return[];if(Array.isArray(e)&&e.every(e=>"string"==typeof e))return Ge(e,t);if("string"==typeof e)return Ge(e,t);const o=G(e,M(n));return 0===o.length?[]:1===o.length?Ge(o[0],t):Ge(o,t)}async function ft(e,t,n={},o){const{allowed:s,consent:r,globals:i,user:a}=e;if(!s)return ht({ok:!1});if(t){const n=e.config.queueMax;if(void 0===n)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o=nt(e.queue,t,{max:n});if(o.dropped>0){const t=lt(e.status,U("collector"),"queue",o.dropped);st(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:n,droppedCount:t})}else e.queue.length<n&&rt(e.queue);e.status.in++}o||(o=e.destinations);const c=e.transformers?Be(e.transformers):{},u=await Promise.all(Object.entries(o||{}).map(async([o,s])=>{if(s.config.disabled)return{id:o,destination:s,skipped:!0};let u=(s.queuePush||[]).map(e=>({...e,consent:r}));s.queuePush=[],t&&u.push(T(t));const l=n.ingest?{...n.ingest,_meta:{...n.ingest._meta,path:[...n.ingest._meta.path]}}:H("unknown");if(!u.length&&!s.queueOn?.length)return{id:o,destination:s,skipped:!0};if(!u.length&&s.queueOn?.length){let t=!1;try{t=await gt(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}return{id:o,destination:s,skipped:!t}}const d=[],f=u.filter(e=>{const t=z(s.config.consent,r,e.consent);return!t||(e.consent=t,d.push(e),!1)});if(f.length>0){const t=s.queuePush,n=s.config.id||o,r={max:s.config.queueMax??1e3};let i=0;for(const e of f)i+=nt(t,e,r).dropped;if(i>0){ut(e,n);const o=lt(e.status,U("destination",n),"queue",i);st(t,e.logger.scope(s.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:n,cap:r.max,droppedCount:o})}else t.length<r.max&&rt(t)}if(!d.length)return{id:o,destination:s,queue:u};let g,p,h=!1;try{h=await gt(e,s,o)}catch(t){e.status.failed++;const n=s.type||"unknown";e.logger.scope(n).error("destination init failed",{error:t instanceof Error?t.message:String(t)})}if(!h)return{id:o,destination:s,queue:u};s.dlq||(s.dlq=[]);const m=dt(s.config.before,c,l),b=s.config.next,y=s.config?.cache,v=y?$(y):void 0,w=v?Ne(v,e):void 0;let k=0,S=0;return await Promise.all(d.map(async t=>{let r;if(t.globals=D(i,t.globals),t.user=D(a,t.user),v?.stop&&w){const e=M(l,t),n=await _(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}let u=t,d=n.respond;if(m.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s=await Je(e,e.transformers,m,t,l,n.respond,`destination.${o}.before`);if(null===s.event)return t;s.respond&&(d=s.respond),u=Array.isArray(s.event)?s.event[0]:s.event}if(v&&!v.stop&&w){const e=M(l,u),n=await _(v,w,e);if("HIT"===n?.status)return t;"MISS"===n?.status&&(r={key:n.key,ttl:n.rule.ttl})}const f=Date.now();let h=!1;const y=await W(pt,t=>{const n=s.type||"unknown";e.logger.scope(n).error("Push failed",{error:t,event:u.name}),g=t,h=!0;const r=s.dlq,i=s.config.id||o,a={max:s.config.dlqMax??100},c=nt(r,[u,t],a);if(c.dropped>0){ut(e,i);const t=lt(e.status,U("destination",i),"dlq",c.dropped);st(r,e.logger.scope(s.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:i,cap:a.max,droppedCount:t})}else r.length<a.max&&rt(r)})(e,s,o,u,l,d);if(k+=Date.now()-f,r&&w&&void 0===s.config.mock&&R(w,r.key,y??!0,r.ttl),void 0===y||at(y)||(p=y),at(y)&&S++,!h&&b){void 0!==y&&(l._response=y);const t=dt(b,c,l);if(t.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Je(e,e.transformers,t,u,l,d,`destination.${o}.next`);n.respond&&(d=n.respond)}}return t})),{id:o,destination:s,error:g,response:p,totalDuration:k,batchedCount:S,allowedCount:d.length}})),l={},d={},f={};for(const t of u){if(t.skipped)continue;const n=t.destination,o={type:n.type||"unknown",data:t.response};ut(e,t.id);const s=e.status.destinations[t.id],r=Date.now();if(s.queuePushSize=n.queuePush?.length??0,s.dlqSize=n.dlq?.length??0,t.error)o.error=t.error,f[t.id]=o,s.failed++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.failed++;else if(t.queue&&t.queue.length)d[t.id]=o;else{const n=t.batchedCount??0,i=t.allowedCount??0;(Math.max(0,i-n)>0||0===i)&&(l[t.id]=o,s.count++,s.lastAt=r,s.duration+=t.totalDuration||0,e.status.out++)}}return ht({event:t,...Object.keys(l).length&&{done:l},...Object.keys(d).length&&{queued:d},...Object.keys(f).length&&{failed:f}})}async function gt(e,t,n){if(t.init&&!t.config.init){const o=t.type||"unknown",s=e.logger.scope(o),r={collector:e,logger:s,id:n,config:t.config,env:bt(t.env,t.config.env)};s.debug("init");const i=await K(t.init,"DestinationInit",e.hooks,e.logger)(r);if(!1===i)return i;if(t.config={...i||t.config,init:!0},t.queueOn?.length){const o=t.queueOn;t.queueOn=[];for(const{type:s,data:r}of o)et(e,t,n,s,r)}s.debug("init done")}return!0}async function pt(e,t,n,o,s,r){const{config:i}=t,a=await J(o,i,e);if(a.ignore)return!1;const c=t.type||"unknown",u=e.logger.scope(c),l={collector:e,logger:u,id:n,config:i,data:a.data,rule:a.mapping,ingest:s,env:{...bt(t.env,i.env),...r?{respond:r}:{}}};if(void 0!==i.mock)return u.debug("mock",{event:a.event.name}),i.mock;const d=a.mapping,f=a.mappingKey||"* *";if(d?.batch&&t.pushBatch&&void 0===i.mock){if(t.batches=t.batches||{},!t.batches[f]){const o={key:f,entries:[],events:[],data:[]},s=ct(d.batch),r=ct(i.batch),a=s.wait??r.wait??3e4,c=s.size??r.size??1e3,l=s.age??r.age??3e4,g=bt(t.env,i.env),p=N(async()=>{const o=t.batches[f].batched;if(0===o.entries.length)return;const s={key:o.key,entries:o.entries,events:o.events,data:o.data};o.entries=[],o.events=[],o.data=[];const r=s.entries[0],a={collector:e,logger:u,id:n,config:i,data:void 0,rule:r.rule,ingest:r.ingest,env:{...g,...r.respond?{respond:r.respond}:{}}};u.debug("push batch",{events:s.entries.length});const c=t.config.id||n,l=ut(e,c);let d=!0;await W(K(t.pushBatch,"DestinationPushBatch",e.hooks,e.logger),n=>{d=!1;const o=t.dlq=t.dlq||[],r={max:t.config.dlqMax??100};let i=0;for(const e of s.entries)i+=nt(o,[e.event,n],r).dropped;if(i>0){const t=lt(e.status,U("destination",c),"dlq",i);st(o,u,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c,cap:r.max,droppedCount:t})}else o.length<r.max&&rt(o);l.failed+=s.entries.length,l.dlqSize=o.length,e.status.failed+=s.entries.length,u.error("Push batch failed",{error:n instanceof Error?n.message:String(n),entries:s.entries.length})})(s,a),u.debug("push batch done"),l.inFlightBatch=Math.max(0,(l.inFlightBatch??0)-s.entries.length),d&&(l.count+=s.entries.length,l.lastAt=Date.now(),e.status.out+=s.entries.length)},{wait:a,size:c,age:l});t.batches[f]={batched:o,batchFn:()=>{p()},flush:async()=>{await p.flush()}}}const o=t.batches[f];o.batched.entries.push({event:a.event,ingest:s,respond:r,rule:d,data:a.data}),o.batched.events.push(a.event),F(a.data)&&o.batched.data.push(a.data);const c=t.config.id||n,l=ut(e,c);return l.inFlightBatch=(l.inFlightBatch??0)+1,o.batchFn(),it}{u.debug("push",{event:a.event.name});const n=await K(t.push,"DestinationPush",e.hooks,e.logger)(a.event,l);return u.debug("push done"),n}}function ht(e){return{ok:!e?.failed,...e}}function mt(e){const{code:t,config:n={},env:o={},cache:s}=e,{config:r}=ze(e,"before"),{config:i}=ze({...e,config:r},"next"),a={...t.config,...n,...i};s&&(a.cache=s);const c=bt(t.env,o);return{...t,config:a,env:c}}function bt(e,t){return e||t?t?e&&Q(e)&&Q(t)?{...e,...t}:t:e:{}}async function yt(e,t,n){const o=Object.entries(e).map(async([e,o])=>{const s=o.destroy;if(!s)return;const r=o.type||"unknown",i=n.scope(r),a={id:e,config:o.config,env:o.env??{},logger:i};try{await Promise.race([s(a),new Promise((n,o)=>setTimeout(()=>o(new Error(`${t} '${e}' destroy timed out`)),5e3))])}catch(n){i.error(`${t} '${e}' destroy failed: ${n}`)}});await Promise.allSettled(o)}async function vt(e,t,n){let o,s,r=!1;switch(t){case He.Config:Ae(n)&&(Se(e.config,n,{shallow:!1}),s=n,r=!0);break;case He.Consent:if(Ae(n)){const{update:t}=function(e,t){const n={};return Object.entries(t).forEach(([e,t])=>{n[e]=!!t}),e.consent=P(e.consent,n),{update:n}}(e,n);s=t,r=!0}break;case He.Custom:Ae(n)&&(e.custom=Se(e.custom,n),s=n,r=!0);break;case He.Destination:Ae(n)&&"code"in n&&Ae(n.code)&&(o=await async function(e,t){const{code:n,config:o={},env:s={},before:r,next:i,cache:a}=t;if(!L(n.push))return ht({ok:!1,failed:{invalid:{type:"invalid",error:"Destination code must have a push method"}}});const c=o||{init:!1};let u=r?{...c,before:r}:{...c};i&&(u={...u,next:i}),a&&(u={...u,cache:a});const l={...n,config:u,env:bt(n.env,s)};let d=l.config.id;if(!d)do{d=B(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[d]);return e.destinations[d]=l,!1!==l.config.queue&&(l.queuePush=[...e.queue]),ft(e,void 0,{},{[d]:l})}(e,n));break;case He.Globals:Ae(n)&&(e.globals=Se(e.globals,n),s=n,r=!0);break;case He.Hook:if(Ae(n)&&xe(n.name)&&Oe(n.fn)){const{name:t,fn:o}=n;e.hooks[t]=o,s=n,r=!0}break;case He.On:if(Ae(n)&&xe(n.type)){const{type:t,rules:o}=n;await async function(e,t,n){const o=e.on,s=o[t]||[],r=V(n)?n:[n];r.forEach(e=>{s.push(e)}),o[t]=s,tt(e,t,r)}(e,t,o)}break;case He.Ready:r=!0;break;case He.Run:o=await async function(e,t){return e.allowed=!0,e.timing=Date.now(),t&&(t.consent&&(e.consent=Se(e.consent,t.consent)),t.user&&(e.user=Se(e.user,t.user)),t.globals&&(e.globals=Se(e.config.globalsStatic||{},t.globals)),t.custom&&(e.custom=Se(e.custom,t.custom))),Object.values(e.destinations).forEach(e=>{e.queuePush=[]}),e.queue=[],e.round++,await ft(e)}(e,n),r=!0;break;case He.Session:r=!0;break;case He.Shutdown:await async function(e){const t=e.logger;await yt(e.sources,"source",t),await yt(e.destinations,"destination",t),await yt(e.transformers,"transformer",t),await yt(e.stores,"store",t)}(e);break;case He.User:Ae(n)&&(Se(e.user,n,{shallow:!1}),s=n,r=!0)}return r&&(await async function(e,t,n,o){let s,r=n||[];switch(n||(r=e.on[t]||[]),t){case He.Consent:s=o||e.consent;break;case He.Session:s=e.session;break;case He.User:s=o||e.user;break;case He.Custom:s=o||e.custom;break;case He.Globals:s=o||e.globals;break;case He.Config:s=o||e.config;break;case He.Ready:case He.Run:default:s=void 0}let i=!1;for(const[n,o]of Object.entries(e.sources)){if(o.config.require?.length){const e=o.config.require.indexOf(t);-1!==e&&o.config.require.splice(e,1)}o.on&&(Ve(o)?!1===await Z(o.on,o=>Xe(e,"source",o,{sourceId:n,type:t}))(t,s)&&(i=!0):(o.queueOn=o.queueOn||[],o.queueOn.push({type:t,data:s})))}Object.entries(e.destinations).forEach(([n,o])=>{if(o.on){if(!o.config.init)return o.queueOn=o.queueOn||[],void o.queueOn.push({type:t,data:s});et(e,o,n,t,s)}});for(const[t,n]of Object.entries(e.sources))Ve(n)&&n.queueOn?.length&&await Ke(e,n,t);return Object.keys(e.pending.destinations).length>0&&await async function(e,t){for(const[n,o]of Object.entries(e.pending.destinations)){if(!e.pending.destinations[n]||e.destinations[n])continue;const s=o.config?.require;if(!s)continue;const r=s.indexOf(t);if(-1===r)continue;if(s.splice(r,1),s.length>0)continue;delete e.pending.destinations[n];const i=mt(o);!1!==i.config.queue&&(i.queuePush=[...e.queue]),e.destinations[n]=i}}(e,t),tt(e,t,r,o),!i}(e,t,void 0,s),o=await ft(e)),o||ht({ok:!0})}function wt(e,t){if(!t.name)throw new Error("Event name is required");const[n,o]=t.name.split(" ");if(!n||!o)throw new Error("Event name is invalid");const{timestamp:s=Date.now(),name:r=`${n} ${o}`,data:i={},context:a={},globals:c=e.globals,custom:u={},user:l=e.user,nested:d=[],consent:f=e.consent,id:g=qe(),trigger:p="",entity:h=n,action:m=o,timing:b=0,source:y={type:"collector",schema:"4"}}=t;return{name:r,data:i,context:a,globals:c,custom:u,user:l,nested:d,consent:f,id:g,trigger:p,entity:h,action:m,timestamp:s,timing:b,source:y}}function kt(e={}){const t=e.maxEntries??1e4,n=e.lowWaterMark??.8,o=e.sweepIntervalMs??6e4,s=Math.floor(t*n),r=new Map,i={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a;return o>0&&(a=setInterval(function(){const e=Date.now();let t=0;for(const[n,o]of r)void 0!==o.expires&&o.expires<=e&&(r.delete(n),t++);i.evictions_ttl+=t},o),a&&"function"==typeof a.unref&&a.unref()),{type:"memory",config:{},get(e){const t=r.get(e);if(t)return void 0!==t.expires&&t.expires<=Date.now()?(r.delete(e),i.evictions_ttl++,void i.misses++):(r.delete(e),r.set(e,t),i.hits++,t.value);i.misses++},set(e,n,o){const a=!r.has(e);a||r.delete(e),r.set(e,{value:n,expires:void 0!==o?Date.now()+o:void 0}),i.writes++,a&&i.populates++,r.size>t&&function(){if(r.size<=t)return;const e=r.size-s;let n=0;for(const t of r.keys()){if(n>=e)break;r.delete(t),n++}i.evictions_entries+=n}()},delete(e){r.delete(e)&&i.deletes++},get counters(){return{...i}},destroy(){void 0!==a&&(clearInterval(a),a=void 0),r.clear()}}}function St(e,t){const{cacheConfig:n,cacheStore:o,namespace:s,logger:r,storeId:i}=t,a={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c=n.rules.map(e=>({match:e.match?Re(e.match):()=>!0,ttl:e.ttl})),u=e=>`${s}:${e}`;function l(e,t){const n=void 0===t?{key:e}:{key:e,value:t};return c.find(e=>e.match(n))}const d=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a}},async get(t){const n=u(t),s=await o.get(n);if(void 0!==s)return a.hits++,s;const r=d.get(n);if(r)return a.inflight_dedups++,r;a.misses++;const i=(async()=>{try{const s=await e.get(t);if(void 0===s)return;const r=l(t,s);if(r)try{await o.set(n,s,1e3*r.ttl),a.populates++}catch(e){f("set",t,e)}return s}finally{d.delete(n)}})();return d.set(n,i),i},async set(t,n,s){a.writes++,await e.set(t,n,s);const r=l(t,n);if(r)try{await o.set(u(t),n,1e3*r.ttl)}catch(e){f("set",t,e)}},async delete(t){a.deletes++,await e.delete(t);try{await o.delete(u(t))}catch(e){f("delete",t,e)}}};function f(e,t,n){const o=`store-cache(${i}): cache ${e} failed for "${t}"; backing succeeded, continuing`;r?r.warn(o,{error:n}):console.warn(o,n)}}function qt(e,t){const n=t.get,o=t.set,s=t.delete;t.get=_e(n,"StoreGet",e.hooks,e.logger),t.set=_e(o,"StoreSet",e.hooks,e.logger),t.delete=_e(s,"StoreDelete",e.hooks,e.logger)}async function Ot(e){const t=E({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),n={level:e.logger?.level,handler:e.logger?.handler},o=I(n),s={...t.globalsStatic,...e.globals},r={allowed:!1,config:t,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s,hooks:e.hooks||{},logger:o,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 i,a;r.push=function(e,t){return De(async(n,o={})=>await Ie(async()=>{const s=Date.now(),{id:r,ingest:i,respond:a,mapping:c,preChain:u,include:l,exclude:d}=o;let f=a,g=n;const p=l||d?function(e,t,n){let o=e;return t&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>t.includes(e)))),n&&(o=Object.fromEntries(Object.entries(o).filter(([e])=>!n.includes(e)))),o}(e.destinations,l,d):void 0,h=i??Ce(r||"unknown");if(c){const t=await Ee(g,c,e);if(t.ignore)return ht({ok:!0});if(c.consent&&!Pe(c.consent,e.consent,t.event.consent))return ht({ok:!0});g=t.event}if(u?.length&&e.transformers&&Object.keys(e.transformers).length>0){const n=await Je(e,e.transformers,u,g,h,f,r?`source.${r}.next`:void 0);if(null===n.event)return ht({ok:!0});if(n.stopped)return n.respond&&(f=n.respond),ht({ok:!0});if(n.respond&&(f=n.respond),Array.isArray(n.event)){const o=await Promise.all(n.event.map(async n=>{const o=t(n),s=wt(e,o);return ft(e,s,{id:r,ingest:h,respond:f},p)}));if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count+=n.event.length,t.lastAt=Date.now(),t.duration+=Date.now()-s}return o[0]??ht({ok:!0})}g=n.event}const m=t(g),b=wt(e,m),y=await ft(e,b,{id:r,ingest:h,respond:f},p);if(r){e.status.sources[r]||(e.status.sources[r]={count:0,duration:0});const t=e.status.sources[r];t.count++,t.lastAt=Date.now(),t.duration+=Date.now()-s}return y},t=>{if(t instanceof je)throw t;return e.status.failed++,e.logger.error("push failed",{event:n,ingest:o.ingest,error:t}),ht({ok:!1})})(),"Push",e.hooks,e.logger)}(r,e=>({timing:Math.round((Date.now()-r.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.0"},...e})),r.command=(a=vt,Te(async(e,t,n)=>await $e(async()=>await a(i,e,t,n),n=>{if(n instanceof Me)throw n;return i.status.failed++,i.logger.error("command failed",{command:e,data:t,error:n}),ht({ok:!1})})(),"Command",(i=r).hooks,i.logger));const c=e.stores||{};return r.stores=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,config:r={},env:i={}}=s,a=e.logger.scope("store").scope(o),c={collector:e,logger:a,id:o,config:r,env:i},u=await t(c);n[o]=u}const o=t,s=function(e){const t={};for(const n of Object.keys(e))t[n]="WHITE";const n=[],o=[];function s(r){const i=t[r];if("BLACK"===i)return;if("GRAY"===i){const e=o.indexOf(r),t=o.slice(-1===e?0:e).concat(r).join(" -> ");throw new Error(`Cycle in cache.store chain: ${t}`)}t[r]="GRAY",o.push(r);const a=e[r].cache?.store;if(void 0!==a){if(!(a in e))throw new Error(`Store "${r}" cache.store references "${a}", which is not declared in flow.stores`);s(a)}o.pop(),t[r]="BLACK",n.push(r)}for(const n of Object.keys(e))"WHITE"===t[n]&&s(n);return n}(o);for(const t of s){const s=o[t].cache;if(!s)continue;let r,i;void 0!==s.store?(r=n[s.store],i=s.store):(n.__cache||(n.__cache=kt()),r=n.__cache,i="__cache");const a=s.namespace??t;e.logger.scope("store-cache").scope(t).info(`store "${t}" caches with namespace "${a}:" via ${i}`),n[t]=St(n[t],{storeId:t,cacheConfig:s,cacheStore:r,namespace:a,logger:e.logger.scope("store-cache").scope(t)})}for(const[t,o]of Object.entries(n))"__cache"!==t&&qt(e,o);return n}(r,c),function(e,t,n){const o=new Map;for(const[n,s]of Object.entries(e))t[n]&&o.set(s,t[n]);if(0!==o.size)for(const e of[n.transformers,n.destinations,n.sources])if(e)for(const t of Object.values(e))s(t.env);function s(e){if(e)for(const[t,n]of Object.entries(e))if("object"==typeof n&&null!==n){const s=o.get(n);s&&(e[t]=s)}}}(c,r.stores,e),r.stores.__cache||(r.stores.__cache=kt()),r.destinations=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t))s.config?.require?.length?e.pending.destinations[o]=s:n[o]=mt(s);return n}(r,e.destinations||{}),r.transformers=await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const{code:t,env:r={}}=s,i=we(s,"Transformer");if(!i.ok){e.logger.warn(`Transformer ${o} invalid (${i.code}): ${i.reason}. Skipping.`);continue}const{config:a}=ze(s,"before"),{config:c}=ze({...s,config:a},"next"),u=Object.keys(r).length>0?{...c,env:r}:c,{cache:l}=s,d=l?{...u,cache:l}:u,f=e.logger.scope("transformer").scope(o),g={collector:e,logger:f,id:o,ingest:le(o),config:d,env:r},p=t??(e=>{const t=s.mapping;if(t){const n=[];if(void 0!==t.data&&n.push("data"),t.mapping)for(const[e,o]of Object.entries(t.mapping))if("object"==typeof o&&null!==o)for(const[t,s]of Object.entries(o)){if("object"!=typeof s||null===s)continue;const o=s;void 0!==o.data&&n.push(`mapping[${e}][${t}].data`),void 0!==o.silent&&n.push(`mapping[${e}][${t}].silent`)}return n.length>0&&e.collector.logger.warn(`Transformer ${o}: \`${n.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e.config,push:async n=>{const o=await ke(n,t,e.collector);return!o.ignore&&{event:o.event}}}}return{type:"pass",config:e.config,push:e=>({event:e})}}),h=await p(g);void 0!==s.before&&void 0===h.config?.before&&(h.config={...h.config??{},before:s.before}),void 0!==s.next&&void 0===h.config?.next&&(h.config={...h.config??{},next:s.next}),n[o]=h}return n}(r,e.transformers||{}),r}async function xt(e){e=e||{};const t=await Ot(e),n=(o=t,{type:"elb",config:{},push:async(e,t,n,s,r)=>{if("string"==typeof e&&e.startsWith("walker ")){const n=e.replace("walker ","");return o.command(n,t)}let i;if("string"==typeof e)i={name:e},t&&"object"==typeof t&&!Array.isArray(t)&&(i.data=t);else{if(!e||"object"!=typeof e)return ht({ok:!1});i=e,t&&"object"==typeof t&&!Array.isArray(t)&&(i.data={...i.data||{},...t})}return n&&"object"==typeof n&&(i.context=n),s&&Array.isArray(s)&&(i.nested=s),r&&"object"==typeof r&&(i.custom=r),o.push(i)}});var o;t.sources.elb=n,await async function(e,t={}){const n={};for(const[o,s]of Object.entries(t)){const t=await Ye(e,o,s);if(!t)continue;const r=s.config?.require;t.config={...t.config,init:!1,...r?{require:[...r]}:{}},n[o]=t}Object.assign(e.sources,n);for(const t of Object.keys(n)){const n=e.sources[t];let o=!1;n.init&&await oe(n.init.bind(n),n=>{if(n instanceof te)throw n;o=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:t,error:n})})(),o||(n.config.init=!0,Ve(n)&&await Ke(e,n,t))}return n}(t,e.sources||{});const{consent:s,user:r,globals:i,custom:a}=e;s&&await t.command("consent",s),r&&await t.command("user",r),i&&Object.assign(t.globals,i),a&&Object.assign(t.custom,a),t.config.run&&await t.command("run");let c=n.push;const u=Object.values(t.sources).filter(e=>"elb"!==e.type),l=u.find(e=>e.config.primary);return l?c=l.push:u.length>0&&(c=u[0].push),{collector:t,elb:c}}var At=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await xt(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources||{}))if("lambda"===t.type)return t}(t.collector);if(!o)throw new Error("Lambda source not found in collector");const s={awsRequestId:`test-${Date.now()}`},r=o.push,i=await r(n,s);let a;try{a=JSON.parse(i.body||"{}")}catch{a=i.body}const c={};if(i.headers)for(const[e,t]of Object.entries(i.headers))void 0!==t&&(c[e]=String(t));return{statusCode:i.statusCode,body:a,headers:c}}}};function Ct(e){return async t=>{const n={...t};if(n.body&&"string"==typeof n.body){const e=JSON.parse(n.body);e.name&&!e.event&&(n.body=JSON.stringify({...e,event:e.name,name:void 0}))}return e.push(n,{awsRequestId:"test-req"})}}var jt={};t(jt,{createTrigger:()=>zt,env:()=>Pt,step:()=>$t});var Pt={};t(Pt,{push:()=>Mt,simulation:()=>Tt});var Et=()=>{},It={error:Et,warn:Et,info:Et,debug:Et,throw:e=>{throw"string"==typeof e?new Error(e):e},json:Et,scope:()=>It},Dt=()=>()=>Promise.resolve({ok:!0}),Mt={get push(){return Dt()},get command(){return Dt()},get elb(){return Dt()},logger:It},Tt=["AWS.SQSClient"],$t={};t($t,{decoderText:()=>Ht,malformedJson:()=>Nt,orderComplete:()=>Rt,pageView:()=>_t});var _t={title:"Page view from SQS",description:"A standard SQS message body containing a walker elb event payload as JSON.",in:{MessageId:"m-1",Body:JSON.stringify({event:"page view",data:{title:"Documentation",url:"https://example.com/docs"}})},out:[["message.ack","m-1"]]},Rt={title:"Order complete from SQS",description:"Order complete event flowing through the long-poll loop.",in:{MessageId:"m-2",Body:JSON.stringify({event:"order complete",data:{id:"ORD-500",total:199.99,currency:"EUR"}})},out:[["message.ack","m-2"]]},Ht={title:"Text decoder",description:'When decoder is "text", the body string flows under data.payload.',in:{MessageId:"m-3",Body:"raw text payload"},out:[["message.ack","m-3"]]},Nt={title:"Malformed JSON nacks",description:"Default decoder is JSON. A malformed body throws DecoderError; the source nacks (skips DeleteMessage) so the message redelivers.",in:{MessageId:"m-4",Body:"{not json"},out:[["message.nack","m-4"]]};function Bt(e){if("object"!=typeof e||null===e)return!1;const t=e;return"sqs"===t.type&&"function"==typeof t.push}var zt=async e=>{let t;return{get flow(){return t},trigger:()=>async n=>{if(!t){const n=await xt(e);t={collector:n.collector,elb:n.elb}}const o=function(e){for(const t of Object.values(e.sources??{}))if(Bt(t))return t}(t.collector);if(!o)throw new Error("sqs source not registered in collector, ensure it is configured in sources");const s={MessageId:n.MessageId,Body:n.Body,ReceiptHandle:n.ReceiptHandle,Attributes:n.Attributes,MessageAttributes:n.MessageAttributes},r=await o.push(s),i=[];return r&&"object"==typeof r&&(r.acked&&i.push(["message.ack",n.MessageId]),r.nacked&&i.push(["message.nack",n.MessageId])),i}}};export{v as examples,n as schemas,jt as sqsExamples};//# sourceMappingURL=dev.mjs.map
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var mod,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},index_exports={};__export(index_exports,{SourceLambda:()=>types_exports,SourceSqs:()=>types_exports2,examples:()=>examples_exports,sourceLambda:()=>lambda_default,sourceSqs:()=>sqs_default}),module.exports=(mod=index_exports,((to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to})(__defProp({},"__esModule",{value:!0}),mod));var import_core14=require("@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_core=require("@walkeros/core"),import_core2=require("@walkeros/core"),import_core3=require("@walkeros/core"),import_core4=require("@walkeros/core"),import_core5=require("@walkeros/core"),import_core6=require("@walkeros/core"),import_core7=require("@walkeros/core"),import_core8=require("@walkeros/core"),import_core9=require("@walkeros/core"),import_core10=require("@walkeros/core"),import_core11=require("@walkeros/core"),import_core12=require("@walkeros/core"),import_core13=require("@walkeros/core"),t_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 Q(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function X(e){const n2={};for(const[t2,o2]of Object.entries(e)){const e2=o2.config?.next;"string"==typeof e2||Array.isArray(e2)&&e2.every(e3=>"string"==typeof e3)?n2[t2]={next:e2}:n2[t2]={}}return n2}function Z(e,n2){const t2=e.config||{},o2=e[n2];return void 0!==o2?{config:{...t2,[n2]:o2},chainValue:o2}:{config:t2,chainValue:void 0}}function ee(e,n2={}){if(!e)return[];if(Array.isArray(e))return e;const t2=[],o2=new Set;let s2=e;for(;s2&&n2[s2]&&!o2.has(s2);){o2.add(s2),t2.push(s2);const e2=n2[s2].next;if(Array.isArray(e2)){t2.push(...e2);break}s2=e2}return t2}async function ne(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:t2,ingest:(0,import_core7.createIngest)(t2),config:n2.config,env:re(n2.config.env)};s2.debug("init");const i2=await(0,import_core7.useHooks)(n2.init,"TransformerInit",e.hooks,e.logger)(r2);if(!1===i2)return!1;n2.config={...i2||n2.config,env:i2?.env||n2.config.env,init:!0},s2.debug("init done")}return!0}async function te(e,n2,t2,o2,s2,r2){const i2=n2.type||"unknown",a2=e.logger.scope(`transformer:${i2}`),c2={collector:e,logger:a2,id:t2,ingest:s2,config:n2.config,env:{...re(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await(0,import_core7.useHooks)(n2.push,"TransformerPush",e.hooks,e.logger)(o2,c2);return a2.debug("push done"),u2}function oe(e,n2){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:(0,import_core7.createIngest)(n2)}async function se(e,n2,t2,o2,s2,r2,i2){s2||(s2=(0,import_core7.createIngest)(t2[0]??"chain")),i2&&s2._meta&&(s2._meta.chainPath=i2);let a2=o2,c2=r2;for(const o3 of t2){const r3=n2[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(0,import_core7.tryCatchAsync)(ne,n3=>{if(n3 instanceof import_core7.FatalError)throw n3;return e.status.failed++,e.logger.scope(`transformer:${r3.type||"unknown"}`).error("transformer init failed",{transformer:o3,error:n3}),!1})(e,r3,o3))return{event:null,respond:c2};if(i2&&void 0!==r3.config?.chainMocks?.[i2]){const n3=r3.config.chainMocks[i2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:i2}),a2=n3;continue}if(void 0!==r3.config?.mock){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),a2=r3.config.mock;continue}if(r3.config?.disabled)continue;const u2=r3.config?.cache,l2=u2?(0,import_core7.compileCache)(u2):void 0,f2=l2?Q(l2,e):void 0;let d2;if(l2&&f2){const e2=(0,import_core7.buildCacheContext)(s2,a2),n3=await(0,import_core7.checkCache)(l2,f2,e2);if("HIT"===n3?.status&&n3.value){if(a2=n3.value,l2.stop)return{event:a2,respond:c2,stopped:!0};continue}"MISS"===n3?.status&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=(0,import_core7.getNextSteps)(g2,(0,import_core7.buildCacheContext)(s2,a2));if(1===t3.length){const o4=ee(t3[0],X(n2));if(o4.length>0){const t4=await se(e,n2,o4,a2,s2,c2,i2);if(null===t4.event)return{event:null,respond:t4.respond??c2};if(t4.stopped)return{event:Array.isArray(t4.event)?t4.event[0]:t4.event,respond:t4.respond??c2,stopped:!0};t4.respond&&(c2=t4.respond),a2=Array.isArray(t4.event)?t4.event[0]:t4.event}}else t3.length>1&&await Promise.all(t3.map(t4=>(0,import_core7.tryCatchAsync)(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),a2,oe(s2,t4),void 0,i2)))}const p2=await(0,import_core7.tryCatchAsync)(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===p2)return{event:null,respond:c2};if(Array.isArray(p2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(p2.map(async t3=>{const o4=t3.event||a2,u4=oe(s2,"unknown");if(t3.next){const s3=(0,import_core7.getNextSteps)(t3.next,(0,import_core7.buildCacheContext)(u4,o4));if(0===s3.length)return{event:o4,respond:c2};if(1===s3.length){const t4=ee(s3[0],X(n2));return t4.length>0?se(e,n2,t4,o4,u4,c2,i2):{event:o4,respond:c2}}return(await Promise.all(s3.map(t4=>(0,import_core7.tryCatchAsync)(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),o4,oe(u4,t4),void 0,i2)))).map(e2=>({event:e2.event,respond:void 0}))}return r4.length>0?se(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let l3=c2;const f3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(l3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?f3.push(...n3.event):f3.push(n3.event)}else f3.push(e2);return 0===f3.length?{event:null,respond:l3}:1===f3.length?{event:f3[0],respond:l3}:{event:f3,respond:l3}}if(p2&&"object"==typeof p2){const{event:t3,respond:o4,next:r4}=p2;if(o4&&(c2=o4),void 0!==r4){const o5=(0,import_core7.getNextSteps)(r4,(0,import_core7.buildCacheContext)(s2,a2));if(0===o5.length){t3&&(a2=t3);continue}if(1===o5.length){const u3=ee(o5[0],X(n2));return u3.length>0?se(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}return await Promise.all(o5.map(o6=>(0,import_core7.tryCatchAsync)(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${o6} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(o6,X(n2)),t3||a2,oe(s2,o6),void 0,i2))),{event:null,respond:void 0}}t3&&(a2=t3)}d2&&f2&&(0,import_core7.storeCache)(f2,d2.key,a2,d2.ttl);const h2=r3.config.next,m2="string"==typeof h2||Array.isArray(h2)&&h2.every(e2=>"string"==typeof e2),y2=void 0!==h2&&!m2;if((!p2||"object"==typeof p2&&!p2.next)&&y2){const t3=(0,import_core7.getNextSteps)(r3.config.next,(0,import_core7.buildCacheContext)(s2,a2));if(1===t3.length){const o4=ee(t3[0],X(n2));return o4.length>0?se(e,n2,o4,a2,s2,c2,i2):{event:a2,respond:c2}}return t3.length>1?(await Promise.all(t3.map(t4=>(0,import_core7.tryCatchAsync)(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),a2,oe(s2,t4),void 0,i2))),{event:null,respond:void 0}):{event:a2,respond:c2}}}return{event:a2,respond:c2}}function re(e){return e&&(0,import_core7.isObject)(e)?e:{}}function ie(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e2=>"string"==typeof e2))}async function ae(e,n2,t2){if(!n2.on||!n2.queueOn?.length)return;const o2=n2.queueOn;n2.queueOn=[];const s2=t2||n2.config?.id||"unknown";for(const{type:t3,data:r2}of o2)await(0,import_core6.tryCatchAsync)(n2.on,n3=>{if(n3 instanceof import_core6.FatalError)throw n3;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s2,type:t3,error:n3})})(t3,r2)}function ce(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ue(e,n2,t2){const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2,l2=u2,f2=l2?(0,import_core6.compileCache)({...l2,stop:l2.stop??!0}):void 0,d2=ie(a2)?ee(a2,X(e.transformers)):void 0,g2=ie(c2)?ee(c2,X(e.transformers)):void 0,p2=r2.push,h2=p2??e.push,m2=Boolean(p2),y2=async(t3,o3,r3)=>{let i3;const u3=g2??(void 0!==c2?(()=>{const n3=(0,import_core6.getNextSteps)(c2,(0,import_core6.buildCacheContext)(r3.ingest));return 0===n3.length?[]:ee(1===n3.length?n3[0]:n3,X(e.transformers))})():[]);let l3=[t3];if(u3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o4=await se(e,e.transformers,u3,t3,r3.ingest,r3.respond,`source.${n2}.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),l3=Array.isArray(o4.event)?o4.event:[o4.event]}if(f2){const n3=Q(f2,e);if(n3){const t4=(0,import_core6.buildCacheContext)(r3.ingest),o4=await(0,import_core6.checkCache)(f2,n3,t4);if(o4){if("HIT"===o4.status&&void 0!==o4.value&&f2.stop){let n4=o4.value;return o4.rule.update&&(n4=await(0,import_core6.applyUpdate)(n4,o4.rule.update,{...t4,cache:{status:"HIT"}},e)),r3.respond?.(n4),{ok:!0}}if("MISS"===o4.status&&f2.stop&&r3.respond){const s3=r3.respond,a3=o4.rule.update,c3={...t4,cache:{status:"MISS"}},u4=o4.key,l4=o4.rule.ttl,f3=t5=>{(0,import_core6.storeCache)(n3,u4,t5,l4),a3?i3=(async()=>{const n4=await(0,import_core6.applyUpdate)(t5,a3,c3,e);s3(n4)})():s3(t5)};r3.respond=f3}"MISS"!==o4.status||f2.stop||(0,import_core6.storeCache)(n3,o4.key,!0,o4.rule.ttl)}}}const p3=d2?{kind:"single",preChain:d2}:void 0!==a2?(()=>{const n3=(0,import_core6.getNextSteps)(a2,(0,import_core6.buildCacheContext)(r3.ingest));return 0===n3.length?{kind:"single",preChain:[]}:1===n3.length?{kind:"single",preChain:ee(n3[0],X(e.transformers))}:{kind:"many",branches:n3.map(n4=>ee(n4,X(e.transformers)))}})():{kind:"single",preChain:[]};let y3={ok:!0};for(const t4 of l3)"many"===p3.kind?(await Promise.all(p3.branches.map((i4,a3)=>(0,import_core6.tryCatchAsync)(async()=>m2?h2(t4):h2(t4,{...o3,id:n2,ingest:oe(r3.ingest,`${n2}.${a3}`),respond:void 0,mapping:s2,preChain:i4}),n3=>(e.logger.scope("source:many").error(`many branch ${a3} failed`,{error:n3}),{ok:!0}))())),y3={ok:!0}):y3=m2?await h2(t4):await h2(t4,{...o3,id:n2,ingest:r3.ingest,respond:r3.respond,mapping:s2,preChain:p3.preChain});return i3&&await i3,y3},v2=async t3=>{const o3=(0,import_core6.createIngest)(n2);if(!s2.ingest||void 0===t3)return o3;const r3=await(0,import_core6.getMappingValue)(t3,s2.ingest,{collector:e});return{...o3,...r3,_meta:o3._meta}},w2=e.logger.scope("source").scope(n2),b2={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:w2,...r2,push:async(e2,t3={})=>{const o3={ingest:(0,import_core6.createIngest)(n2),respond:void 0};return y2(e2,t3,o3)}},k2={collector:e,logger:w2,id:n2,config:s2,env:b2,withScope:async(e2,n3,t3)=>{const o3={ingest:await v2(e2),respond:n3};return t3({...b2,push:(e3,n4={})=>y2(e3,n4,o3),ingest:o3.ingest,respond:o3.respond})}},C2=await(0,import_core6.tryCatchAsync)(o2,t3=>{if(t3 instanceof import_core6.FatalError)throw t3;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:n2,error:t3})})(k2);if(!C2)return;const q2=C2.type||"unknown",x2=e.logger.scope(q2).scope(n2);return b2.logger=x2,i2&&(C2.config={...C2.config,primary:i2}),C2}function fe(e,n2,t2,o2){if(t2 instanceof import_core4.FatalError)throw t2;e.logger.scope("on").error("on callback failed",{kind:n2,...o2,error:t2})}function de(e,n2){return{collector:e,logger:e.logger.scope("on").scope(String(n2))}}function pe(e,n2,t2,o2,s2){if(!n2.on)return;const r2=n2.type||"unknown",i2=e.logger.scope(r2).scope("on").scope(o2),a2={collector:e,logger:i2,id:t2,config:n2.config,data:s2,env:De(n2.env,n2.config.env)};(0,import_core5.tryCatch)(n2.on,n3=>fe(e,"destination",n3,{destId:t2,type:o2}))(o2,a2)}function he(e,n2,o2,s2){let r2;switch(n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}if(o2.length)switch(n2){case t_Commands.Consent:!function(e2,n3,o3){const s3=o3||e2.consent,r3=de(e2,t_Commands.Consent);n3.forEach(n4=>{Object.keys(s3).filter(e3=>e3 in n4).forEach(t2=>{(0,import_core5.tryCatch)(n4[t2],n5=>fe(e2,"consent",n5,{key:t2}))(s3,r3)})})}(e,o2,s2);break;case t_Commands.Ready:!function(e2,n3){if(!e2.allowed)return;const o3=de(e2,t_Commands.Ready);n3.forEach(n4=>{(0,import_core5.tryCatch)(n4,n5=>fe(e2,"ready",n5))(void 0,o3)})}(e,o2);break;case t_Commands.Run:!function(e2,n3){if(!e2.allowed)return;const o3=de(e2,t_Commands.Run);n3.forEach(n4=>{(0,import_core5.tryCatch)(n4,n5=>fe(e2,"run",n5))(void 0,o3)})}(e,o2);break;case t_Commands.Session:!function(e2,n3){if(!e2.session)return;const o3=de(e2,t_Commands.Session);n3.forEach(n4=>{(0,import_core5.tryCatch)(n4,n5=>fe(e2,"session",n5))(e2.session,o3)})}(e,o2);break;default:{const t2=de(e,n2);o2.forEach(o3=>{"function"==typeof o3&&(0,import_core5.tryCatch)(o3,t3=>fe(e,"generic",t3,{type:n2}))(r2,t2)});break}}}function ye(e,n2,t2,o2){if(!Number.isFinite(t2.max)||t2.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${t2.max})`);if("dropNewest"===(t2.onOverflow??"dropOldest"))return e.length>=t2.max?(o2&&o2([n2]),{appended:!1,dropped:1}):(e.push(n2),{appended:!0,dropped:0});const s2=[];for(;e.length>=t2.max;)s2.push(e.shift());return e.push(n2),s2.length>0&&o2&&o2(s2),{appended:!0,dropped:s2.length}}var ve=new WeakMap;function we(e,n2,t2,o2){ve.get(e)||(ve.set(e,!0),n2.warn(t2,o2))}function be(e){ve.delete(e)}var ke=Object.freeze({batched:!0});function Ce(e){return e===ke}function qe(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function xe(e,n2){return e.status.destinations[n2]||(e.status.destinations[n2]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[n2]}function Oe(e,n2,t2,o2){e.dropped[n2]||(e.dropped[n2]={});const s2=e.dropped[n2];return s2[t2]=(s2[t2]??0)+o2,s2[t2]}function je(e,n2,t2){if(!e)return[];if(Array.isArray(e)&&e.every(e2=>"string"==typeof e2))return ee(e,n2);if("string"==typeof e)return ee(e,n2);const o2=(0,import_core3.getNextSteps)(e,(0,import_core3.buildCacheContext)(t2));return 0===o2.length?[]:1===o2.length?ee(o2[0],n2):ee(o2,n2)}async function Se(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return Ee({ok:!1});if(n2){const t3=e.config.queueMax;if(void 0===t3)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o3=ye(e.queue,n2,{max:t3});if(o3.dropped>0){const n3=Oe(e.status,(0,import_core3.stepId)("collector"),"queue",o3.dropped);we(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:t3,droppedCount:n3})}else e.queue.length<t3&&be(e.queue);e.status.in++}o2||(o2=e.destinations);const h2=e.transformers?X(e.transformers):{},y2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let y3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&y3.push((0,import_core3.clone)(n2));const v3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:(0,import_core3.createIngest)("unknown");if(!y3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!y3.length&&s3.queueOn?.length){let n3=!1;try{n3=await $e(e,s3,o3)}catch(n4){e.status.failed++;const t3=s3.type||"unknown";e.logger.scope(t3).error("destination init failed",{error:n4 instanceof Error?n4.message:String(n4)})}return{id:o3,destination:s3,skipped:!n3}}const w3=[],b3=y3.filter(e2=>{const n3=(0,import_core3.getGrantedConsent)(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,w3.push(e2),!1)});if(b3.length>0){const n3=s3.queuePush,t3=s3.config.id||o3,r3={max:s3.config.queueMax??1e3};let i3=0;for(const e2 of b3)i3+=ye(n3,e2,r3).dropped;if(i3>0){xe(e,t3);const o4=Oe(e.status,(0,import_core3.stepId)("destination",t3),"queue",i3);we(n3,e.logger.scope(s3.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:t3,cap:r3.max,droppedCount:o4})}else n3.length<r3.max&&be(n3)}if(!w3.length)return{id:o3,destination:s3,queue:y3};let k2,x2,O2=!1;try{O2=await $e(e,s3,o3)}catch(n3){e.status.failed++;const t3=s3.type||"unknown";e.logger.scope(t3).error("destination init failed",{error:n3 instanceof Error?n3.message:String(n3)})}if(!O2)return{id:o3,destination:s3,queue:y3};s3.dlq||(s3.dlq=[]);const j2=je(s3.config.before,h2,v3),A2=s3.config.next,S2=s3.config?.cache,$2=S2?(0,import_core3.compileCache)(S2):void 0,_2=$2?Q($2,e):void 0;let E2=0,I2=0;return await Promise.all(w3.map(async n3=>{let r3;if(n3.globals=(0,import_core3.assign)(i2,n3.globals),n3.user=(0,import_core3.assign)(p2,n3.user),$2?.stop&&_2){const e2=(0,import_core3.buildCacheContext)(v3,n3),t3=await(0,import_core3.checkCache)($2,_2,e2);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,l2=t2.respond;if(j2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await se(e,e.transformers,j2,n3,v3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(l2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if($2&&!$2.stop&&_2){const e2=(0,import_core3.buildCacheContext)(v3,u2),t3=await(0,import_core3.checkCache)($2,_2,e2);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}const g2=Date.now();let m2=!1;const y4=await(0,import_core3.tryCatchAsync)(_e,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),k2=n4,m2=!0;const r4=s3.dlq,i3=s3.config.id||o3,a2={max:s3.config.dlqMax??100},c2=ye(r4,[u2,n4],a2);if(c2.dropped>0){xe(e,i3);const n5=Oe(e.status,(0,import_core3.stepId)("destination",i3),"dlq",c2.dropped);we(r4,e.logger.scope(s3.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:i3,cap:a2.max,droppedCount:n5})}else r4.length<a2.max&&be(r4)})(e,s3,o3,u2,v3,l2);if(E2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&(0,import_core3.storeCache)(_2,r3.key,y4??!0,r3.ttl),void 0===y4||Ce(y4)||(x2=y4),Ce(y4)&&I2++,!m2&&A2){void 0!==y4&&(v3._response=y4);const n4=je(A2,h2,v3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await se(e,e.transformers,n4,u2,v3,l2,`destination.${o3}.next`);t3.respond&&(l2=t3.respond)}}return n3})),{id:o3,destination:s3,error:k2,response:x2,totalDuration:E2,batchedCount:I2,allowedCount:w3.length}})),v2={},w2={},b2={};for(const n3 of y2){if(n3.skipped)continue;const t3=n3.destination,o3={type:t3.type||"unknown",data:n3.response};xe(e,n3.id);const s3=e.status.destinations[n3.id],r3=Date.now();if(s3.queuePushSize=t3.queuePush?.length??0,s3.dlqSize=t3.dlq?.length??0,n3.error)o3.error=n3.error,b2[n3.id]=o3,s3.failed++,s3.lastAt=r3,s3.duration+=n3.totalDuration||0,e.status.failed++;else if(n3.queue&&n3.queue.length)w2[n3.id]=o3;else{const t4=n3.batchedCount??0,i3=n3.allowedCount??0;(Math.max(0,i3-t4)>0||0===i3)&&(v2[n3.id]=o3,s3.count++,s3.lastAt=r3,s3.duration+=n3.totalDuration||0,e.status.out++)}}return Ee({event:n2,...Object.keys(v2).length&&{done:v2},...Object.keys(w2).length&&{queued:w2},...Object.keys(b2).length&&{failed:b2}})}async function $e(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:t2,config:n2.config,env:De(n2.env,n2.config.env)};s2.debug("init");const i2=await(0,import_core3.useHooks)(n2.init,"DestinationInit",e.hooks,e.logger)(r2);if(!1===i2)return i2;if(n2.config={...i2||n2.config,init:!0},n2.queueOn?.length){const o3=n2.queueOn;n2.queueOn=[];for(const{type:s3,data:r3}of o3)pe(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function _e(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await(0,import_core3.processEventMapping)(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),l2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...De(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const f2=a2.mapping,d2=a2.mappingKey||"* *";if(f2?.batch&&n2.pushBatch&&void 0===i2.mock){if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,entries:[],events:[],data:[]},s3=qe(f2.batch),r3=qe(i2.batch),a3=s3.wait??r3.wait??3e4,c4=s3.size??r3.size??1e3,l4=s3.age??r3.age??3e4,g2=De(n2.env,i2.env),h2=(0,import_core3.debounce)(async()=>{const o5=n2.batches[d2].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],a4={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:r4.rule,ingest:r4.ingest,env:{...g2,...r4.respond?{respond:r4.respond}:{}}};u2.debug("push batch",{events:s4.entries.length});const c5=n2.config.id||t2,l5=xe(e,c5);let f3=!0;await(0,import_core3.tryCatchAsync)((0,import_core3.useHooks)(n2.pushBatch,"DestinationPushBatch",e.hooks,e.logger),t3=>{f3=!1;const o6=n2.dlq=n2.dlq||[],r5={max:n2.config.dlqMax??100};let i3=0;for(const e2 of s4.entries)i3+=ye(o6,[e2.event,t3],r5).dropped;if(i3>0){const n3=Oe(e.status,(0,import_core3.stepId)("destination",c5),"dlq",i3);we(o6,u2,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c5,cap:r5.max,droppedCount:n3})}else o6.length<r5.max&&be(o6);l5.failed+=s4.entries.length,l5.dlqSize=o6.length,e.status.failed+=s4.entries.length,u2.error("Push batch failed",{error:t3 instanceof Error?t3.message:String(t3),entries:s4.entries.length})})(s4,a4),u2.debug("push batch done"),l5.inFlightBatch=Math.max(0,(l5.inFlightBatch??0)-s4.entries.length),f3&&(l5.count+=s4.entries.length,l5.lastAt=Date.now(),e.status.out+=s4.entries.length)},{wait:a3,size:c4,age:l4});n2.batches[d2]={batched:o4,batchFn:()=>{h2()},flush:async()=>{await h2.flush()}}}const o3=n2.batches[d2];o3.batched.entries.push({event:a2.event,ingest:s2,respond:r2,rule:f2,data:a2.data}),o3.batched.events.push(a2.event),(0,import_core3.isDefined)(a2.data)&&o3.batched.data.push(a2.data);const c3=n2.config.id||t2,l3=xe(e,c3);return l3.inFlightBatch=(l3.inFlightBatch??0)+1,o3.batchFn(),ke}{u2.debug("push",{event:a2.event.name});const t3=await(0,import_core3.useHooks)(n2.push,"DestinationPush",e.hooks,e.logger)(a2.event,l2);return u2.debug("push done"),t3}}function Ee(e){return{ok:!e?.failed,...e}}function Ie(e){const{code:n2,config:t2={},env:o2={},cache:s2}=e,{config:r2}=Z(e,"before"),{config:i2}=Z({...e,config:r2},"next"),a2={...n2.config,...t2,...i2};s2&&(a2.cache=s2);const c2=De(n2.env,o2);return{...n2,config:a2,env:c2}}function De(e,n2){return e||n2?n2?e&&(0,import_core3.isObject)(e)&&(0,import_core3.isObject)(n2)?{...e,...n2}:n2:e:{}}async function He(e,n2,t2){const o2=Object.entries(e).map(async([e2,o3])=>{const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",i2=t2.scope(r2),a2={id:e2,config:o3.config,env:o3.env??{},logger:i2};try{await Promise.race([s2(a2),new Promise((t3,o4)=>setTimeout(()=>o4(new Error(`${n2} '${e2}' destroy timed out`)),5e3))])}catch(t3){i2.error(`${n2} '${e2}' destroy failed: ${t3}`)}});await Promise.allSettled(o2)}async function Fe(e,n2,o2){let r2,i2,a2=!1;switch(n2){case t_Commands.Config:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.config,o2,{shallow:!1}),i2=o2,a2=!0);break;case t_Commands.Consent:if((0,import_core9.isObject)(o2)){const{update:n3}=function(e,n2){const t2={};return Object.entries(n2).forEach(([e2,n3])=>{t2[e2]=!!n3}),e.consent=(0,import_core.assign)(e.consent,t2),{update:t2}}(e,o2);i2=n3,a2=!0}break;case t_Commands.Custom:(0,import_core9.isObject)(o2)&&(e.custom=(0,import_core8.assign)(e.custom,o2),i2=o2,a2=!0);break;case t_Commands.Destination:(0,import_core9.isObject)(o2)&&"code"in o2&&(0,import_core9.isObject)(o2.code)&&(r2=await async function(e,n2){const{code:t2,config:o2={},env:s2={},before:r2,next:i2,cache:a2}=n2;if(!(0,import_core3.isFunction)(t2.push))return Ee({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};i2&&(u2={...u2,next:i2}),a2&&(u2={...u2,cache:a2});const l2={...t2,config:u2,env:De(t2.env,s2)};let f2=l2.config.id;if(!f2)do{f2=(0,import_core3.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f2]);return e.destinations[f2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),Se(e,void 0,{},{[f2]:l2})}(e,o2));break;case t_Commands.Globals:(0,import_core9.isObject)(o2)&&(e.globals=(0,import_core8.assign)(e.globals,o2),i2=o2,a2=!0);break;case t_Commands.Hook:if((0,import_core9.isObject)(o2)&&(0,import_core8.isString)(o2.name)&&(0,import_core8.isFunction)(o2.fn)){const{name:n3,fn:t2}=o2;e.hooks[n3]=t2,i2=o2,a2=!0}break;case t_Commands.On:if((0,import_core9.isObject)(o2)&&(0,import_core8.isString)(o2.type)){const{type:n3,rules:t2}=o2;await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=(0,import_core4.isArray)(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,he(e,n2,r2)}(e,n3,t2)}break;case t_Commands.Ready:a2=!0;break;case t_Commands.Run:r2=await async function(e,n2){return e.allowed=!0,e.timing=Date.now(),n2&&(n2.consent&&(e.consent=(0,import_core8.assign)(e.consent,n2.consent)),n2.user&&(e.user=(0,import_core8.assign)(e.user,n2.user)),n2.globals&&(e.globals=(0,import_core8.assign)(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=(0,import_core8.assign)(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await Se(e)}(e,o2),a2=!0;break;case t_Commands.Session:a2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await He(e2.sources,"source",n3),await He(e2.destinations,"destination",n3),await He(e2.transformers,"transformer",n3),await He(e2.stores,"store",n3)}(e);break;case t_Commands.User:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.user,o2,{shallow:!1}),i2=o2,a2=!0)}return a2&&(await async function(e,n2,o2,s2){let r2,i2=o2||[];switch(o2||(i2=e.on[n2]||[]),n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}let a2=!1;for(const[t2,o3]of Object.entries(e.sources)){if(o3.config.require?.length){const e2=o3.config.require.indexOf(n2);-1!==e2&&o3.config.require.splice(e2,1)}o3.on&&(ce(o3)?!1===await(0,import_core5.tryCatchAsync)(o3.on,o4=>fe(e,"source",o4,{sourceId:t2,type:n2}))(n2,r2)&&(a2=!0):(o3.queueOn=o3.queueOn||[],o3.queueOn.push({type:n2,data:r2})))}Object.entries(e.destinations).forEach(([t2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:n2,data:r2});pe(e,o3,t2,n2,r2)}});for(const[n3,t2]of Object.entries(e.sources))ce(t2)&&t2.queueOn?.length&&await ae(e,t2,n3);return Object.keys(e.pending.destinations).length>0&&await async function(e2,n3){for(const[t2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[t2]||e2.destinations[t2])continue;const s3=o3.config?.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[t2];const i3=Ie(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),he(e,n2,i2,s2),!a2}(e,n2,void 0,i2),r2=await Se(e)),r2||Ee({ok:!0})}function Ge(e,n2){if(!n2.name)throw new Error("Event name is required");const[t2,o2]=n2.name.split(" ");if(!t2||!o2)throw new Error("Event name is invalid");const{timestamp:s2=Date.now(),name:r2=`${t2} ${o2}`,data:i2={},context:a2={},globals:c2=e.globals,custom:u2={},user:l2=e.user,nested:f2=[],consent:d2=e.consent,id:g2=(0,import_core8.getSpanId)(),trigger:p2="",entity:h2=t2,action:m2=o2,timing:y2=0,source:v2={type:"collector",schema:"4"}}=n2;return{name:r2,data:i2,context:a2,globals:c2,custom:u2,user:l2,nested:f2,consent:d2,id:g2,trigger:p2,entity:h2,action:m2,timestamp:s2,timing:y2,source:v2}}function nn(e={}){const n2=e.maxEntries??1e4,t2=e.lowWaterMark??.8,o2=e.sweepIntervalMs??6e4,s2=Math.floor(n2*t2),r2=new Map,i2={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a2;return o2>0&&(a2=setInterval(function(){const e2=Date.now();let n3=0;for(const[t3,o3]of r2)void 0!==o3.expires&&o3.expires<=e2&&(r2.delete(t3),n3++);i2.evictions_ttl+=n3},o2),a2&&"function"==typeof a2.unref&&a2.unref()),{type:"memory",config:{},get(e2){const n3=r2.get(e2);if(n3)return void 0!==n3.expires&&n3.expires<=Date.now()?(r2.delete(e2),i2.evictions_ttl++,void i2.misses++):(r2.delete(e2),r2.set(e2,n3),i2.hits++,n3.value);i2.misses++},set(e2,t3,o3){const a3=!r2.has(e2);a3||r2.delete(e2),r2.set(e2,{value:t3,expires:void 0!==o3?Date.now()+o3:void 0}),i2.writes++,a3&&i2.populates++,r2.size>n2&&function(){if(r2.size<=n2)return;const e3=r2.size-s2;let t4=0;for(const n3 of r2.keys()){if(t4>=e3)break;r2.delete(n3),t4++}i2.evictions_entries+=t4}()},delete(e2){r2.delete(e2)&&i2.deletes++},get counters(){return{...i2}},destroy(){void 0!==a2&&(clearInterval(a2),a2=void 0),r2.clear()}}}function on(e,n2){const{cacheConfig:t2,cacheStore:o2,namespace:s2,logger:r2,storeId:i2}=n2,a2={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c2=t2.rules.map(e2=>({match:e2.match?(0,import_core13.compileMatcher)(e2.match):()=>!0,ttl:e2.ttl})),u2=e2=>`${s2}:${e2}`;function l2(e2,n3){const t3=void 0===n3?{key:e2}:{key:e2,value:n3};return c2.find(e3=>e3.match(t3))}const f2=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a2}},async get(n3){const t3=u2(n3),s3=await o2.get(t3);if(void 0!==s3)return a2.hits++,s3;const r3=f2.get(t3);if(r3)return a2.inflight_dedups++,r3;a2.misses++;const i3=(async()=>{try{const s4=await e.get(n3);if(void 0===s4)return;const r4=l2(n3,s4);if(r4)try{await o2.set(t3,s4,1e3*r4.ttl),a2.populates++}catch(e2){d2("set",n3,e2)}return s4}finally{f2.delete(t3)}})();return f2.set(t3,i3),i3},async set(n3,t3,s3){a2.writes++,await e.set(n3,t3,s3);const r3=l2(n3,t3);if(r3)try{await o2.set(u2(n3),t3,1e3*r3.ttl)}catch(e2){d2("set",n3,e2)}},async delete(n3){a2.deletes++,await e.delete(n3);try{await o2.delete(u2(n3))}catch(e2){d2("delete",n3,e2)}}};function d2(e2,n3,t3){const o3=`store-cache(${i2}): cache ${e2} failed for "${n3}"; backing succeeded, continuing`;r2?r2.warn(o3,{error:t3}):console.warn(o3,t3)}}function sn(e,n2){const t2=n2.get,o2=n2.set,s2=n2.delete;n2.get=(0,import_core12.useHooks)(t2,"StoreGet",e.hooks,e.logger),n2.set=(0,import_core12.useHooks)(o2,"StoreSet",e.hooks,e.logger),n2.delete=(0,import_core12.useHooks)(s2,"StoreDelete",e.hooks,e.logger)}async function an(e){const n2=(0,import_core2.assign)({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),t2={level:e.logger?.level,handler:e.logger?.handler},o2=(0,import_core2.createLogger)(t2),s2={...n2.globalsStatic,...e.globals},a2={allowed:!1,config:n2,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,hooks:e.hooks||{},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,n3;a2.push=function(e,n2){return(0,import_core10.useHooks)(async(t2,o2={})=>await(0,import_core10.tryCatchAsync)(async()=>{const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:l2,exclude:f2}=o2;let d2=a2,g2=t2;const p2=l2||f2?function(e2,n3,t3){let o3=e2;return n3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>n3.includes(e3)))),t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!t3.includes(e3)))),o3}(e.destinations,l2,f2):void 0,h2=i2??(0,import_core10.createIngest)(r2||"unknown");if(c2){const n3=await(0,import_core10.processEventMapping)(g2,c2,e);if(n3.ignore)return Ee({ok:!0});if(c2.consent&&!(0,import_core10.getGrantedConsent)(c2.consent,e.consent,n3.event.consent))return Ee({ok:!0});g2=n3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await se(e,e.transformers,u2,g2,h2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return Ee({ok:!0});if(t3.stopped)return t3.respond&&(d2=t3.respond),Ee({ok:!0});if(t3.respond&&(d2=t3.respond),Array.isArray(t3.event)){const o3=await Promise.all(t3.event.map(async t4=>{const o4=n2(t4),s3=Ge(e,o4);return Se(e,s3,{id:r2,ingest:h2,respond:d2},p2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count+=t3.event.length,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return o3[0]??Ee({ok:!0})}g2=t3.event}const m2=n2(g2),y2=Ge(e,m2),v2=await Se(e,y2,{id:r2,ingest:h2,respond:d2},p2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count++,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return v2},n3=>{if(n3 instanceof import_core10.FatalError)throw n3;return e.status.failed++,e.logger.error("push failed",{event:t2,ingest:o2.ingest,error:n3}),Ee({ok:!1})})(),"Push",e.hooks,e.logger)}(a2,e2=>({timing:Math.round((Date.now()-a2.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.0-next-1779362268386"},...e2})),a2.command=(e2=a2,n3=Fe,(0,import_core11.useHooks)(async(t3,o3,s3)=>await(0,import_core11.tryCatchAsync)(async()=>await n3(e2,t3,o3,s3),n4=>{if(n4 instanceof import_core11.FatalError)throw n4;return e2.status.failed++,e2.logger.error("command failed",{command:t3,data:o3,error:n4}),Ee({ok:!1})})(),"Command",e2.hooks,e2.logger));const c2=e.stores||{};return a2.stores=await async function(e,n2={}){const t2={};for(const[o3,s3]of Object.entries(n2)){const{code:n3,config:r2={},env:i2={}}=s3,a2=e.logger.scope("store").scope(o3),c2={collector:e,logger:a2,id:o3,config:r2,env:i2},u2=await n3(c2);t2[o3]=u2}const o2=n2,s2=function(e2){const n3={};for(const t4 of Object.keys(e2))n3[t4]="WHITE";const t3=[],o3=[];function s3(r2){const i2=n3[r2];if("BLACK"===i2)return;if("GRAY"===i2){const e3=o3.indexOf(r2),n4=o3.slice(-1===e3?0:e3).concat(r2).join(" -> ");throw new Error(`Cycle in cache.store chain: ${n4}`)}n3[r2]="GRAY",o3.push(r2);const a2=e2[r2].cache?.store;if(void 0!==a2){if(!(a2 in e2))throw new Error(`Store "${r2}" cache.store references "${a2}", which is not declared in flow.stores`);s3(a2)}o3.pop(),n3[r2]="BLACK",t3.push(r2)}for(const t4 of Object.keys(e2))"WHITE"===n3[t4]&&s3(t4);return t3}(o2);for(const n3 of s2){const s3=o2[n3].cache;if(!s3)continue;let r2,i2;void 0!==s3.store?(r2=t2[s3.store],i2=s3.store):(t2.__cache||(t2.__cache=nn()),r2=t2.__cache,i2="__cache");const a2=s3.namespace??n3;e.logger.scope("store-cache").scope(n3).info(`store "${n3}" caches with namespace "${a2}:" via ${i2}`),t2[n3]=on(t2[n3],{storeId:n3,cacheConfig:s3,cacheStore:r2,namespace:a2,logger:e.logger.scope("store-cache").scope(n3)})}for(const[n3,o3]of Object.entries(t2))"__cache"!==n3&&sn(e,o3);return t2}(a2,c2),function(e2,n3,t3){const o3=new Map;for(const[t4,s4]of Object.entries(e2))n3[t4]&&o3.set(s4,n3[t4]);if(0!==o3.size)for(const e3 of[t3.transformers,t3.destinations,t3.sources])if(e3)for(const n4 of Object.values(e3))s3(n4.env);function s3(e3){if(e3)for(const[n4,t4]of Object.entries(e3))if("object"==typeof t4&&null!==t4){const s4=o3.get(t4);s4&&(e3[n4]=s4)}}}(c2,a2.stores,e),a2.stores.__cache||(a2.stores.__cache=nn()),a2.destinations=await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2))s2.config?.require?.length?e.pending.destinations[o2]=s2:t2[o2]=Ie(s2);return t2}(a2,e.destinations||{}),a2.transformers=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,env:r2={}}=s3,i2=(0,import_core7.validateStepEntry)(s3,"Transformer");if(!i2.ok){e2.logger.warn(`Transformer ${o3} invalid (${i2.code}): ${i2.reason}. Skipping.`);continue}const{config:a3}=Z(s3,"before"),{config:c3}=Z({...s3,config:a3},"next"),u2=Object.keys(r2).length>0?{...c3,env:r2}:c3,{cache:l2}=s3,f2=l2?{...u2,cache:l2}:u2,d2=e2.logger.scope("transformer").scope(o3),g2={collector:e2,logger:d2,id:o3,ingest:(0,import_core7.createIngest)(o3),config:f2,env:r2},p2=n4??(e3=>{const n5=s3.mapping;if(n5){const t4=[];if(void 0!==n5.data&&t4.push("data"),n5.mapping)for(const[e4,o4]of Object.entries(n5.mapping))if("object"==typeof o4&&null!==o4)for(const[n6,s4]of Object.entries(o4)){if("object"!=typeof s4||null===s4)continue;const o5=s4;void 0!==o5.data&&t4.push(`mapping[${e4}][${n6}].data`),void 0!==o5.silent&&t4.push(`mapping[${e4}][${n6}].silent`)}return t4.length>0&&e3.collector.logger.warn(`Transformer ${o3}: \`${t4.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e3.config,push:async t5=>{const o4=await(0,import_core7.processEventMapping)(t5,n5,e3.collector);return!o4.ignore&&{event:o4.event}}}}return{type:"pass",config:e3.config,push:e4=>({event:e4})}}),h2=await p2(g2);void 0!==s3.before&&void 0===h2.config?.before&&(h2.config={...h2.config??{},before:s3.before}),void 0!==s3.next&&void 0===h2.config?.next&&(h2.config={...h2.config??{},next:s3.next}),t3[o3]=h2}return t3}(a2,e.transformers||{}),a2}async function cn(e){e=e||{};const n2=await an(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const t4=e2.replace("walker ","");return o2.command(t4,n3)}let i3;if("string"==typeof e2)i3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(i3.data=n3);else{if(!e2||"object"!=typeof e2)return Ee({ok:!1});i3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(i3.data={...i3.data||{},...n3})}return t3&&"object"==typeof t3&&(i3.context=t3),s3&&Array.isArray(s3)&&(i3.nested=s3),r3&&"object"==typeof r3&&(i3.custom=r3),o2.push(i3)}});var o2;n2.sources.elb=t2,await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const n3=await ue(e,o2,s2);if(!n3)continue;const r2=s2.config?.require;n3.config={...n3.config,init:!1,...r2?{require:[...r2]}:{}},t2[o2]=n3}Object.assign(e.sources,t2);for(const n3 of Object.keys(t2)){const t3=e.sources[n3];let o2=!1;t3.init&&await(0,import_core6.tryCatchAsync)(t3.init.bind(t3),t4=>{if(t4 instanceof import_core6.FatalError)throw t4;o2=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:n3,error:t4})})(),o2||(t3.config.init=!0,ce(t3)&&await ae(e,t3,n3))}return t2}(n2,e.sources||{});const{consent:s2,user:r2,globals:i2,custom:a2}=e;s2&&await n2.command("consent",s2),r2&&await n2.command("user",r2),i2&&Object.assign(n2.globals,i2),a2&&Object.assign(n2.custom,a2),n2.config.run&&await n2.command("run");let c2=t2.push;const u2=Object.values(n2.sources).filter(e2=>"elb"!==e2.type),l2=u2.find(e2=>e2.config.primary);return l2?c2=l2.push:u2.length>0&&(c2=u2[0].push),{collector:n2,elb:c2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await cn(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 sourceLambda=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&&params.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=(0,import_core14.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)}}}},lambda_default=sourceLambda,import_client_sqs3=require("@aws-sdk/client-sqs"),DecoderError=class extends Error{constructor(message){super(message),this.name="DecoderError"}};var import_client_sqs=require("@aws-sdk/client-sqs");var import_client_sqs2=require("@aws-sdk/client-sqs"),import_client_sns=require("@aws-sdk/client-sns"),import_core15=require("@walkeros/core"),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 import_client_sqs2.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 import_client_sqs2.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=(0,import_core15.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??import_client_sqs2.SQSClient)({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??import_client_sns.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 import_client_sns.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 sourceSqs=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??import_client_sqs.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 import_client_sqs3.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 import_client_sqs3.GetQueueAttributesCommand({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 import_client_sqs3.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 import_client_sqs3.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)}}}},sqs_default=sourceSqs,types_exports2={};//# sourceMappingURL=index.js.map
1
+ "use strict";var mod,__defProp=Object.defineProperty,__getOwnPropDesc=Object.getOwnPropertyDescriptor,__getOwnPropNames=Object.getOwnPropertyNames,__hasOwnProp=Object.prototype.hasOwnProperty,__export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},index_exports={};__export(index_exports,{SourceLambda:()=>types_exports,SourceSqs:()=>types_exports2,examples:()=>examples_exports,sourceLambda:()=>lambda_default,sourceSqs:()=>sqs_default}),module.exports=(mod=index_exports,((to,from,except,desc)=>{if(from&&"object"==typeof from||"function"==typeof from)for(let key of __getOwnPropNames(from))__hasOwnProp.call(to,key)||key===except||__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to})(__defProp({},"__esModule",{value:!0}),mod));var import_core14=require("@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_core=require("@walkeros/core"),import_core2=require("@walkeros/core"),import_core3=require("@walkeros/core"),import_core4=require("@walkeros/core"),import_core5=require("@walkeros/core"),import_core6=require("@walkeros/core"),import_core7=require("@walkeros/core"),import_core8=require("@walkeros/core"),import_core9=require("@walkeros/core"),import_core10=require("@walkeros/core"),import_core11=require("@walkeros/core"),import_core12=require("@walkeros/core"),import_core13=require("@walkeros/core"),t_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 Q(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function X(e){const n2={};for(const[t2,o2]of Object.entries(e)){const e2=o2.config?.next;"string"==typeof e2||Array.isArray(e2)&&e2.every(e3=>"string"==typeof e3)?n2[t2]={next:e2}:n2[t2]={}}return n2}function Z(e,n2){const t2=e.config||{},o2=e[n2];return void 0!==o2?{config:{...t2,[n2]:o2},chainValue:o2}:{config:t2,chainValue:void 0}}function ee(e,n2={}){if(!e)return[];if(Array.isArray(e))return e;const t2=[],o2=new Set;let s2=e;for(;s2&&n2[s2]&&!o2.has(s2);){o2.add(s2),t2.push(s2);const e2=n2[s2].next;if(Array.isArray(e2)){t2.push(...e2);break}s2=e2}return t2}async function ne(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:t2,ingest:(0,import_core7.createIngest)(t2),config:n2.config,env:re(n2.config.env)};s2.debug("init");const i2=await(0,import_core7.useHooks)(n2.init,"TransformerInit",e.hooks,e.logger)(r2);if(!1===i2)return!1;n2.config={...i2||n2.config,env:i2?.env||n2.config.env,init:!0},s2.debug("init done")}return!0}async function te(e,n2,t2,o2,s2,r2){const i2=n2.type||"unknown",a2=e.logger.scope(`transformer:${i2}`),c2={collector:e,logger:a2,id:t2,ingest:s2,config:n2.config,env:{...re(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await(0,import_core7.useHooks)(n2.push,"TransformerPush",e.hooks,e.logger)(o2,c2);return a2.debug("push done"),u2}function oe(e,n2){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:(0,import_core7.createIngest)(n2)}async function se(e,n2,t2,o2,s2,r2,i2){s2||(s2=(0,import_core7.createIngest)(t2[0]??"chain")),i2&&s2._meta&&(s2._meta.chainPath=i2);let a2=o2,c2=r2;for(const o3 of t2){const r3=n2[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(0,import_core7.tryCatchAsync)(ne,n3=>{if(n3 instanceof import_core7.FatalError)throw n3;return e.status.failed++,e.logger.scope(`transformer:${r3.type||"unknown"}`).error("transformer init failed",{transformer:o3,error:n3}),!1})(e,r3,o3))return{event:null,respond:c2};if(i2&&void 0!==r3.config?.chainMocks?.[i2]){const n3=r3.config.chainMocks[i2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:i2}),a2=n3;continue}if(void 0!==r3.config?.mock){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),a2=r3.config.mock;continue}if(r3.config?.disabled)continue;const u2=r3.config?.cache,l2=u2?(0,import_core7.compileCache)(u2):void 0,f2=l2?Q(l2,e):void 0;let d2;if(l2&&f2){const e2=(0,import_core7.buildCacheContext)(s2,a2),n3=await(0,import_core7.checkCache)(l2,f2,e2);if("HIT"===n3?.status&&n3.value){if(a2=n3.value,l2.stop)return{event:a2,respond:c2,stopped:!0};continue}"MISS"===n3?.status&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=(0,import_core7.getNextSteps)(g2,(0,import_core7.buildCacheContext)(s2,a2));if(1===t3.length){const o4=ee(t3[0],X(n2));if(o4.length>0){const t4=await se(e,n2,o4,a2,s2,c2,i2);if(null===t4.event)return{event:null,respond:t4.respond??c2};if(t4.stopped)return{event:Array.isArray(t4.event)?t4.event[0]:t4.event,respond:t4.respond??c2,stopped:!0};t4.respond&&(c2=t4.respond),a2=Array.isArray(t4.event)?t4.event[0]:t4.event}}else t3.length>1&&await Promise.all(t3.map(t4=>(0,import_core7.tryCatchAsync)(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),a2,oe(s2,t4),void 0,i2)))}const p2=await(0,import_core7.tryCatchAsync)(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===p2)return{event:null,respond:c2};if(Array.isArray(p2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(p2.map(async t3=>{const o4=t3.event||a2,u4=oe(s2,"unknown");if(t3.next){const s3=(0,import_core7.getNextSteps)(t3.next,(0,import_core7.buildCacheContext)(u4,o4));if(0===s3.length)return{event:o4,respond:c2};if(1===s3.length){const t4=ee(s3[0],X(n2));return t4.length>0?se(e,n2,t4,o4,u4,c2,i2):{event:o4,respond:c2}}return(await Promise.all(s3.map(t4=>(0,import_core7.tryCatchAsync)(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),o4,oe(u4,t4),void 0,i2)))).map(e2=>({event:e2.event,respond:void 0}))}return r4.length>0?se(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let l3=c2;const f3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(l3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?f3.push(...n3.event):f3.push(n3.event)}else f3.push(e2);return 0===f3.length?{event:null,respond:l3}:1===f3.length?{event:f3[0],respond:l3}:{event:f3,respond:l3}}if(p2&&"object"==typeof p2){const{event:t3,respond:o4,next:r4}=p2;if(o4&&(c2=o4),void 0!==r4){const o5=(0,import_core7.getNextSteps)(r4,(0,import_core7.buildCacheContext)(s2,a2));if(0===o5.length){t3&&(a2=t3);continue}if(1===o5.length){const u3=ee(o5[0],X(n2));return u3.length>0?se(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}return await Promise.all(o5.map(o6=>(0,import_core7.tryCatchAsync)(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${o6} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(o6,X(n2)),t3||a2,oe(s2,o6),void 0,i2))),{event:null,respond:void 0}}t3&&(a2=t3)}d2&&f2&&(0,import_core7.storeCache)(f2,d2.key,a2,d2.ttl);const h2=r3.config.next,m2="string"==typeof h2||Array.isArray(h2)&&h2.every(e2=>"string"==typeof e2),y2=void 0!==h2&&!m2;if((!p2||"object"==typeof p2&&!p2.next)&&y2){const t3=(0,import_core7.getNextSteps)(r3.config.next,(0,import_core7.buildCacheContext)(s2,a2));if(1===t3.length){const o4=ee(t3[0],X(n2));return o4.length>0?se(e,n2,o4,a2,s2,c2,i2):{event:a2,respond:c2}}return t3.length>1?(await Promise.all(t3.map(t4=>(0,import_core7.tryCatchAsync)(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),a2,oe(s2,t4),void 0,i2))),{event:null,respond:void 0}):{event:a2,respond:c2}}}return{event:a2,respond:c2}}function re(e){return e&&(0,import_core7.isObject)(e)?e:{}}function ie(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e2=>"string"==typeof e2))}async function ae(e,n2,t2){if(!n2.on||!n2.queueOn?.length)return;const o2=n2.queueOn;n2.queueOn=[];const s2=t2||n2.config?.id||"unknown";for(const{type:t3,data:r2}of o2)await(0,import_core6.tryCatchAsync)(n2.on,n3=>{if(n3 instanceof import_core6.FatalError)throw n3;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s2,type:t3,error:n3})})(t3,r2)}function ce(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ue(e,n2,t2){const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2,l2=u2,f2=l2?(0,import_core6.compileCache)({...l2,stop:l2.stop??!0}):void 0,d2=ie(a2)?ee(a2,X(e.transformers)):void 0,g2=ie(c2)?ee(c2,X(e.transformers)):void 0,p2=r2.push,h2=p2??e.push,m2=Boolean(p2),y2=async(t3,o3,r3)=>{let i3;const u3=g2??(void 0!==c2?(()=>{const n3=(0,import_core6.getNextSteps)(c2,(0,import_core6.buildCacheContext)(r3.ingest));return 0===n3.length?[]:ee(1===n3.length?n3[0]:n3,X(e.transformers))})():[]);let l3=[t3];if(u3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o4=await se(e,e.transformers,u3,t3,r3.ingest,r3.respond,`source.${n2}.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),l3=Array.isArray(o4.event)?o4.event:[o4.event]}if(f2){const n3=Q(f2,e);if(n3){const t4=(0,import_core6.buildCacheContext)(r3.ingest),o4=await(0,import_core6.checkCache)(f2,n3,t4);if(o4){if("HIT"===o4.status&&void 0!==o4.value&&f2.stop){let n4=o4.value;return o4.rule.update&&(n4=await(0,import_core6.applyUpdate)(n4,o4.rule.update,{...t4,cache:{status:"HIT"}},e)),r3.respond?.(n4),{ok:!0}}if("MISS"===o4.status&&f2.stop&&r3.respond){const s3=r3.respond,a3=o4.rule.update,c3={...t4,cache:{status:"MISS"}},u4=o4.key,l4=o4.rule.ttl,f3=t5=>{(0,import_core6.storeCache)(n3,u4,t5,l4),a3?i3=(async()=>{const n4=await(0,import_core6.applyUpdate)(t5,a3,c3,e);s3(n4)})():s3(t5)};r3.respond=f3}"MISS"!==o4.status||f2.stop||(0,import_core6.storeCache)(n3,o4.key,!0,o4.rule.ttl)}}}const p3=d2?{kind:"single",preChain:d2}:void 0!==a2?(()=>{const n3=(0,import_core6.getNextSteps)(a2,(0,import_core6.buildCacheContext)(r3.ingest));return 0===n3.length?{kind:"single",preChain:[]}:1===n3.length?{kind:"single",preChain:ee(n3[0],X(e.transformers))}:{kind:"many",branches:n3.map(n4=>ee(n4,X(e.transformers)))}})():{kind:"single",preChain:[]};let y3={ok:!0};for(const t4 of l3)"many"===p3.kind?(await Promise.all(p3.branches.map((i4,a3)=>(0,import_core6.tryCatchAsync)(async()=>m2?h2(t4):h2(t4,{...o3,id:n2,ingest:oe(r3.ingest,`${n2}.${a3}`),respond:void 0,mapping:s2,preChain:i4}),n3=>(e.logger.scope("source:many").error(`many branch ${a3} failed`,{error:n3}),{ok:!0}))())),y3={ok:!0}):y3=m2?await h2(t4):await h2(t4,{...o3,id:n2,ingest:r3.ingest,respond:r3.respond,mapping:s2,preChain:p3.preChain});return i3&&await i3,y3},v2=async t3=>{const o3=(0,import_core6.createIngest)(n2);if(!s2.ingest||void 0===t3)return o3;const r3=await(0,import_core6.getMappingValue)(t3,s2.ingest,{collector:e});return{...o3,...r3,_meta:o3._meta}},w2=e.logger.scope("source").scope(n2),b2={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:w2,...r2,push:async(e2,t3={})=>{const o3={ingest:(0,import_core6.createIngest)(n2),respond:void 0};return y2(e2,t3,o3)}},k2={collector:e,logger:w2,id:n2,config:s2,env:b2,withScope:async(e2,n3,t3)=>{const o3={ingest:await v2(e2),respond:n3};return t3({...b2,push:(e3,n4={})=>y2(e3,n4,o3),ingest:o3.ingest,respond:o3.respond})}},C2=await(0,import_core6.tryCatchAsync)(o2,t3=>{if(t3 instanceof import_core6.FatalError)throw t3;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:n2,error:t3})})(k2);if(!C2)return;const q2=C2.type||"unknown",x2=e.logger.scope(q2).scope(n2);return b2.logger=x2,i2&&(C2.config={...C2.config,primary:i2}),C2}function fe(e,n2,t2,o2){if(t2 instanceof import_core4.FatalError)throw t2;e.logger.scope("on").error("on callback failed",{kind:n2,...o2,error:t2})}function de(e,n2){return{collector:e,logger:e.logger.scope("on").scope(String(n2))}}function pe(e,n2,t2,o2,s2){if(!n2.on)return;const r2=n2.type||"unknown",i2=e.logger.scope(r2).scope("on").scope(o2),a2={collector:e,logger:i2,id:t2,config:n2.config,data:s2,env:De(n2.env,n2.config.env)};(0,import_core5.tryCatch)(n2.on,n3=>fe(e,"destination",n3,{destId:t2,type:o2}))(o2,a2)}function he(e,n2,o2,s2){let r2;switch(n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}if(o2.length)switch(n2){case t_Commands.Consent:!function(e2,n3,o3){const s3=o3||e2.consent,r3=de(e2,t_Commands.Consent);n3.forEach(n4=>{Object.keys(s3).filter(e3=>e3 in n4).forEach(t2=>{(0,import_core5.tryCatch)(n4[t2],n5=>fe(e2,"consent",n5,{key:t2}))(s3,r3)})})}(e,o2,s2);break;case t_Commands.Ready:!function(e2,n3){if(!e2.allowed)return;const o3=de(e2,t_Commands.Ready);n3.forEach(n4=>{(0,import_core5.tryCatch)(n4,n5=>fe(e2,"ready",n5))(void 0,o3)})}(e,o2);break;case t_Commands.Run:!function(e2,n3){if(!e2.allowed)return;const o3=de(e2,t_Commands.Run);n3.forEach(n4=>{(0,import_core5.tryCatch)(n4,n5=>fe(e2,"run",n5))(void 0,o3)})}(e,o2);break;case t_Commands.Session:!function(e2,n3){if(!e2.session)return;const o3=de(e2,t_Commands.Session);n3.forEach(n4=>{(0,import_core5.tryCatch)(n4,n5=>fe(e2,"session",n5))(e2.session,o3)})}(e,o2);break;default:{const t2=de(e,n2);o2.forEach(o3=>{"function"==typeof o3&&(0,import_core5.tryCatch)(o3,t3=>fe(e,"generic",t3,{type:n2}))(r2,t2)});break}}}function ye(e,n2,t2,o2){if(!Number.isFinite(t2.max)||t2.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${t2.max})`);if("dropNewest"===(t2.onOverflow??"dropOldest"))return e.length>=t2.max?(o2&&o2([n2]),{appended:!1,dropped:1}):(e.push(n2),{appended:!0,dropped:0});const s2=[];for(;e.length>=t2.max;)s2.push(e.shift());return e.push(n2),s2.length>0&&o2&&o2(s2),{appended:!0,dropped:s2.length}}var ve=new WeakMap;function we(e,n2,t2,o2){ve.get(e)||(ve.set(e,!0),n2.warn(t2,o2))}function be(e){ve.delete(e)}var ke=Object.freeze({batched:!0});function Ce(e){return e===ke}function qe(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function xe(e,n2){return e.status.destinations[n2]||(e.status.destinations[n2]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[n2]}function Oe(e,n2,t2,o2){e.dropped[n2]||(e.dropped[n2]={});const s2=e.dropped[n2];return s2[t2]=(s2[t2]??0)+o2,s2[t2]}function je(e,n2,t2){if(!e)return[];if(Array.isArray(e)&&e.every(e2=>"string"==typeof e2))return ee(e,n2);if("string"==typeof e)return ee(e,n2);const o2=(0,import_core3.getNextSteps)(e,(0,import_core3.buildCacheContext)(t2));return 0===o2.length?[]:1===o2.length?ee(o2[0],n2):ee(o2,n2)}async function Se(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return Ee({ok:!1});if(n2){const t3=e.config.queueMax;if(void 0===t3)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o3=ye(e.queue,n2,{max:t3});if(o3.dropped>0){const n3=Oe(e.status,(0,import_core3.stepId)("collector"),"queue",o3.dropped);we(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:t3,droppedCount:n3})}else e.queue.length<t3&&be(e.queue);e.status.in++}o2||(o2=e.destinations);const h2=e.transformers?X(e.transformers):{},y2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let y3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&y3.push((0,import_core3.clone)(n2));const v3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:(0,import_core3.createIngest)("unknown");if(!y3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!y3.length&&s3.queueOn?.length){let n3=!1;try{n3=await $e(e,s3,o3)}catch(n4){e.status.failed++;const t3=s3.type||"unknown";e.logger.scope(t3).error("destination init failed",{error:n4 instanceof Error?n4.message:String(n4)})}return{id:o3,destination:s3,skipped:!n3}}const w3=[],b3=y3.filter(e2=>{const n3=(0,import_core3.getGrantedConsent)(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,w3.push(e2),!1)});if(b3.length>0){const n3=s3.queuePush,t3=s3.config.id||o3,r3={max:s3.config.queueMax??1e3};let i3=0;for(const e2 of b3)i3+=ye(n3,e2,r3).dropped;if(i3>0){xe(e,t3);const o4=Oe(e.status,(0,import_core3.stepId)("destination",t3),"queue",i3);we(n3,e.logger.scope(s3.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:t3,cap:r3.max,droppedCount:o4})}else n3.length<r3.max&&be(n3)}if(!w3.length)return{id:o3,destination:s3,queue:y3};let k2,x2,O2=!1;try{O2=await $e(e,s3,o3)}catch(n3){e.status.failed++;const t3=s3.type||"unknown";e.logger.scope(t3).error("destination init failed",{error:n3 instanceof Error?n3.message:String(n3)})}if(!O2)return{id:o3,destination:s3,queue:y3};s3.dlq||(s3.dlq=[]);const j2=je(s3.config.before,h2,v3),A2=s3.config.next,S2=s3.config?.cache,$2=S2?(0,import_core3.compileCache)(S2):void 0,_2=$2?Q($2,e):void 0;let E2=0,I2=0;return await Promise.all(w3.map(async n3=>{let r3;if(n3.globals=(0,import_core3.assign)(i2,n3.globals),n3.user=(0,import_core3.assign)(p2,n3.user),$2?.stop&&_2){const e2=(0,import_core3.buildCacheContext)(v3,n3),t3=await(0,import_core3.checkCache)($2,_2,e2);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,l2=t2.respond;if(j2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await se(e,e.transformers,j2,n3,v3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(l2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if($2&&!$2.stop&&_2){const e2=(0,import_core3.buildCacheContext)(v3,u2),t3=await(0,import_core3.checkCache)($2,_2,e2);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}const g2=Date.now();let m2=!1;const y4=await(0,import_core3.tryCatchAsync)(_e,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),k2=n4,m2=!0;const r4=s3.dlq,i3=s3.config.id||o3,a2={max:s3.config.dlqMax??100},c2=ye(r4,[u2,n4],a2);if(c2.dropped>0){xe(e,i3);const n5=Oe(e.status,(0,import_core3.stepId)("destination",i3),"dlq",c2.dropped);we(r4,e.logger.scope(s3.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:i3,cap:a2.max,droppedCount:n5})}else r4.length<a2.max&&be(r4)})(e,s3,o3,u2,v3,l2);if(E2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&(0,import_core3.storeCache)(_2,r3.key,y4??!0,r3.ttl),void 0===y4||Ce(y4)||(x2=y4),Ce(y4)&&I2++,!m2&&A2){void 0!==y4&&(v3._response=y4);const n4=je(A2,h2,v3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await se(e,e.transformers,n4,u2,v3,l2,`destination.${o3}.next`);t3.respond&&(l2=t3.respond)}}return n3})),{id:o3,destination:s3,error:k2,response:x2,totalDuration:E2,batchedCount:I2,allowedCount:w3.length}})),v2={},w2={},b2={};for(const n3 of y2){if(n3.skipped)continue;const t3=n3.destination,o3={type:t3.type||"unknown",data:n3.response};xe(e,n3.id);const s3=e.status.destinations[n3.id],r3=Date.now();if(s3.queuePushSize=t3.queuePush?.length??0,s3.dlqSize=t3.dlq?.length??0,n3.error)o3.error=n3.error,b2[n3.id]=o3,s3.failed++,s3.lastAt=r3,s3.duration+=n3.totalDuration||0,e.status.failed++;else if(n3.queue&&n3.queue.length)w2[n3.id]=o3;else{const t4=n3.batchedCount??0,i3=n3.allowedCount??0;(Math.max(0,i3-t4)>0||0===i3)&&(v2[n3.id]=o3,s3.count++,s3.lastAt=r3,s3.duration+=n3.totalDuration||0,e.status.out++)}}return Ee({event:n2,...Object.keys(v2).length&&{done:v2},...Object.keys(w2).length&&{queued:w2},...Object.keys(b2).length&&{failed:b2}})}async function $e(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:t2,config:n2.config,env:De(n2.env,n2.config.env)};s2.debug("init");const i2=await(0,import_core3.useHooks)(n2.init,"DestinationInit",e.hooks,e.logger)(r2);if(!1===i2)return i2;if(n2.config={...i2||n2.config,init:!0},n2.queueOn?.length){const o3=n2.queueOn;n2.queueOn=[];for(const{type:s3,data:r3}of o3)pe(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function _e(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await(0,import_core3.processEventMapping)(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),l2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...De(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const f2=a2.mapping,d2=a2.mappingKey||"* *";if(f2?.batch&&n2.pushBatch&&void 0===i2.mock){if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,entries:[],events:[],data:[]},s3=qe(f2.batch),r3=qe(i2.batch),a3=s3.wait??r3.wait??3e4,c4=s3.size??r3.size??1e3,l4=s3.age??r3.age??3e4,g2=De(n2.env,i2.env),h2=(0,import_core3.debounce)(async()=>{const o5=n2.batches[d2].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],a4={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:r4.rule,ingest:r4.ingest,env:{...g2,...r4.respond?{respond:r4.respond}:{}}};u2.debug("push batch",{events:s4.entries.length});const c5=n2.config.id||t2,l5=xe(e,c5);let f3=!0;await(0,import_core3.tryCatchAsync)((0,import_core3.useHooks)(n2.pushBatch,"DestinationPushBatch",e.hooks,e.logger),t3=>{f3=!1;const o6=n2.dlq=n2.dlq||[],r5={max:n2.config.dlqMax??100};let i3=0;for(const e2 of s4.entries)i3+=ye(o6,[e2.event,t3],r5).dropped;if(i3>0){const n3=Oe(e.status,(0,import_core3.stepId)("destination",c5),"dlq",i3);we(o6,u2,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c5,cap:r5.max,droppedCount:n3})}else o6.length<r5.max&&be(o6);l5.failed+=s4.entries.length,l5.dlqSize=o6.length,e.status.failed+=s4.entries.length,u2.error("Push batch failed",{error:t3 instanceof Error?t3.message:String(t3),entries:s4.entries.length})})(s4,a4),u2.debug("push batch done"),l5.inFlightBatch=Math.max(0,(l5.inFlightBatch??0)-s4.entries.length),f3&&(l5.count+=s4.entries.length,l5.lastAt=Date.now(),e.status.out+=s4.entries.length)},{wait:a3,size:c4,age:l4});n2.batches[d2]={batched:o4,batchFn:()=>{h2()},flush:async()=>{await h2.flush()}}}const o3=n2.batches[d2];o3.batched.entries.push({event:a2.event,ingest:s2,respond:r2,rule:f2,data:a2.data}),o3.batched.events.push(a2.event),(0,import_core3.isDefined)(a2.data)&&o3.batched.data.push(a2.data);const c3=n2.config.id||t2,l3=xe(e,c3);return l3.inFlightBatch=(l3.inFlightBatch??0)+1,o3.batchFn(),ke}{u2.debug("push",{event:a2.event.name});const t3=await(0,import_core3.useHooks)(n2.push,"DestinationPush",e.hooks,e.logger)(a2.event,l2);return u2.debug("push done"),t3}}function Ee(e){return{ok:!e?.failed,...e}}function Ie(e){const{code:n2,config:t2={},env:o2={},cache:s2}=e,{config:r2}=Z(e,"before"),{config:i2}=Z({...e,config:r2},"next"),a2={...n2.config,...t2,...i2};s2&&(a2.cache=s2);const c2=De(n2.env,o2);return{...n2,config:a2,env:c2}}function De(e,n2){return e||n2?n2?e&&(0,import_core3.isObject)(e)&&(0,import_core3.isObject)(n2)?{...e,...n2}:n2:e:{}}async function He(e,n2,t2){const o2=Object.entries(e).map(async([e2,o3])=>{const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",i2=t2.scope(r2),a2={id:e2,config:o3.config,env:o3.env??{},logger:i2};try{await Promise.race([s2(a2),new Promise((t3,o4)=>setTimeout(()=>o4(new Error(`${n2} '${e2}' destroy timed out`)),5e3))])}catch(t3){i2.error(`${n2} '${e2}' destroy failed: ${t3}`)}});await Promise.allSettled(o2)}async function Fe(e,n2,o2){let r2,i2,a2=!1;switch(n2){case t_Commands.Config:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.config,o2,{shallow:!1}),i2=o2,a2=!0);break;case t_Commands.Consent:if((0,import_core9.isObject)(o2)){const{update:n3}=function(e,n2){const t2={};return Object.entries(n2).forEach(([e2,n3])=>{t2[e2]=!!n3}),e.consent=(0,import_core.assign)(e.consent,t2),{update:t2}}(e,o2);i2=n3,a2=!0}break;case t_Commands.Custom:(0,import_core9.isObject)(o2)&&(e.custom=(0,import_core8.assign)(e.custom,o2),i2=o2,a2=!0);break;case t_Commands.Destination:(0,import_core9.isObject)(o2)&&"code"in o2&&(0,import_core9.isObject)(o2.code)&&(r2=await async function(e,n2){const{code:t2,config:o2={},env:s2={},before:r2,next:i2,cache:a2}=n2;if(!(0,import_core3.isFunction)(t2.push))return Ee({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};i2&&(u2={...u2,next:i2}),a2&&(u2={...u2,cache:a2});const l2={...t2,config:u2,env:De(t2.env,s2)};let f2=l2.config.id;if(!f2)do{f2=(0,import_core3.getId)(5,"abcdefghijklmnopqrstuvwxyz")}while(e.destinations[f2]);return e.destinations[f2]=l2,!1!==l2.config.queue&&(l2.queuePush=[...e.queue]),Se(e,void 0,{},{[f2]:l2})}(e,o2));break;case t_Commands.Globals:(0,import_core9.isObject)(o2)&&(e.globals=(0,import_core8.assign)(e.globals,o2),i2=o2,a2=!0);break;case t_Commands.Hook:if((0,import_core9.isObject)(o2)&&(0,import_core8.isString)(o2.name)&&(0,import_core8.isFunction)(o2.fn)){const{name:n3,fn:t2}=o2;e.hooks[n3]=t2,i2=o2,a2=!0}break;case t_Commands.On:if((0,import_core9.isObject)(o2)&&(0,import_core8.isString)(o2.type)){const{type:n3,rules:t2}=o2;await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=(0,import_core4.isArray)(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,he(e,n2,r2)}(e,n3,t2)}break;case t_Commands.Ready:a2=!0;break;case t_Commands.Run:r2=await async function(e,n2){return e.allowed=!0,e.timing=Date.now(),n2&&(n2.consent&&(e.consent=(0,import_core8.assign)(e.consent,n2.consent)),n2.user&&(e.user=(0,import_core8.assign)(e.user,n2.user)),n2.globals&&(e.globals=(0,import_core8.assign)(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=(0,import_core8.assign)(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await Se(e)}(e,o2),a2=!0;break;case t_Commands.Session:a2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await He(e2.sources,"source",n3),await He(e2.destinations,"destination",n3),await He(e2.transformers,"transformer",n3),await He(e2.stores,"store",n3)}(e);break;case t_Commands.User:(0,import_core9.isObject)(o2)&&((0,import_core8.assign)(e.user,o2,{shallow:!1}),i2=o2,a2=!0)}return a2&&(await async function(e,n2,o2,s2){let r2,i2=o2||[];switch(o2||(i2=e.on[n2]||[]),n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}let a2=!1;for(const[t2,o3]of Object.entries(e.sources)){if(o3.config.require?.length){const e2=o3.config.require.indexOf(n2);-1!==e2&&o3.config.require.splice(e2,1)}o3.on&&(ce(o3)?!1===await(0,import_core5.tryCatchAsync)(o3.on,o4=>fe(e,"source",o4,{sourceId:t2,type:n2}))(n2,r2)&&(a2=!0):(o3.queueOn=o3.queueOn||[],o3.queueOn.push({type:n2,data:r2})))}Object.entries(e.destinations).forEach(([t2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:n2,data:r2});pe(e,o3,t2,n2,r2)}});for(const[n3,t2]of Object.entries(e.sources))ce(t2)&&t2.queueOn?.length&&await ae(e,t2,n3);return Object.keys(e.pending.destinations).length>0&&await async function(e2,n3){for(const[t2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[t2]||e2.destinations[t2])continue;const s3=o3.config?.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[t2];const i3=Ie(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),he(e,n2,i2,s2),!a2}(e,n2,void 0,i2),r2=await Se(e)),r2||Ee({ok:!0})}function Ge(e,n2){if(!n2.name)throw new Error("Event name is required");const[t2,o2]=n2.name.split(" ");if(!t2||!o2)throw new Error("Event name is invalid");const{timestamp:s2=Date.now(),name:r2=`${t2} ${o2}`,data:i2={},context:a2={},globals:c2=e.globals,custom:u2={},user:l2=e.user,nested:f2=[],consent:d2=e.consent,id:g2=(0,import_core8.getSpanId)(),trigger:p2="",entity:h2=t2,action:m2=o2,timing:y2=0,source:v2={type:"collector",schema:"4"}}=n2;return{name:r2,data:i2,context:a2,globals:c2,custom:u2,user:l2,nested:f2,consent:d2,id:g2,trigger:p2,entity:h2,action:m2,timestamp:s2,timing:y2,source:v2}}function nn(e={}){const n2=e.maxEntries??1e4,t2=e.lowWaterMark??.8,o2=e.sweepIntervalMs??6e4,s2=Math.floor(n2*t2),r2=new Map,i2={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a2;return o2>0&&(a2=setInterval(function(){const e2=Date.now();let n3=0;for(const[t3,o3]of r2)void 0!==o3.expires&&o3.expires<=e2&&(r2.delete(t3),n3++);i2.evictions_ttl+=n3},o2),a2&&"function"==typeof a2.unref&&a2.unref()),{type:"memory",config:{},get(e2){const n3=r2.get(e2);if(n3)return void 0!==n3.expires&&n3.expires<=Date.now()?(r2.delete(e2),i2.evictions_ttl++,void i2.misses++):(r2.delete(e2),r2.set(e2,n3),i2.hits++,n3.value);i2.misses++},set(e2,t3,o3){const a3=!r2.has(e2);a3||r2.delete(e2),r2.set(e2,{value:t3,expires:void 0!==o3?Date.now()+o3:void 0}),i2.writes++,a3&&i2.populates++,r2.size>n2&&function(){if(r2.size<=n2)return;const e3=r2.size-s2;let t4=0;for(const n3 of r2.keys()){if(t4>=e3)break;r2.delete(n3),t4++}i2.evictions_entries+=t4}()},delete(e2){r2.delete(e2)&&i2.deletes++},get counters(){return{...i2}},destroy(){void 0!==a2&&(clearInterval(a2),a2=void 0),r2.clear()}}}function on(e,n2){const{cacheConfig:t2,cacheStore:o2,namespace:s2,logger:r2,storeId:i2}=n2,a2={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c2=t2.rules.map(e2=>({match:e2.match?(0,import_core13.compileMatcher)(e2.match):()=>!0,ttl:e2.ttl})),u2=e2=>`${s2}:${e2}`;function l2(e2,n3){const t3=void 0===n3?{key:e2}:{key:e2,value:n3};return c2.find(e3=>e3.match(t3))}const f2=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a2}},async get(n3){const t3=u2(n3),s3=await o2.get(t3);if(void 0!==s3)return a2.hits++,s3;const r3=f2.get(t3);if(r3)return a2.inflight_dedups++,r3;a2.misses++;const i3=(async()=>{try{const s4=await e.get(n3);if(void 0===s4)return;const r4=l2(n3,s4);if(r4)try{await o2.set(t3,s4,1e3*r4.ttl),a2.populates++}catch(e2){d2("set",n3,e2)}return s4}finally{f2.delete(t3)}})();return f2.set(t3,i3),i3},async set(n3,t3,s3){a2.writes++,await e.set(n3,t3,s3);const r3=l2(n3,t3);if(r3)try{await o2.set(u2(n3),t3,1e3*r3.ttl)}catch(e2){d2("set",n3,e2)}},async delete(n3){a2.deletes++,await e.delete(n3);try{await o2.delete(u2(n3))}catch(e2){d2("delete",n3,e2)}}};function d2(e2,n3,t3){const o3=`store-cache(${i2}): cache ${e2} failed for "${n3}"; backing succeeded, continuing`;r2?r2.warn(o3,{error:t3}):console.warn(o3,t3)}}function sn(e,n2){const t2=n2.get,o2=n2.set,s2=n2.delete;n2.get=(0,import_core12.useHooks)(t2,"StoreGet",e.hooks,e.logger),n2.set=(0,import_core12.useHooks)(o2,"StoreSet",e.hooks,e.logger),n2.delete=(0,import_core12.useHooks)(s2,"StoreDelete",e.hooks,e.logger)}async function an(e){const n2=(0,import_core2.assign)({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),t2={level:e.logger?.level,handler:e.logger?.handler},o2=(0,import_core2.createLogger)(t2),s2={...n2.globalsStatic,...e.globals},a2={allowed:!1,config:n2,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,hooks:e.hooks||{},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,n3;a2.push=function(e,n2){return(0,import_core10.useHooks)(async(t2,o2={})=>await(0,import_core10.tryCatchAsync)(async()=>{const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:l2,exclude:f2}=o2;let d2=a2,g2=t2;const p2=l2||f2?function(e2,n3,t3){let o3=e2;return n3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>n3.includes(e3)))),t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!t3.includes(e3)))),o3}(e.destinations,l2,f2):void 0,h2=i2??(0,import_core10.createIngest)(r2||"unknown");if(c2){const n3=await(0,import_core10.processEventMapping)(g2,c2,e);if(n3.ignore)return Ee({ok:!0});if(c2.consent&&!(0,import_core10.getGrantedConsent)(c2.consent,e.consent,n3.event.consent))return Ee({ok:!0});g2=n3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await se(e,e.transformers,u2,g2,h2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return Ee({ok:!0});if(t3.stopped)return t3.respond&&(d2=t3.respond),Ee({ok:!0});if(t3.respond&&(d2=t3.respond),Array.isArray(t3.event)){const o3=await Promise.all(t3.event.map(async t4=>{const o4=n2(t4),s3=Ge(e,o4);return Se(e,s3,{id:r2,ingest:h2,respond:d2},p2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count+=t3.event.length,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return o3[0]??Ee({ok:!0})}g2=t3.event}const m2=n2(g2),y2=Ge(e,m2),v2=await Se(e,y2,{id:r2,ingest:h2,respond:d2},p2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count++,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return v2},n3=>{if(n3 instanceof import_core10.FatalError)throw n3;return e.status.failed++,e.logger.error("push failed",{event:t2,ingest:o2.ingest,error:n3}),Ee({ok:!1})})(),"Push",e.hooks,e.logger)}(a2,e2=>({timing:Math.round((Date.now()-a2.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.0"},...e2})),a2.command=(e2=a2,n3=Fe,(0,import_core11.useHooks)(async(t3,o3,s3)=>await(0,import_core11.tryCatchAsync)(async()=>await n3(e2,t3,o3,s3),n4=>{if(n4 instanceof import_core11.FatalError)throw n4;return e2.status.failed++,e2.logger.error("command failed",{command:t3,data:o3,error:n4}),Ee({ok:!1})})(),"Command",e2.hooks,e2.logger));const c2=e.stores||{};return a2.stores=await async function(e,n2={}){const t2={};for(const[o3,s3]of Object.entries(n2)){const{code:n3,config:r2={},env:i2={}}=s3,a2=e.logger.scope("store").scope(o3),c2={collector:e,logger:a2,id:o3,config:r2,env:i2},u2=await n3(c2);t2[o3]=u2}const o2=n2,s2=function(e2){const n3={};for(const t4 of Object.keys(e2))n3[t4]="WHITE";const t3=[],o3=[];function s3(r2){const i2=n3[r2];if("BLACK"===i2)return;if("GRAY"===i2){const e3=o3.indexOf(r2),n4=o3.slice(-1===e3?0:e3).concat(r2).join(" -> ");throw new Error(`Cycle in cache.store chain: ${n4}`)}n3[r2]="GRAY",o3.push(r2);const a2=e2[r2].cache?.store;if(void 0!==a2){if(!(a2 in e2))throw new Error(`Store "${r2}" cache.store references "${a2}", which is not declared in flow.stores`);s3(a2)}o3.pop(),n3[r2]="BLACK",t3.push(r2)}for(const t4 of Object.keys(e2))"WHITE"===n3[t4]&&s3(t4);return t3}(o2);for(const n3 of s2){const s3=o2[n3].cache;if(!s3)continue;let r2,i2;void 0!==s3.store?(r2=t2[s3.store],i2=s3.store):(t2.__cache||(t2.__cache=nn()),r2=t2.__cache,i2="__cache");const a2=s3.namespace??n3;e.logger.scope("store-cache").scope(n3).info(`store "${n3}" caches with namespace "${a2}:" via ${i2}`),t2[n3]=on(t2[n3],{storeId:n3,cacheConfig:s3,cacheStore:r2,namespace:a2,logger:e.logger.scope("store-cache").scope(n3)})}for(const[n3,o3]of Object.entries(t2))"__cache"!==n3&&sn(e,o3);return t2}(a2,c2),function(e2,n3,t3){const o3=new Map;for(const[t4,s4]of Object.entries(e2))n3[t4]&&o3.set(s4,n3[t4]);if(0!==o3.size)for(const e3 of[t3.transformers,t3.destinations,t3.sources])if(e3)for(const n4 of Object.values(e3))s3(n4.env);function s3(e3){if(e3)for(const[n4,t4]of Object.entries(e3))if("object"==typeof t4&&null!==t4){const s4=o3.get(t4);s4&&(e3[n4]=s4)}}}(c2,a2.stores,e),a2.stores.__cache||(a2.stores.__cache=nn()),a2.destinations=await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2))s2.config?.require?.length?e.pending.destinations[o2]=s2:t2[o2]=Ie(s2);return t2}(a2,e.destinations||{}),a2.transformers=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,env:r2={}}=s3,i2=(0,import_core7.validateStepEntry)(s3,"Transformer");if(!i2.ok){e2.logger.warn(`Transformer ${o3} invalid (${i2.code}): ${i2.reason}. Skipping.`);continue}const{config:a3}=Z(s3,"before"),{config:c3}=Z({...s3,config:a3},"next"),u2=Object.keys(r2).length>0?{...c3,env:r2}:c3,{cache:l2}=s3,f2=l2?{...u2,cache:l2}:u2,d2=e2.logger.scope("transformer").scope(o3),g2={collector:e2,logger:d2,id:o3,ingest:(0,import_core7.createIngest)(o3),config:f2,env:r2},p2=n4??(e3=>{const n5=s3.mapping;if(n5){const t4=[];if(void 0!==n5.data&&t4.push("data"),n5.mapping)for(const[e4,o4]of Object.entries(n5.mapping))if("object"==typeof o4&&null!==o4)for(const[n6,s4]of Object.entries(o4)){if("object"!=typeof s4||null===s4)continue;const o5=s4;void 0!==o5.data&&t4.push(`mapping[${e4}][${n6}].data`),void 0!==o5.silent&&t4.push(`mapping[${e4}][${n6}].silent`)}return t4.length>0&&e3.collector.logger.warn(`Transformer ${o3}: \`${t4.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e3.config,push:async t5=>{const o4=await(0,import_core7.processEventMapping)(t5,n5,e3.collector);return!o4.ignore&&{event:o4.event}}}}return{type:"pass",config:e3.config,push:e4=>({event:e4})}}),h2=await p2(g2);void 0!==s3.before&&void 0===h2.config?.before&&(h2.config={...h2.config??{},before:s3.before}),void 0!==s3.next&&void 0===h2.config?.next&&(h2.config={...h2.config??{},next:s3.next}),t3[o3]=h2}return t3}(a2,e.transformers||{}),a2}async function cn(e){e=e||{};const n2=await an(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const t4=e2.replace("walker ","");return o2.command(t4,n3)}let i3;if("string"==typeof e2)i3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(i3.data=n3);else{if(!e2||"object"!=typeof e2)return Ee({ok:!1});i3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(i3.data={...i3.data||{},...n3})}return t3&&"object"==typeof t3&&(i3.context=t3),s3&&Array.isArray(s3)&&(i3.nested=s3),r3&&"object"==typeof r3&&(i3.custom=r3),o2.push(i3)}});var o2;n2.sources.elb=t2,await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const n3=await ue(e,o2,s2);if(!n3)continue;const r2=s2.config?.require;n3.config={...n3.config,init:!1,...r2?{require:[...r2]}:{}},t2[o2]=n3}Object.assign(e.sources,t2);for(const n3 of Object.keys(t2)){const t3=e.sources[n3];let o2=!1;t3.init&&await(0,import_core6.tryCatchAsync)(t3.init.bind(t3),t4=>{if(t4 instanceof import_core6.FatalError)throw t4;o2=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:n3,error:t4})})(),o2||(t3.config.init=!0,ce(t3)&&await ae(e,t3,n3))}return t2}(n2,e.sources||{});const{consent:s2,user:r2,globals:i2,custom:a2}=e;s2&&await n2.command("consent",s2),r2&&await n2.command("user",r2),i2&&Object.assign(n2.globals,i2),a2&&Object.assign(n2.custom,a2),n2.config.run&&await n2.command("run");let c2=t2.push;const u2=Object.values(n2.sources).filter(e2=>"elb"!==e2.type),l2=u2.find(e2=>e2.config.primary);return l2?c2=l2.push:u2.length>0&&(c2=u2[0].push),{collector:n2,elb:c2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await cn(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 sourceLambda=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&&params.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=(0,import_core14.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)}}}},lambda_default=sourceLambda,import_client_sqs3=require("@aws-sdk/client-sqs"),DecoderError=class extends Error{constructor(message){super(message),this.name="DecoderError"}};var import_client_sqs=require("@aws-sdk/client-sqs");var import_client_sqs2=require("@aws-sdk/client-sqs"),import_client_sns=require("@aws-sdk/client-sns"),import_core15=require("@walkeros/core"),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 import_client_sqs2.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 import_client_sqs2.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=(0,import_core15.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??import_client_sqs2.SQSClient)({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??import_client_sns.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 import_client_sns.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 sourceSqs=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??import_client_sqs.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 import_client_sqs3.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 import_client_sqs3.GetQueueAttributesCommand({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 import_client_sqs3.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 import_client_sqs3.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)}}}},sqs_default=sourceSqs,types_exports2={};//# sourceMappingURL=index.js.map
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 i}from"@walkeros/core";import{assign as a,buildCacheContext as c,clone as u,compileCache as l,checkCache as f,storeCache as d,createIngest as g,debounce as p,getId as h,getGrantedConsent as m,getNextSteps as y,isDefined as v,isFunction as w,isObject as b,processEventMapping as k,stepId as C,tryCatchAsync as q,useHooks as x}from"@walkeros/core";import{isArray as O,FatalError as j}from"@walkeros/core";import{tryCatch as A,tryCatchAsync as S}from"@walkeros/core";import{createIngest as $,FatalError as _,getMappingValue as E,tryCatchAsync as I,getNextSteps as P,compileCache as D,checkCache as M,storeCache as z,applyUpdate as R,buildCacheContext as T}from"@walkeros/core";import{createIngest as B,FatalError as H,isObject as F,tryCatchAsync as G,useHooks as W,getNextSteps as N,compileCache as U,checkCache as L,storeCache as K,buildCacheContext as V,validateStepEntry as Y,processEventMapping as J}from"@walkeros/core";import{assign as Me,getSpanId as ze,isFunction as Re,isString as Te}from"@walkeros/core";import{isObject as Be}from"@walkeros/core";import{createIngest as Ne,FatalError as Ue,getGrantedConsent as Le,processEventMapping as Ke,tryCatchAsync as Ve,useHooks as Ye}from"@walkeros/core";import{FatalError as Qe,useHooks as Xe,tryCatchAsync as Ze}from"@walkeros/core";import{useHooks as en}from"@walkeros/core";import{compileMatcher as tn}from"@walkeros/core";var t_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 Q(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function X(e){const n2={};for(const[t2,o2]of Object.entries(e)){const e2=o2.config?.next;"string"==typeof e2||Array.isArray(e2)&&e2.every(e3=>"string"==typeof e3)?n2[t2]={next:e2}:n2[t2]={}}return n2}function Z(e,n2){const t2=e.config||{},o2=e[n2];return void 0!==o2?{config:{...t2,[n2]:o2},chainValue:o2}:{config:t2,chainValue:void 0}}function ee(e,n2={}){if(!e)return[];if(Array.isArray(e))return e;const t2=[],o2=new Set;let s2=e;for(;s2&&n2[s2]&&!o2.has(s2);){o2.add(s2),t2.push(s2);const e2=n2[s2].next;if(Array.isArray(e2)){t2.push(...e2);break}s2=e2}return t2}async function ne(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:t2,ingest:B(t2),config:n2.config,env:re(n2.config.env)};s2.debug("init");const i2=await W(n2.init,"TransformerInit",e.hooks,e.logger)(r2);if(!1===i2)return!1;n2.config={...i2||n2.config,env:i2?.env||n2.config.env,init:!0},s2.debug("init done")}return!0}async function te(e,n2,t2,o2,s2,r2){const i2=n2.type||"unknown",a2=e.logger.scope(`transformer:${i2}`),c2={collector:e,logger:a2,id:t2,ingest:s2,config:n2.config,env:{...re(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await W(n2.push,"TransformerPush",e.hooks,e.logger)(o2,c2);return a2.debug("push done"),u2}function oe(e,n2){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:B(n2)}async function se(e,n2,t2,o2,s2,r2,i2){s2||(s2=B(t2[0]??"chain")),i2&&s2._meta&&(s2._meta.chainPath=i2);let a2=o2,c2=r2;for(const o3 of t2){const r3=n2[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 G(ne,n3=>{if(n3 instanceof H)throw n3;return e.status.failed++,e.logger.scope(`transformer:${r3.type||"unknown"}`).error("transformer init failed",{transformer:o3,error:n3}),!1})(e,r3,o3))return{event:null,respond:c2};if(i2&&void 0!==r3.config?.chainMocks?.[i2]){const n3=r3.config.chainMocks[i2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:i2}),a2=n3;continue}if(void 0!==r3.config?.mock){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),a2=r3.config.mock;continue}if(r3.config?.disabled)continue;const u2=r3.config?.cache,l2=u2?U(u2):void 0,f2=l2?Q(l2,e):void 0;let d2;if(l2&&f2){const e2=V(s2,a2),n3=await L(l2,f2,e2);if("HIT"===n3?.status&&n3.value){if(a2=n3.value,l2.stop)return{event:a2,respond:c2,stopped:!0};continue}"MISS"===n3?.status&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=N(g2,V(s2,a2));if(1===t3.length){const o4=ee(t3[0],X(n2));if(o4.length>0){const t4=await se(e,n2,o4,a2,s2,c2,i2);if(null===t4.event)return{event:null,respond:t4.respond??c2};if(t4.stopped)return{event:Array.isArray(t4.event)?t4.event[0]:t4.event,respond:t4.respond??c2,stopped:!0};t4.respond&&(c2=t4.respond),a2=Array.isArray(t4.event)?t4.event[0]:t4.event}}else t3.length>1&&await Promise.all(t3.map(t4=>G(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),a2,oe(s2,t4),void 0,i2)))}const p2=await G(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===p2)return{event:null,respond:c2};if(Array.isArray(p2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(p2.map(async t3=>{const o4=t3.event||a2,u4=oe(s2,"unknown");if(t3.next){const s3=N(t3.next,V(u4,o4));if(0===s3.length)return{event:o4,respond:c2};if(1===s3.length){const t4=ee(s3[0],X(n2));return t4.length>0?se(e,n2,t4,o4,u4,c2,i2):{event:o4,respond:c2}}return(await Promise.all(s3.map(t4=>G(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),o4,oe(u4,t4),void 0,i2)))).map(e2=>({event:e2.event,respond:void 0}))}return r4.length>0?se(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let l3=c2;const f3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(l3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?f3.push(...n3.event):f3.push(n3.event)}else f3.push(e2);return 0===f3.length?{event:null,respond:l3}:1===f3.length?{event:f3[0],respond:l3}:{event:f3,respond:l3}}if(p2&&"object"==typeof p2){const{event:t3,respond:o4,next:r4}=p2;if(o4&&(c2=o4),void 0!==r4){const o5=N(r4,V(s2,a2));if(0===o5.length){t3&&(a2=t3);continue}if(1===o5.length){const u3=ee(o5[0],X(n2));return u3.length>0?se(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}return await Promise.all(o5.map(o6=>G(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${o6} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(o6,X(n2)),t3||a2,oe(s2,o6),void 0,i2))),{event:null,respond:void 0}}t3&&(a2=t3)}d2&&f2&&K(f2,d2.key,a2,d2.ttl);const h2=r3.config.next,m2="string"==typeof h2||Array.isArray(h2)&&h2.every(e2=>"string"==typeof e2),y2=void 0!==h2&&!m2;if((!p2||"object"==typeof p2&&!p2.next)&&y2){const t3=N(r3.config.next,V(s2,a2));if(1===t3.length){const o4=ee(t3[0],X(n2));return o4.length>0?se(e,n2,o4,a2,s2,c2,i2):{event:a2,respond:c2}}return t3.length>1?(await Promise.all(t3.map(t4=>G(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),a2,oe(s2,t4),void 0,i2))),{event:null,respond:void 0}):{event:a2,respond:c2}}}return{event:a2,respond:c2}}function re(e){return e&&F(e)?e:{}}function ie(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e2=>"string"==typeof e2))}async function ae(e,n2,t2){if(!n2.on||!n2.queueOn?.length)return;const o2=n2.queueOn;n2.queueOn=[];const s2=t2||n2.config?.id||"unknown";for(const{type:t3,data:r2}of o2)await I(n2.on,n3=>{if(n3 instanceof _)throw n3;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s2,type:t3,error:n3})})(t3,r2)}function ce(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ue(e,n2,t2){const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2,l2=u2,f2=l2?D({...l2,stop:l2.stop??!0}):void 0,d2=ie(a2)?ee(a2,X(e.transformers)):void 0,g2=ie(c2)?ee(c2,X(e.transformers)):void 0,p2=r2.push,h2=p2??e.push,m2=Boolean(p2),y2=async(t3,o3,r3)=>{let i3;const u3=g2??(void 0!==c2?(()=>{const n3=P(c2,T(r3.ingest));return 0===n3.length?[]:ee(1===n3.length?n3[0]:n3,X(e.transformers))})():[]);let l3=[t3];if(u3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o4=await se(e,e.transformers,u3,t3,r3.ingest,r3.respond,`source.${n2}.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),l3=Array.isArray(o4.event)?o4.event:[o4.event]}if(f2){const n3=Q(f2,e);if(n3){const t4=T(r3.ingest),o4=await M(f2,n3,t4);if(o4){if("HIT"===o4.status&&void 0!==o4.value&&f2.stop){let n4=o4.value;return o4.rule.update&&(n4=await R(n4,o4.rule.update,{...t4,cache:{status:"HIT"}},e)),r3.respond?.(n4),{ok:!0}}if("MISS"===o4.status&&f2.stop&&r3.respond){const s3=r3.respond,a3=o4.rule.update,c3={...t4,cache:{status:"MISS"}},u4=o4.key,l4=o4.rule.ttl,f3=t5=>{z(n3,u4,t5,l4),a3?i3=(async()=>{const n4=await R(t5,a3,c3,e);s3(n4)})():s3(t5)};r3.respond=f3}"MISS"!==o4.status||f2.stop||z(n3,o4.key,!0,o4.rule.ttl)}}}const p3=d2?{kind:"single",preChain:d2}:void 0!==a2?(()=>{const n3=P(a2,T(r3.ingest));return 0===n3.length?{kind:"single",preChain:[]}:1===n3.length?{kind:"single",preChain:ee(n3[0],X(e.transformers))}:{kind:"many",branches:n3.map(n4=>ee(n4,X(e.transformers)))}})():{kind:"single",preChain:[]};let y3={ok:!0};for(const t4 of l3)"many"===p3.kind?(await Promise.all(p3.branches.map((i4,a3)=>I(async()=>m2?h2(t4):h2(t4,{...o3,id:n2,ingest:oe(r3.ingest,`${n2}.${a3}`),respond:void 0,mapping:s2,preChain:i4}),n3=>(e.logger.scope("source:many").error(`many branch ${a3} failed`,{error:n3}),{ok:!0}))())),y3={ok:!0}):y3=m2?await h2(t4):await h2(t4,{...o3,id:n2,ingest:r3.ingest,respond:r3.respond,mapping:s2,preChain:p3.preChain});return i3&&await i3,y3},v2=async t3=>{const o3=$(n2);if(!s2.ingest||void 0===t3)return o3;const r3=await E(t3,s2.ingest,{collector:e});return{...o3,...r3,_meta:o3._meta}},w2=e.logger.scope("source").scope(n2),b2={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:w2,...r2,push:async(e2,t3={})=>{const o3={ingest:$(n2),respond:void 0};return y2(e2,t3,o3)}},k2={collector:e,logger:w2,id:n2,config:s2,env:b2,withScope:async(e2,n3,t3)=>{const o3={ingest:await v2(e2),respond:n3};return t3({...b2,push:(e3,n4={})=>y2(e3,n4,o3),ingest:o3.ingest,respond:o3.respond})}},C2=await I(o2,t3=>{if(t3 instanceof _)throw t3;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:n2,error:t3})})(k2);if(!C2)return;const q2=C2.type||"unknown",x2=e.logger.scope(q2).scope(n2);return b2.logger=x2,i2&&(C2.config={...C2.config,primary:i2}),C2}function fe(e,n2,t2,o2){if(t2 instanceof j)throw t2;e.logger.scope("on").error("on callback failed",{kind:n2,...o2,error:t2})}function de(e,n2){return{collector:e,logger:e.logger.scope("on").scope(String(n2))}}function pe(e,n2,t2,o2,s2){if(!n2.on)return;const r2=n2.type||"unknown",i2=e.logger.scope(r2).scope("on").scope(o2),a2={collector:e,logger:i2,id:t2,config:n2.config,data:s2,env:De(n2.env,n2.config.env)};A(n2.on,n3=>fe(e,"destination",n3,{destId:t2,type:o2}))(o2,a2)}function he(e,n2,o2,s2){let r2;switch(n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}if(o2.length)switch(n2){case t_Commands.Consent:!function(e2,n3,o3){const s3=o3||e2.consent,r3=de(e2,t_Commands.Consent);n3.forEach(n4=>{Object.keys(s3).filter(e3=>e3 in n4).forEach(t2=>{A(n4[t2],n5=>fe(e2,"consent",n5,{key:t2}))(s3,r3)})})}(e,o2,s2);break;case t_Commands.Ready:!function(e2,n3){if(!e2.allowed)return;const o3=de(e2,t_Commands.Ready);n3.forEach(n4=>{A(n4,n5=>fe(e2,"ready",n5))(void 0,o3)})}(e,o2);break;case t_Commands.Run:!function(e2,n3){if(!e2.allowed)return;const o3=de(e2,t_Commands.Run);n3.forEach(n4=>{A(n4,n5=>fe(e2,"run",n5))(void 0,o3)})}(e,o2);break;case t_Commands.Session:!function(e2,n3){if(!e2.session)return;const o3=de(e2,t_Commands.Session);n3.forEach(n4=>{A(n4,n5=>fe(e2,"session",n5))(e2.session,o3)})}(e,o2);break;default:{const t2=de(e,n2);o2.forEach(o3=>{"function"==typeof o3&&A(o3,t3=>fe(e,"generic",t3,{type:n2}))(r2,t2)});break}}}function ye(e,n2,t2,o2){if(!Number.isFinite(t2.max)||t2.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${t2.max})`);if("dropNewest"===(t2.onOverflow??"dropOldest"))return e.length>=t2.max?(o2&&o2([n2]),{appended:!1,dropped:1}):(e.push(n2),{appended:!0,dropped:0});const s2=[];for(;e.length>=t2.max;)s2.push(e.shift());return e.push(n2),s2.length>0&&o2&&o2(s2),{appended:!0,dropped:s2.length}}var ve=new WeakMap;function we(e,n2,t2,o2){ve.get(e)||(ve.set(e,!0),n2.warn(t2,o2))}function be(e){ve.delete(e)}var ke=Object.freeze({batched:!0});function Ce(e){return e===ke}function qe(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function xe(e,n2){return e.status.destinations[n2]||(e.status.destinations[n2]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[n2]}function Oe(e,n2,t2,o2){e.dropped[n2]||(e.dropped[n2]={});const s2=e.dropped[n2];return s2[t2]=(s2[t2]??0)+o2,s2[t2]}function je(e,n2,t2){if(!e)return[];if(Array.isArray(e)&&e.every(e2=>"string"==typeof e2))return ee(e,n2);if("string"==typeof e)return ee(e,n2);const o2=y(e,c(t2));return 0===o2.length?[]:1===o2.length?ee(o2[0],n2):ee(o2,n2)}async function Se(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return Ee({ok:!1});if(n2){const t3=e.config.queueMax;if(void 0===t3)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o3=ye(e.queue,n2,{max:t3});if(o3.dropped>0){const n3=Oe(e.status,C("collector"),"queue",o3.dropped);we(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:t3,droppedCount:n3})}else e.queue.length<t3&&be(e.queue);e.status.in++}o2||(o2=e.destinations);const h2=e.transformers?X(e.transformers):{},y2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let y3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&y3.push(u(n2));const v3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:g("unknown");if(!y3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!y3.length&&s3.queueOn?.length){let n3=!1;try{n3=await $e(e,s3,o3)}catch(n4){e.status.failed++;const t3=s3.type||"unknown";e.logger.scope(t3).error("destination init failed",{error:n4 instanceof Error?n4.message:String(n4)})}return{id:o3,destination:s3,skipped:!n3}}const w3=[],b3=y3.filter(e2=>{const n3=m(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,w3.push(e2),!1)});if(b3.length>0){const n3=s3.queuePush,t3=s3.config.id||o3,r3={max:s3.config.queueMax??1e3};let i3=0;for(const e2 of b3)i3+=ye(n3,e2,r3).dropped;if(i3>0){xe(e,t3);const o4=Oe(e.status,C("destination",t3),"queue",i3);we(n3,e.logger.scope(s3.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:t3,cap:r3.max,droppedCount:o4})}else n3.length<r3.max&&be(n3)}if(!w3.length)return{id:o3,destination:s3,queue:y3};let k2,x2,O2=!1;try{O2=await $e(e,s3,o3)}catch(n3){e.status.failed++;const t3=s3.type||"unknown";e.logger.scope(t3).error("destination init failed",{error:n3 instanceof Error?n3.message:String(n3)})}if(!O2)return{id:o3,destination:s3,queue:y3};s3.dlq||(s3.dlq=[]);const j2=je(s3.config.before,h2,v3),A2=s3.config.next,S2=s3.config?.cache,$2=S2?l(S2):void 0,_2=$2?Q($2,e):void 0;let E2=0,I2=0;return await Promise.all(w3.map(async n3=>{let r3;if(n3.globals=a(i2,n3.globals),n3.user=a(p2,n3.user),$2?.stop&&_2){const e2=c(v3,n3),t3=await f($2,_2,e2);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,l2=t2.respond;if(j2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await se(e,e.transformers,j2,n3,v3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(l2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if($2&&!$2.stop&&_2){const e2=c(v3,u2),t3=await f($2,_2,e2);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}const g2=Date.now();let m2=!1;const y4=await q(_e,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),k2=n4,m2=!0;const r4=s3.dlq,i3=s3.config.id||o3,a2={max:s3.config.dlqMax??100},c2=ye(r4,[u2,n4],a2);if(c2.dropped>0){xe(e,i3);const n5=Oe(e.status,C("destination",i3),"dlq",c2.dropped);we(r4,e.logger.scope(s3.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:i3,cap:a2.max,droppedCount:n5})}else r4.length<a2.max&&be(r4)})(e,s3,o3,u2,v3,l2);if(E2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&d(_2,r3.key,y4??!0,r3.ttl),void 0===y4||Ce(y4)||(x2=y4),Ce(y4)&&I2++,!m2&&A2){void 0!==y4&&(v3._response=y4);const n4=je(A2,h2,v3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await se(e,e.transformers,n4,u2,v3,l2,`destination.${o3}.next`);t3.respond&&(l2=t3.respond)}}return n3})),{id:o3,destination:s3,error:k2,response:x2,totalDuration:E2,batchedCount:I2,allowedCount:w3.length}})),v2={},w2={},b2={};for(const n3 of y2){if(n3.skipped)continue;const t3=n3.destination,o3={type:t3.type||"unknown",data:n3.response};xe(e,n3.id);const s3=e.status.destinations[n3.id],r3=Date.now();if(s3.queuePushSize=t3.queuePush?.length??0,s3.dlqSize=t3.dlq?.length??0,n3.error)o3.error=n3.error,b2[n3.id]=o3,s3.failed++,s3.lastAt=r3,s3.duration+=n3.totalDuration||0,e.status.failed++;else if(n3.queue&&n3.queue.length)w2[n3.id]=o3;else{const t4=n3.batchedCount??0,i3=n3.allowedCount??0;(Math.max(0,i3-t4)>0||0===i3)&&(v2[n3.id]=o3,s3.count++,s3.lastAt=r3,s3.duration+=n3.totalDuration||0,e.status.out++)}}return Ee({event:n2,...Object.keys(v2).length&&{done:v2},...Object.keys(w2).length&&{queued:w2},...Object.keys(b2).length&&{failed:b2}})}async function $e(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:t2,config:n2.config,env:De(n2.env,n2.config.env)};s2.debug("init");const i2=await x(n2.init,"DestinationInit",e.hooks,e.logger)(r2);if(!1===i2)return i2;if(n2.config={...i2||n2.config,init:!0},n2.queueOn?.length){const o3=n2.queueOn;n2.queueOn=[];for(const{type:s3,data:r3}of o3)pe(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function _e(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await k(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),l2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...De(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const f2=a2.mapping,d2=a2.mappingKey||"* *";if(f2?.batch&&n2.pushBatch&&void 0===i2.mock){if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,entries:[],events:[],data:[]},s3=qe(f2.batch),r3=qe(i2.batch),a3=s3.wait??r3.wait??3e4,c4=s3.size??r3.size??1e3,l4=s3.age??r3.age??3e4,g2=De(n2.env,i2.env),h2=p(async()=>{const o5=n2.batches[d2].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],a4={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:r4.rule,ingest:r4.ingest,env:{...g2,...r4.respond?{respond:r4.respond}:{}}};u2.debug("push batch",{events:s4.entries.length});const c5=n2.config.id||t2,l5=xe(e,c5);let f3=!0;await q(x(n2.pushBatch,"DestinationPushBatch",e.hooks,e.logger),t3=>{f3=!1;const o6=n2.dlq=n2.dlq||[],r5={max:n2.config.dlqMax??100};let i3=0;for(const e2 of s4.entries)i3+=ye(o6,[e2.event,t3],r5).dropped;if(i3>0){const n3=Oe(e.status,C("destination",c5),"dlq",i3);we(o6,u2,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c5,cap:r5.max,droppedCount:n3})}else o6.length<r5.max&&be(o6);l5.failed+=s4.entries.length,l5.dlqSize=o6.length,e.status.failed+=s4.entries.length,u2.error("Push batch failed",{error:t3 instanceof Error?t3.message:String(t3),entries:s4.entries.length})})(s4,a4),u2.debug("push batch done"),l5.inFlightBatch=Math.max(0,(l5.inFlightBatch??0)-s4.entries.length),f3&&(l5.count+=s4.entries.length,l5.lastAt=Date.now(),e.status.out+=s4.entries.length)},{wait:a3,size:c4,age:l4});n2.batches[d2]={batched:o4,batchFn:()=>{h2()},flush:async()=>{await h2.flush()}}}const o3=n2.batches[d2];o3.batched.entries.push({event:a2.event,ingest:s2,respond:r2,rule:f2,data:a2.data}),o3.batched.events.push(a2.event),v(a2.data)&&o3.batched.data.push(a2.data);const c3=n2.config.id||t2,l3=xe(e,c3);return l3.inFlightBatch=(l3.inFlightBatch??0)+1,o3.batchFn(),ke}{u2.debug("push",{event:a2.event.name});const t3=await x(n2.push,"DestinationPush",e.hooks,e.logger)(a2.event,l2);return u2.debug("push done"),t3}}function Ee(e){return{ok:!e?.failed,...e}}function Ie(e){const{code:n2,config:t2={},env:o2={},cache:s2}=e,{config:r2}=Z(e,"before"),{config:i2}=Z({...e,config:r2},"next"),a2={...n2.config,...t2,...i2};s2&&(a2.cache=s2);const c2=De(n2.env,o2);return{...n2,config:a2,env:c2}}function De(e,n2){return e||n2?n2?e&&b(e)&&b(n2)?{...e,...n2}:n2:e:{}}async function He(e,n2,t2){const o2=Object.entries(e).map(async([e2,o3])=>{const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",i2=t2.scope(r2),a2={id:e2,config:o3.config,env:o3.env??{},logger:i2};try{await Promise.race([s2(a2),new Promise((t3,o4)=>setTimeout(()=>o4(new Error(`${n2} '${e2}' destroy timed out`)),5e3))])}catch(t3){i2.error(`${n2} '${e2}' destroy failed: ${t3}`)}});await Promise.allSettled(o2)}async function Fe(e,n2,o2){let r2,i2,a2=!1;switch(n2){case t_Commands.Config:Be(o2)&&(Me(e.config,o2,{shallow:!1}),i2=o2,a2=!0);break;case t_Commands.Consent:if(Be(o2)){const{update:n3}=function(e,n2){const t2={};return Object.entries(n2).forEach(([e2,n3])=>{t2[e2]=!!n3}),e.consent=o(e.consent,t2),{update:t2}}(e,o2);i2=n3,a2=!0}break;case t_Commands.Custom:Be(o2)&&(e.custom=Me(e.custom,o2),i2=o2,a2=!0);break;case t_Commands.Destination:Be(o2)&&"code"in o2&&Be(o2.code)&&(r2=await async function(e,n2){const{code:t2,config:o2={},env:s2={},before:r2,next:i2,cache:a2}=n2;if(!w(t2.push))return Ee({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};i2&&(u2={...u2,next:i2}),a2&&(u2={...u2,cache:a2});const l2={...t2,config:u2,env:De(t2.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]),Se(e,void 0,{},{[f2]:l2})}(e,o2));break;case t_Commands.Globals:Be(o2)&&(e.globals=Me(e.globals,o2),i2=o2,a2=!0);break;case t_Commands.Hook:if(Be(o2)&&Te(o2.name)&&Re(o2.fn)){const{name:n3,fn:t2}=o2;e.hooks[n3]=t2,i2=o2,a2=!0}break;case t_Commands.On:if(Be(o2)&&Te(o2.type)){const{type:n3,rules:t2}=o2;await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=O(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,he(e,n2,r2)}(e,n3,t2)}break;case t_Commands.Ready:a2=!0;break;case t_Commands.Run:r2=await async function(e,n2){return e.allowed=!0,e.timing=Date.now(),n2&&(n2.consent&&(e.consent=Me(e.consent,n2.consent)),n2.user&&(e.user=Me(e.user,n2.user)),n2.globals&&(e.globals=Me(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=Me(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await Se(e)}(e,o2),a2=!0;break;case t_Commands.Session:a2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await He(e2.sources,"source",n3),await He(e2.destinations,"destination",n3),await He(e2.transformers,"transformer",n3),await He(e2.stores,"store",n3)}(e);break;case t_Commands.User:Be(o2)&&(Me(e.user,o2,{shallow:!1}),i2=o2,a2=!0)}return a2&&(await async function(e,n2,o2,s2){let r2,i2=o2||[];switch(o2||(i2=e.on[n2]||[]),n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}let a2=!1;for(const[t2,o3]of Object.entries(e.sources)){if(o3.config.require?.length){const e2=o3.config.require.indexOf(n2);-1!==e2&&o3.config.require.splice(e2,1)}o3.on&&(ce(o3)?!1===await S(o3.on,o4=>fe(e,"source",o4,{sourceId:t2,type:n2}))(n2,r2)&&(a2=!0):(o3.queueOn=o3.queueOn||[],o3.queueOn.push({type:n2,data:r2})))}Object.entries(e.destinations).forEach(([t2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:n2,data:r2});pe(e,o3,t2,n2,r2)}});for(const[n3,t2]of Object.entries(e.sources))ce(t2)&&t2.queueOn?.length&&await ae(e,t2,n3);return Object.keys(e.pending.destinations).length>0&&await async function(e2,n3){for(const[t2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[t2]||e2.destinations[t2])continue;const s3=o3.config?.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[t2];const i3=Ie(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),he(e,n2,i2,s2),!a2}(e,n2,void 0,i2),r2=await Se(e)),r2||Ee({ok:!0})}function Ge(e,n2){if(!n2.name)throw new Error("Event name is required");const[t2,o2]=n2.name.split(" ");if(!t2||!o2)throw new Error("Event name is invalid");const{timestamp:s2=Date.now(),name:r2=`${t2} ${o2}`,data:i2={},context:a2={},globals:c2=e.globals,custom:u2={},user:l2=e.user,nested:f2=[],consent:d2=e.consent,id:g2=ze(),trigger:p2="",entity:h2=t2,action:m2=o2,timing:y2=0,source:v2={type:"collector",schema:"4"}}=n2;return{name:r2,data:i2,context:a2,globals:c2,custom:u2,user:l2,nested:f2,consent:d2,id:g2,trigger:p2,entity:h2,action:m2,timestamp:s2,timing:y2,source:v2}}function nn(e={}){const n2=e.maxEntries??1e4,t2=e.lowWaterMark??.8,o2=e.sweepIntervalMs??6e4,s2=Math.floor(n2*t2),r2=new Map,i2={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a2;return o2>0&&(a2=setInterval(function(){const e2=Date.now();let n3=0;for(const[t3,o3]of r2)void 0!==o3.expires&&o3.expires<=e2&&(r2.delete(t3),n3++);i2.evictions_ttl+=n3},o2),a2&&"function"==typeof a2.unref&&a2.unref()),{type:"memory",config:{},get(e2){const n3=r2.get(e2);if(n3)return void 0!==n3.expires&&n3.expires<=Date.now()?(r2.delete(e2),i2.evictions_ttl++,void i2.misses++):(r2.delete(e2),r2.set(e2,n3),i2.hits++,n3.value);i2.misses++},set(e2,t3,o3){const a3=!r2.has(e2);a3||r2.delete(e2),r2.set(e2,{value:t3,expires:void 0!==o3?Date.now()+o3:void 0}),i2.writes++,a3&&i2.populates++,r2.size>n2&&function(){if(r2.size<=n2)return;const e3=r2.size-s2;let t4=0;for(const n3 of r2.keys()){if(t4>=e3)break;r2.delete(n3),t4++}i2.evictions_entries+=t4}()},delete(e2){r2.delete(e2)&&i2.deletes++},get counters(){return{...i2}},destroy(){void 0!==a2&&(clearInterval(a2),a2=void 0),r2.clear()}}}function on(e,n2){const{cacheConfig:t2,cacheStore:o2,namespace:s2,logger:r2,storeId:i2}=n2,a2={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c2=t2.rules.map(e2=>({match:e2.match?tn(e2.match):()=>!0,ttl:e2.ttl})),u2=e2=>`${s2}:${e2}`;function l2(e2,n3){const t3=void 0===n3?{key:e2}:{key:e2,value:n3};return c2.find(e3=>e3.match(t3))}const f2=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a2}},async get(n3){const t3=u2(n3),s3=await o2.get(t3);if(void 0!==s3)return a2.hits++,s3;const r3=f2.get(t3);if(r3)return a2.inflight_dedups++,r3;a2.misses++;const i3=(async()=>{try{const s4=await e.get(n3);if(void 0===s4)return;const r4=l2(n3,s4);if(r4)try{await o2.set(t3,s4,1e3*r4.ttl),a2.populates++}catch(e2){d2("set",n3,e2)}return s4}finally{f2.delete(t3)}})();return f2.set(t3,i3),i3},async set(n3,t3,s3){a2.writes++,await e.set(n3,t3,s3);const r3=l2(n3,t3);if(r3)try{await o2.set(u2(n3),t3,1e3*r3.ttl)}catch(e2){d2("set",n3,e2)}},async delete(n3){a2.deletes++,await e.delete(n3);try{await o2.delete(u2(n3))}catch(e2){d2("delete",n3,e2)}}};function d2(e2,n3,t3){const o3=`store-cache(${i2}): cache ${e2} failed for "${n3}"; backing succeeded, continuing`;r2?r2.warn(o3,{error:t3}):console.warn(o3,t3)}}function sn(e,n2){const t2=n2.get,o2=n2.set,s2=n2.delete;n2.get=en(t2,"StoreGet",e.hooks,e.logger),n2.set=en(o2,"StoreSet",e.hooks,e.logger),n2.delete=en(s2,"StoreDelete",e.hooks,e.logger)}async function an(e){const n2=r({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),t2={level:e.logger?.level,handler:e.logger?.handler},o2=i(t2),s2={...n2.globalsStatic,...e.globals},a2={allowed:!1,config:n2,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,hooks:e.hooks||{},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,n3;a2.push=function(e,n2){return Ye(async(t2,o2={})=>await Ve(async()=>{const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:l2,exclude:f2}=o2;let d2=a2,g2=t2;const p2=l2||f2?function(e2,n3,t3){let o3=e2;return n3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>n3.includes(e3)))),t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!t3.includes(e3)))),o3}(e.destinations,l2,f2):void 0,h2=i2??Ne(r2||"unknown");if(c2){const n3=await Ke(g2,c2,e);if(n3.ignore)return Ee({ok:!0});if(c2.consent&&!Le(c2.consent,e.consent,n3.event.consent))return Ee({ok:!0});g2=n3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await se(e,e.transformers,u2,g2,h2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return Ee({ok:!0});if(t3.stopped)return t3.respond&&(d2=t3.respond),Ee({ok:!0});if(t3.respond&&(d2=t3.respond),Array.isArray(t3.event)){const o3=await Promise.all(t3.event.map(async t4=>{const o4=n2(t4),s3=Ge(e,o4);return Se(e,s3,{id:r2,ingest:h2,respond:d2},p2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count+=t3.event.length,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return o3[0]??Ee({ok:!0})}g2=t3.event}const m2=n2(g2),y2=Ge(e,m2),v2=await Se(e,y2,{id:r2,ingest:h2,respond:d2},p2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count++,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return v2},n3=>{if(n3 instanceof Ue)throw n3;return e.status.failed++,e.logger.error("push failed",{event:t2,ingest:o2.ingest,error:n3}),Ee({ok:!1})})(),"Push",e.hooks,e.logger)}(a2,e2=>({timing:Math.round((Date.now()-a2.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.0-next-1779362268386"},...e2})),a2.command=(n3=Fe,Xe(async(t3,o3,s3)=>await Ze(async()=>await n3(e2,t3,o3,s3),n4=>{if(n4 instanceof Qe)throw n4;return e2.status.failed++,e2.logger.error("command failed",{command:t3,data:o3,error:n4}),Ee({ok:!1})})(),"Command",(e2=a2).hooks,e2.logger));const c2=e.stores||{};return a2.stores=await async function(e,n2={}){const t2={};for(const[o3,s3]of Object.entries(n2)){const{code:n3,config:r2={},env:i2={}}=s3,a2=e.logger.scope("store").scope(o3),c2={collector:e,logger:a2,id:o3,config:r2,env:i2},u2=await n3(c2);t2[o3]=u2}const o2=n2,s2=function(e2){const n3={};for(const t4 of Object.keys(e2))n3[t4]="WHITE";const t3=[],o3=[];function s3(r2){const i2=n3[r2];if("BLACK"===i2)return;if("GRAY"===i2){const e3=o3.indexOf(r2),n4=o3.slice(-1===e3?0:e3).concat(r2).join(" -> ");throw new Error(`Cycle in cache.store chain: ${n4}`)}n3[r2]="GRAY",o3.push(r2);const a2=e2[r2].cache?.store;if(void 0!==a2){if(!(a2 in e2))throw new Error(`Store "${r2}" cache.store references "${a2}", which is not declared in flow.stores`);s3(a2)}o3.pop(),n3[r2]="BLACK",t3.push(r2)}for(const t4 of Object.keys(e2))"WHITE"===n3[t4]&&s3(t4);return t3}(o2);for(const n3 of s2){const s3=o2[n3].cache;if(!s3)continue;let r2,i2;void 0!==s3.store?(r2=t2[s3.store],i2=s3.store):(t2.__cache||(t2.__cache=nn()),r2=t2.__cache,i2="__cache");const a2=s3.namespace??n3;e.logger.scope("store-cache").scope(n3).info(`store "${n3}" caches with namespace "${a2}:" via ${i2}`),t2[n3]=on(t2[n3],{storeId:n3,cacheConfig:s3,cacheStore:r2,namespace:a2,logger:e.logger.scope("store-cache").scope(n3)})}for(const[n3,o3]of Object.entries(t2))"__cache"!==n3&&sn(e,o3);return t2}(a2,c2),function(e2,n3,t3){const o3=new Map;for(const[t4,s4]of Object.entries(e2))n3[t4]&&o3.set(s4,n3[t4]);if(0!==o3.size)for(const e3 of[t3.transformers,t3.destinations,t3.sources])if(e3)for(const n4 of Object.values(e3))s3(n4.env);function s3(e3){if(e3)for(const[n4,t4]of Object.entries(e3))if("object"==typeof t4&&null!==t4){const s4=o3.get(t4);s4&&(e3[n4]=s4)}}}(c2,a2.stores,e),a2.stores.__cache||(a2.stores.__cache=nn()),a2.destinations=await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2))s2.config?.require?.length?e.pending.destinations[o2]=s2:t2[o2]=Ie(s2);return t2}(a2,e.destinations||{}),a2.transformers=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,env:r2={}}=s3,i2=Y(s3,"Transformer");if(!i2.ok){e2.logger.warn(`Transformer ${o3} invalid (${i2.code}): ${i2.reason}. Skipping.`);continue}const{config:a3}=Z(s3,"before"),{config:c3}=Z({...s3,config:a3},"next"),u2=Object.keys(r2).length>0?{...c3,env:r2}:c3,{cache:l2}=s3,f2=l2?{...u2,cache:l2}:u2,d2=e2.logger.scope("transformer").scope(o3),g2={collector:e2,logger:d2,id:o3,ingest:B(o3),config:f2,env:r2},p2=n4??(e3=>{const n5=s3.mapping;if(n5){const t4=[];if(void 0!==n5.data&&t4.push("data"),n5.mapping)for(const[e4,o4]of Object.entries(n5.mapping))if("object"==typeof o4&&null!==o4)for(const[n6,s4]of Object.entries(o4)){if("object"!=typeof s4||null===s4)continue;const o5=s4;void 0!==o5.data&&t4.push(`mapping[${e4}][${n6}].data`),void 0!==o5.silent&&t4.push(`mapping[${e4}][${n6}].silent`)}return t4.length>0&&e3.collector.logger.warn(`Transformer ${o3}: \`${t4.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e3.config,push:async t5=>{const o4=await J(t5,n5,e3.collector);return!o4.ignore&&{event:o4.event}}}}return{type:"pass",config:e3.config,push:e4=>({event:e4})}}),h2=await p2(g2);void 0!==s3.before&&void 0===h2.config?.before&&(h2.config={...h2.config??{},before:s3.before}),void 0!==s3.next&&void 0===h2.config?.next&&(h2.config={...h2.config??{},next:s3.next}),t3[o3]=h2}return t3}(a2,e.transformers||{}),a2}async function cn(e){e=e||{};const n2=await an(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const t4=e2.replace("walker ","");return o2.command(t4,n3)}let i3;if("string"==typeof e2)i3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(i3.data=n3);else{if(!e2||"object"!=typeof e2)return Ee({ok:!1});i3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(i3.data={...i3.data||{},...n3})}return t3&&"object"==typeof t3&&(i3.context=t3),s3&&Array.isArray(s3)&&(i3.nested=s3),r3&&"object"==typeof r3&&(i3.custom=r3),o2.push(i3)}});var o2;n2.sources.elb=t2,await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const n3=await ue(e,o2,s2);if(!n3)continue;const r2=s2.config?.require;n3.config={...n3.config,init:!1,...r2?{require:[...r2]}:{}},t2[o2]=n3}Object.assign(e.sources,t2);for(const n3 of Object.keys(t2)){const t3=e.sources[n3];let o2=!1;t3.init&&await I(t3.init.bind(t3),t4=>{if(t4 instanceof _)throw t4;o2=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:n3,error:t4})})(),o2||(t3.config.init=!0,ce(t3)&&await ae(e,t3,n3))}return t2}(n2,e.sources||{});const{consent:s2,user:r2,globals:i2,custom:a2}=e;s2&&await n2.command("consent",s2),r2&&await n2.command("user",r2),i2&&Object.assign(n2.globals,i2),a2&&Object.assign(n2.custom,a2),n2.config.run&&await n2.command("run");let c2=t2.push;const u2=Object.values(n2.sources).filter(e2=>"elb"!==e2.type),l2=u2.find(e2=>e2.config.primary);return l2?c2=l2.push:u2.length>0&&(c2=u2[0].push),{collector:n2,elb:c2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await cn(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&&params.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 i}from"@walkeros/core";import{assign as a,buildCacheContext as c,clone as u,compileCache as l,checkCache as f,storeCache as d,createIngest as g,debounce as p,getId as h,getGrantedConsent as m,getNextSteps as y,isDefined as v,isFunction as w,isObject as b,processEventMapping as k,stepId as C,tryCatchAsync as q,useHooks as x}from"@walkeros/core";import{isArray as O,FatalError as j}from"@walkeros/core";import{tryCatch as A,tryCatchAsync as S}from"@walkeros/core";import{createIngest as $,FatalError as _,getMappingValue as E,tryCatchAsync as I,getNextSteps as P,compileCache as D,checkCache as M,storeCache as z,applyUpdate as R,buildCacheContext as T}from"@walkeros/core";import{createIngest as B,FatalError as H,isObject as F,tryCatchAsync as G,useHooks as W,getNextSteps as N,compileCache as U,checkCache as L,storeCache as K,buildCacheContext as V,validateStepEntry as Y,processEventMapping as J}from"@walkeros/core";import{assign as Me,getSpanId as ze,isFunction as Re,isString as Te}from"@walkeros/core";import{isObject as Be}from"@walkeros/core";import{createIngest as Ne,FatalError as Ue,getGrantedConsent as Le,processEventMapping as Ke,tryCatchAsync as Ve,useHooks as Ye}from"@walkeros/core";import{FatalError as Qe,useHooks as Xe,tryCatchAsync as Ze}from"@walkeros/core";import{useHooks as en}from"@walkeros/core";import{compileMatcher as tn}from"@walkeros/core";var t_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 Q(e,n2){return e.storeId&&n2.stores[e.storeId]?n2.stores[e.storeId]:n2.stores.__cache}function X(e){const n2={};for(const[t2,o2]of Object.entries(e)){const e2=o2.config?.next;"string"==typeof e2||Array.isArray(e2)&&e2.every(e3=>"string"==typeof e3)?n2[t2]={next:e2}:n2[t2]={}}return n2}function Z(e,n2){const t2=e.config||{},o2=e[n2];return void 0!==o2?{config:{...t2,[n2]:o2},chainValue:o2}:{config:t2,chainValue:void 0}}function ee(e,n2={}){if(!e)return[];if(Array.isArray(e))return e;const t2=[],o2=new Set;let s2=e;for(;s2&&n2[s2]&&!o2.has(s2);){o2.add(s2),t2.push(s2);const e2=n2[s2].next;if(Array.isArray(e2)){t2.push(...e2);break}s2=e2}return t2}async function ne(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(`transformer:${o2}`),r2={collector:e,logger:s2,id:t2,ingest:B(t2),config:n2.config,env:re(n2.config.env)};s2.debug("init");const i2=await W(n2.init,"TransformerInit",e.hooks,e.logger)(r2);if(!1===i2)return!1;n2.config={...i2||n2.config,env:i2?.env||n2.config.env,init:!0},s2.debug("init done")}return!0}async function te(e,n2,t2,o2,s2,r2){const i2=n2.type||"unknown",a2=e.logger.scope(`transformer:${i2}`),c2={collector:e,logger:a2,id:t2,ingest:s2,config:n2.config,env:{...re(n2.config.env),...r2?{respond:r2}:{}}};a2.debug("push",{event:o2.name});const u2=await W(n2.push,"TransformerPush",e.hooks,e.logger)(o2,c2);return a2.debug("push done"),u2}function oe(e,n2){return e?{...e,_meta:{...e._meta,path:[...e._meta.path]}}:B(n2)}async function se(e,n2,t2,o2,s2,r2,i2){s2||(s2=B(t2[0]??"chain")),i2&&s2._meta&&(s2._meta.chainPath=i2);let a2=o2,c2=r2;for(const o3 of t2){const r3=n2[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 G(ne,n3=>{if(n3 instanceof H)throw n3;return e.status.failed++,e.logger.scope(`transformer:${r3.type||"unknown"}`).error("transformer init failed",{transformer:o3,error:n3}),!1})(e,r3,o3))return{event:null,respond:c2};if(i2&&void 0!==r3.config?.chainMocks?.[i2]){const n3=r3.config.chainMocks[i2];e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("chainMock",{chain:i2}),a2=n3;continue}if(void 0!==r3.config?.mock){e.logger.scope(`transformer:${r3.type||"unknown"}`).debug("mock"),a2=r3.config.mock;continue}if(r3.config?.disabled)continue;const u2=r3.config?.cache,l2=u2?U(u2):void 0,f2=l2?Q(l2,e):void 0;let d2;if(l2&&f2){const e2=V(s2,a2),n3=await L(l2,f2,e2);if("HIT"===n3?.status&&n3.value){if(a2=n3.value,l2.stop)return{event:a2,respond:c2,stopped:!0};continue}"MISS"===n3?.status&&(d2={key:n3.key,ttl:n3.rule.ttl})}const g2=r3.config.before;if(g2){const t3=N(g2,V(s2,a2));if(1===t3.length){const o4=ee(t3[0],X(n2));if(o4.length>0){const t4=await se(e,n2,o4,a2,s2,c2,i2);if(null===t4.event)return{event:null,respond:t4.respond??c2};if(t4.stopped)return{event:Array.isArray(t4.event)?t4.event[0]:t4.event,respond:t4.respond??c2,stopped:!0};t4.respond&&(c2=t4.respond),a2=Array.isArray(t4.event)?t4.event[0]:t4.event}}else t3.length>1&&await Promise.all(t3.map(t4=>G(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),a2,oe(s2,t4),void 0,i2)))}const p2=await G(te,n3=>(e.logger.scope(`transformer:${r3.type||"unknown"}`).error("Push failed",{error:n3}),!1))(e,r3,o3,a2,s2,c2);if(!1===p2)return{event:null,respond:c2};if(Array.isArray(p2)){const r4=t2.slice(t2.indexOf(o3)+1),u3=await Promise.all(p2.map(async t3=>{const o4=t3.event||a2,u4=oe(s2,"unknown");if(t3.next){const s3=N(t3.next,V(u4,o4));if(0===s3.length)return{event:o4,respond:c2};if(1===s3.length){const t4=ee(s3[0],X(n2));return t4.length>0?se(e,n2,t4,o4,u4,c2,i2):{event:o4,respond:c2}}return(await Promise.all(s3.map(t4=>G(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),o4,oe(u4,t4),void 0,i2)))).map(e2=>({event:e2.event,respond:void 0}))}return r4.length>0?se(e,n2,r4,o4,u4,c2,i2):{event:o4,respond:c2}}));let l3=c2;const f3=[];for(const e2 of u3.flat())if(null!==e2)if(e2&&"object"==typeof e2&&"event"in e2){const n3=e2;if(n3.respond&&(l3=n3.respond),null===n3.event)continue;Array.isArray(n3.event)?f3.push(...n3.event):f3.push(n3.event)}else f3.push(e2);return 0===f3.length?{event:null,respond:l3}:1===f3.length?{event:f3[0],respond:l3}:{event:f3,respond:l3}}if(p2&&"object"==typeof p2){const{event:t3,respond:o4,next:r4}=p2;if(o4&&(c2=o4),void 0!==r4){const o5=N(r4,V(s2,a2));if(0===o5.length){t3&&(a2=t3);continue}if(1===o5.length){const u3=ee(o5[0],X(n2));return u3.length>0?se(e,n2,u3,t3||a2,s2,c2,i2):(e.logger.warn(`Branch target not found: ${JSON.stringify(r4)}`),{event:null,respond:c2})}return await Promise.all(o5.map(o6=>G(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${o6} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(o6,X(n2)),t3||a2,oe(s2,o6),void 0,i2))),{event:null,respond:void 0}}t3&&(a2=t3)}d2&&f2&&K(f2,d2.key,a2,d2.ttl);const h2=r3.config.next,m2="string"==typeof h2||Array.isArray(h2)&&h2.every(e2=>"string"==typeof e2),y2=void 0!==h2&&!m2;if((!p2||"object"==typeof p2&&!p2.next)&&y2){const t3=N(r3.config.next,V(s2,a2));if(1===t3.length){const o4=ee(t3[0],X(n2));return o4.length>0?se(e,n2,o4,a2,s2,c2,i2):{event:a2,respond:c2}}return t3.length>1?(await Promise.all(t3.map(t4=>G(se,n3=>(e.logger.scope("transformer:many").error(`many branch ${t4} failed`,{error:n3}),{event:null,respond:void 0}))(e,n2,ee(t4,X(n2)),a2,oe(s2,t4),void 0,i2))),{event:null,respond:void 0}):{event:a2,respond:c2}}}return{event:a2,respond:c2}}function re(e){return e&&F(e)?e:{}}function ie(e){return"string"==typeof e||!(!Array.isArray(e)||!e.every(e2=>"string"==typeof e2))}async function ae(e,n2,t2){if(!n2.on||!n2.queueOn?.length)return;const o2=n2.queueOn;n2.queueOn=[];const s2=t2||n2.config?.id||"unknown";for(const{type:t3,data:r2}of o2)await I(n2.on,n3=>{if(n3 instanceof _)throw n3;e.status.failed++,e.logger.scope("source").error("source on flush failed",{sourceId:s2,type:t3,error:n3})})(t3,r2)}function ce(e){return Boolean(e.config.init)&&!e.config.require?.length}async function ue(e,n2,t2){const{code:o2,config:s2={},env:r2={},primary:i2,next:a2,before:c2,cache:u2}=t2,l2=u2,f2=l2?D({...l2,stop:l2.stop??!0}):void 0,d2=ie(a2)?ee(a2,X(e.transformers)):void 0,g2=ie(c2)?ee(c2,X(e.transformers)):void 0,p2=r2.push,h2=p2??e.push,m2=Boolean(p2),y2=async(t3,o3,r3)=>{let i3;const u3=g2??(void 0!==c2?(()=>{const n3=P(c2,T(r3.ingest));return 0===n3.length?[]:ee(1===n3.length?n3[0]:n3,X(e.transformers))})():[]);let l3=[t3];if(u3.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const o4=await se(e,e.transformers,u3,t3,r3.ingest,r3.respond,`source.${n2}.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),l3=Array.isArray(o4.event)?o4.event:[o4.event]}if(f2){const n3=Q(f2,e);if(n3){const t4=T(r3.ingest),o4=await M(f2,n3,t4);if(o4){if("HIT"===o4.status&&void 0!==o4.value&&f2.stop){let n4=o4.value;return o4.rule.update&&(n4=await R(n4,o4.rule.update,{...t4,cache:{status:"HIT"}},e)),r3.respond?.(n4),{ok:!0}}if("MISS"===o4.status&&f2.stop&&r3.respond){const s3=r3.respond,a3=o4.rule.update,c3={...t4,cache:{status:"MISS"}},u4=o4.key,l4=o4.rule.ttl,f3=t5=>{z(n3,u4,t5,l4),a3?i3=(async()=>{const n4=await R(t5,a3,c3,e);s3(n4)})():s3(t5)};r3.respond=f3}"MISS"!==o4.status||f2.stop||z(n3,o4.key,!0,o4.rule.ttl)}}}const p3=d2?{kind:"single",preChain:d2}:void 0!==a2?(()=>{const n3=P(a2,T(r3.ingest));return 0===n3.length?{kind:"single",preChain:[]}:1===n3.length?{kind:"single",preChain:ee(n3[0],X(e.transformers))}:{kind:"many",branches:n3.map(n4=>ee(n4,X(e.transformers)))}})():{kind:"single",preChain:[]};let y3={ok:!0};for(const t4 of l3)"many"===p3.kind?(await Promise.all(p3.branches.map((i4,a3)=>I(async()=>m2?h2(t4):h2(t4,{...o3,id:n2,ingest:oe(r3.ingest,`${n2}.${a3}`),respond:void 0,mapping:s2,preChain:i4}),n3=>(e.logger.scope("source:many").error(`many branch ${a3} failed`,{error:n3}),{ok:!0}))())),y3={ok:!0}):y3=m2?await h2(t4):await h2(t4,{...o3,id:n2,ingest:r3.ingest,respond:r3.respond,mapping:s2,preChain:p3.preChain});return i3&&await i3,y3},v2=async t3=>{const o3=$(n2);if(!s2.ingest||void 0===t3)return o3;const r3=await E(t3,s2.ingest,{collector:e});return{...o3,...r3,_meta:o3._meta}},w2=e.logger.scope("source").scope(n2),b2={command:e.command,sources:e.sources,elb:e.sources.elb.push,logger:w2,...r2,push:async(e2,t3={})=>{const o3={ingest:$(n2),respond:void 0};return y2(e2,t3,o3)}},k2={collector:e,logger:w2,id:n2,config:s2,env:b2,withScope:async(e2,n3,t3)=>{const o3={ingest:await v2(e2),respond:n3};return t3({...b2,push:(e3,n4={})=>y2(e3,n4,o3),ingest:o3.ingest,respond:o3.respond})}},C2=await I(o2,t3=>{if(t3 instanceof _)throw t3;e.status.failed++,e.logger.scope("source").error("source factory failed",{sourceId:n2,error:t3})})(k2);if(!C2)return;const q2=C2.type||"unknown",x2=e.logger.scope(q2).scope(n2);return b2.logger=x2,i2&&(C2.config={...C2.config,primary:i2}),C2}function fe(e,n2,t2,o2){if(t2 instanceof j)throw t2;e.logger.scope("on").error("on callback failed",{kind:n2,...o2,error:t2})}function de(e,n2){return{collector:e,logger:e.logger.scope("on").scope(String(n2))}}function pe(e,n2,t2,o2,s2){if(!n2.on)return;const r2=n2.type||"unknown",i2=e.logger.scope(r2).scope("on").scope(o2),a2={collector:e,logger:i2,id:t2,config:n2.config,data:s2,env:De(n2.env,n2.config.env)};A(n2.on,n3=>fe(e,"destination",n3,{destId:t2,type:o2}))(o2,a2)}function he(e,n2,o2,s2){let r2;switch(n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}if(o2.length)switch(n2){case t_Commands.Consent:!function(e2,n3,o3){const s3=o3||e2.consent,r3=de(e2,t_Commands.Consent);n3.forEach(n4=>{Object.keys(s3).filter(e3=>e3 in n4).forEach(t2=>{A(n4[t2],n5=>fe(e2,"consent",n5,{key:t2}))(s3,r3)})})}(e,o2,s2);break;case t_Commands.Ready:!function(e2,n3){if(!e2.allowed)return;const o3=de(e2,t_Commands.Ready);n3.forEach(n4=>{A(n4,n5=>fe(e2,"ready",n5))(void 0,o3)})}(e,o2);break;case t_Commands.Run:!function(e2,n3){if(!e2.allowed)return;const o3=de(e2,t_Commands.Run);n3.forEach(n4=>{A(n4,n5=>fe(e2,"run",n5))(void 0,o3)})}(e,o2);break;case t_Commands.Session:!function(e2,n3){if(!e2.session)return;const o3=de(e2,t_Commands.Session);n3.forEach(n4=>{A(n4,n5=>fe(e2,"session",n5))(e2.session,o3)})}(e,o2);break;default:{const t2=de(e,n2);o2.forEach(o3=>{"function"==typeof o3&&A(o3,t3=>fe(e,"generic",t3,{type:n2}))(r2,t2)});break}}}function ye(e,n2,t2,o2){if(!Number.isFinite(t2.max)||t2.max<=0)throw new Error(`pushBounded: max must be > 0 (got ${t2.max})`);if("dropNewest"===(t2.onOverflow??"dropOldest"))return e.length>=t2.max?(o2&&o2([n2]),{appended:!1,dropped:1}):(e.push(n2),{appended:!0,dropped:0});const s2=[];for(;e.length>=t2.max;)s2.push(e.shift());return e.push(n2),s2.length>0&&o2&&o2(s2),{appended:!0,dropped:s2.length}}var ve=new WeakMap;function we(e,n2,t2,o2){ve.get(e)||(ve.set(e,!0),n2.warn(t2,o2))}function be(e){ve.delete(e)}var ke=Object.freeze({batched:!0});function Ce(e){return e===ke}function qe(e){return void 0===e?{}:"number"==typeof e?{wait:e}:{wait:e.wait,size:e.size,age:e.age}}function xe(e,n2){return e.status.destinations[n2]||(e.status.destinations[n2]={count:0,failed:0,duration:0,queuePushSize:0,dlqSize:0}),e.status.destinations[n2]}function Oe(e,n2,t2,o2){e.dropped[n2]||(e.dropped[n2]={});const s2=e.dropped[n2];return s2[t2]=(s2[t2]??0)+o2,s2[t2]}function je(e,n2,t2){if(!e)return[];if(Array.isArray(e)&&e.every(e2=>"string"==typeof e2))return ee(e,n2);if("string"==typeof e)return ee(e,n2);const o2=y(e,c(t2));return 0===o2.length?[]:1===o2.length?ee(o2[0],n2):ee(o2,n2)}async function Se(e,n2,t2={},o2){const{allowed:s2,consent:r2,globals:i2,user:p2}=e;if(!s2)return Ee({ok:!1});if(n2){const t3=e.config.queueMax;if(void 0===t3)throw new Error("Collector.Config.queueMax is undefined; defaults must be seeded by collector()");const o3=ye(e.queue,n2,{max:t3});if(o3.dropped>0){const n3=Oe(e.status,C("collector"),"queue",o3.dropped);we(e.queue,e.logger,"collector.queue overflow; oldest events dropped",{buffer:"queue",cap:t3,droppedCount:n3})}else e.queue.length<t3&&be(e.queue);e.status.in++}o2||(o2=e.destinations);const h2=e.transformers?X(e.transformers):{},y2=await Promise.all(Object.entries(o2||{}).map(async([o3,s3])=>{if(s3.config.disabled)return{id:o3,destination:s3,skipped:!0};let y3=(s3.queuePush||[]).map(e2=>({...e2,consent:r2}));s3.queuePush=[],n2&&y3.push(u(n2));const v3=t2.ingest?{...t2.ingest,_meta:{...t2.ingest._meta,path:[...t2.ingest._meta.path]}}:g("unknown");if(!y3.length&&!s3.queueOn?.length)return{id:o3,destination:s3,skipped:!0};if(!y3.length&&s3.queueOn?.length){let n3=!1;try{n3=await $e(e,s3,o3)}catch(n4){e.status.failed++;const t3=s3.type||"unknown";e.logger.scope(t3).error("destination init failed",{error:n4 instanceof Error?n4.message:String(n4)})}return{id:o3,destination:s3,skipped:!n3}}const w3=[],b3=y3.filter(e2=>{const n3=m(s3.config.consent,r2,e2.consent);return!n3||(e2.consent=n3,w3.push(e2),!1)});if(b3.length>0){const n3=s3.queuePush,t3=s3.config.id||o3,r3={max:s3.config.queueMax??1e3};let i3=0;for(const e2 of b3)i3+=ye(n3,e2,r3).dropped;if(i3>0){xe(e,t3);const o4=Oe(e.status,C("destination",t3),"queue",i3);we(n3,e.logger.scope(s3.type||"unknown"),"destination.queuePush overflow; oldest events dropped",{buffer:"queuePush",destination:t3,cap:r3.max,droppedCount:o4})}else n3.length<r3.max&&be(n3)}if(!w3.length)return{id:o3,destination:s3,queue:y3};let k2,x2,O2=!1;try{O2=await $e(e,s3,o3)}catch(n3){e.status.failed++;const t3=s3.type||"unknown";e.logger.scope(t3).error("destination init failed",{error:n3 instanceof Error?n3.message:String(n3)})}if(!O2)return{id:o3,destination:s3,queue:y3};s3.dlq||(s3.dlq=[]);const j2=je(s3.config.before,h2,v3),A2=s3.config.next,S2=s3.config?.cache,$2=S2?l(S2):void 0,_2=$2?Q($2,e):void 0;let E2=0,I2=0;return await Promise.all(w3.map(async n3=>{let r3;if(n3.globals=a(i2,n3.globals),n3.user=a(p2,n3.user),$2?.stop&&_2){const e2=c(v3,n3),t3=await f($2,_2,e2);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}let u2=n3,l2=t2.respond;if(j2.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const s4=await se(e,e.transformers,j2,n3,v3,t2.respond,`destination.${o3}.before`);if(null===s4.event)return n3;s4.respond&&(l2=s4.respond),u2=Array.isArray(s4.event)?s4.event[0]:s4.event}if($2&&!$2.stop&&_2){const e2=c(v3,u2),t3=await f($2,_2,e2);if("HIT"===t3?.status)return n3;"MISS"===t3?.status&&(r3={key:t3.key,ttl:t3.rule.ttl})}const g2=Date.now();let m2=!1;const y4=await q(_e,n4=>{const t3=s3.type||"unknown";e.logger.scope(t3).error("Push failed",{error:n4,event:u2.name}),k2=n4,m2=!0;const r4=s3.dlq,i3=s3.config.id||o3,a2={max:s3.config.dlqMax??100},c2=ye(r4,[u2,n4],a2);if(c2.dropped>0){xe(e,i3);const n5=Oe(e.status,C("destination",i3),"dlq",c2.dropped);we(r4,e.logger.scope(s3.type||"unknown"),"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:i3,cap:a2.max,droppedCount:n5})}else r4.length<a2.max&&be(r4)})(e,s3,o3,u2,v3,l2);if(E2+=Date.now()-g2,r3&&_2&&void 0===s3.config.mock&&d(_2,r3.key,y4??!0,r3.ttl),void 0===y4||Ce(y4)||(x2=y4),Ce(y4)&&I2++,!m2&&A2){void 0!==y4&&(v3._response=y4);const n4=je(A2,h2,v3);if(n4.length>0&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await se(e,e.transformers,n4,u2,v3,l2,`destination.${o3}.next`);t3.respond&&(l2=t3.respond)}}return n3})),{id:o3,destination:s3,error:k2,response:x2,totalDuration:E2,batchedCount:I2,allowedCount:w3.length}})),v2={},w2={},b2={};for(const n3 of y2){if(n3.skipped)continue;const t3=n3.destination,o3={type:t3.type||"unknown",data:n3.response};xe(e,n3.id);const s3=e.status.destinations[n3.id],r3=Date.now();if(s3.queuePushSize=t3.queuePush?.length??0,s3.dlqSize=t3.dlq?.length??0,n3.error)o3.error=n3.error,b2[n3.id]=o3,s3.failed++,s3.lastAt=r3,s3.duration+=n3.totalDuration||0,e.status.failed++;else if(n3.queue&&n3.queue.length)w2[n3.id]=o3;else{const t4=n3.batchedCount??0,i3=n3.allowedCount??0;(Math.max(0,i3-t4)>0||0===i3)&&(v2[n3.id]=o3,s3.count++,s3.lastAt=r3,s3.duration+=n3.totalDuration||0,e.status.out++)}}return Ee({event:n2,...Object.keys(v2).length&&{done:v2},...Object.keys(w2).length&&{queued:w2},...Object.keys(b2).length&&{failed:b2}})}async function $e(e,n2,t2){if(n2.init&&!n2.config.init){const o2=n2.type||"unknown",s2=e.logger.scope(o2),r2={collector:e,logger:s2,id:t2,config:n2.config,env:De(n2.env,n2.config.env)};s2.debug("init");const i2=await x(n2.init,"DestinationInit",e.hooks,e.logger)(r2);if(!1===i2)return i2;if(n2.config={...i2||n2.config,init:!0},n2.queueOn?.length){const o3=n2.queueOn;n2.queueOn=[];for(const{type:s3,data:r3}of o3)pe(e,n2,t2,s3,r3)}s2.debug("init done")}return!0}async function _e(e,n2,t2,o2,s2,r2){const{config:i2}=n2,a2=await k(o2,i2,e);if(a2.ignore)return!1;const c2=n2.type||"unknown",u2=e.logger.scope(c2),l2={collector:e,logger:u2,id:t2,config:i2,data:a2.data,rule:a2.mapping,ingest:s2,env:{...De(n2.env,i2.env),...r2?{respond:r2}:{}}};if(void 0!==i2.mock)return u2.debug("mock",{event:a2.event.name}),i2.mock;const f2=a2.mapping,d2=a2.mappingKey||"* *";if(f2?.batch&&n2.pushBatch&&void 0===i2.mock){if(n2.batches=n2.batches||{},!n2.batches[d2]){const o4={key:d2,entries:[],events:[],data:[]},s3=qe(f2.batch),r3=qe(i2.batch),a3=s3.wait??r3.wait??3e4,c4=s3.size??r3.size??1e3,l4=s3.age??r3.age??3e4,g2=De(n2.env,i2.env),h2=p(async()=>{const o5=n2.batches[d2].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],a4={collector:e,logger:u2,id:t2,config:i2,data:void 0,rule:r4.rule,ingest:r4.ingest,env:{...g2,...r4.respond?{respond:r4.respond}:{}}};u2.debug("push batch",{events:s4.entries.length});const c5=n2.config.id||t2,l5=xe(e,c5);let f3=!0;await q(x(n2.pushBatch,"DestinationPushBatch",e.hooks,e.logger),t3=>{f3=!1;const o6=n2.dlq=n2.dlq||[],r5={max:n2.config.dlqMax??100};let i3=0;for(const e2 of s4.entries)i3+=ye(o6,[e2.event,t3],r5).dropped;if(i3>0){const n3=Oe(e.status,C("destination",c5),"dlq",i3);we(o6,u2,"destination.dlq overflow; oldest entries dropped",{buffer:"dlq",destination:c5,cap:r5.max,droppedCount:n3})}else o6.length<r5.max&&be(o6);l5.failed+=s4.entries.length,l5.dlqSize=o6.length,e.status.failed+=s4.entries.length,u2.error("Push batch failed",{error:t3 instanceof Error?t3.message:String(t3),entries:s4.entries.length})})(s4,a4),u2.debug("push batch done"),l5.inFlightBatch=Math.max(0,(l5.inFlightBatch??0)-s4.entries.length),f3&&(l5.count+=s4.entries.length,l5.lastAt=Date.now(),e.status.out+=s4.entries.length)},{wait:a3,size:c4,age:l4});n2.batches[d2]={batched:o4,batchFn:()=>{h2()},flush:async()=>{await h2.flush()}}}const o3=n2.batches[d2];o3.batched.entries.push({event:a2.event,ingest:s2,respond:r2,rule:f2,data:a2.data}),o3.batched.events.push(a2.event),v(a2.data)&&o3.batched.data.push(a2.data);const c3=n2.config.id||t2,l3=xe(e,c3);return l3.inFlightBatch=(l3.inFlightBatch??0)+1,o3.batchFn(),ke}{u2.debug("push",{event:a2.event.name});const t3=await x(n2.push,"DestinationPush",e.hooks,e.logger)(a2.event,l2);return u2.debug("push done"),t3}}function Ee(e){return{ok:!e?.failed,...e}}function Ie(e){const{code:n2,config:t2={},env:o2={},cache:s2}=e,{config:r2}=Z(e,"before"),{config:i2}=Z({...e,config:r2},"next"),a2={...n2.config,...t2,...i2};s2&&(a2.cache=s2);const c2=De(n2.env,o2);return{...n2,config:a2,env:c2}}function De(e,n2){return e||n2?n2?e&&b(e)&&b(n2)?{...e,...n2}:n2:e:{}}async function He(e,n2,t2){const o2=Object.entries(e).map(async([e2,o3])=>{const s2=o3.destroy;if(!s2)return;const r2=o3.type||"unknown",i2=t2.scope(r2),a2={id:e2,config:o3.config,env:o3.env??{},logger:i2};try{await Promise.race([s2(a2),new Promise((t3,o4)=>setTimeout(()=>o4(new Error(`${n2} '${e2}' destroy timed out`)),5e3))])}catch(t3){i2.error(`${n2} '${e2}' destroy failed: ${t3}`)}});await Promise.allSettled(o2)}async function Fe(e,n2,o2){let r2,i2,a2=!1;switch(n2){case t_Commands.Config:Be(o2)&&(Me(e.config,o2,{shallow:!1}),i2=o2,a2=!0);break;case t_Commands.Consent:if(Be(o2)){const{update:n3}=function(e,n2){const t2={};return Object.entries(n2).forEach(([e2,n3])=>{t2[e2]=!!n3}),e.consent=o(e.consent,t2),{update:t2}}(e,o2);i2=n3,a2=!0}break;case t_Commands.Custom:Be(o2)&&(e.custom=Me(e.custom,o2),i2=o2,a2=!0);break;case t_Commands.Destination:Be(o2)&&"code"in o2&&Be(o2.code)&&(r2=await async function(e,n2){const{code:t2,config:o2={},env:s2={},before:r2,next:i2,cache:a2}=n2;if(!w(t2.push))return Ee({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};i2&&(u2={...u2,next:i2}),a2&&(u2={...u2,cache:a2});const l2={...t2,config:u2,env:De(t2.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]),Se(e,void 0,{},{[f2]:l2})}(e,o2));break;case t_Commands.Globals:Be(o2)&&(e.globals=Me(e.globals,o2),i2=o2,a2=!0);break;case t_Commands.Hook:if(Be(o2)&&Te(o2.name)&&Re(o2.fn)){const{name:n3,fn:t2}=o2;e.hooks[n3]=t2,i2=o2,a2=!0}break;case t_Commands.On:if(Be(o2)&&Te(o2.type)){const{type:n3,rules:t2}=o2;await async function(e,n2,t2){const o2=e.on,s2=o2[n2]||[],r2=O(t2)?t2:[t2];r2.forEach(e2=>{s2.push(e2)}),o2[n2]=s2,he(e,n2,r2)}(e,n3,t2)}break;case t_Commands.Ready:a2=!0;break;case t_Commands.Run:r2=await async function(e,n2){return e.allowed=!0,e.timing=Date.now(),n2&&(n2.consent&&(e.consent=Me(e.consent,n2.consent)),n2.user&&(e.user=Me(e.user,n2.user)),n2.globals&&(e.globals=Me(e.config.globalsStatic||{},n2.globals)),n2.custom&&(e.custom=Me(e.custom,n2.custom))),Object.values(e.destinations).forEach(e2=>{e2.queuePush=[]}),e.queue=[],e.round++,await Se(e)}(e,o2),a2=!0;break;case t_Commands.Session:a2=!0;break;case t_Commands.Shutdown:await async function(e2){const n3=e2.logger;await He(e2.sources,"source",n3),await He(e2.destinations,"destination",n3),await He(e2.transformers,"transformer",n3),await He(e2.stores,"store",n3)}(e);break;case t_Commands.User:Be(o2)&&(Me(e.user,o2,{shallow:!1}),i2=o2,a2=!0)}return a2&&(await async function(e,n2,o2,s2){let r2,i2=o2||[];switch(o2||(i2=e.on[n2]||[]),n2){case t_Commands.Consent:r2=s2||e.consent;break;case t_Commands.Session:r2=e.session;break;case t_Commands.User:r2=s2||e.user;break;case t_Commands.Custom:r2=s2||e.custom;break;case t_Commands.Globals:r2=s2||e.globals;break;case t_Commands.Config:r2=s2||e.config;break;case t_Commands.Ready:case t_Commands.Run:default:r2=void 0}let a2=!1;for(const[t2,o3]of Object.entries(e.sources)){if(o3.config.require?.length){const e2=o3.config.require.indexOf(n2);-1!==e2&&o3.config.require.splice(e2,1)}o3.on&&(ce(o3)?!1===await S(o3.on,o4=>fe(e,"source",o4,{sourceId:t2,type:n2}))(n2,r2)&&(a2=!0):(o3.queueOn=o3.queueOn||[],o3.queueOn.push({type:n2,data:r2})))}Object.entries(e.destinations).forEach(([t2,o3])=>{if(o3.on){if(!o3.config.init)return o3.queueOn=o3.queueOn||[],void o3.queueOn.push({type:n2,data:r2});pe(e,o3,t2,n2,r2)}});for(const[n3,t2]of Object.entries(e.sources))ce(t2)&&t2.queueOn?.length&&await ae(e,t2,n3);return Object.keys(e.pending.destinations).length>0&&await async function(e2,n3){for(const[t2,o3]of Object.entries(e2.pending.destinations)){if(!e2.pending.destinations[t2]||e2.destinations[t2])continue;const s3=o3.config?.require;if(!s3)continue;const r3=s3.indexOf(n3);if(-1===r3)continue;if(s3.splice(r3,1),s3.length>0)continue;delete e2.pending.destinations[t2];const i3=Ie(o3);!1!==i3.config.queue&&(i3.queuePush=[...e2.queue]),e2.destinations[t2]=i3}}(e,n2),he(e,n2,i2,s2),!a2}(e,n2,void 0,i2),r2=await Se(e)),r2||Ee({ok:!0})}function Ge(e,n2){if(!n2.name)throw new Error("Event name is required");const[t2,o2]=n2.name.split(" ");if(!t2||!o2)throw new Error("Event name is invalid");const{timestamp:s2=Date.now(),name:r2=`${t2} ${o2}`,data:i2={},context:a2={},globals:c2=e.globals,custom:u2={},user:l2=e.user,nested:f2=[],consent:d2=e.consent,id:g2=ze(),trigger:p2="",entity:h2=t2,action:m2=o2,timing:y2=0,source:v2={type:"collector",schema:"4"}}=n2;return{name:r2,data:i2,context:a2,globals:c2,custom:u2,user:l2,nested:f2,consent:d2,id:g2,trigger:p2,entity:h2,action:m2,timestamp:s2,timing:y2,source:v2}}function nn(e={}){const n2=e.maxEntries??1e4,t2=e.lowWaterMark??.8,o2=e.sweepIntervalMs??6e4,s2=Math.floor(n2*t2),r2=new Map,i2={hits:0,misses:0,populates:0,writes:0,deletes:0,evictions_entries:0,evictions_ttl:0};let a2;return o2>0&&(a2=setInterval(function(){const e2=Date.now();let n3=0;for(const[t3,o3]of r2)void 0!==o3.expires&&o3.expires<=e2&&(r2.delete(t3),n3++);i2.evictions_ttl+=n3},o2),a2&&"function"==typeof a2.unref&&a2.unref()),{type:"memory",config:{},get(e2){const n3=r2.get(e2);if(n3)return void 0!==n3.expires&&n3.expires<=Date.now()?(r2.delete(e2),i2.evictions_ttl++,void i2.misses++):(r2.delete(e2),r2.set(e2,n3),i2.hits++,n3.value);i2.misses++},set(e2,t3,o3){const a3=!r2.has(e2);a3||r2.delete(e2),r2.set(e2,{value:t3,expires:void 0!==o3?Date.now()+o3:void 0}),i2.writes++,a3&&i2.populates++,r2.size>n2&&function(){if(r2.size<=n2)return;const e3=r2.size-s2;let t4=0;for(const n3 of r2.keys()){if(t4>=e3)break;r2.delete(n3),t4++}i2.evictions_entries+=t4}()},delete(e2){r2.delete(e2)&&i2.deletes++},get counters(){return{...i2}},destroy(){void 0!==a2&&(clearInterval(a2),a2=void 0),r2.clear()}}}function on(e,n2){const{cacheConfig:t2,cacheStore:o2,namespace:s2,logger:r2,storeId:i2}=n2,a2={hits:0,misses:0,populates:0,writes:0,deletes:0,inflight_dedups:0},c2=t2.rules.map(e2=>({match:e2.match?tn(e2.match):()=>!0,ttl:e2.ttl})),u2=e2=>`${s2}:${e2}`;function l2(e2,n3){const t3=void 0===n3?{key:e2}:{key:e2,value:n3};return c2.find(e3=>e3.match(t3))}const f2=new Map;return{type:e.type,config:e.config,setup:e.setup,get counters(){return{...a2}},async get(n3){const t3=u2(n3),s3=await o2.get(t3);if(void 0!==s3)return a2.hits++,s3;const r3=f2.get(t3);if(r3)return a2.inflight_dedups++,r3;a2.misses++;const i3=(async()=>{try{const s4=await e.get(n3);if(void 0===s4)return;const r4=l2(n3,s4);if(r4)try{await o2.set(t3,s4,1e3*r4.ttl),a2.populates++}catch(e2){d2("set",n3,e2)}return s4}finally{f2.delete(t3)}})();return f2.set(t3,i3),i3},async set(n3,t3,s3){a2.writes++,await e.set(n3,t3,s3);const r3=l2(n3,t3);if(r3)try{await o2.set(u2(n3),t3,1e3*r3.ttl)}catch(e2){d2("set",n3,e2)}},async delete(n3){a2.deletes++,await e.delete(n3);try{await o2.delete(u2(n3))}catch(e2){d2("delete",n3,e2)}}};function d2(e2,n3,t3){const o3=`store-cache(${i2}): cache ${e2} failed for "${n3}"; backing succeeded, continuing`;r2?r2.warn(o3,{error:t3}):console.warn(o3,t3)}}function sn(e,n2){const t2=n2.get,o2=n2.set,s2=n2.delete;n2.get=en(t2,"StoreGet",e.hooks,e.logger),n2.set=en(o2,"StoreSet",e.hooks,e.logger),n2.delete=en(s2,"StoreDelete",e.hooks,e.logger)}async function an(e){const n2=r({globalsStatic:{},sessionStatic:{},run:!0,queueMax:1e3},e,{merge:!1,extend:!1}),t2={level:e.logger?.level,handler:e.logger?.handler},o2=i(t2),s2={...n2.globalsStatic,...e.globals},a2={allowed:!1,config:n2,consent:e.consent||{},custom:e.custom||{},destinations:{},transformers:{},stores:{},globals:s2,hooks:e.hooks||{},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,n3;a2.push=function(e,n2){return Ye(async(t2,o2={})=>await Ve(async()=>{const s2=Date.now(),{id:r2,ingest:i2,respond:a2,mapping:c2,preChain:u2,include:l2,exclude:f2}=o2;let d2=a2,g2=t2;const p2=l2||f2?function(e2,n3,t3){let o3=e2;return n3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>n3.includes(e3)))),t3&&(o3=Object.fromEntries(Object.entries(o3).filter(([e3])=>!t3.includes(e3)))),o3}(e.destinations,l2,f2):void 0,h2=i2??Ne(r2||"unknown");if(c2){const n3=await Ke(g2,c2,e);if(n3.ignore)return Ee({ok:!0});if(c2.consent&&!Le(c2.consent,e.consent,n3.event.consent))return Ee({ok:!0});g2=n3.event}if(u2?.length&&e.transformers&&Object.keys(e.transformers).length>0){const t3=await se(e,e.transformers,u2,g2,h2,d2,r2?`source.${r2}.next`:void 0);if(null===t3.event)return Ee({ok:!0});if(t3.stopped)return t3.respond&&(d2=t3.respond),Ee({ok:!0});if(t3.respond&&(d2=t3.respond),Array.isArray(t3.event)){const o3=await Promise.all(t3.event.map(async t4=>{const o4=n2(t4),s3=Ge(e,o4);return Se(e,s3,{id:r2,ingest:h2,respond:d2},p2)}));if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count+=t3.event.length,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return o3[0]??Ee({ok:!0})}g2=t3.event}const m2=n2(g2),y2=Ge(e,m2),v2=await Se(e,y2,{id:r2,ingest:h2,respond:d2},p2);if(r2){e.status.sources[r2]||(e.status.sources[r2]={count:0,duration:0});const n3=e.status.sources[r2];n3.count++,n3.lastAt=Date.now(),n3.duration+=Date.now()-s2}return v2},n3=>{if(n3 instanceof Ue)throw n3;return e.status.failed++,e.logger.error("push failed",{event:t2,ingest:o2.ingest,error:n3}),Ee({ok:!1})})(),"Push",e.hooks,e.logger)}(a2,e2=>({timing:Math.round((Date.now()-a2.timing)/10)/100,source:{type:"collector",schema:"4",version:"4.1.0"},...e2})),a2.command=(n3=Fe,Xe(async(t3,o3,s3)=>await Ze(async()=>await n3(e2,t3,o3,s3),n4=>{if(n4 instanceof Qe)throw n4;return e2.status.failed++,e2.logger.error("command failed",{command:t3,data:o3,error:n4}),Ee({ok:!1})})(),"Command",(e2=a2).hooks,e2.logger));const c2=e.stores||{};return a2.stores=await async function(e,n2={}){const t2={};for(const[o3,s3]of Object.entries(n2)){const{code:n3,config:r2={},env:i2={}}=s3,a2=e.logger.scope("store").scope(o3),c2={collector:e,logger:a2,id:o3,config:r2,env:i2},u2=await n3(c2);t2[o3]=u2}const o2=n2,s2=function(e2){const n3={};for(const t4 of Object.keys(e2))n3[t4]="WHITE";const t3=[],o3=[];function s3(r2){const i2=n3[r2];if("BLACK"===i2)return;if("GRAY"===i2){const e3=o3.indexOf(r2),n4=o3.slice(-1===e3?0:e3).concat(r2).join(" -> ");throw new Error(`Cycle in cache.store chain: ${n4}`)}n3[r2]="GRAY",o3.push(r2);const a2=e2[r2].cache?.store;if(void 0!==a2){if(!(a2 in e2))throw new Error(`Store "${r2}" cache.store references "${a2}", which is not declared in flow.stores`);s3(a2)}o3.pop(),n3[r2]="BLACK",t3.push(r2)}for(const t4 of Object.keys(e2))"WHITE"===n3[t4]&&s3(t4);return t3}(o2);for(const n3 of s2){const s3=o2[n3].cache;if(!s3)continue;let r2,i2;void 0!==s3.store?(r2=t2[s3.store],i2=s3.store):(t2.__cache||(t2.__cache=nn()),r2=t2.__cache,i2="__cache");const a2=s3.namespace??n3;e.logger.scope("store-cache").scope(n3).info(`store "${n3}" caches with namespace "${a2}:" via ${i2}`),t2[n3]=on(t2[n3],{storeId:n3,cacheConfig:s3,cacheStore:r2,namespace:a2,logger:e.logger.scope("store-cache").scope(n3)})}for(const[n3,o3]of Object.entries(t2))"__cache"!==n3&&sn(e,o3);return t2}(a2,c2),function(e2,n3,t3){const o3=new Map;for(const[t4,s4]of Object.entries(e2))n3[t4]&&o3.set(s4,n3[t4]);if(0!==o3.size)for(const e3 of[t3.transformers,t3.destinations,t3.sources])if(e3)for(const n4 of Object.values(e3))s3(n4.env);function s3(e3){if(e3)for(const[n4,t4]of Object.entries(e3))if("object"==typeof t4&&null!==t4){const s4=o3.get(t4);s4&&(e3[n4]=s4)}}}(c2,a2.stores,e),a2.stores.__cache||(a2.stores.__cache=nn()),a2.destinations=await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2))s2.config?.require?.length?e.pending.destinations[o2]=s2:t2[o2]=Ie(s2);return t2}(a2,e.destinations||{}),a2.transformers=await async function(e2,n3={}){const t3={};for(const[o3,s3]of Object.entries(n3)){const{code:n4,env:r2={}}=s3,i2=Y(s3,"Transformer");if(!i2.ok){e2.logger.warn(`Transformer ${o3} invalid (${i2.code}): ${i2.reason}. Skipping.`);continue}const{config:a3}=Z(s3,"before"),{config:c3}=Z({...s3,config:a3},"next"),u2=Object.keys(r2).length>0?{...c3,env:r2}:c3,{cache:l2}=s3,f2=l2?{...u2,cache:l2}:u2,d2=e2.logger.scope("transformer").scope(o3),g2={collector:e2,logger:d2,id:o3,ingest:B(o3),config:f2,env:r2},p2=n4??(e3=>{const n5=s3.mapping;if(n5){const t4=[];if(void 0!==n5.data&&t4.push("data"),n5.mapping)for(const[e4,o4]of Object.entries(n5.mapping))if("object"==typeof o4&&null!==o4)for(const[n6,s4]of Object.entries(o4)){if("object"!=typeof s4||null===s4)continue;const o5=s4;void 0!==o5.data&&t4.push(`mapping[${e4}][${n6}].data`),void 0!==o5.silent&&t4.push(`mapping[${e4}][${n6}].silent`)}return t4.length>0&&e3.collector.logger.warn(`Transformer ${o3}: \`${t4.join(", ")}\` ignored at transformer position (only event-mutating fields apply).`),{type:"pass",config:e3.config,push:async t5=>{const o4=await J(t5,n5,e3.collector);return!o4.ignore&&{event:o4.event}}}}return{type:"pass",config:e3.config,push:e4=>({event:e4})}}),h2=await p2(g2);void 0!==s3.before&&void 0===h2.config?.before&&(h2.config={...h2.config??{},before:s3.before}),void 0!==s3.next&&void 0===h2.config?.next&&(h2.config={...h2.config??{},next:s3.next}),t3[o3]=h2}return t3}(a2,e.transformers||{}),a2}async function cn(e){e=e||{};const n2=await an(e),t2=(o2=n2,{type:"elb",config:{},push:async(e2,n3,t3,s3,r3)=>{if("string"==typeof e2&&e2.startsWith("walker ")){const t4=e2.replace("walker ","");return o2.command(t4,n3)}let i3;if("string"==typeof e2)i3={name:e2},n3&&"object"==typeof n3&&!Array.isArray(n3)&&(i3.data=n3);else{if(!e2||"object"!=typeof e2)return Ee({ok:!1});i3=e2,n3&&"object"==typeof n3&&!Array.isArray(n3)&&(i3.data={...i3.data||{},...n3})}return t3&&"object"==typeof t3&&(i3.context=t3),s3&&Array.isArray(s3)&&(i3.nested=s3),r3&&"object"==typeof r3&&(i3.custom=r3),o2.push(i3)}});var o2;n2.sources.elb=t2,await async function(e,n2={}){const t2={};for(const[o2,s2]of Object.entries(n2)){const n3=await ue(e,o2,s2);if(!n3)continue;const r2=s2.config?.require;n3.config={...n3.config,init:!1,...r2?{require:[...r2]}:{}},t2[o2]=n3}Object.assign(e.sources,t2);for(const n3 of Object.keys(t2)){const t3=e.sources[n3];let o2=!1;t3.init&&await I(t3.init.bind(t3),t4=>{if(t4 instanceof _)throw t4;o2=!0,e.status.failed++,e.logger.scope("source").error("source init failed",{sourceId:n3,error:t4})})(),o2||(t3.config.init=!0,ce(t3)&&await ae(e,t3,n3))}return t2}(n2,e.sources||{});const{consent:s2,user:r2,globals:i2,custom:a2}=e;s2&&await n2.command("consent",s2),r2&&await n2.command("user",r2),i2&&Object.assign(n2.globals,i2),a2&&Object.assign(n2.custom,a2),n2.config.run&&await n2.command("run");let c2=t2.push;const u2=Object.values(n2.sources).filter(e2=>"elb"!==e2.type),l2=u2.find(e2=>e2.config.primary);return l2?c2=l2.push:u2.length>0&&(c2=u2[0].push),{collector:n2,elb:c2}}var createTrigger=async config=>{let flow;return{get flow(){return flow},trigger:()=>async content=>{if(!flow){const result=await cn(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&&params.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,7 +1,7 @@
1
1
  {
2
2
  "$meta": {
3
3
  "package": "@walkeros/server-source-aws",
4
- "version": "4.1.0-next-1779362268386",
4
+ "version": "4.1.0",
5
5
  "type": "source",
6
6
  "platform": [
7
7
  "server"
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@walkeros/server-source-aws",
3
3
  "description": "AWS server sources for walkerOS (Lambda, API Gateway, Function URLs)",
4
- "version": "4.1.0-next-1779362268386",
4
+ "version": "4.1.0",
5
5
  "license": "MIT",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.mjs",
@@ -23,14 +23,14 @@
23
23
  "dependencies": {
24
24
  "@aws-sdk/client-sqs": "^3.952.0",
25
25
  "@aws-sdk/client-sns": "^3.952.0",
26
- "@walkeros/core": "4.1.0-next-1779362268386"
26
+ "@walkeros/core": "4.1.0"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "@types/aws-lambda": "^8.10.0"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/aws-lambda": "^8.10.159",
33
- "@walkeros/collector": "4.1.0-next-1779362268386"
33
+ "@walkeros/collector": "4.1.0"
34
34
  },
35
35
  "repository": {
36
36
  "url": "git+https://github.com/elbwalker/walkerOS.git",